[PATCH 4/6] remoteproc: renesas: rsip: Reset SCP core on stop

Marek Vasut via U-Boot <[email protected]>
Newsgroups gmane.comp.boot-loaders.u-boot
Message-ID <20260810223604.1333043-4-marek.vasut+renesas__32343.4662351914$1786401394$gmane$org@mailbox.org>
Use SCP core init code, which resets the SCP core, as a SCP core stop.
Once stop is invoked, the SCP core is reset and ready to be loaded with
new software, which is practical for SCP firwmare development.

Signed-off-by: Marek Vasut <[email protected]>
---
Cc: Nobuhiro Iwamatsu <[email protected]>
Cc: Tom Rini <[email protected]>
Cc: [email protected]
---
 drivers/remoteproc/renesas_rsip.c | 79 +++++++++++++++----------------
 1 file changed, 39 insertions(+), 40 deletions(-)

diff --git a/drivers/remoteproc/renesas_rsip.c b/drivers/remoteproc/renesas_rsip.c
index cbf999e88f2..96f3bf77eb8 100644
--- a/drivers/remoteproc/renesas_rsip.c
+++ b/drivers/remoteproc/renesas_rsip.c
@@ -169,6 +169,42 @@ static int renesas_rsip_rproc_load(struct udevice *dev, ulong addr, ulong size)
 	return 0;
 }
 
+/**
+ * renesas_rsip_rproc_init() - Initialize the remote processor
+ * @dev:	corresponding remote processor device
+ *
+ * Return: 0 if all went ok, else corresponding -ve error
+ */
+static int renesas_rsip_rproc_init(struct udevice *dev)
+{
+	struct renesas_rsip_rproc_privdata *priv = dev_get_priv(dev);
+	struct reset_ctl *rst = dev_get_priv(dev->parent);
+	u32 addr;
+
+	if (priv->core_id != 0)	/* No init for non-SCP cores */
+		return 0;
+
+	/*
+	 * Put SCP into reset, configure SCP entry point address and systick
+	 * timer, release SCP from reset, and zero out SCP STCM regions.
+	 */
+	reset_assert(rst);
+
+	writel(SCP_STCM, SCP_CFGVECTABLE);
+	writel(SCP_CFGNSSTCALIB_13_3MHZ, SCP_CFGNSSTCALIB);
+	setbits_le32(SCP_CPUWAIT, SCP_CPUWAIT_WAIT);
+
+	reset_deassert(rst);
+
+	/* Fill zero to SCP STCM regions 0 ... 27 */
+	for (addr = SCP_STCM; addr < 0xc1061b00; addr += 8)
+		writeq(0, addr);
+
+	asm volatile("dsb sy");
+
+	return 0;
+}
+
 /**
  * renesas_rsip_rproc_start() - Start the remote processor
  * @dev:	corresponding remote processor device
@@ -211,9 +247,9 @@ static int renesas_rsip_rproc_stop(struct udevice *dev)
 {
 	struct renesas_rsip_rproc_privdata *priv = dev_get_priv(dev);
 
-	if (priv->core_id == 0) {	/* SCP */
-		setbits_le32(SCP_CPUWAIT, SCP_CPUWAIT_WAIT);
-		return 0;
+	if (priv->core_id == 0) {
+		/* SCP */
+		return renesas_rsip_rproc_init(dev);
 	}
 
 	return 0;
@@ -244,43 +280,6 @@ static int renesas_rsip_rproc_is_running(struct udevice *dev)
 	return 1;
 }
 
-/**
- * renesas_rsip_rproc_init() - Initialize the remote processor
- * @dev:	corresponding remote processor device
- *
- * Return: 0 if all went ok, else corresponding -ve error
- */
-static int renesas_rsip_rproc_init(struct udevice *dev)
-{
-	struct renesas_rsip_rproc_privdata *priv = dev_get_priv(dev);
-	struct reset_ctl *rst = dev_get_priv(dev->parent);
-	u32 addr;
-
-	if (priv->core_id != 0)	/* No init for non-SCP cores */
-		return 0;
-
-	/*
-	 * Put SCP into reset, configure SCP entry point address and systick
-	 * timer, release SCP from reset, and zero out SCP STCM regions.
-	 */
-
-	reset_assert(rst);
-
-	writel(SCP_STCM, SCP_CFGVECTABLE);
-	writel(SCP_CFGNSSTCALIB_13_3MHZ, SCP_CFGNSSTCALIB);
-	setbits_le32(SCP_CPUWAIT, SCP_CPUWAIT_WAIT);
-
-	reset_deassert(rst);
-
-	/* Fill zero to SCP STCM regions 0 ... 27 */
-	for (addr = SCP_STCM; addr < 0xc1061b00; addr += 8)
-		writeq(0, addr);
-
-	asm volatile("dsb sy");
-
-	return 0;
-}
-
 /**
  * renesas_rsip_rproc_device_to_virt() - Convert device address to virtual address
  * @dev:	corresponding remote processor device
-- 
2.53.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.