Loading drivers/dma/dmaengine.c +31 −4 Original line number Original line Diff line number Diff line Loading @@ -540,6 +540,8 @@ EXPORT_SYMBOL_GPL(dma_get_slave_channel); * @mask: capabilities that the channel must satisfy * @mask: capabilities that the channel must satisfy * @fn: optional callback to disposition available channels * @fn: optional callback to disposition available channels * @fn_param: opaque parameter to pass to dma_filter_fn * @fn_param: opaque parameter to pass to dma_filter_fn * * Returns pointer to appropriate DMA channel on success or NULL. */ */ struct dma_chan *__dma_request_channel(const dma_cap_mask_t *mask, struct dma_chan *__dma_request_channel(const dma_cap_mask_t *mask, dma_filter_fn fn, void *fn_param) dma_filter_fn fn, void *fn_param) Loading Loading @@ -591,18 +593,43 @@ EXPORT_SYMBOL_GPL(__dma_request_channel); * dma_request_slave_channel - try to allocate an exclusive slave channel * dma_request_slave_channel - try to allocate an exclusive slave channel * @dev: pointer to client device structure * @dev: pointer to client device structure * @name: slave channel name * @name: slave channel name * * Returns pointer to appropriate DMA channel on success or an error pointer. */ */ struct dma_chan *dma_request_slave_channel(struct device *dev, const char *name) struct dma_chan *dma_request_slave_channel_reason(struct device *dev, const char *name) { { struct dma_chan *chan; /* If device-tree is present get slave info from here */ /* If device-tree is present get slave info from here */ if (dev->of_node) if (dev->of_node) return of_dma_request_slave_channel(dev->of_node, name); return of_dma_request_slave_channel(dev->of_node, name); /* If device was enumerated by ACPI get slave info from here */ /* If device was enumerated by ACPI get slave info from here */ if (ACPI_HANDLE(dev)) if (ACPI_HANDLE(dev)) { return acpi_dma_request_slave_chan_by_name(dev, name); chan = acpi_dma_request_slave_chan_by_name(dev, name); if (chan) return chan; } return ERR_PTR(-ENODEV); } EXPORT_SYMBOL_GPL(dma_request_slave_channel_reason); /** * dma_request_slave_channel - try to allocate an exclusive slave channel * @dev: pointer to client device structure * @name: slave channel name * * Returns pointer to appropriate DMA channel on success or NULL. */ struct dma_chan *dma_request_slave_channel(struct device *dev, const char *name) { struct dma_chan *ch = dma_request_slave_channel_reason(dev, name); if (IS_ERR(ch)) return NULL; return NULL; return ch; } } EXPORT_SYMBOL_GPL(dma_request_slave_channel); EXPORT_SYMBOL_GPL(dma_request_slave_channel); Loading drivers/dma/of-dma.c +9 −6 Original line number Original line Diff line number Diff line Loading @@ -143,7 +143,7 @@ static int of_dma_match_channel(struct device_node *np, const char *name, * @np: device node to get DMA request from * @np: device node to get DMA request from * @name: name of desired channel * @name: name of desired channel * * * Returns pointer to appropriate dma channel on success or NULL on error. * Returns pointer to appropriate DMA channel on success or an error pointer. */ */ struct dma_chan *of_dma_request_slave_channel(struct device_node *np, struct dma_chan *of_dma_request_slave_channel(struct device_node *np, const char *name) const char *name) Loading @@ -152,17 +152,18 @@ struct dma_chan *of_dma_request_slave_channel(struct device_node *np, struct of_dma *ofdma; struct of_dma *ofdma; struct dma_chan *chan; struct dma_chan *chan; int count, i; int count, i; int ret_no_channel = -ENODEV; if (!np || !name) { if (!np || !name) { pr_err("%s: not enough information provided\n", __func__); pr_err("%s: not enough information provided\n", __func__); return NULL; return ERR_PTR(-ENODEV); } } count = of_property_count_strings(np, "dma-names"); count = of_property_count_strings(np, "dma-names"); if (count < 0) { if (count < 0) { pr_err("%s: dma-names property of node '%s' missing or empty\n", pr_err("%s: dma-names property of node '%s' missing or empty\n", __func__, np->full_name); __func__, np->full_name); return NULL; return ERR_PTR(-ENODEV); } } for (i = 0; i < count; i++) { for (i = 0; i < count; i++) { Loading @@ -172,10 +173,12 @@ struct dma_chan *of_dma_request_slave_channel(struct device_node *np, mutex_lock(&of_dma_lock); mutex_lock(&of_dma_lock); ofdma = of_dma_find_controller(&dma_spec); ofdma = of_dma_find_controller(&dma_spec); if (ofdma) if (ofdma) { chan = ofdma->of_dma_xlate(&dma_spec, ofdma); chan = ofdma->of_dma_xlate(&dma_spec, ofdma); else } else { ret_no_channel = -EPROBE_DEFER; chan = NULL; chan = NULL; } mutex_unlock(&of_dma_lock); mutex_unlock(&of_dma_lock); Loading @@ -185,7 +188,7 @@ struct dma_chan *of_dma_request_slave_channel(struct device_node *np, return chan; return chan; } } return NULL; return ERR_PTR(ret_no_channel); } } /** /** Loading include/linux/dmaengine.h +8 −0 Original line number Original line Diff line number Diff line Loading @@ -22,6 +22,7 @@ #define LINUX_DMAENGINE_H #define LINUX_DMAENGINE_H #include <linux/device.h> #include <linux/device.h> #include <linux/err.h> #include <linux/uio.h> #include <linux/uio.h> #include <linux/bug.h> #include <linux/bug.h> #include <linux/scatterlist.h> #include <linux/scatterlist.h> Loading Loading @@ -1040,6 +1041,8 @@ enum dma_status dma_wait_for_async_tx(struct dma_async_tx_descriptor *tx); void dma_issue_pending_all(void); void dma_issue_pending_all(void); struct dma_chan *__dma_request_channel(const dma_cap_mask_t *mask, struct dma_chan *__dma_request_channel(const dma_cap_mask_t *mask, dma_filter_fn fn, void *fn_param); dma_filter_fn fn, void *fn_param); struct dma_chan *dma_request_slave_channel_reason(struct device *dev, const char *name); struct dma_chan *dma_request_slave_channel(struct device *dev, const char *name); struct dma_chan *dma_request_slave_channel(struct device *dev, const char *name); void dma_release_channel(struct dma_chan *chan); void dma_release_channel(struct dma_chan *chan); #else #else Loading @@ -1063,6 +1066,11 @@ static inline struct dma_chan *__dma_request_channel(const dma_cap_mask_t *mask, { { return NULL; return NULL; } } static inline struct dma_chan *dma_request_slave_channel_reason( struct device *dev, const char *name) { return ERR_PTR(-ENODEV); } static inline struct dma_chan *dma_request_slave_channel(struct device *dev, static inline struct dma_chan *dma_request_slave_channel(struct device *dev, const char *name) const char *name) { { Loading Loading
drivers/dma/dmaengine.c +31 −4 Original line number Original line Diff line number Diff line Loading @@ -540,6 +540,8 @@ EXPORT_SYMBOL_GPL(dma_get_slave_channel); * @mask: capabilities that the channel must satisfy * @mask: capabilities that the channel must satisfy * @fn: optional callback to disposition available channels * @fn: optional callback to disposition available channels * @fn_param: opaque parameter to pass to dma_filter_fn * @fn_param: opaque parameter to pass to dma_filter_fn * * Returns pointer to appropriate DMA channel on success or NULL. */ */ struct dma_chan *__dma_request_channel(const dma_cap_mask_t *mask, struct dma_chan *__dma_request_channel(const dma_cap_mask_t *mask, dma_filter_fn fn, void *fn_param) dma_filter_fn fn, void *fn_param) Loading Loading @@ -591,18 +593,43 @@ EXPORT_SYMBOL_GPL(__dma_request_channel); * dma_request_slave_channel - try to allocate an exclusive slave channel * dma_request_slave_channel - try to allocate an exclusive slave channel * @dev: pointer to client device structure * @dev: pointer to client device structure * @name: slave channel name * @name: slave channel name * * Returns pointer to appropriate DMA channel on success or an error pointer. */ */ struct dma_chan *dma_request_slave_channel(struct device *dev, const char *name) struct dma_chan *dma_request_slave_channel_reason(struct device *dev, const char *name) { { struct dma_chan *chan; /* If device-tree is present get slave info from here */ /* If device-tree is present get slave info from here */ if (dev->of_node) if (dev->of_node) return of_dma_request_slave_channel(dev->of_node, name); return of_dma_request_slave_channel(dev->of_node, name); /* If device was enumerated by ACPI get slave info from here */ /* If device was enumerated by ACPI get slave info from here */ if (ACPI_HANDLE(dev)) if (ACPI_HANDLE(dev)) { return acpi_dma_request_slave_chan_by_name(dev, name); chan = acpi_dma_request_slave_chan_by_name(dev, name); if (chan) return chan; } return ERR_PTR(-ENODEV); } EXPORT_SYMBOL_GPL(dma_request_slave_channel_reason); /** * dma_request_slave_channel - try to allocate an exclusive slave channel * @dev: pointer to client device structure * @name: slave channel name * * Returns pointer to appropriate DMA channel on success or NULL. */ struct dma_chan *dma_request_slave_channel(struct device *dev, const char *name) { struct dma_chan *ch = dma_request_slave_channel_reason(dev, name); if (IS_ERR(ch)) return NULL; return NULL; return ch; } } EXPORT_SYMBOL_GPL(dma_request_slave_channel); EXPORT_SYMBOL_GPL(dma_request_slave_channel); Loading
drivers/dma/of-dma.c +9 −6 Original line number Original line Diff line number Diff line Loading @@ -143,7 +143,7 @@ static int of_dma_match_channel(struct device_node *np, const char *name, * @np: device node to get DMA request from * @np: device node to get DMA request from * @name: name of desired channel * @name: name of desired channel * * * Returns pointer to appropriate dma channel on success or NULL on error. * Returns pointer to appropriate DMA channel on success or an error pointer. */ */ struct dma_chan *of_dma_request_slave_channel(struct device_node *np, struct dma_chan *of_dma_request_slave_channel(struct device_node *np, const char *name) const char *name) Loading @@ -152,17 +152,18 @@ struct dma_chan *of_dma_request_slave_channel(struct device_node *np, struct of_dma *ofdma; struct of_dma *ofdma; struct dma_chan *chan; struct dma_chan *chan; int count, i; int count, i; int ret_no_channel = -ENODEV; if (!np || !name) { if (!np || !name) { pr_err("%s: not enough information provided\n", __func__); pr_err("%s: not enough information provided\n", __func__); return NULL; return ERR_PTR(-ENODEV); } } count = of_property_count_strings(np, "dma-names"); count = of_property_count_strings(np, "dma-names"); if (count < 0) { if (count < 0) { pr_err("%s: dma-names property of node '%s' missing or empty\n", pr_err("%s: dma-names property of node '%s' missing or empty\n", __func__, np->full_name); __func__, np->full_name); return NULL; return ERR_PTR(-ENODEV); } } for (i = 0; i < count; i++) { for (i = 0; i < count; i++) { Loading @@ -172,10 +173,12 @@ struct dma_chan *of_dma_request_slave_channel(struct device_node *np, mutex_lock(&of_dma_lock); mutex_lock(&of_dma_lock); ofdma = of_dma_find_controller(&dma_spec); ofdma = of_dma_find_controller(&dma_spec); if (ofdma) if (ofdma) { chan = ofdma->of_dma_xlate(&dma_spec, ofdma); chan = ofdma->of_dma_xlate(&dma_spec, ofdma); else } else { ret_no_channel = -EPROBE_DEFER; chan = NULL; chan = NULL; } mutex_unlock(&of_dma_lock); mutex_unlock(&of_dma_lock); Loading @@ -185,7 +188,7 @@ struct dma_chan *of_dma_request_slave_channel(struct device_node *np, return chan; return chan; } } return NULL; return ERR_PTR(ret_no_channel); } } /** /** Loading
include/linux/dmaengine.h +8 −0 Original line number Original line Diff line number Diff line Loading @@ -22,6 +22,7 @@ #define LINUX_DMAENGINE_H #define LINUX_DMAENGINE_H #include <linux/device.h> #include <linux/device.h> #include <linux/err.h> #include <linux/uio.h> #include <linux/uio.h> #include <linux/bug.h> #include <linux/bug.h> #include <linux/scatterlist.h> #include <linux/scatterlist.h> Loading Loading @@ -1040,6 +1041,8 @@ enum dma_status dma_wait_for_async_tx(struct dma_async_tx_descriptor *tx); void dma_issue_pending_all(void); void dma_issue_pending_all(void); struct dma_chan *__dma_request_channel(const dma_cap_mask_t *mask, struct dma_chan *__dma_request_channel(const dma_cap_mask_t *mask, dma_filter_fn fn, void *fn_param); dma_filter_fn fn, void *fn_param); struct dma_chan *dma_request_slave_channel_reason(struct device *dev, const char *name); struct dma_chan *dma_request_slave_channel(struct device *dev, const char *name); struct dma_chan *dma_request_slave_channel(struct device *dev, const char *name); void dma_release_channel(struct dma_chan *chan); void dma_release_channel(struct dma_chan *chan); #else #else Loading @@ -1063,6 +1066,11 @@ static inline struct dma_chan *__dma_request_channel(const dma_cap_mask_t *mask, { { return NULL; return NULL; } } static inline struct dma_chan *dma_request_slave_channel_reason( struct device *dev, const char *name) { return ERR_PTR(-ENODEV); } static inline struct dma_chan *dma_request_slave_channel(struct device *dev, static inline struct dma_chan *dma_request_slave_channel(struct device *dev, const char *name) const char *name) { { Loading