Merge tag 'rproc-v5.12' of git://git.kernel.org/pub/scm/linux/kernel/git/andersson...
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 24 Feb 2021 19:30:13 +0000 (11:30 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 24 Feb 2021 19:30:13 +0000 (11:30 -0800)
Pull remoteproc updates from Bjorn Andersson:
 "This adds remoteproc support for the audio, compute, sensor and modem
  remoteprocs on the Qualcomm SM8350 platform, it adds Qualcomm WCN3660b
  support, Mediatek MT8192 SCP driver support for MPU and L1TCM memory,
  STM32 driver adopts dev_err_probe() and the Qualcomm Kconfig help
  texts are revamped"

* tag 'rproc-v5.12' of git://git.kernel.org/pub/scm/linux/kernel/git/andersson/remoteproc:
  remoteproc: qcom: pas: Add SM8350 PAS remoteprocs
  dt-bindings: remoteproc: qcom: pas: Add SM8350 remoteprocs
  remoteproc: core: Fix rproc->firmware free in rproc_set_firmware()
  remoteproc/mediatek: support L1TCM
  dt-bindings: remoteproc: mediatek: add L1TCM memory region
  remoteproc/mediatek: enable MPU for all memory regions in MT8192 SCP
  remoteproc/mediatek: use devm_platform_ioremap_resource_byname
  remoteproc: ingenic: Add module parameter 'auto_boot'
  remoteproc/mediatek: acknowledge watchdog IRQ after handled
  remoteproc: qcom_wcnss: remove unneeded semicolon
  remoteproc: qcom: fix glink dependencies
  remoteproc: stm32: improve debug using dev_err_probe
  remoteproc: qcom: add more help text qcom options
  remoteproc: qcom_wcnss: Add qcom,wcn3660b compatible
  dt-bindings: remoteproc: qcom,wcnss: Add qcom,wcn3660b compatible

12 files changed:
Documentation/devicetree/bindings/remoteproc/mtk,scp.txt
Documentation/devicetree/bindings/remoteproc/qcom,adsp.txt
Documentation/devicetree/bindings/remoteproc/qcom,wcnss-pil.txt
drivers/remoteproc/Kconfig
drivers/remoteproc/ingenic_rproc.c
drivers/remoteproc/mtk_common.h
drivers/remoteproc/mtk_scp.c
drivers/remoteproc/qcom_q6v5_pas.c
drivers/remoteproc/qcom_wcnss.c
drivers/remoteproc/qcom_wcnss_iris.c
drivers/remoteproc/remoteproc_core.c
drivers/remoteproc/stm32_rproc.c

index 3ba668bab14b22929bfd092d276754f167bcd766..3f5f78764b6024c473f01d0ee60e4b5e54821991 100644 (file)
@@ -6,10 +6,10 @@ Mediatek SoCs.
 
 Required properties:
 - compatible           Should be "mediatek,mt8183-scp"
-- reg                  Should contain the address ranges for the two memory
-                       regions, SRAM and CFG.
-- reg-names            Contains the corresponding names for the two memory
-                       regions. These should be named "sram" & "cfg".
+- reg                  Should contain the address ranges for memory regions:
+                       SRAM, CFG, and L1TCM.
+- reg-names            Contains the corresponding names for the memory regions:
+                       "sram", "cfg", and "l1tcm".
 - clocks               Clock for co-processor (See: ../clock/clock-bindings.txt)
 - clock-names          Contains the corresponding name for the clock. This
                        should be named "main".
index 54737024da20886e52507852fed25f8be01d8598..1c330a8941f970c690971e4d535f0bedcb622a84 100644 (file)
@@ -25,6 +25,10 @@ on the Qualcomm ADSP Hexagon core.
                    "qcom,sm8250-adsp-pas"
                    "qcom,sm8250-cdsp-pas"
                    "qcom,sm8250-slpi-pas"
+                   "qcom,sm8350-adsp-pas"
+                   "qcom,sm8350-cdsp-pas"
+                   "qcom,sm8350-slpi-pas"
+                   "qcom,sm8350-mpss-pas"
 
 - interrupts-extended:
        Usage: required
@@ -51,10 +55,14 @@ on the Qualcomm ADSP Hexagon core.
        qcom,sm8250-adsp-pas:
        qcom,sm8250-cdsp-pas:
        qcom,sm8250-slpi-pas:
+       qcom,sm8350-adsp-pas:
+       qcom,sm8350-cdsp-pas:
+       qcom,sm8350-slpi-pas:
                    must be "wdog", "fatal", "ready", "handover", "stop-ack"
        qcom,qcs404-wcss-pas:
        qcom,sc7180-mpss-pas:
        qcom,sm8150-mpss-pas:
+       qcom,sm8350-mpss-pas:
                    must be "wdog", "fatal", "ready", "handover", "stop-ack",
                    "shutdown-ack"
 
@@ -114,13 +122,17 @@ on the Qualcomm ADSP Hexagon core.
        qcom,sm8150-adsp-pas:
        qcom,sm8150-cdsp-pas:
        qcom,sm8250-cdsp-pas:
+       qcom,sm8350-cdsp-pas:
                    must be "cx", "load_state"
        qcom,sc7180-mpss-pas:
        qcom,sm8150-mpss-pas:
+       qcom,sm8350-mpss-pas:
                    must be "cx", "load_state", "mss"
        qcom,sm8250-adsp-pas:
+       qcom,sm8350-adsp-pas:
        qcom,sm8150-slpi-pas:
        qcom,sm8250-slpi-pas:
+       qcom,sm8350-slpi-pas:
                    must be "lcx", "lmx", "load_state"
 
 - memory-region:
index cc0b7fc1c29b6d4b3ece3e5e26aff431ac5ce23b..da09c0d79ac009f3b634e37a343800e0319b6a6d 100644 (file)
@@ -80,6 +80,7 @@ and its resource dependencies. It is described by the following properties:
        Definition: must be one of:
                    "qcom,wcn3620",
                    "qcom,wcn3660",
+                   "qcom,wcn3660b",
                    "qcom,wcn3680"
 
 - clocks:
index 9e7efe542f6903636fa7fce863d325df0d6bc0b9..15d1574d129bb77073c3e96f23d38c6880dd4393 100644 (file)
@@ -155,6 +155,7 @@ config QCOM_Q6V5_ADSP
        depends on RPMSG_QCOM_SMD || (COMPILE_TEST && RPMSG_QCOM_SMD=n)
        depends on RPMSG_QCOM_GLINK_SMEM || RPMSG_QCOM_GLINK_SMEM=n
        depends on QCOM_SYSMON || QCOM_SYSMON=n
+       depends on RPMSG_QCOM_GLINK || RPMSG_QCOM_GLINK=n
        select MFD_SYSCON
        select QCOM_PIL_INFO
        select QCOM_MDT_LOADER
@@ -162,7 +163,9 @@ config QCOM_Q6V5_ADSP
        select QCOM_RPROC_COMMON
        help
          Say y here to support the Peripheral Image Loader
-         for the Qualcomm Technology Inc. ADSP remote processors.
+         for the non-TrustZone part of Qualcomm Technology Inc. ADSP and CDSP
+         remote processors. The TrustZone part is handled by QCOM_Q6V5_PAS
+         driver.
 
 config QCOM_Q6V5_MSS
        tristate "Qualcomm Hexagon V5 self-authenticating modem subsystem support"
@@ -171,6 +174,7 @@ config QCOM_Q6V5_MSS
        depends on RPMSG_QCOM_SMD || (COMPILE_TEST && RPMSG_QCOM_SMD=n)
        depends on RPMSG_QCOM_GLINK_SMEM || RPMSG_QCOM_GLINK_SMEM=n
        depends on QCOM_SYSMON || QCOM_SYSMON=n
+       depends on RPMSG_QCOM_GLINK || RPMSG_QCOM_GLINK=n
        select MFD_SYSCON
        select QCOM_MDT_LOADER
        select QCOM_PIL_INFO
@@ -179,7 +183,8 @@ config QCOM_Q6V5_MSS
        select QCOM_SCM
        help
          Say y here to support the Qualcomm self-authenticating modem
-         subsystem based on Hexagon V5.
+         subsystem based on Hexagon V5. The TrustZone based system is
+         handled by QCOM_Q6V5_PAS driver.
 
 config QCOM_Q6V5_PAS
        tristate "Qualcomm Hexagon v5 Peripheral Authentication Service support"
@@ -188,6 +193,7 @@ config QCOM_Q6V5_PAS
        depends on RPMSG_QCOM_SMD || (COMPILE_TEST && RPMSG_QCOM_SMD=n)
        depends on RPMSG_QCOM_GLINK_SMEM || RPMSG_QCOM_GLINK_SMEM=n
        depends on QCOM_SYSMON || QCOM_SYSMON=n
+       depends on RPMSG_QCOM_GLINK || RPMSG_QCOM_GLINK=n
        select MFD_SYSCON
        select QCOM_PIL_INFO
        select QCOM_MDT_LOADER
@@ -197,7 +203,9 @@ config QCOM_Q6V5_PAS
        help
          Say y here to support the TrustZone based Peripheral Image Loader
          for the Qualcomm Hexagon v5 based remote processors. This is commonly
-         used to control subsystems such as ADSP, Compute and Sensor.
+         used to control subsystems such as ADSP (Audio DSP),
+         CDSP (Compute DSP), MPSS (Modem Peripheral SubSystem), and
+         SLPI (Sensor Low Power Island).
 
 config QCOM_Q6V5_WCSS
        tristate "Qualcomm Hexagon based WCSS Peripheral Image Loader"
@@ -206,6 +214,7 @@ config QCOM_Q6V5_WCSS
        depends on RPMSG_QCOM_SMD || (COMPILE_TEST && RPMSG_QCOM_SMD=n)
        depends on RPMSG_QCOM_GLINK_SMEM || RPMSG_QCOM_GLINK_SMEM=n
        depends on QCOM_SYSMON || QCOM_SYSMON=n
+       depends on RPMSG_QCOM_GLINK || RPMSG_QCOM_GLINK=n
        select MFD_SYSCON
        select QCOM_MDT_LOADER
        select QCOM_PIL_INFO
@@ -214,7 +223,8 @@ config QCOM_Q6V5_WCSS
        select QCOM_SCM
        help
          Say y here to support the Qualcomm Peripheral Image Loader for the
-         Hexagon V5 based WCSS remote processors.
+         Hexagon V5 based WCSS remote processors on e.g. IPQ8074.  This is
+         a non-TrustZone wireless subsystem.
 
 config QCOM_SYSMON
        tristate "Qualcomm sysmon driver"
@@ -238,13 +248,16 @@ config QCOM_WCNSS_PIL
        depends on RPMSG_QCOM_GLINK_SMEM || RPMSG_QCOM_GLINK_SMEM=n
        depends on QCOM_SMEM
        depends on QCOM_SYSMON || QCOM_SYSMON=n
+       depends on RPMSG_QCOM_GLINK || RPMSG_QCOM_GLINK=n
        select QCOM_MDT_LOADER
        select QCOM_PIL_INFO
        select QCOM_RPROC_COMMON
        select QCOM_SCM
        help
-         Say y here to support the Peripheral Image Loader for the Qualcomm
-         Wireless Connectivity Subsystem.
+         Say y here to support the Peripheral Image Loader for loading WCNSS
+         firmware and boot the core on e.g. MSM8974, MSM8916. The firmware is
+         verified and booted with the help of the Peripheral Authentication
+         System (PAS) in TrustZone.
 
 config ST_REMOTEPROC
        tristate "ST remoteproc support"
index 26e19e6143b77c635c73e729e474a2dbbff3abb4..e2618c36eaabc5379eeee01058d50542272567e3 100644 (file)
 #define AUX_CTRL_NMI           BIT(1)
 #define AUX_CTRL_SW_RESET      BIT(0)
 
+static bool auto_boot;
+module_param(auto_boot, bool, 0400);
+MODULE_PARM_DESC(auto_boot,
+                "Auto-boot the remote processor [default=false]");
+
 struct vpu_mem_map {
        const char *name;
        unsigned int da;
@@ -172,6 +177,8 @@ static int ingenic_rproc_probe(struct platform_device *pdev)
        if (!rproc)
                return -ENOMEM;
 
+       rproc->auto_boot = auto_boot;
+
        vpu = rproc->priv;
        vpu->dev = &pdev->dev;
        platform_set_drvdata(pdev, vpu);
index 988edb4977c313716737c77d35d394e17c090589..61901f5efa051e7d2875b9abe36b67a3a48afce1 100644 (file)
@@ -47,6 +47,8 @@
 
 #define MT8192_CORE0_SW_RSTN_CLR       0x10000
 #define MT8192_CORE0_SW_RSTN_SET       0x10004
+#define MT8192_CORE0_MEM_ATT_PREDEF    0x10008
+#define MT8192_CORE0_WDT_IRQ           0x10030
 #define MT8192_CORE0_WDT_CFG           0x10034
 
 #define SCP_FW_VER_LEN                 32
@@ -75,6 +77,7 @@ struct mtk_scp_of_data {
        void (*scp_reset_assert)(struct mtk_scp *scp);
        void (*scp_reset_deassert)(struct mtk_scp *scp);
        void (*scp_stop)(struct mtk_scp *scp);
+       void *(*scp_da_to_va)(struct mtk_scp *scp, u64 da, size_t len);
 
        u32 host_to_scp_reg;
        u32 host_to_scp_int_bit;
@@ -89,6 +92,10 @@ struct mtk_scp {
        void __iomem *reg_base;
        void __iomem *sram_base;
        size_t sram_size;
+       phys_addr_t sram_phys;
+       void __iomem *l1tcm_base;
+       size_t l1tcm_size;
+       phys_addr_t l1tcm_phys;
 
        const struct mtk_scp_of_data *data;
 
index e0c2356903616e2e02b15378df4df15de4d9ec78..ce727598c41c7e0cf300e6d3b3645bc29ca7a5fd 100644 (file)
@@ -197,17 +197,19 @@ static void mt8192_scp_irq_handler(struct mtk_scp *scp)
 
        scp_to_host = readl(scp->reg_base + MT8192_SCP2APMCU_IPC_SET);
 
-       if (scp_to_host & MT8192_SCP_IPC_INT_BIT)
+       if (scp_to_host & MT8192_SCP_IPC_INT_BIT) {
                scp_ipi_handler(scp);
-       else
-               scp_wdt_handler(scp, scp_to_host);
 
-       /*
-        * SCP won't send another interrupt until we clear
-        * MT8192_SCP2APMCU_IPC.
-        */
-       writel(MT8192_SCP_IPC_INT_BIT,
-              scp->reg_base + MT8192_SCP2APMCU_IPC_CLR);
+               /*
+                * SCP won't send another interrupt until we clear
+                * MT8192_SCP2APMCU_IPC.
+                */
+               writel(MT8192_SCP_IPC_INT_BIT,
+                      scp->reg_base + MT8192_SCP2APMCU_IPC_CLR);
+       } else {
+               scp_wdt_handler(scp, scp_to_host);
+               writel(1, scp->reg_base + MT8192_CORE0_WDT_IRQ);
+       }
 }
 
 static irqreturn_t scp_irq_handler(int irq, void *priv)
@@ -369,6 +371,9 @@ static int mt8192_scp_before_load(struct mtk_scp *scp)
        mt8192_power_on_sram(scp->reg_base + MT8192_L1TCM_SRAM_PDN);
        mt8192_power_on_sram(scp->reg_base + MT8192_CPU0_SRAM_PD);
 
+       /* enable MPU for all memory regions */
+       writel(0xff, scp->reg_base + MT8192_CORE0_MEM_ATT_PREDEF);
+
        return 0;
 }
 
@@ -458,9 +463,8 @@ stop:
        return ret;
 }
 
-static void *scp_da_to_va(struct rproc *rproc, u64 da, size_t len)
+static void *mt8183_scp_da_to_va(struct mtk_scp *scp, u64 da, size_t len)
 {
-       struct mtk_scp *scp = (struct mtk_scp *)rproc->priv;
        int offset;
 
        if (da < scp->sram_size) {
@@ -476,6 +480,42 @@ static void *scp_da_to_va(struct rproc *rproc, u64 da, size_t len)
        return NULL;
 }
 
+static void *mt8192_scp_da_to_va(struct mtk_scp *scp, u64 da, size_t len)
+{
+       int offset;
+
+       if (da >= scp->sram_phys &&
+           (da + len) <= scp->sram_phys + scp->sram_size) {
+               offset = da - scp->sram_phys;
+               return (void __force *)scp->sram_base + offset;
+       }
+
+       /* optional memory region */
+       if (scp->l1tcm_size &&
+           da >= scp->l1tcm_phys &&
+           (da + len) <= scp->l1tcm_phys + scp->l1tcm_size) {
+               offset = da - scp->l1tcm_phys;
+               return (void __force *)scp->l1tcm_base + offset;
+       }
+
+       /* optional memory region */
+       if (scp->dram_size &&
+           da >= scp->dma_addr &&
+           (da + len) <= scp->dma_addr + scp->dram_size) {
+               offset = da - scp->dma_addr;
+               return scp->cpu_addr + offset;
+       }
+
+       return NULL;
+}
+
+static void *scp_da_to_va(struct rproc *rproc, u64 da, size_t len)
+{
+       struct mtk_scp *scp = (struct mtk_scp *)rproc->priv;
+
+       return scp->data->scp_da_to_va(scp, da, len);
+}
+
 static void mt8183_scp_stop(struct mtk_scp *scp)
 {
        /* Disable SCP watchdog */
@@ -714,13 +754,27 @@ static int scp_probe(struct platform_device *pdev)
                goto free_rproc;
        }
        scp->sram_size = resource_size(res);
+       scp->sram_phys = res->start;
+
+       /* l1tcm is an optional memory region */
+       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "l1tcm");
+       scp->l1tcm_base = devm_ioremap_resource(dev, res);
+       if (IS_ERR((__force void *)scp->l1tcm_base)) {
+               ret = PTR_ERR((__force void *)scp->l1tcm_base);
+               if (ret != -EINVAL) {
+                       dev_err(dev, "Failed to map l1tcm memory\n");
+                       goto free_rproc;
+               }
+       } else {
+               scp->l1tcm_size = resource_size(res);
+               scp->l1tcm_phys = res->start;
+       }
 
        mutex_init(&scp->send_lock);
        for (i = 0; i < SCP_IPI_MAX; i++)
                mutex_init(&scp->ipi_desc[i].lock);
 
-       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cfg");
-       scp->reg_base = devm_ioremap_resource(dev, res);
+       scp->reg_base = devm_platform_ioremap_resource_byname(pdev, "cfg");
        if (IS_ERR((__force void *)scp->reg_base)) {
                dev_err(dev, "Failed to parse and map cfg memory\n");
                ret = PTR_ERR((__force void *)scp->reg_base);
@@ -803,6 +857,7 @@ static const struct mtk_scp_of_data mt8183_of_data = {
        .scp_reset_assert = mt8183_scp_reset_assert,
        .scp_reset_deassert = mt8183_scp_reset_deassert,
        .scp_stop = mt8183_scp_stop,
+       .scp_da_to_va = mt8183_scp_da_to_va,
        .host_to_scp_reg = MT8183_HOST_TO_SCP,
        .host_to_scp_int_bit = MT8183_HOST_IPC_INT_BIT,
        .ipi_buf_offset = 0x7bdb0,
@@ -814,6 +869,7 @@ static const struct mtk_scp_of_data mt8192_of_data = {
        .scp_reset_assert = mt8192_scp_reset_assert,
        .scp_reset_deassert = mt8192_scp_reset_deassert,
        .scp_stop = mt8192_scp_stop,
+       .scp_da_to_va = mt8192_scp_da_to_va,
        .host_to_scp_reg = MT8192_GIPC_IN_SET,
        .host_to_scp_int_bit = MT8192_HOST_IPC_INT_BIT,
 };
index ee586226e43804c1f7da09ad774fbbb032542121..e635454d617020469dc182dc0004d2cd193bcd3e 100644 (file)
@@ -565,6 +565,26 @@ static const struct adsp_data sm8250_adsp_resource = {
        .ssctl_id = 0x14,
 };
 
+static const struct adsp_data sm8350_adsp_resource = {
+       .crash_reason_smem = 423,
+       .firmware_name = "adsp.mdt",
+       .pas_id = 1,
+       .has_aggre2_clk = false,
+       .auto_boot = true,
+       .active_pd_names = (char*[]){
+               "load_state",
+               NULL
+       },
+       .proxy_pd_names = (char*[]){
+               "lcx",
+               "lmx",
+               NULL
+       },
+       .ssr_name = "lpass",
+       .sysmon_name = "adsp",
+       .ssctl_id = 0x14,
+};
+
 static const struct adsp_data msm8998_adsp_resource = {
                .crash_reason_smem = 423,
                .firmware_name = "adsp.mdt",
@@ -629,6 +649,25 @@ static const struct adsp_data sm8250_cdsp_resource = {
        .ssctl_id = 0x17,
 };
 
+static const struct adsp_data sm8350_cdsp_resource = {
+       .crash_reason_smem = 601,
+       .firmware_name = "cdsp.mdt",
+       .pas_id = 18,
+       .has_aggre2_clk = false,
+       .auto_boot = true,
+       .active_pd_names = (char*[]){
+               "load_state",
+               NULL
+       },
+       .proxy_pd_names = (char*[]){
+               "cx",
+               NULL
+       },
+       .ssr_name = "cdsp",
+       .sysmon_name = "cdsp",
+       .ssctl_id = 0x17,
+};
+
 static const struct adsp_data mpss_resource_init = {
        .crash_reason_smem = 421,
        .firmware_name = "modem.mdt",
@@ -701,6 +740,26 @@ static const struct adsp_data sm8250_slpi_resource = {
        .ssctl_id = 0x16,
 };
 
+static const struct adsp_data sm8350_slpi_resource = {
+       .crash_reason_smem = 424,
+       .firmware_name = "slpi.mdt",
+       .pas_id = 12,
+       .has_aggre2_clk = false,
+       .auto_boot = true,
+       .active_pd_names = (char*[]){
+               "load_state",
+               NULL
+       },
+       .proxy_pd_names = (char*[]){
+               "lcx",
+               "lmx",
+               NULL
+       },
+       .ssr_name = "dsps",
+       .sysmon_name = "slpi",
+       .ssctl_id = 0x16,
+};
+
 static const struct adsp_data msm8998_slpi_resource = {
                .crash_reason_smem = 424,
                .firmware_name = "slpi.mdt",
@@ -745,6 +804,10 @@ static const struct of_device_id adsp_of_match[] = {
        { .compatible = "qcom,sm8250-adsp-pas", .data = &sm8250_adsp_resource},
        { .compatible = "qcom,sm8250-cdsp-pas", .data = &sm8250_cdsp_resource},
        { .compatible = "qcom,sm8250-slpi-pas", .data = &sm8250_slpi_resource},
+       { .compatible = "qcom,sm8350-adsp-pas", .data = &sm8350_adsp_resource},
+       { .compatible = "qcom,sm8350-cdsp-pas", .data = &sm8350_cdsp_resource},
+       { .compatible = "qcom,sm8350-slpi-pas", .data = &sm8350_slpi_resource},
+       { .compatible = "qcom,sm8350-mpss-pas", .data = &mpss_resource_init},
        { },
 };
 MODULE_DEVICE_TABLE(of, adsp_of_match);
index f95854255c700d7ccfa1ff85ec5a6afd813664e2..2a6a23cb14ca19a76061aa7cae287080dfaf7bcb 100644 (file)
@@ -570,7 +570,7 @@ static int wcnss_probe(struct platform_device *pdev)
        if (IS_ERR(mmio)) {
                ret = PTR_ERR(mmio);
                goto free_rproc;
-       };
+       }
 
        ret = wcnss_alloc_memory_region(wcnss);
        if (ret)
index 0e0ae1e764ea3e9f5a86f76d16aa5b0defae1694..169acd305ae399626cb1c296a6d955bcfe2e562e 100644 (file)
@@ -160,6 +160,7 @@ static int qcom_iris_remove(struct platform_device *pdev)
 static const struct of_device_id iris_of_match[] = {
        { .compatible = "qcom,wcn3620", .data = &wcn3620_data },
        { .compatible = "qcom,wcn3660", .data = &wcn3660_data },
+       { .compatible = "qcom,wcn3660b", .data = &wcn3680_data },
        { .compatible = "qcom,wcn3680", .data = &wcn3680_data },
        {}
 };
index 2394eef383e351f1083f9ee3bac297249fff9035..ab150765d1243fe24bf91e55eacd10531381fe02 100644 (file)
@@ -1988,7 +1988,7 @@ int rproc_set_firmware(struct rproc *rproc, const char *fw_name)
                goto out;
        }
 
-       kfree(rproc->firmware);
+       kfree_const(rproc->firmware);
        rproc->firmware = p;
 
 out:
index a180aeae9675ba98bc95dcb0971b819e4657dfb3..ccb3c14a0023edc7a9f7c76af07ce81052a1dccd 100644 (file)
@@ -370,8 +370,13 @@ static int stm32_rproc_request_mbox(struct rproc *rproc)
 
                ddata->mb[i].chan = mbox_request_channel_byname(cl, name);
                if (IS_ERR(ddata->mb[i].chan)) {
-                       if (PTR_ERR(ddata->mb[i].chan) == -EPROBE_DEFER)
+                       if (PTR_ERR(ddata->mb[i].chan) == -EPROBE_DEFER) {
+                               dev_err_probe(dev->parent,
+                                             PTR_ERR(ddata->mb[i].chan),
+                                             "failed to request mailbox %s\n",
+                                             name);
                                goto err_probe;
+                       }
                        dev_warn(dev, "cannot get %s mbox\n", name);
                        ddata->mb[i].chan = NULL;
                }
@@ -592,15 +597,14 @@ static int stm32_rproc_parse_dt(struct platform_device *pdev,
 
        irq = platform_get_irq(pdev, 0);
        if (irq == -EPROBE_DEFER)
-               return -EPROBE_DEFER;
+               return dev_err_probe(dev, irq, "failed to get interrupt\n");
 
        if (irq > 0) {
                err = devm_request_irq(dev, irq, stm32_rproc_wdg, 0,
                                       dev_name(dev), pdev);
-               if (err) {
-                       dev_err(dev, "failed to request wdg irq\n");
-                       return err;
-               }
+               if (err)
+                       return dev_err_probe(dev, err,
+                                            "failed to request wdg irq\n");
 
                ddata->wdg_irq = irq;
 
@@ -613,10 +617,9 @@ static int stm32_rproc_parse_dt(struct platform_device *pdev,
        }
 
        ddata->rst = devm_reset_control_get_by_index(dev, 0);
-       if (IS_ERR(ddata->rst)) {
-               dev_err(dev, "failed to get mcu reset\n");
-               return PTR_ERR(ddata->rst);
-       }
+       if (IS_ERR(ddata->rst))
+               return dev_err_probe(dev, PTR_ERR(ddata->rst),
+                                    "failed to get mcu_reset\n");
 
        /*
         * if platform is secured the hold boot bit must be written by