dmaengine: qcom_hidma: simplify DT resource parsing
Subsystems (3)
PATCH 1/1 dmaengine: qcom_hidma: simplify DT resource parsing
The hidma driver open codes populating address and IRQ resources from DT. We have standard functions of_address_to_resource and of_irq_to_resource for this, so use them instead.
The DT binding states each child should have 2 addresses and 1 IRQ, so we can simplify the logic and do a fixed size resource allocation. Using the standard of_address_to_resource will also do any address translation which was missing.
--- drivers/dma/qcom/hidma_mgmt.c | 61 +++++++++++-------------------------------- 1 file changed, 15 insertions(+), 46 deletions(-)
--
2.14.1
--
To unsubscribe from this list: send the line "unsubscribe dmaengine" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
drivers/dma/qcom/hidma_mgmt.c +15 -46
@@ -17,6 +17,7 @@#include <linux/acpi.h> #include <linux/of.h> #include <linux/property.h> +#include <linux/of_address.h> #include <linux/of_irq.h> #include <linux/of_platform.h> #include <linux/module.h>
@@ -356,67 +357,37 @@ static int __init hidma_mgmt_of_populate_channels(struct device_node *np) {struct platform_device *pdev_parent =of_find_device_by_node (np);struct platform_device_info pdevinfo; -struct of_phandle_args out_irq;struct device_node *child; -struct resource *res =NULL ; -const __be32 *cell; -int ret =0 , size, i, num; -u64 addr, addr_size; +struct resource *res; +int ret =0 ; + +/* allocate a resource array */ + res =kcalloc (3 ,sizeof (*res),GFP_KERNEL ); +if (!res) +return -ENOMEM ;for_each_available_child_of_node (np, child) { -struct resource *res_iter;struct platform_device *new_pdev; - cell =of_get_property (child,"reg" , &size); -if (!cell) { - ret = -EINVAL ; + ret =of_address_to_resource (child,0 , &res[0 ]); +if (!ret) goto out; - } - - size /=sizeof (*cell); - num = size / - (of_n_addr_cells (child) +of_n_size_cells (child)) +1 ; -/* allocate a resource array */ - res =kcalloc (num,sizeof (*res),GFP_KERNEL ); -if (!res) { - ret = -ENOMEM ; + ret =of_address_to_resource (child,1 , &res[1 ]); +if (!ret) goto out; - } - -/* read each reg value */ - i =0 ; - res_iter = res; -while (i < size) { - addr =of_read_number (&cell[i], -of_n_addr_cells (child)); - i +=of_n_addr_cells (child); - - addr_size =of_read_number (&cell[i], -of_n_size_cells (child)); - i +=of_n_size_cells (child); - - res_iter->start = addr; - res_iter->end = res_iter->start + addr_size -1 ; - res_iter->flags =IORESOURCE_MEM ; - res_iter++; - } - ret =of_irq_parse_one (child,0 , &out_irq); -if (ret) + ret =of_irq_to_resource (child,0 , &res[2 ]); +if (ret <=0 ) goto out; - res_iter->start =irq_create_of_mapping (&out_irq); - res_iter->name ="hidma event irq" ; - res_iter->flags =IORESOURCE_IRQ ; -memset (&pdevinfo,0 ,sizeof (pdevinfo)); pdevinfo.fwnode = &child->fwnode; pdevinfo.parent = pdev_parent ? &pdev_parent->dev :NULL ; pdevinfo.name = child->name; pdevinfo.id = object_counter++; pdevinfo.res = res; - pdevinfo.num_res = num; + pdevinfo.num_res =3 ; pdevinfo.data =NULL ; pdevinfo.size_data =0 ; pdevinfo.dma_mask =DMA_BIT_MASK (64 );
@@ -434,8 +405,6 @@ static int __init hidma_mgmt_of_populate_channels(struct device_node *np)*/ of_msi_configure (&new_pdev->dev, child);of_node_put (child); -kfree (res); - res =NULL ; } out:kfree (res);
Quoted 17 lines · Rob Herring
The hidma driver open codes populating address and IRQ resources from DT. We have standard functions
of_address_to_resourceandof_irq_to_resourcefor this, so use them instead.The DT binding states each child should have 2 addresses and 1 IRQ, so we can simplify the logic and do a fixed size resource allocation. Using the standard
of_address_to_resourcewill also do any address translation which was missing.Cc Andy Gross <[email protected]>Cc David Brown <[email protected]>Cc Dan Williams <[email protected]>Cc Vinod Koul <[email protected]>Signed-off-by Rob Herring <[email protected]>
Quoted 3 lines
--- drivers/dma/qcom/hidma_mgmt.c | 61 +++++++++++-------------------------------- 1 file changed, 15 insertions(+), 46 deletions(-)
Thanks, this certainly looks cleaner. Mine was mostly copy/paste from other examples.
Vinod Koul
AppliedQuoted 8 lines · Rob Herring
The hidma driver open codes populating address and IRQ resources from DT. We have standard functions
of_address_to_resourceandof_irq_to_resourcefor this, so use them instead.The DT binding states each child should have 2 addresses and 1 IRQ, so we can simplify the logic and do a fixed size resource allocation. Using the standard
of_address_to_resourcewill also do any address translation which was missing.
Applied, thanks
Signature · 1 line
~Vinod