From: Arnaud POULIQUEN <arnaud.pouliq...@foss.st.com>

Some actions such as memory resources reallocation are needed when
trying to reattach a co-processor. Use the prepare() operation for
these actions.

Co-developed-by: Mathieu Poirier <mathieu.poir...@linaro.org>
Signed-off-by: Mathieu Poirier <mathieu.poir...@linaro.org>
Signed-off-by: Arnaud POULIQUEN <arnaud.pouliq...@foss.st.com>
---
 drivers/remoteproc/remoteproc_core.c | 14 ++++++++++++--
 drivers/remoteproc/stm32_rproc.c     | 27 ++++++---------------------
 2 files changed, 18 insertions(+), 23 deletions(-)

diff --git a/drivers/remoteproc/remoteproc_core.c 
b/drivers/remoteproc/remoteproc_core.c
index 741bc20de437..5c52c612a7f0 100644
--- a/drivers/remoteproc/remoteproc_core.c
+++ b/drivers/remoteproc/remoteproc_core.c
@@ -1585,10 +1585,17 @@ static int rproc_attach(struct rproc *rproc)
                return ret;
        }
 
+       /* Do anything that is needed to boot the remote processor */
+       ret = rproc_prepare_device(rproc);
+       if (ret) {
+               dev_err(dev, "can't prepare rproc %s: %d\n", rproc->name, ret);
+               goto disable_iommu;
+       }
+
        ret = rproc_set_loaded_rsc_table(rproc);
        if (ret) {
                dev_err(dev, "can't load resource table: %d\n", ret);
-               goto disable_iommu;
+               goto unprepare_device;
        }
 
        /* reset max_notifyid */
@@ -1605,7 +1612,7 @@ static int rproc_attach(struct rproc *rproc)
        ret = rproc_handle_resources(rproc, rproc_loading_handlers);
        if (ret) {
                dev_err(dev, "Failed to process resources: %d\n", ret);
-               goto disable_iommu;
+               goto unprepare_device;
        }
 
        /* Allocate carveout resources associated to rproc */
@@ -1624,6 +1631,9 @@ static int rproc_attach(struct rproc *rproc)
 
 clean_up_resources:
        rproc_resource_cleanup(rproc);
+unprepare_device:
+       /* release HW resources if needed */
+       rproc_unprepare_device(rproc);
 disable_iommu:
        rproc_disable_iommu(rproc);
        return ret;
diff --git a/drivers/remoteproc/stm32_rproc.c b/drivers/remoteproc/stm32_rproc.c
index 826cb7a045df..6f0bb54dec15 100644
--- a/drivers/remoteproc/stm32_rproc.c
+++ b/drivers/remoteproc/stm32_rproc.c
@@ -207,16 +207,7 @@ static int stm32_rproc_mbox_idx(struct rproc *rproc, const 
unsigned char *name)
        return -EINVAL;
 }
 
-static int stm32_rproc_elf_load_rsc_table(struct rproc *rproc,
-                                         const struct firmware *fw)
-{
-       if (rproc_elf_load_rsc_table(rproc, fw))
-               dev_warn(&rproc->dev, "no resource table found for this 
firmware\n");
-
-       return 0;
-}
-
-static int stm32_rproc_parse_memory_regions(struct rproc *rproc)
+static int stm32_rproc_prepare(struct rproc *rproc)
 {
        struct device *dev = rproc->dev.parent;
        struct device_node *np = dev->of_node;
@@ -274,12 +265,10 @@ static int stm32_rproc_parse_memory_regions(struct rproc 
*rproc)
 
 static int stm32_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw)
 {
-       int ret = stm32_rproc_parse_memory_regions(rproc);
-
-       if (ret)
-               return ret;
+       if (rproc_elf_load_rsc_table(rproc, fw))
+               dev_warn(&rproc->dev, "no resource table found for this 
firmware\n");
 
-       return stm32_rproc_elf_load_rsc_table(rproc, fw);
+       return 0;
 }
 
 static irqreturn_t stm32_rproc_wdg(int irq, void *data)
@@ -609,6 +598,7 @@ stm32_rproc_get_loaded_rsc_table(struct rproc *rproc, 
size_t *table_sz)
 }
 
 static const struct rproc_ops st_rproc_ops = {
+       .prepare        = stm32_rproc_prepare,
        .start          = stm32_rproc_start,
        .stop           = stm32_rproc_stop,
        .attach         = stm32_rproc_attach,
@@ -793,14 +783,9 @@ static int stm32_rproc_probe(struct platform_device *pdev)
        if (ret)
                goto free_rproc;
 
-       if (state == M4_STATE_CRUN) {
+       if (state == M4_STATE_CRUN)
                rproc->state = RPROC_DETACHED;
 
-               ret = stm32_rproc_parse_memory_regions(rproc);
-               if (ret)
-                       goto free_resources;
-       }
-
        rproc->has_iommu = false;
        ddata->workqueue = create_workqueue(dev_name(dev));
        if (!ddata->workqueue) {
-- 
2.25.1

Reply via email to