dma: Introduce dma_get_cfg() interface
authorVignesh Raghavendra <vigneshr@ti.com>
Wed, 4 Dec 2019 16:47:20 +0000 (22:17 +0530)
committerJoe Hershberger <joe.hershberger@ni.com>
Mon, 9 Dec 2019 15:47:43 +0000 (09:47 -0600)
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>
drivers/dma/dma-uclass.c
include/dma-uclass.h
include/dma.h

index 0ff56f7e88c9e04c76bf265f60c2279d4b2e9c69..5598bca21c5e64298cf5b6e5a74d989fc62e6624 100644 (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);
 }
+
+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 */
 
 int dma_get_device(u32 transfer_type, struct udevice **devp)
index 31b43fb4b98ec8e9853518c01c62950539bef409..a1d9d26ac56f146524f68f7efe659190124dd70a 100644 (file)
@@ -108,6 +108,17 @@ struct dma_ops {
         * @return zero on success, or -ve error code.
         */
        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 */
        /**
         * transfer() - Issue a DMA transfer. The implementation must
index d1c3d0df7d91552dfe985a280f35aa3e02eee092..6c55aa3a0046f2b91225639d10d74054110ef9b5 100644 (file)
@@ -290,6 +290,18 @@ int dma_receive(struct dma *dma, void **dst, void *metadata);
  * @return zero on success, or -ve error code.
  */
 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 */
 
 /*