Commit 02676ecc authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'rproc-v6.5' of git://git.kernel.org/pub/scm/linux/kernel/git/remoteproc/linux

Pull remoteproc updates from Bjorn Andersson:
 "The bulk of these patches relates to the moving to a void-returning
  remove callback.

  The i.MX HiFi remoteproc driver gets its pm_ops helpers updated to
  resolve build warnings about 'defined but not used' variables in
  certain configurations.

  The ST STM32 remoteproc driver is extended to allow using a SCMI reset
  controller to hold boot, and has an error message corrected.

  The Qualcomm Q6V5 PAS driver gains a missing 'static' qualifier on
  adsp_segment_dump()"

* tag 'rproc-v6.5' of git://git.kernel.org/pub/scm/linux/kernel/git/remoteproc/linux: (23 commits)
  remoteproc: qcom_q6v5_pas: staticize adsp_segment_dump()
  remoteproc: stm32: Fix error code in stm32_rproc_parse_dt()
  remoteproc: stm32: Allow hold boot management by the SCMI reset controller
  dt-bindings: remoteproc: st,stm32-rproc: Rework reset declarations
  remoteproc: imx_dsp_rproc: use modern pm_ops
  remoteproc: wkup_m3: Convert to platform remove callback returning void
  remoteproc: stm32: Convert to platform remove callback returning void
  remoteproc: st: Convert to platform remove callback returning void
  remoteproc: virtio: Convert to platform remove callback returning void
  remoteproc: rcar: Convert to platform remove callback returning void
  remoteproc: qcom_wcnss: Convert to platform remove callback returning void
  remoteproc: qcom_q6v5_wcss: Convert to platform remove callback returning void
  remoteproc: qcom_q6v5_pas: Convert to platform remove callback returning void
  remoteproc: qcom_q6v5_mss: Convert to platform remove callback returning void
  remoteproc: qcom_q6v5_adsp: Convert to platform remove callback returning void
  remoteproc: pru: Convert to platform remove callback returning void
  remoteproc: omap: Convert to platform remove callback returning void
  remoteproc: mtk_scp: Convert to platform remove callback returning void
  remoteproc: meson_mx_ao_arc: Convert to platform remove callback returning void
  remoteproc: keystone: Convert to platform remove callback returning void
  ...
