Currently it is not easy to find out which DMA channels are in use, and by which slave devices. Fix this by creating in sysfs a "slave" symlink from the DMA channel to the actual slave device when a channel is requested, and removing it again when the channel is released. For now this is limited to DT and ACPI. Signed-off-by: Geert Uytterhoeven <geert+renesas@xxxxxxxxx> --- Questions: 1. Do you think this is useful? 2. Should backlinks (e.g. "dma:<name>") be created from the slave device to the DMA channel? This requires storing the name in struct dma_chan, for later symlink removal. 3. Should this be extended to other ways of requesting channels? In many cases, no device pointer is available, so a device pointer parameter has to be added to all DMA channel request APIs that don't have it yet. --- drivers/dma/dmaengine.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c index 03ac4b96117cd8db..c11476f76fc96bcf 100644 --- a/drivers/dma/dmaengine.c +++ b/drivers/dma/dmaengine.c @@ -706,6 +706,10 @@ struct dma_chan *dma_request_chan(struct device *dev, const char *name) if (chan) { /* Valid channel found or requester needs to be deferred */ + if (!IS_ERR(chan) && + sysfs_create_link(&chan->dev->device.kobj, &dev->kobj, + "slave")) + dev_err(dev, "Cannot create DMA slave symlink\n"); if (!IS_ERR(chan) || PTR_ERR(chan) == -EPROBE_DEFER) return chan; } @@ -786,6 +790,7 @@ void dma_release_channel(struct dma_chan *chan) /* drop PRIVATE cap enabled by __dma_request_channel() */ if (--chan->device->privatecnt == 0) dma_cap_clear(DMA_PRIVATE, chan->device->cap_mask); + sysfs_remove_link(&chan->dev->device.kobj, "slave"); mutex_unlock(&dma_list_mutex); } EXPORT_SYMBOL_GPL(dma_release_channel); -- 2.17.1