mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-30 23:54:04 +08:00
dmaengine: Introduce DMA-device device_caps callback
There are DMA devices (like ours version of Synopsys DW DMAC) which have DMA capabilities non-uniformly redistributed between the device channels. In order to provide a way of exposing the channel-specific parameters to the DMA engine consumers, we introduce a new DMA-device callback. In case if provided it gets called from the dma_get_slave_caps() method and is able to override the generic DMA-device capabilities. Signed-off-by: Serge Semin <Sergey.Semin@baikalelectronics.ru> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Link: https://lore.kernel.org/r/20200723005848.31907-6-Sergey.Semin@baikalelectronics.ru Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
parent
b1b40b8fe7
commit
3b6d694eb3
@ -601,6 +601,16 @@ int dma_get_slave_caps(struct dma_chan *chan, struct dma_slave_caps *caps)
|
||||
caps->cmd_resume = !!device->device_resume;
|
||||
caps->cmd_terminate = !!device->device_terminate_all;
|
||||
|
||||
/*
|
||||
* DMA engine device might be configured with non-uniformly
|
||||
* distributed slave capabilities per device channels. In this
|
||||
* case the corresponding driver may provide the device_caps
|
||||
* callback to override the generic capabilities with
|
||||
* channel-specific ones.
|
||||
*/
|
||||
if (device->device_caps)
|
||||
device->device_caps(chan, caps);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dma_get_slave_caps);
|
||||
|
@ -801,6 +801,8 @@ struct dma_filter {
|
||||
* be called after period_len bytes have been transferred.
|
||||
* @device_prep_interleaved_dma: Transfer expression in a generic way.
|
||||
* @device_prep_dma_imm_data: DMA's 8 byte immediate data to the dst address
|
||||
* @device_caps: May be used to override the generic DMA slave capabilities
|
||||
* with per-channel specific ones
|
||||
* @device_config: Pushes a new configuration to a channel, return 0 or an error
|
||||
* code
|
||||
* @device_pause: Pauses any transfer happening on a channel. Returns
|
||||
@ -901,6 +903,8 @@ struct dma_device {
|
||||
struct dma_chan *chan, dma_addr_t dst, u64 data,
|
||||
unsigned long flags);
|
||||
|
||||
void (*device_caps)(struct dma_chan *chan,
|
||||
struct dma_slave_caps *caps);
|
||||
int (*device_config)(struct dma_chan *chan,
|
||||
struct dma_slave_config *config);
|
||||
int (*device_pause)(struct dma_chan *chan);
|
||||
|
Loading…
Reference in New Issue
Block a user