diff --git a/drivers/remoteproc/adi_remoteproc.c b/drivers/remoteproc/adi_remoteproc.c index ce5235591ced25..b084ad710927e2 100644 --- a/drivers/remoteproc/adi_remoteproc.c +++ b/drivers/remoteproc/adi_remoteproc.c @@ -533,7 +533,6 @@ static int adi_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw) struct device_node *np = dev->of_node; struct sharc_resource_table *rsc_table; struct rproc_mem_entry *mem; - struct device_node *node; struct reserved_mem *rmem; phys_addr_t size; int ret, i, mem_regions, num; @@ -569,9 +568,8 @@ static int adi_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw) */ mem_regions = of_count_phandle_with_args(np, "vdev-vring", NULL); for (i = 0; i < mem_regions; i++) { - node = of_parse_phandle(np, "vdev-vring", i); + struct device_node *node __free(device_node) = of_parse_phandle(np, "vdev-vring", i); rmem = of_reserved_mem_lookup(node); - of_node_put(node); if (!rmem) { dev_err(dev, "Failed to acquire vdev-vring at idx %d\n", i); return -EINVAL; @@ -613,7 +611,8 @@ static int adi_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw) if (i > 0) { continue; } else { - /* Calc how many buffers we can fit in the vring region, + /* + * Calc how many buffers we can fit in the vring region, * number of buffers must be power of 2 */ for (num = 2; num < 0x00400000; num <<= 1) { @@ -640,7 +639,7 @@ static int adi_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw) */ mem_regions = of_count_phandle_with_args(np, "memory-region", NULL); for (i = 0; i < mem_regions; i++) { - node = of_parse_phandle(np, "memory-region", i); + struct device_node *node __free(device_node) = of_parse_phandle(np, "memory-region", i); rmem = of_reserved_mem_lookup(node); mem = rproc_of_resm_mem_entry_init(dev, i, rmem->size, rmem->base, "vdev%dbuffer", i); @@ -687,7 +686,8 @@ static struct resource_table *adi_rproc_find_loaded_rsc_table(struct rproc *rpro return ret; } -/* @todo store number of vrings from resource table and use it to dynamically +/* + * @todo store number of vrings from resource table and use it to dynamically * notify the correct number of vrings */ static irqreturn_t sharc_virtio_irq_threaded_handler(int irq, void *p) @@ -813,92 +813,75 @@ static int adi_remoteproc_probe(struct platform_device *pdev) const char *name; ret = of_property_read_string(np, "firmware-name", &name); - if (ret) { - dev_err(dev, "Unable to get firmware-name property\n"); - return ret; - } + if (ret) + return dev_err_probe(dev, ret, "Unable to get firmware-name property\n"); ret = of_property_read_u32(np, "core-id", &core_id); - if (ret) { - dev_err(dev, "Unable to get core-id property\n"); - return ret; - } + if (ret) + return dev_err_probe(dev, ret, "Unable to get core-id property\n"); - rproc = rproc_alloc(dev, np->name, &adi_rproc_ops, - name, sizeof(*rproc_data)); - if (!rproc) { - dev_err(dev, "Unable to allocate remoteproc\n"); + rproc = devm_rproc_alloc(dev, np->name, &adi_rproc_ops, + name, sizeof(*rproc_data)); + if (!rproc) return -ENOMEM; - } rproc_data = (struct adi_rproc_data *)rproc->priv; platform_set_drvdata(pdev, rproc); ret = of_parse_phandle_with_fixed_args(np, "adi,svect", 1, 0, &svect_args); - if (ret) { - dev_err(dev, "Missing adi,svect property\n"); - goto free_rproc; - } + if (ret) + return dev_err_probe(dev, ret, "Missing adi,svect property\n"); + rproc_data->svect_regmap = syscon_node_to_regmap(svect_args.np); of_node_put(svect_args.np); - if (IS_ERR(rproc_data->svect_regmap)) { - dev_err(dev, "Unable to get SVECT regmap\n"); - ret = PTR_ERR(rproc_data->svect_regmap); - goto free_rproc; - } + if (IS_ERR(rproc_data->svect_regmap)) + return dev_err_probe(dev, PTR_ERR(rproc_data->svect_regmap), + "Unable to get SVECT regmap\n"); + rproc_data->svect_offset = svect_args.args[0]; rproc_data->rst_crst = devm_reset_control_get_exclusive(dev, "crst"); - if (IS_ERR(rproc_data->rst_crst)) { - dev_err(dev, "Unable to get crst reset control\n"); - ret = PTR_ERR(rproc_data->rst_crst); - goto free_rproc; - } + if (IS_ERR(rproc_data->rst_crst)) + return dev_err_probe(dev, PTR_ERR(rproc_data->rst_crst), + "Unable to get crst reset control\n"); rproc_data->rst_start = devm_reset_control_get_exclusive(dev, "start"); - if (IS_ERR(rproc_data->rst_start)) { - dev_err(dev, "Unable to get start reset control\n"); - ret = PTR_ERR(rproc_data->rst_start); - goto free_rproc; - } + if (IS_ERR(rproc_data->rst_start)) + return dev_err_probe(dev, PTR_ERR(rproc_data->rst_start), + "Unable to get start reset control\n"); ret = reset_control_status(rproc_data->rst_start); - if (ret < 0) { - dev_err(dev, "Unable to read core status\n"); - goto free_rproc; - } else if (ret == 0) { - dev_err(dev, "Error: Core%d not idle\n", core_id); - ret = -EBUSY; - goto free_rproc; - } + if (ret < 0) + return dev_err_probe(dev, ret, "Unable to read core status\n"); + else if (ret == 0) + return dev_err_probe(dev, -EBUSY, + "Error: Core%d not idle\n", core_id); rproc_data->kick_client.dev = dev; rproc_data->kick_client.tx_block = false; rproc_data->kick_chan = mbox_request_channel_byname(&rproc_data->kick_client, "kick"); - if (IS_ERR(rproc_data->kick_chan)) { - ret = PTR_ERR(rproc_data->kick_chan); - if (ret != -EPROBE_DEFER) - dev_err(dev, "Unable to get kick mailbox channel\n"); - goto free_rproc; - } + if (IS_ERR(rproc_data->kick_chan)) + return dev_err_probe(dev, PTR_ERR(rproc_data->kick_chan), + "Unable to get kick mailbox channel\n"); - /* for now device addresses are represented as 32 bits and expanded to 64 + /* + * for now device addresses are represented as 32 bits and expanded to 64 * here in driver code */ if (of_property_read_u32_array(np, "adi,l1-da", addr, 2)) { - dev_err(dev, "Missing adi,l1-da with L1 device address range information\n"); - ret = -ENODEV; + ret = dev_err_probe(dev, -ENODEV, + "Missing adi,l1-da with L1 device address range information\n"); goto free_mbox; } rproc_data->l1_da_range[0] = addr[0]; rproc_data->l1_da_range[1] = addr[1]; if (of_property_read_u32_array(np, "adi,l2-da", addr, 2)) { - dev_err(dev, "Missing adi,l2-da with L2 device address range information\n"); - ret = -ENODEV; + ret = dev_err_probe(dev, -ENODEV, + "Missing adi,l2-da with L2 device address range information\n"); goto free_mbox; } rproc_data->l2_da_range[0] = addr[0]; @@ -910,25 +893,20 @@ static int adi_remoteproc_probe(struct platform_device *pdev) dev_info(&pdev->dev, "Resource table set, enable rpmsg\n"); rmem = of_reserved_mem_lookup(node); of_node_put(node); - if (!rmem) { - dev_err(&pdev->dev, "Translating adi,rsc-table failed\n"); - ret = -ENOMEM; + if (!rmem) goto free_mbox; - } rproc_data->adi_rsc_table = devm_ioremap_wc(dev, rmem->base, rmem->size); - if (IS_ERR(rproc_data->adi_rsc_table)) { - dev_err(dev, "Can't map adi,rsc-table\n"); - ret = PTR_ERR(rproc_data->adi_rsc_table); + if (!rproc_data->adi_rsc_table) { + ret = -ENOMEM; goto free_mbox; } rproc_data->icc_irq = platform_get_irq(pdev, 0); if (rproc_data->icc_irq <= 0) { - dev_err(dev, "No ICC IRQ specified\n"); - ret = -ENOENT; + ret = dev_err_probe(dev, -ENOENT, "No ICC IRQ specified\n"); goto free_mbox; } @@ -940,39 +918,33 @@ static int adi_remoteproc_probe(struct platform_device *pdev) rproc_data->core_workqueue = alloc_workqueue("Core workqueue", WQ_UNBOUND | WQ_MEM_RECLAIM, 1); - if (!rproc_data->core_workqueue) { - dev_err(dev, "Unable to allocate core workqueue\n"); - ret = -ENOMEM; + if (!rproc_data->core_workqueue) goto free_mbox; - } res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { - dev_err(dev, "Cannot get L1 base address (reg 0)\n"); - ret = -ENODEV; + ret = dev_err_probe(dev, -ENODEV, "Cannot get L1 base address (reg 0)\n"); goto free_workqueue; } rproc_data->L1_shared_base = devm_ioremap_wc(dev, res->start, resource_size(res)); - if (IS_ERR(rproc_data->L1_shared_base)) { - dev_err(dev, "Cannot map L1 shared memory\n"); - ret = PTR_ERR(rproc_data->L1_shared_base); + if (!rproc_data->L1_shared_base) { + ret = -ENOMEM; goto free_workqueue; } res = platform_get_resource(pdev, IORESOURCE_MEM, 1); if (!res) { - dev_err(dev, "Cannot get L2 base address (reg 1)\n"); - ret = -ENODEV; + ret = dev_err_probe(dev, -ENODEV, "Cannot get L2 base address (reg 1)\n"); goto free_workqueue; } rproc_data->L2_shared_base = devm_ioremap_wc(dev, res->start, resource_size(res)); - if (IS_ERR(rproc_data->L2_shared_base)) { + if (!rproc_data->L2_shared_base) { dev_err(dev, "Cannot map L2 shared memory\n"); - ret = PTR_ERR(rproc_data->L2_shared_base); + ret = -ENOMEM; goto free_workqueue; } @@ -991,25 +963,25 @@ static int adi_remoteproc_probe(struct platform_device *pdev) rproc_data->ldr_load_addr = SHARC_IDLE_ADDR; rproc_data->rpmsg_state = ADI_RP_RPMSG_TIMED_OUT; + dmaengine_get(); + ret = rproc_add(rproc); if (ret) { - dev_err(dev, "Failed to add rproc\n"); - goto free_workqueue; + dev_err_probe(dev, ret, "Failed to add rproc\n"); + goto put_dmaengine; } - dmaengine_get(); - return 0; +put_dmaengine: + dmaengine_put(); + free_workqueue: destroy_workqueue(rproc_data->core_workqueue); free_mbox: mbox_free_channel(rproc_data->kick_chan); -free_rproc: - rproc_free(rproc); - return ret; } @@ -1018,16 +990,15 @@ static void adi_remoteproc_remove(struct platform_device *pdev) struct rproc *rproc = platform_get_drvdata(pdev); struct adi_rproc_data *rproc_data = rproc->priv; + rproc_del(rproc); dmaengine_put(); destroy_workqueue(rproc_data->core_workqueue); mbox_free_channel(rproc_data->kick_chan); - rproc_del(rproc); - rproc_free(rproc); } static const struct of_device_id adi_rproc_of_match[] = { { .compatible = "adi,remoteproc" }, - { }, + { } }; MODULE_DEVICE_TABLE(of, adi_rproc_of_match); @@ -1036,7 +1007,7 @@ static struct platform_driver adi_rproc_driver = { .remove = adi_remoteproc_remove, .driver = { .name = "adi_remoteproc", - .of_match_table = of_match_ptr(adi_rproc_of_match), + .of_match_table = adi_rproc_of_match, }, }; module_platform_driver(adi_rproc_driver);