dma: Introduce dma_get_cfg() interface

Sometimes, there would be a need to exchange data between DMA provider
and DMA client which are very specific to DMA driver of the SoC/platform
and are not generic enough to be put into struct dma. Therefore, introduce
dma_get_cfg() interface to get DMA provider specific data from client
device. Clients can use unique configuration ID flags to get different
configuration data from DMA driver.

Signed-off-by: Vignesh Raghavendra <vigneshr@ti.com>
Acked-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: Grygorii Strashko <grygorii.strashko@ti.com>
This commit is contained in:
Vignesh Raghavendra 2019-12-04 22:17:20 +05:30 committed by Joe Hershberger
parent 08b3e90a01
commit b8a4dd28f3
3 changed files with 35 additions and 0 deletions

View File

@ -187,6 +187,18 @@ int dma_send(struct dma *dma, void *src, size_t len, void *metadata)
return ops->send(dma, src, len, metadata); return ops->send(dma, src, len, metadata);
} }
int dma_get_cfg(struct dma *dma, u32 cfg_id, void **cfg_data)
{
struct dma_ops *ops = dma_dev_ops(dma->dev);
debug("%s(dma=%p)\n", __func__, dma);
if (!ops->get_cfg)
return -ENOSYS;
return ops->get_cfg(dma, cfg_id, cfg_data);
}
#endif /* CONFIG_DMA_CHANNELS */ #endif /* CONFIG_DMA_CHANNELS */
int dma_get_device(u32 transfer_type, struct udevice **devp) int dma_get_device(u32 transfer_type, struct udevice **devp)

View File

@ -108,6 +108,17 @@ struct dma_ops {
* @return zero on success, or -ve error code. * @return zero on success, or -ve error code.
*/ */
int (*send)(struct dma *dma, void *src, size_t len, void *metadata); int (*send)(struct dma *dma, void *src, size_t len, void *metadata);
/**
* get_cfg() - Get DMA channel configuration for client's use
*
* @dma: The DMA Channel to manipulate
* @cfg_id: DMA provider specific ID to identify what
* configuration data client needs
* @data: Pointer to store pointer to DMA driver specific
* configuration data for the given cfg_id (output param)
* @return zero on success, or -ve error code.
*/
int (*get_cfg)(struct dma *dma, u32 cfg_id, void **data);
#endif /* CONFIG_DMA_CHANNELS */ #endif /* CONFIG_DMA_CHANNELS */
/** /**
* transfer() - Issue a DMA transfer. The implementation must * transfer() - Issue a DMA transfer. The implementation must

View File

@ -290,6 +290,18 @@ int dma_receive(struct dma *dma, void **dst, void *metadata);
* @return zero on success, or -ve error code. * @return zero on success, or -ve error code.
*/ */
int dma_send(struct dma *dma, void *src, size_t len, void *metadata); int dma_send(struct dma *dma, void *src, size_t len, void *metadata);
/**
* dma_get_cfg() - Get DMA channel configuration for client's use
*
* @dma: The DMA Channel to manipulate
* @cfg_id: DMA provider specific ID to identify what
* configuration data client needs
* @cfg_data: Pointer to store pointer to DMA driver specific
* configuration data for the given cfg_id (output param)
* @return zero on success, or -ve error code.
*/
int dma_get_cfg(struct dma *dma, u32 cfg_id, void **cfg_data);
#endif /* CONFIG_DMA_CHANNELS */ #endif /* CONFIG_DMA_CHANNELS */
/* /*