Commit 18ea671b authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'dmaengine-fix-5.6-rc1' of git://git.infradead.org/users/vkoul/slave-dma

Pull dmaengine fixes from Vinod Koul:
 "Fixes for:

   - Documentation build error fix

   - Fix dma_request_chan() error return

   - Remove unneeded conversion in idxd driver

   - Fix pointer check for dma_async_device_channel_register()

   - Fix slave-channel symlink cleanup"

* tag 'dmaengine-fix-5.6-rc1' of git://git.infradead.org/users/vkoul/slave-dma:
  dmaengine: Cleanups for the slave <-> channel symlink support
  dmaengine: fix null ptr check for __dma_async_device_channel_register()
  dmaengine: idxd: fix boolconv.cocci warnings
  dmaengine: Fix return value for dma_request_chan() in case of failure
  dmaengine: doc: Properly indent metadata title
parents 4fc2ea6a bad83565
...@@ -151,8 +151,8 @@ The details of these operations are: ...@@ -151,8 +151,8 @@ The details of these operations are:
Note that callbacks will always be invoked from the DMA Note that callbacks will always be invoked from the DMA
engines tasklet, never from interrupt context. engines tasklet, never from interrupt context.
Optional: per descriptor metadata Optional: per descriptor metadata
--------------------------------- ---------------------------------
DMAengine provides two ways for metadata support. DMAengine provides two ways for metadata support.
DESC_METADATA_CLIENT DESC_METADATA_CLIENT
......
...@@ -756,22 +756,21 @@ struct dma_chan *dma_request_chan(struct device *dev, const char *name) ...@@ -756,22 +756,21 @@ struct dma_chan *dma_request_chan(struct device *dev, const char *name)
} }
mutex_unlock(&dma_list_mutex); mutex_unlock(&dma_list_mutex);
if (!IS_ERR_OR_NULL(chan)) if (IS_ERR_OR_NULL(chan))
goto found; return chan ? chan : ERR_PTR(-EPROBE_DEFER);
return ERR_PTR(-EPROBE_DEFER);
found: found:
chan->slave = dev;
chan->name = kasprintf(GFP_KERNEL, "dma:%s", name); chan->name = kasprintf(GFP_KERNEL, "dma:%s", name);
if (!chan->name) if (!chan->name)
return ERR_PTR(-ENOMEM); return chan;
chan->slave = dev;
if (sysfs_create_link(&chan->dev->device.kobj, &dev->kobj, if (sysfs_create_link(&chan->dev->device.kobj, &dev->kobj,
DMA_SLAVE_NAME)) DMA_SLAVE_NAME))
dev_err(dev, "Cannot create DMA %s symlink\n", DMA_SLAVE_NAME); dev_warn(dev, "Cannot create DMA %s symlink\n", DMA_SLAVE_NAME);
if (sysfs_create_link(&dev->kobj, &chan->dev->device.kobj, chan->name)) if (sysfs_create_link(&dev->kobj, &chan->dev->device.kobj, chan->name))
dev_err(dev, "Cannot create DMA %s symlink\n", chan->name); dev_warn(dev, "Cannot create DMA %s symlink\n", chan->name);
return chan; return chan;
} }
EXPORT_SYMBOL_GPL(dma_request_chan); EXPORT_SYMBOL_GPL(dma_request_chan);
...@@ -830,13 +829,14 @@ void dma_release_channel(struct dma_chan *chan) ...@@ -830,13 +829,14 @@ void dma_release_channel(struct dma_chan *chan)
/* drop PRIVATE cap enabled by __dma_request_channel() */ /* drop PRIVATE cap enabled by __dma_request_channel() */
if (--chan->device->privatecnt == 0) if (--chan->device->privatecnt == 0)
dma_cap_clear(DMA_PRIVATE, chan->device->cap_mask); dma_cap_clear(DMA_PRIVATE, chan->device->cap_mask);
if (chan->slave) { if (chan->slave) {
sysfs_remove_link(&chan->dev->device.kobj, DMA_SLAVE_NAME);
sysfs_remove_link(&chan->slave->kobj, chan->name); sysfs_remove_link(&chan->slave->kobj, chan->name);
kfree(chan->name); kfree(chan->name);
chan->name = NULL; chan->name = NULL;
chan->slave = NULL; chan->slave = NULL;
} }
sysfs_remove_link(&chan->dev->device.kobj, DMA_SLAVE_NAME);
mutex_unlock(&dma_list_mutex); mutex_unlock(&dma_list_mutex);
} }
EXPORT_SYMBOL_GPL(dma_release_channel); EXPORT_SYMBOL_GPL(dma_release_channel);
...@@ -962,6 +962,9 @@ static int __dma_async_device_channel_register(struct dma_device *device, ...@@ -962,6 +962,9 @@ static int __dma_async_device_channel_register(struct dma_device *device,
tchan = list_first_entry_or_null(&device->channels, tchan = list_first_entry_or_null(&device->channels,
struct dma_chan, device_node); struct dma_chan, device_node);
if (!tchan)
return -ENODEV;
if (tchan->dev) { if (tchan->dev) {
idr_ref = tchan->dev->idr_ref; idr_ref = tchan->dev->idr_ref;
} else { } else {
......
...@@ -66,7 +66,7 @@ static inline bool is_idxd_wq_dmaengine(struct idxd_wq *wq) ...@@ -66,7 +66,7 @@ static inline bool is_idxd_wq_dmaengine(struct idxd_wq *wq)
static inline bool is_idxd_wq_cdev(struct idxd_wq *wq) static inline bool is_idxd_wq_cdev(struct idxd_wq *wq)
{ {
return wq->type == IDXD_WQT_USER ? true : false; return wq->type == IDXD_WQT_USER;
} }
static int idxd_config_bus_match(struct device *dev, static int idxd_config_bus_match(struct device *dev,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment