summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuEe-GUI <[email protected]>2024-11-28 18:54:51 +0800
committerRbb666 <[email protected]>2024-12-02 21:14:13 +0800
commit72a78a268f1b5f422bcdb1eac8dc5eb0dfd49b63 (patch)
tree157e54fb34841620f159f3f54de04cb7b00dee54
parent8f392779ef60d9f81a31e50e9d5c4fb40f3b0611 (diff)
[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 <[email protected]>
-rw-r--r--components/drivers/dma/dma.c23
-rw-r--r--components/drivers/include/drivers/dma.h5
2 files changed, 10 insertions, 18 deletions
diff --git a/components/drivers/dma/dma.c b/components/drivers/dma/dma.c
index 7de9d3a096..da2d80a866 100644
--- a/components/drivers/dma/dma.c
+++ b/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
{
diff --git a/components/drivers/include/drivers/dma.h b/components/drivers/include/drivers/dma.h
index 16f02c3df7..3128c67744 100644
--- a/components/drivers/include/drivers/dma.h
+++ b/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