parents 6afb24a0 181da4bc
...@@ -25,7 +25,14 @@ properties: ...@@ -25,7 +25,14 @@ properties:
maxItems: 3 maxItems: 3
resets: resets:
maxItems: 1 minItems: 1
maxItems: 2
reset-names:
items:
- const: mcu_rst
- const: hold_boot
minItems: 1
st,syscfg-holdboot: st,syscfg-holdboot:
description: remote processor reset hold boot description: remote processor reset hold boot
...@@ -37,6 +44,7 @@ properties: ...@@ -37,6 +44,7 @@ properties:
- description: The field mask of the hold boot - description: The field mask of the hold boot
st,syscfg-tz: st,syscfg-tz:
deprecated: true
description: description:
Reference to the system configuration which holds the RCC trust zone mode Reference to the system configuration which holds the RCC trust zone mode
$ref: /schemas/types.yaml#/definitions/phandle-array $ref: /schemas/types.yaml#/definitions/phandle-array
...@@ -135,22 +143,48 @@ required: ...@@ -135,22 +143,48 @@ required:
- compatible - compatible
- reg - reg
- resets - resets
allOf:
- if:
properties:
reset-names:
not:
contains:
const: hold_boot
then:
required:
- st,syscfg-holdboot - st,syscfg-holdboot
- st,syscfg-tz else:
properties:
st,syscfg-holdboot: false
additionalProperties: false additionalProperties: false
examples: examples:
- | - |
#include <dt-bindings/reset/stm32mp1-resets.h> #include <dt-bindings/reset/stm32mp1-resets.h>
m4_rproc: m4@10000000 { m4@10000000 {
compatible = "st,stm32mp1-m4"; compatible = "st,stm32mp1-m4";
reg = <0x10000000 0x40000>, reg = <0x10000000 0x40000>,
<0x30000000 0x40000>, <0x30000000 0x40000>,
<0x38000000 0x10000>; <0x38000000 0x10000>;
resets = <&rcc MCU_R>; resets = <&rcc MCU_R>;
reset-names = "mcu_rst";
/* Hold boot managed using system config*/
st,syscfg-holdboot = <&rcc 0x10C 0x1>; st,syscfg-holdboot = <&rcc 0x10C 0x1>;
st,syscfg-tz = <&rcc 0x000 0x1>; st,syscfg-rsc-tbl = <&tamp 0x144 0xFFFFFFFF>;
st,syscfg-m4-state = <&tamp 0x148 0xFFFFFFFF>;
};
- |
#include <dt-bindings/reset/stm32mp1-resets.h>
m4@10000000 {
compatible = "st,stm32mp1-m4";
reg = <0x10000000 0x40000>,
<0x30000000 0x40000>,
<0x38000000 0x10000>;
/* Hold boot managed using SCMI reset controller */
resets = <&scmi MCU_R>, <&scmi MCU_HOLD_BOOT_R>;
reset-names = "mcu_rst", "hold_boot";
st,syscfg-rsc-tbl = <&tamp 0x144 0xFFFFFFFF>; st,syscfg-rsc-tbl = <&tamp 0x144 0xFFFFFFFF>;
st,syscfg-m4-state = <&tamp 0x148 0xFFFFFFFF>; st,syscfg-m4-state = <&tamp 0x148 0xFFFFFFFF>;
}; };
......
...@@ -357,7 +357,7 @@ static int da8xx_rproc_probe(struct platform_device *pdev) ...@@ -357,7 +357,7 @@ static int da8xx_rproc_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int da8xx_rproc_remove(struct platform_device *pdev) static void da8xx_rproc_remove(struct platform_device *pdev)
{ {
struct rproc *rproc = platform_get_drvdata(pdev); struct rproc *rproc = platform_get_drvdata(pdev);
struct da8xx_rproc *drproc = rproc->priv; struct da8xx_rproc *drproc = rproc->priv;
...@@ -374,8 +374,6 @@ static int da8xx_rproc_remove(struct platform_device *pdev) ...@@ -374,8 +374,6 @@ static int da8xx_rproc_remove(struct platform_device *pdev)
rproc_free(rproc); rproc_free(rproc);
if (dev->of_node) if (dev->of_node)
of_reserved_mem_device_release(dev); of_reserved_mem_device_release(dev);
return 0;
} }
static const struct of_device_id davinci_rproc_of_match[] __maybe_unused = { static const struct of_device_id davinci_rproc_of_match[] __maybe_unused = {
...@@ -386,7 +384,7 @@ MODULE_DEVICE_TABLE(of, davinci_rproc_of_match); ...@@ -386,7 +384,7 @@ MODULE_DEVICE_TABLE(of, davinci_rproc_of_match);
static struct platform_driver da8xx_rproc_driver = { static struct platform_driver da8xx_rproc_driver = {
.probe = da8xx_rproc_probe, .probe = da8xx_rproc_probe,
.remove = da8xx_rproc_remove, .remove_new = da8xx_rproc_remove,
.driver = { .driver = {
.name = "davinci-rproc", .name = "davinci-rproc",
.of_match_table = of_match_ptr(davinci_rproc_of_match), .of_match_table = of_match_ptr(davinci_rproc_of_match),
......
...@@ -1161,7 +1161,7 @@ static int imx_dsp_rproc_probe(struct platform_device *pdev) ...@@ -1161,7 +1161,7 @@ static int imx_dsp_rproc_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int imx_dsp_rproc_remove(struct platform_device *pdev) static void imx_dsp_rproc_remove(struct platform_device *pdev)
{ {
struct rproc *rproc = platform_get_drvdata(pdev); struct rproc *rproc = platform_get_drvdata(pdev);
struct imx_dsp_rproc *priv = rproc->priv; struct imx_dsp_rproc *priv = rproc->priv;
...@@ -1170,8 +1170,6 @@ static int imx_dsp_rproc_remove(struct platform_device *pdev) ...@@ -1170,8 +1170,6 @@ static int imx_dsp_rproc_remove(struct platform_device *pdev)
rproc_del(rproc); rproc_del(rproc);
imx_dsp_detach_pm_domains(priv); imx_dsp_detach_pm_domains(priv);
rproc_free(rproc); rproc_free(rproc);
return 0;
} }
/* pm runtime functions */ /* pm runtime functions */
...@@ -1243,7 +1241,7 @@ static void imx_dsp_load_firmware(const struct firmware *fw, void *context) ...@@ -1243,7 +1241,7 @@ static void imx_dsp_load_firmware(const struct firmware *fw, void *context)
release_firmware(fw); release_firmware(fw);
} }
static __maybe_unused int imx_dsp_suspend(struct device *dev) static int imx_dsp_suspend(struct device *dev)
{ {
struct rproc *rproc = dev_get_drvdata(dev); struct rproc *rproc = dev_get_drvdata(dev);
struct imx_dsp_rproc *priv = rproc->priv; struct imx_dsp_rproc *priv = rproc->priv;
...@@ -1278,7 +1276,7 @@ static __maybe_unused int imx_dsp_suspend(struct device *dev) ...@@ -1278,7 +1276,7 @@ static __maybe_unused int imx_dsp_suspend(struct device *dev)
return pm_runtime_force_suspend(dev); return pm_runtime_force_suspend(dev);
} }
static __maybe_unused int imx_dsp_resume(struct device *dev) static int imx_dsp_resume(struct device *dev)
{ {
struct rproc *rproc = dev_get_drvdata(dev); struct rproc *rproc = dev_get_drvdata(dev);
int ret = 0; int ret = 0;
...@@ -1312,9 +1310,8 @@ static __maybe_unused int imx_dsp_resume(struct device *dev) ...@@ -1312,9 +1310,8 @@ static __maybe_unused int imx_dsp_resume(struct device *dev)
} }
static const struct dev_pm_ops imx_dsp_rproc_pm_ops = { static const struct dev_pm_ops imx_dsp_rproc_pm_ops = {
SET_SYSTEM_SLEEP_PM_OPS(imx_dsp_suspend, imx_dsp_resume) SYSTEM_SLEEP_PM_OPS(imx_dsp_suspend, imx_dsp_resume)
SET_RUNTIME_PM_OPS(imx_dsp_runtime_suspend, RUNTIME_PM_OPS(imx_dsp_runtime_suspend, imx_dsp_runtime_resume, NULL)
imx_dsp_runtime_resume, NULL)
}; };
static const struct of_device_id imx_dsp_rproc_of_match[] = { static const struct of_device_id imx_dsp_rproc_of_match[] = {
...@@ -1328,11 +1325,11 @@ MODULE_DEVICE_TABLE(of, imx_dsp_rproc_of_match); ...@@ -1328,11 +1325,11 @@ MODULE_DEVICE_TABLE(of, imx_dsp_rproc_of_match);
static struct platform_driver imx_dsp_rproc_driver = { static struct platform_driver imx_dsp_rproc_driver = {
.probe = imx_dsp_rproc_probe, .probe = imx_dsp_rproc_probe,
.remove = imx_dsp_rproc_remove, .remove_new = imx_dsp_rproc_remove,
.driver = { .driver = {
.name = "imx-dsp-rproc", .name = "imx-dsp-rproc",
.of_match_table = imx_dsp_rproc_of_match, .of_match_table = imx_dsp_rproc_of_match,
.pm = &imx_dsp_rproc_pm_ops, .pm = pm_ptr(&imx_dsp_rproc_pm_ops),
}, },
}; };
module_platform_driver(imx_dsp_rproc_driver); module_platform_driver(imx_dsp_rproc_driver);
......
...@@ -1112,7 +1112,7 @@ static int imx_rproc_probe(struct platform_device *pdev) ...@@ -1112,7 +1112,7 @@ static int imx_rproc_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int imx_rproc_remove(struct platform_device *pdev) static void imx_rproc_remove(struct platform_device *pdev)
{ {
struct rproc *rproc = platform_get_drvdata(pdev); struct rproc *rproc = platform_get_drvdata(pdev);
struct imx_rproc *priv = rproc->priv; struct imx_rproc *priv = rproc->priv;
...@@ -1123,8 +1123,6 @@ static int imx_rproc_remove(struct platform_device *pdev) ...@@ -1123,8 +1123,6 @@ static int imx_rproc_remove(struct platform_device *pdev)
imx_rproc_free_mbox(rproc); imx_rproc_free_mbox(rproc);
destroy_workqueue(priv->workqueue); destroy_workqueue(priv->workqueue);
rproc_free(rproc); rproc_free(rproc);
return 0;
} }
static const struct of_device_id imx_rproc_of_match[] = { static const struct of_device_id imx_rproc_of_match[] = {
...@@ -1145,7 +1143,7 @@ MODULE_DEVICE_TABLE(of, imx_rproc_of_match); ...@@ -1145,7 +1143,7 @@ MODULE_DEVICE_TABLE(of, imx_rproc_of_match);
static struct platform_driver imx_rproc_driver = { static struct platform_driver imx_rproc_driver = {
.probe = imx_rproc_probe, .probe = imx_rproc_probe,
.remove = imx_rproc_remove, .remove_new = imx_rproc_remove,
.driver = { .driver = {
.name = "imx-rproc", .name = "imx-rproc",
.of_match_table = imx_rproc_of_match, .of_match_table = imx_rproc_of_match,
......
...@@ -476,7 +476,7 @@ static int keystone_rproc_probe(struct platform_device *pdev) ...@@ -476,7 +476,7 @@ static int keystone_rproc_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int keystone_rproc_remove(struct platform_device *pdev) static void keystone_rproc_remove(struct platform_device *pdev)
{ {
struct keystone_rproc *ksproc = platform_get_drvdata(pdev); struct keystone_rproc *ksproc = platform_get_drvdata(pdev);
...@@ -486,8 +486,6 @@ static int keystone_rproc_remove(struct platform_device *pdev) ...@@ -486,8 +486,6 @@ static int keystone_rproc_remove(struct platform_device *pdev)
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
rproc_free(ksproc->rproc); rproc_free(ksproc->rproc);
of_reserved_mem_device_release(&pdev->dev); of_reserved_mem_device_release(&pdev->dev);
return 0;
} }
static const struct of_device_id keystone_rproc_of_match[] = { static const struct of_device_id keystone_rproc_of_match[] = {
...@@ -501,7 +499,7 @@ MODULE_DEVICE_TABLE(of, keystone_rproc_of_match); ...@@ -501,7 +499,7 @@ MODULE_DEVICE_TABLE(of, keystone_rproc_of_match);
static struct platform_driver keystone_rproc_driver = { static struct platform_driver keystone_rproc_driver = {
.probe = keystone_rproc_probe, .probe = keystone_rproc_probe,
.remove = keystone_rproc_remove, .remove_new = keystone_rproc_remove,
.driver = { .driver = {
.name = "keystone-rproc", .name = "keystone-rproc",
.of_match_table = keystone_rproc_of_match, .of_match_table = keystone_rproc_of_match,
......
...@@ -228,15 +228,13 @@ static int meson_mx_ao_arc_rproc_probe(struct platform_device *pdev) ...@@ -228,15 +228,13 @@ static int meson_mx_ao_arc_rproc_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int meson_mx_ao_arc_rproc_remove(struct platform_device *pdev) static void meson_mx_ao_arc_rproc_remove(struct platform_device *pdev)
{ {
struct rproc *rproc = platform_get_drvdata(pdev); struct rproc *rproc = platform_get_drvdata(pdev);
struct meson_mx_ao_arc_rproc_priv *priv = rproc->priv; struct meson_mx_ao_arc_rproc_priv *priv = rproc->priv;
rproc_del(rproc); rproc_del(rproc);
gen_pool_free(priv->sram_pool, priv->sram_va, priv->sram_size); gen_pool_free(priv->sram_pool, priv->sram_va, priv->sram_size);
return 0;
} }
static const struct of_device_id meson_mx_ao_arc_rproc_match[] = { static const struct of_device_id meson_mx_ao_arc_rproc_match[] = {
...@@ -248,7 +246,7 @@ MODULE_DEVICE_TABLE(of, meson_mx_ao_arc_rproc_match); ...@@ -248,7 +246,7 @@ MODULE_DEVICE_TABLE(of, meson_mx_ao_arc_rproc_match);
static struct platform_driver meson_mx_ao_arc_rproc_driver = { static struct platform_driver meson_mx_ao_arc_rproc_driver = {
.probe = meson_mx_ao_arc_rproc_probe, .probe = meson_mx_ao_arc_rproc_probe,
.remove = meson_mx_ao_arc_rproc_remove, .remove_new = meson_mx_ao_arc_rproc_remove,
.driver = { .driver = {
.name = "meson-mx-ao-arc-rproc", .name = "meson-mx-ao-arc-rproc",
.of_match_table = meson_mx_ao_arc_rproc_match, .of_match_table = meson_mx_ao_arc_rproc_match,
......
...@@ -913,7 +913,7 @@ static int scp_probe(struct platform_device *pdev) ...@@ -913,7 +913,7 @@ static int scp_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int scp_remove(struct platform_device *pdev) static void scp_remove(struct platform_device *pdev)
{ {
struct mtk_scp *scp = platform_get_drvdata(pdev); struct mtk_scp *scp = platform_get_drvdata(pdev);
int i; int i;
...@@ -925,8 +925,6 @@ static int scp_remove(struct platform_device *pdev) ...@@ -925,8 +925,6 @@ static int scp_remove(struct platform_device *pdev)
for (i = 0; i < SCP_IPI_MAX; i++) for (i = 0; i < SCP_IPI_MAX; i++)
mutex_destroy(&scp->ipi_desc[i].lock); mutex_destroy(&scp->ipi_desc[i].lock);
mutex_destroy(&scp->send_lock); mutex_destroy(&scp->send_lock);
return 0;
} }
static const struct mtk_scp_of_data mt8183_of_data = { static const struct mtk_scp_of_data mt8183_of_data = {
...@@ -1003,7 +1001,7 @@ MODULE_DEVICE_TABLE(of, mtk_scp_of_match); ...@@ -1003,7 +1001,7 @@ MODULE_DEVICE_TABLE(of, mtk_scp_of_match);
static struct platform_driver mtk_scp_driver = { static struct platform_driver mtk_scp_driver = {
.probe = scp_probe, .probe = scp_probe,
.remove = scp_remove, .remove_new = scp_remove,
.driver = { .driver = {
.name = "mtk-scp", .name = "mtk-scp",
.of_match_table = mtk_scp_of_match, .of_match_table = mtk_scp_of_match,
......
...@@ -1363,15 +1363,13 @@ static int omap_rproc_probe(struct platform_device *pdev) ...@@ -1363,15 +1363,13 @@ static int omap_rproc_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int omap_rproc_remove(struct platform_device *pdev) static void omap_rproc_remove(struct platform_device *pdev)
{ {
struct rproc *rproc = platform_get_drvdata(pdev); struct rproc *rproc = platform_get_drvdata(pdev);
rproc_del(rproc); rproc_del(rproc);
rproc_free(rproc); rproc_free(rproc);
of_reserved_mem_device_release(&pdev->dev); of_reserved_mem_device_release(&pdev->dev);
return 0;
} }
static const struct dev_pm_ops omap_rproc_pm_ops = { static const struct dev_pm_ops omap_rproc_pm_ops = {
...@@ -1382,7 +1380,7 @@ static const struct dev_pm_ops omap_rproc_pm_ops = { ...@@ -1382,7 +1380,7 @@ static const struct dev_pm_ops omap_rproc_pm_ops = {
static struct platform_driver omap_rproc_driver = { static struct platform_driver omap_rproc_driver = {
.probe = omap_rproc_probe, .probe = omap_rproc_probe,
.remove = omap_rproc_remove, .remove_new = omap_rproc_remove,
.driver = { .driver = {
.name = "omap-rproc", .name = "omap-rproc",
.pm = &omap_rproc_pm_ops, .pm = &omap_rproc_pm_ops,
......
...@@ -1056,14 +1056,12 @@ static int pru_rproc_probe(struct platform_device *pdev) ...@@ -1056,14 +1056,12 @@ static int pru_rproc_probe(struct platform_device *pdev)
return 0; return 0;
} }
static int pru_rproc_remove(struct platform_device *pdev) static void pru_rproc_remove(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct rproc *rproc = platform_get_drvdata(pdev); struct rproc *rproc = platform_get_drvdata(pdev);
dev_dbg(dev, "%s: removing rproc %s\n", __func__, rproc->name); dev_dbg(dev, "%s: removing rproc %s\n", __func__, rproc->name);
return 0;
} }
static const struct pru_private_data pru_data = { static const struct pru_private_data pru_data = {
...@@ -1111,7 +1109,7 @@ static struct platform_driver pru_rproc_driver = { ...@@ -1111,7 +1109,7 @@ static struct platform_driver pru_rproc_driver = {
.suppress_bind_attrs = true, .suppress_bind_attrs = true,
}, },
.probe = pru_rproc_probe, .probe = pru_rproc_probe,
.remove = pru_rproc_remove, .remove_new = pru_rproc_remove,
}; };
module_platform_driver(pru_rproc_driver); module_platform_driver(pru_rproc_driver);
......
...@@ -763,7 +763,7 @@ static int adsp_probe(struct platform_device *pdev) ...@@ -763,7 +763,7 @@ static int adsp_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int adsp_remove(struct platform_device *pdev) static void adsp_remove(struct platform_device *pdev)
{ {
struct qcom_adsp *adsp = platform_get_drvdata(pdev); struct qcom_adsp *adsp = platform_get_drvdata(pdev);
...@@ -775,8 +775,6 @@ static int adsp_remove(struct platform_device *pdev) ...@@ -775,8 +775,6 @@ static int adsp_remove(struct platform_device *pdev)
qcom_remove_ssr_subdev(adsp->rproc, &adsp->ssr_subdev); qcom_remove_ssr_subdev(adsp->rproc, &adsp->ssr_subdev);
qcom_rproc_pds_detach(adsp, adsp->proxy_pds, adsp->proxy_pd_count); qcom_rproc_pds_detach(adsp, adsp->proxy_pds, adsp->proxy_pd_count);
rproc_free(adsp->rproc); rproc_free(adsp->rproc);
return 0;
} }
static const struct adsp_pil_data adsp_resource_init = { static const struct adsp_pil_data adsp_resource_init = {
...@@ -859,7 +857,7 @@ MODULE_DEVICE_TABLE(of, adsp_of_match); ...@@ -859,7 +857,7 @@ MODULE_DEVICE_TABLE(of, adsp_of_match);
static struct platform_driver adsp_pil_driver = { static struct platform_driver adsp_pil_driver = {
.probe = adsp_probe, .probe = adsp_probe,
.remove = adsp_remove, .remove_new = adsp_remove,
.driver = { .driver = {
.name = "qcom_q6v5_adsp", .name = "qcom_q6v5_adsp",
.of_match_table = adsp_of_match, .of_match_table = adsp_of_match,
......
...@@ -2110,7 +2110,7 @@ static int q6v5_probe(struct platform_device *pdev) ...@@ -2110,7 +2110,7 @@ static int q6v5_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int q6v5_remove(struct platform_device *pdev) static void 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; struct rproc *rproc = qproc->rproc;
...@@ -2128,8 +2128,6 @@ static int q6v5_remove(struct platform_device *pdev) ...@@ -2128,8 +2128,6 @@ static int q6v5_remove(struct platform_device *pdev)
q6v5_pds_detach(qproc, qproc->proxy_pds, qproc->proxy_pd_count); q6v5_pds_detach(qproc, qproc->proxy_pds, qproc->proxy_pd_count);
rproc_free(rproc); rproc_free(rproc);
return 0;
} }
static const struct rproc_hexagon_res sc7180_mss = { static const struct rproc_hexagon_res sc7180_mss = {
...@@ -2482,7 +2480,7 @@ MODULE_DEVICE_TABLE(of, q6v5_of_match); ...@@ -2482,7 +2480,7 @@ MODULE_DEVICE_TABLE(of, q6v5_of_match);
static struct platform_driver q6v5_driver = { static struct platform_driver q6v5_driver = {
.probe = q6v5_probe, .probe = q6v5_probe,
.remove = q6v5_remove, .remove_new = q6v5_remove,
.driver = { .driver = {
.name = "qcom-q6v5-mss", .name = "qcom-q6v5-mss",
.of_match_table = q6v5_of_match, .of_match_table = q6v5_of_match,
......
...@@ -105,7 +105,7 @@ struct qcom_adsp { ...@@ -105,7 +105,7 @@ struct qcom_adsp {
struct qcom_scm_pas_metadata dtb_pas_metadata; struct qcom_scm_pas_metadata dtb_pas_metadata;
}; };
void adsp_segment_dump(struct rproc *rproc, struct rproc_dump_segment *segment, static void adsp_segment_dump(struct rproc *rproc, struct rproc_dump_segment *segment,
void *dest, size_t offset, size_t size) void *dest, size_t offset, size_t size)
{ {
struct qcom_adsp *adsp = rproc->priv; struct qcom_adsp *adsp = rproc->priv;
...@@ -754,7 +754,7 @@ static int adsp_probe(struct platform_device *pdev) ...@@ -754,7 +754,7 @@ static int adsp_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int adsp_remove(struct platform_device *pdev) static void adsp_remove(struct platform_device *pdev)
{ {
struct qcom_adsp *adsp = platform_get_drvdata(pdev); struct qcom_adsp *adsp = platform_get_drvdata(pdev);
...@@ -769,8 +769,6 @@ static int adsp_remove(struct platform_device *pdev) ...@@ -769,8 +769,6 @@ static int adsp_remove(struct platform_device *pdev)
adsp_pds_detach(adsp, adsp->proxy_pds, adsp->proxy_pd_count); adsp_pds_detach(adsp, adsp->proxy_pds, adsp->proxy_pd_count);
device_init_wakeup(adsp->dev, false); device_init_wakeup(adsp->dev, false);
rproc_free(adsp->rproc); rproc_free(adsp->rproc);
return 0;
} }
static const struct adsp_data adsp_resource_init = { static const struct adsp_data adsp_resource_init = {
...@@ -1232,7 +1230,7 @@ MODULE_DEVICE_TABLE(of, adsp_of_match); ...@@ -1232,7 +1230,7 @@ MODULE_DEVICE_TABLE(of, adsp_of_match);
static struct platform_driver adsp_driver = { static struct platform_driver adsp_driver = {
.probe = adsp_probe, .probe = adsp_probe,
.remove = adsp_remove, .remove_new = adsp_remove,
.driver = { .driver = {
.name = "qcom_q6v5_pas", .name = "qcom_q6v5_pas",
.of_match_table = adsp_of_match, .of_match_table = adsp_of_match,
......
...@@ -1074,7 +1074,7 @@ static int q6v5_wcss_probe(struct platform_device *pdev) ...@@ -1074,7 +1074,7 @@ static int q6v5_wcss_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int q6v5_wcss_remove(struct platform_device *pdev) static void q6v5_wcss_remove(struct platform_device *pdev)
{ {
struct rproc *rproc = platform_get_drvdata(pdev); struct rproc *rproc = platform_get_drvdata(pdev);
struct q6v5_wcss *wcss = rproc->priv; struct q6v5_wcss *wcss = rproc->priv;
...@@ -1082,8 +1082,6 @@ static int q6v5_wcss_remove(struct platform_device *pdev) ...@@ -1082,8 +1082,6 @@ static int q6v5_wcss_remove(struct platform_device *pdev)
qcom_q6v5_deinit(&wcss->q6v5); qcom_q6v5_deinit(&wcss->q6v5);
rproc_del(rproc); rproc_del(rproc);
rproc_free(rproc); rproc_free(rproc);
return 0;
} }
static const struct wcss_data wcss_ipq8074_res_init = { static const struct wcss_data wcss_ipq8074_res_init = {
...@@ -1117,7 +1115,7 @@ MODULE_DEVICE_TABLE(of, q6v5_wcss_of_match); ...@@ -1117,7 +1115,7 @@ MODULE_DEVICE_TABLE(of, q6v5_wcss_of_match);
static struct platform_driver q6v5_wcss_driver = { static struct platform_driver q6v5_wcss_driver = {
.probe = q6v5_wcss_probe, .probe = q6v5_wcss_probe,
.remove = q6v5_wcss_remove, .remove_new = q6v5_wcss_remove,
.driver = { .driver = {
.name = "qcom-q6v5-wcss-pil", .name = "qcom-q6v5-wcss-pil",
.of_match_table = q6v5_wcss_of_match, .of_match_table = q6v5_wcss_of_match,
......
...@@ -666,7 +666,7 @@ static int wcnss_probe(struct platform_device *pdev) ...@@ -666,7 +666,7 @@ static int wcnss_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int wcnss_remove(struct platform_device *pdev) static void wcnss_remove(struct platform_device *pdev)
{ {
struct qcom_wcnss *wcnss = platform_get_drvdata(pdev); struct qcom_wcnss *wcnss = platform_get_drvdata(pdev);
...@@ -678,8 +678,6 @@ static int wcnss_remove(struct platform_device *pdev) ...@@ -678,8 +678,6 @@ static int wcnss_remove(struct platform_device *pdev)
qcom_remove_smd_subdev(wcnss->rproc, &wcnss->smd_subdev); qcom_remove_smd_subdev(wcnss->rproc, &wcnss->smd_subdev);
wcnss_release_pds(wcnss); wcnss_release_pds(wcnss);
rproc_free(wcnss->rproc); rproc_free(wcnss->rproc);
return 0;
} }
static const struct of_device_id wcnss_of_match[] = { static const struct of_device_id wcnss_of_match[] = {
...@@ -693,7 +691,7 @@ MODULE_DEVICE_TABLE(of, wcnss_of_match); ...@@ -693,7 +691,7 @@ MODULE_DEVICE_TABLE(of, wcnss_of_match);
static struct platform_driver wcnss_driver = { static struct platform_driver wcnss_driver = {
.probe = wcnss_probe, .probe = wcnss_probe,
.remove = wcnss_remove, .remove_new = wcnss_remove,
.driver = { .driver = {
.name = "qcom-wcnss-pil", .name = "qcom-wcnss-pil",
.of_match_table = wcnss_of_match, .of_match_table = wcnss_of_match,
......
...@@ -197,13 +197,11 @@ static int rcar_rproc_probe(struct platform_device *pdev) ...@@ -197,13 +197,11 @@ static int rcar_rproc_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int rcar_rproc_remove(struct platform_device *pdev) static void rcar_rproc_remove(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
pm_runtime_disable(dev); pm_runtime_disable(dev);
return 0;
} }
static const struct of_device_id rcar_rproc_of_match[] = { static const struct of_device_id rcar_rproc_of_match[] = {
...@@ -215,7 +213,7 @@ MODULE_DEVICE_TABLE(of, rcar_rproc_of_match); ...@@ -215,7 +213,7 @@ MODULE_DEVICE_TABLE(of, rcar_rproc_of_match);
static struct platform_driver rcar_rproc_driver = { static struct platform_driver rcar_rproc_driver = {
.probe = rcar_rproc_probe, .probe = rcar_rproc_probe,
.remove = rcar_rproc_remove, .remove_new = rcar_rproc_remove,
.driver = { .driver = {
.name = "rcar-rproc", .name = "rcar-rproc",
.of_match_table = rcar_rproc_of_match, .of_match_table = rcar_rproc_of_match,
......
...@@ -569,7 +569,7 @@ static int rproc_virtio_probe(struct platform_device *pdev) ...@@ -569,7 +569,7 @@ static int rproc_virtio_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int rproc_virtio_remove(struct platform_device *pdev) static void rproc_virtio_remove(struct platform_device *pdev)
{ {
struct rproc_vdev *rvdev = dev_get_drvdata(&pdev->dev); struct rproc_vdev *rvdev = dev_get_drvdata(&pdev->dev);
struct rproc *rproc = rvdev->rproc; struct rproc *rproc = rvdev->rproc;
...@@ -588,14 +588,12 @@ static int rproc_virtio_remove(struct platform_device *pdev) ...@@ -588,14 +588,12 @@ static int rproc_virtio_remove(struct platform_device *pdev)
dma_release_coherent_memory(&pdev->dev); dma_release_coherent_memory(&pdev->dev);
put_device(&rproc->dev); put_device(&rproc->dev);
return 0;
} }
/* Platform driver */ /* Platform driver */
static struct platform_driver rproc_virtio_driver = { static struct platform_driver rproc_virtio_driver = {
.probe = rproc_virtio_probe, .probe = rproc_virtio_probe,
.remove = rproc_virtio_remove, .remove_new = rproc_virtio_remove,
.driver = { .driver = {
.name = "rproc-virtio", .name = "rproc-virtio",
}, },
......
...@@ -448,7 +448,7 @@ static int st_rproc_probe(struct platform_device *pdev) ...@@ -448,7 +448,7 @@ static int st_rproc_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int st_rproc_remove(struct platform_device *pdev) static void st_rproc_remove(struct platform_device *pdev)
{ {
struct rproc *rproc = platform_get_drvdata(pdev); struct rproc *rproc = platform_get_drvdata(pdev);
struct st_rproc *ddata = rproc->priv; struct st_rproc *ddata = rproc->priv;
...@@ -462,13 +462,11 @@ static int st_rproc_remove(struct platform_device *pdev) ...@@ -462,13 +462,11 @@ static int st_rproc_remove(struct platform_device *pdev)
mbox_free_channel(ddata->mbox_chan[i]); mbox_free_channel(ddata->mbox_chan[i]);
rproc_free(rproc); rproc_free(rproc);
return 0;
} }
static struct platform_driver st_rproc_driver = { static struct platform_driver st_rproc_driver = {
.probe = st_rproc_probe, .probe = st_rproc_probe,
.remove = st_rproc_remove, .remove_new = st_rproc_remove,
.driver = { .driver = {
.name = "st-rproc", .name = "st-rproc",
.of_match_table = of_match_ptr(st_rproc_match), .of_match_table = of_match_ptr(st_rproc_match),
......
...@@ -79,6 +79,7 @@ struct stm32_mbox { ...@@ -79,6 +79,7 @@ struct stm32_mbox {
struct stm32_rproc { struct stm32_rproc {
struct reset_control *rst; struct reset_control *rst;
struct reset_control *hold_boot_rst;
struct stm32_syscon hold_boot; struct stm32_syscon hold_boot;
struct stm32_syscon pdds; struct stm32_syscon pdds;
struct stm32_syscon m4_state; struct stm32_syscon m4_state;
...@@ -88,7 +89,7 @@ struct stm32_rproc { ...@@ -88,7 +89,7 @@ struct stm32_rproc {
struct stm32_rproc_mem *rmems; struct stm32_rproc_mem *rmems;
struct stm32_mbox mb[MBOX_NB_MBX]; struct stm32_mbox mb[MBOX_NB_MBX];
struct workqueue_struct *workqueue; struct workqueue_struct *workqueue;
bool secured_soc; bool hold_boot_smc;
void __iomem *rsc_va; void __iomem *rsc_va;
}; };
...@@ -413,13 +414,28 @@ static int stm32_rproc_set_hold_boot(struct rproc *rproc, bool hold) ...@@ -413,13 +414,28 @@ static int stm32_rproc_set_hold_boot(struct rproc *rproc, bool hold)
struct arm_smccc_res smc_res; struct arm_smccc_res smc_res;
int val, err; int val, err;
/*
* Three ways to manage the hold boot
* - using SCMI: the hold boot is managed as a reset,
* - using Linux(no SCMI): the hold boot is managed as a syscon register
* - using SMC call (deprecated): use SMC reset interface
*/
val = hold ? HOLD_BOOT : RELEASE_BOOT; val = hold ? HOLD_BOOT : RELEASE_BOOT;
if (IS_ENABLED(CONFIG_HAVE_ARM_SMCCC) && ddata->secured_soc) { if (ddata->hold_boot_rst) {
/* Use the SCMI reset controller */
if (!hold)
err = reset_control_deassert(ddata->hold_boot_rst);
else
err = reset_control_assert(ddata->hold_boot_rst);
} else if (IS_ENABLED(CONFIG_HAVE_ARM_SMCCC) && ddata->hold_boot_smc) {
/* Use the SMC call */
arm_smccc_smc(STM32_SMC_RCC, STM32_SMC_REG_WRITE, arm_smccc_smc(STM32_SMC_RCC, STM32_SMC_REG_WRITE,
hold_boot.reg, val, 0, 0, 0, 0, &smc_res); hold_boot.reg, val, 0, 0, 0, 0, &smc_res);
err = smc_res.a0; err = smc_res.a0;
} else { } else {
/* Use syscon */
err = regmap_update_bits(hold_boot.map, hold_boot.reg, err = regmap_update_bits(hold_boot.map, hold_boot.reg,
hold_boot.mask, val); hold_boot.mask, val);
} }
...@@ -717,35 +733,53 @@ static int stm32_rproc_parse_dt(struct platform_device *pdev, ...@@ -717,35 +733,53 @@ static int stm32_rproc_parse_dt(struct platform_device *pdev,
dev_info(dev, "wdg irq registered\n"); dev_info(dev, "wdg irq registered\n");
} }
ddata->rst = devm_reset_control_get_optional(dev, "mcu_rst");
if (!ddata->rst) {
/* Try legacy fallback method: get it by index */
ddata->rst = devm_reset_control_get_by_index(dev, 0); ddata->rst = devm_reset_control_get_by_index(dev, 0);
}
if (IS_ERR(ddata->rst)) if (IS_ERR(ddata->rst))
return dev_err_probe(dev, PTR_ERR(ddata->rst), return dev_err_probe(dev, PTR_ERR(ddata->rst),
"failed to get mcu_reset\n"); "failed to get mcu_reset\n");
/* /*
* if platform is secured the hold boot bit must be written by * Three ways to manage the hold boot
* smc call and read normally. * - using SCMI: the hold boot is managed as a reset
* if not secure the hold boot bit could be read/write normally * The DT "reset-mames" property should be defined with 2 items:
* reset-names = "mcu_rst", "hold_boot";
* - using SMC call (deprecated): use SMC reset interface
* The DT "reset-mames" property is optional, "st,syscfg-tz" is required
* - default(no SCMI, no SMC): the hold boot is managed as a syscon register
* The DT "reset-mames" property is optional, "st,syscfg-holdboot" is required
*/ */
err = stm32_rproc_get_syscon(np, "st,syscfg-tz", &tz);
if (err) {
dev_err(dev, "failed to get tz syscfg\n");
return err;
}
ddata->hold_boot_rst = devm_reset_control_get_optional(dev, "hold_boot");
if (IS_ERR(ddata->hold_boot_rst))
return dev_err_probe(dev, PTR_ERR(ddata->hold_boot_rst),
"failed to get hold_boot reset\n");
if (!ddata->hold_boot_rst && IS_ENABLED(CONFIG_HAVE_ARM_SMCCC)) {
/* Manage the MCU_BOOT using SMC call */
err = stm32_rproc_get_syscon(np, "st,syscfg-tz", &tz);
if (!err) {
err = regmap_read(tz.map, tz.reg, &tzen); err = regmap_read(tz.map, tz.reg, &tzen);
if (err) { if (err) {
dev_err(dev, "failed to read tzen\n"); dev_err(dev, "failed to read tzen\n");
return err; return err;
} }
ddata->secured_soc = tzen & tz.mask; ddata->hold_boot_smc = tzen & tz.mask;
}
}
if (!ddata->hold_boot_rst && !ddata->hold_boot_smc) {
/* Default: hold boot manage it through the syscon controller */
err = stm32_rproc_get_syscon(np, "st,syscfg-holdboot", err = stm32_rproc_get_syscon(np, "st,syscfg-holdboot",
&ddata->hold_boot); &ddata->hold_boot);
if (err) { if (err) {
dev_err(dev, "failed to get hold boot\n"); dev_err(dev, "failed to get hold boot\n");
return err; return err;
} }
}
err = stm32_rproc_get_syscon(np, "st,syscfg-pdds", &ddata->pdds); err = stm32_rproc_get_syscon(np, "st,syscfg-pdds", &ddata->pdds);
if (err) if (err)
...@@ -867,7 +901,7 @@ static int stm32_rproc_probe(struct platform_device *pdev) ...@@ -867,7 +901,7 @@ static int stm32_rproc_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int stm32_rproc_remove(struct platform_device *pdev) static void stm32_rproc_remove(struct platform_device *pdev)
{ {
struct rproc *rproc = platform_get_drvdata(pdev); struct rproc *rproc = platform_get_drvdata(pdev);
struct stm32_rproc *ddata = rproc->priv; struct stm32_rproc *ddata = rproc->priv;
...@@ -885,8 +919,6 @@ static int stm32_rproc_remove(struct platform_device *pdev) ...@@ -885,8 +919,6 @@ static int stm32_rproc_remove(struct platform_device *pdev)
device_init_wakeup(dev, false); device_init_wakeup(dev, false);
} }
rproc_free(rproc); rproc_free(rproc);
return 0;
} }
static int __maybe_unused stm32_rproc_suspend(struct device *dev) static int __maybe_unused stm32_rproc_suspend(struct device *dev)
...@@ -916,7 +948,7 @@ static SIMPLE_DEV_PM_OPS(stm32_rproc_pm_ops, ...@@ -916,7 +948,7 @@ static SIMPLE_DEV_PM_OPS(stm32_rproc_pm_ops,
static struct platform_driver stm32_rproc_driver = { static struct platform_driver stm32_rproc_driver = {
.probe = stm32_rproc_probe, .probe = stm32_rproc_probe,
.remove = stm32_rproc_remove, .remove_new = stm32_rproc_remove,
.driver = { .driver = {
.name = "stm32-rproc", .name = "stm32-rproc",
.pm = &stm32_rproc_pm_ops, .pm = &stm32_rproc_pm_ops,
......
...@@ -223,7 +223,7 @@ static int wkup_m3_rproc_probe(struct platform_device *pdev) ...@@ -223,7 +223,7 @@ static int wkup_m3_rproc_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int wkup_m3_rproc_remove(struct platform_device *pdev) static void wkup_m3_rproc_remove(struct platform_device *pdev)
{ {
struct rproc *rproc = platform_get_drvdata(pdev); struct rproc *rproc = platform_get_drvdata(pdev);
...@@ -231,8 +231,6 @@ static int wkup_m3_rproc_remove(struct platform_device *pdev) ...@@ -231,8 +231,6 @@ static int wkup_m3_rproc_remove(struct platform_device *pdev)
rproc_free(rproc); rproc_free(rproc);
pm_runtime_put_sync(&pdev->dev); pm_runtime_put_sync(&pdev->dev);
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
return 0;
} }
#ifdef CONFIG_PM #ifdef CONFIG_PM
...@@ -253,7 +251,7 @@ static const struct dev_pm_ops wkup_m3_rproc_pm_ops = { ...@@ -253,7 +251,7 @@ static const struct dev_pm_ops wkup_m3_rproc_pm_ops = {
static struct platform_driver wkup_m3_rproc_driver = { static struct platform_driver wkup_m3_rproc_driver = {
.probe = wkup_m3_rproc_probe, .probe = wkup_m3_rproc_probe,
.remove = wkup_m3_rproc_remove, .remove_new = wkup_m3_rproc_remove,
.driver = { .driver = {
.name = "wkup_m3_rproc", .name = "wkup_m3_rproc",
.of_match_table = wkup_m3_rproc_of_match, .of_match_table = wkup_m3_rproc_of_match,
......
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