Forráskód Böngészése

[DM/DMA] merge ofw_parse and request_chan

Work together can make DMA engine device drivers
knows how want a chan easy.

Signed-off-by: GuEe-GUI <2991707448@qq.com>
GuEe-GUI 5 hónapja
szülő
commit
72a78a268f
2 módosított fájl, 10 hozzáadás és 18 törlés
  1. 8 15
      components/drivers/dma/dma.c
  2. 2 3
      components/drivers/include/drivers/dma.h

+ 8 - 15
components/drivers/dma/dma.c

@@ -448,13 +448,11 @@ rt_err_t rt_dma_prep_single(struct rt_dma_chan *chan,
 }
 
 static struct rt_dma_controller *ofw_find_dma_controller(struct rt_device *dev,
-        const char *name)
+        const char *name, struct rt_ofw_cell_args *args)
 {
     struct rt_dma_controller *ctrl = RT_NULL;
 #ifdef RT_USING_OFW
     int index;
-    rt_err_t err;
-    struct rt_ofw_cell_args dma_args = {};
     struct rt_ofw_node *np = dev->ofw_node, *ctrl_np;
 
     if (!np)
@@ -469,9 +467,9 @@ static struct rt_dma_controller *ofw_find_dma_controller(struct rt_device *dev,
         return RT_NULL;
     }
 
-    if (!rt_ofw_parse_phandle_cells(np, "dmas", "#dma-cells", index, &dma_args))
+    if (!rt_ofw_parse_phandle_cells(np, "dmas", "#dma-cells", index, args))
     {
-        ctrl_np = dma_args.data;
+        ctrl_np = args->data;
 
         if (!rt_ofw_data(ctrl_np))
         {
@@ -480,14 +478,6 @@ static struct rt_dma_controller *ofw_find_dma_controller(struct rt_device *dev,
 
         ctrl = rt_ofw_data(ctrl_np);
         rt_ofw_node_put(ctrl_np);
-
-        if (ctrl && ctrl->ops->ofw_parse)
-        {
-            if ((err = ctrl->ops->ofw_parse(ctrl, &dma_args)))
-            {
-                ctrl = rt_err_ptr(err);
-            }
-        }
     }
 #endif /* RT_USING_OFW */
     return ctrl;
@@ -495,7 +485,9 @@ static struct rt_dma_controller *ofw_find_dma_controller(struct rt_device *dev,
 
 struct rt_dma_chan *rt_dma_chan_request(struct rt_device *dev, const char *name)
 {
+    void *fw_data = RT_NULL;
     struct rt_dma_chan *chan;
+    struct rt_ofw_cell_args dma_args;
     struct rt_dma_controller *ctrl = RT_NULL;
 
     if (!dev)
@@ -505,7 +497,8 @@ struct rt_dma_chan *rt_dma_chan_request(struct rt_device *dev, const char *name)
 
     if (name)
     {
-        ctrl = ofw_find_dma_controller(dev, name);
+        fw_data = &dma_args;
+        ctrl = ofw_find_dma_controller(dev, name, &dma_args);
     }
     else
     {
@@ -531,7 +524,7 @@ struct rt_dma_chan *rt_dma_chan_request(struct rt_device *dev, const char *name)
 
     if (ctrl->ops->request_chan)
     {
-        chan = ctrl->ops->request_chan(ctrl, dev);
+        chan = ctrl->ops->request_chan(ctrl, dev, fw_data);
     }
     else
     {

+ 2 - 3
components/drivers/include/drivers/dma.h

@@ -90,7 +90,8 @@ struct rt_dma_controller
 
 struct rt_dma_controller_ops
 {
-    struct rt_dma_chan *(*request_chan)(struct rt_dma_controller *ctrl, struct rt_device *slave);
+    struct rt_dma_chan *(*request_chan)(struct rt_dma_controller *ctrl,
+            struct rt_device *slave, void *fw_data);
     rt_err_t (*release_chan)(struct rt_dma_chan *chan);
 
     rt_err_t (*start)(struct rt_dma_chan *chan);
@@ -107,8 +108,6 @@ struct rt_dma_controller_ops
     rt_err_t (*prep_single)(struct rt_dma_chan *chan,
             rt_ubase_t dma_buf_addr, rt_size_t buf_len,
             enum rt_dma_transfer_direction dir);
-
-    rt_err_t (*ofw_parse)(struct rt_dma_controller *ctrl, struct rt_ofw_cell_args *dma_args);
 };
 
 struct rt_dma_chan