Commit 3cda7799 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'rproc-v5.7-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/andersson/remoteproc

Pull remoteproc fixes from Bjorn Andersson:
 "This fixes a regression in the probe error path of the Qualcomm modem
  remoteproc driver and a mix up of phy_addr_t and dma_addr_t in the
  Mediatek SCP control driver"

* tag 'rproc-v5.7-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/andersson/remoteproc:
  remoteproc: mtk_scp: use dma_addr_t for DMA API
  remoteproc: qcom_q6v5_mss: fix q6v5_probe() error paths
  remoteproc: qcom_q6v5_mss: fix a bug in q6v5_probe()
parents 6a400063 c2781e4d
...@@ -68,7 +68,7 @@ struct mtk_scp { ...@@ -68,7 +68,7 @@ struct mtk_scp {
wait_queue_head_t ack_wq; wait_queue_head_t ack_wq;
void __iomem *cpu_addr; void __iomem *cpu_addr;
phys_addr_t phys_addr; dma_addr_t dma_addr;
size_t dram_size; size_t dram_size;
struct rproc_subdev *rpmsg_subdev; struct rproc_subdev *rpmsg_subdev;
......
...@@ -330,7 +330,7 @@ static void *scp_da_to_va(struct rproc *rproc, u64 da, size_t len) ...@@ -330,7 +330,7 @@ static void *scp_da_to_va(struct rproc *rproc, u64 da, size_t len)
if (offset >= 0 && (offset + len) < scp->sram_size) if (offset >= 0 && (offset + len) < scp->sram_size)
return (void __force *)scp->sram_base + offset; return (void __force *)scp->sram_base + offset;
} else { } else {
offset = da - scp->phys_addr; offset = da - scp->dma_addr;
if (offset >= 0 && (offset + len) < scp->dram_size) if (offset >= 0 && (offset + len) < scp->dram_size)
return (void __force *)scp->cpu_addr + offset; return (void __force *)scp->cpu_addr + offset;
} }
...@@ -451,7 +451,7 @@ static int scp_map_memory_region(struct mtk_scp *scp) ...@@ -451,7 +451,7 @@ static int scp_map_memory_region(struct mtk_scp *scp)
/* Reserved SCP code size */ /* Reserved SCP code size */
scp->dram_size = MAX_CODE_SIZE; scp->dram_size = MAX_CODE_SIZE;
scp->cpu_addr = dma_alloc_coherent(scp->dev, scp->dram_size, scp->cpu_addr = dma_alloc_coherent(scp->dev, scp->dram_size,
&scp->phys_addr, GFP_KERNEL); &scp->dma_addr, GFP_KERNEL);
if (!scp->cpu_addr) if (!scp->cpu_addr)
return -ENOMEM; return -ENOMEM;
...@@ -461,7 +461,7 @@ static int scp_map_memory_region(struct mtk_scp *scp) ...@@ -461,7 +461,7 @@ static int scp_map_memory_region(struct mtk_scp *scp)
static void scp_unmap_memory_region(struct mtk_scp *scp) static void scp_unmap_memory_region(struct mtk_scp *scp)
{ {
dma_free_coherent(scp->dev, scp->dram_size, scp->cpu_addr, dma_free_coherent(scp->dev, scp->dram_size, scp->cpu_addr,
scp->phys_addr); scp->dma_addr);
of_reserved_mem_device_release(scp->dev); of_reserved_mem_device_release(scp->dev);
} }
......
...@@ -367,7 +367,7 @@ static int q6v5_pds_enable(struct q6v5 *qproc, struct device **pds, ...@@ -367,7 +367,7 @@ static int q6v5_pds_enable(struct q6v5 *qproc, struct device **pds,
} }
return ret; return ret;
}; }
static void q6v5_pds_disable(struct q6v5 *qproc, struct device **pds, static void q6v5_pds_disable(struct q6v5 *qproc, struct device **pds,
size_t pd_count) size_t pd_count)
...@@ -1527,7 +1527,7 @@ static int q6v5_pds_attach(struct device *dev, struct device **devs, ...@@ -1527,7 +1527,7 @@ static int q6v5_pds_attach(struct device *dev, struct device **devs,
dev_pm_domain_detach(devs[i], false); dev_pm_domain_detach(devs[i], false);
return ret; return ret;
}; }
static void q6v5_pds_detach(struct q6v5 *qproc, struct device **pds, static void q6v5_pds_detach(struct q6v5 *qproc, struct device **pds,
size_t pd_count) size_t pd_count)
...@@ -1675,7 +1675,7 @@ static int q6v5_probe(struct platform_device *pdev) ...@@ -1675,7 +1675,7 @@ static int q6v5_probe(struct platform_device *pdev)
ret = of_property_read_string_index(pdev->dev.of_node, "firmware-name", ret = of_property_read_string_index(pdev->dev.of_node, "firmware-name",
1, &qproc->hexagon_mdt_image); 1, &qproc->hexagon_mdt_image);
if (ret < 0 && ret != -EINVAL) if (ret < 0 && ret != -EINVAL)
return ret; goto free_rproc;
platform_set_drvdata(pdev, qproc); platform_set_drvdata(pdev, qproc);
...@@ -1766,17 +1766,23 @@ static int q6v5_probe(struct platform_device *pdev) ...@@ -1766,17 +1766,23 @@ static int q6v5_probe(struct platform_device *pdev)
qproc->sysmon = qcom_add_sysmon_subdev(rproc, "modem", 0x12); qproc->sysmon = qcom_add_sysmon_subdev(rproc, "modem", 0x12);
if (IS_ERR(qproc->sysmon)) { if (IS_ERR(qproc->sysmon)) {
ret = PTR_ERR(qproc->sysmon); ret = PTR_ERR(qproc->sysmon);
goto detach_proxy_pds; goto remove_subdevs;
} }
ret = rproc_add(rproc); ret = rproc_add(rproc);
if (ret) if (ret)
goto detach_proxy_pds; goto remove_sysmon_subdev;
return 0; return 0;
detach_proxy_pds: remove_sysmon_subdev:
qcom_remove_sysmon_subdev(qproc->sysmon);
remove_subdevs:
qcom_remove_ipa_notify_subdev(qproc->rproc, &qproc->ipa_notify_subdev); qcom_remove_ipa_notify_subdev(qproc->rproc, &qproc->ipa_notify_subdev);
qcom_remove_ssr_subdev(rproc, &qproc->ssr_subdev);
qcom_remove_smd_subdev(rproc, &qproc->smd_subdev);
qcom_remove_glink_subdev(rproc, &qproc->glink_subdev);
detach_proxy_pds:
q6v5_pds_detach(qproc, qproc->proxy_pds, qproc->proxy_pd_count); q6v5_pds_detach(qproc, qproc->proxy_pds, qproc->proxy_pd_count);
detach_active_pds: detach_active_pds:
q6v5_pds_detach(qproc, qproc->active_pds, qproc->active_pd_count); q6v5_pds_detach(qproc, qproc->active_pds, qproc->active_pd_count);
...@@ -1789,19 +1795,20 @@ static int q6v5_probe(struct platform_device *pdev) ...@@ -1789,19 +1795,20 @@ static int q6v5_probe(struct platform_device *pdev)
static int q6v5_remove(struct platform_device *pdev) static int q6v5_remove(struct platform_device *pdev)
{ {
struct q6v5 *qproc = platform_get_drvdata(pdev); struct q6v5 *qproc = platform_get_drvdata(pdev);
struct rproc *rproc = qproc->rproc;
rproc_del(qproc->rproc); rproc_del(rproc);
qcom_remove_sysmon_subdev(qproc->sysmon); qcom_remove_sysmon_subdev(qproc->sysmon);
qcom_remove_ipa_notify_subdev(qproc->rproc, &qproc->ipa_notify_subdev); qcom_remove_ipa_notify_subdev(rproc, &qproc->ipa_notify_subdev);
qcom_remove_glink_subdev(qproc->rproc, &qproc->glink_subdev); qcom_remove_ssr_subdev(rproc, &qproc->ssr_subdev);
qcom_remove_smd_subdev(qproc->rproc, &qproc->smd_subdev); qcom_remove_smd_subdev(rproc, &qproc->smd_subdev);
qcom_remove_ssr_subdev(qproc->rproc, &qproc->ssr_subdev); qcom_remove_glink_subdev(rproc, &qproc->glink_subdev);
q6v5_pds_detach(qproc, qproc->active_pds, qproc->active_pd_count);
q6v5_pds_detach(qproc, qproc->proxy_pds, qproc->proxy_pd_count); q6v5_pds_detach(qproc, qproc->proxy_pds, qproc->proxy_pd_count);
q6v5_pds_detach(qproc, qproc->active_pds, qproc->active_pd_count);
rproc_free(qproc->rproc); rproc_free(rproc);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment