aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBeleswar Padhi <b-padhi@ti.com>2025-05-13 11:14:53 +0530
committerMathieu Poirier <mathieu.poirier@linaro.org>2025-05-20 11:19:11 -0600
commit3b8127fc51eb9254551b465bd6eec7ef94a3dc90 (patch)
treee03b58276656c18141e7f95aa9c9d6b6c663b620
parentremoteproc: k3-dsp: Correct Reset deassert logic for devices w/o lresets (diff)
downloadlinux-rng-3b8127fc51eb9254551b465bd6eec7ef94a3dc90.tar.xz
linux-rng-3b8127fc51eb9254551b465bd6eec7ef94a3dc90.zip
remoteproc: k3-m4: Introduce central function to release rproc from reset
Currently, the TI K3 M4 remoteproc driver assumes all of the M4 devices have local resets. Even though its true for all existing M4 devices, keep room for future devices which possibly may not have local resets and only have a module reset. Therefore introduce a central function, k3_m4_rproc_release() which handles both type of devices (with and without local resets), and use it throughout the driver to release the remote processor from reset. Also, for devices with local reset, Assert the module reset back in case the local reset deassert operation failed. This is done to align the reset release implementation with DSP remoteproc driver and can be factored out later. Signed-off-by: Beleswar Padhi <b-padhi@ti.com> Tested-by: Judith Mendez <jm@ti.com> Reviewed-by: Andrew Davis <afd@ti.com> Link: https://lore.kernel.org/r/20250513054510.3439842-20-b-padhi@ti.com Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
-rw-r--r--drivers/remoteproc/ti_k3_m4_remoteproc.c33
1 files changed, 26 insertions, 7 deletions
diff --git a/drivers/remoteproc/ti_k3_m4_remoteproc.c b/drivers/remoteproc/ti_k3_m4_remoteproc.c
index 512316274895..d9c105bc4845 100644
--- a/drivers/remoteproc/ti_k3_m4_remoteproc.c
+++ b/drivers/remoteproc/ti_k3_m4_remoteproc.c
@@ -21,6 +21,30 @@
#include "ti_sci_proc.h"
#include "ti_k3_common.h"
+/* Release the M4 remote processor from reset */
+static int k3_m4_rproc_release(struct k3_rproc *kproc)
+{
+ struct device *dev = kproc->dev;
+ int ret;
+
+ if (kproc->data->uses_lreset) {
+ ret = reset_control_deassert(kproc->reset);
+ if (ret) {
+ dev_err(dev, "local-reset deassert failed, ret = %d\n", ret);
+ if (kproc->ti_sci->ops.dev_ops.put_device(kproc->ti_sci,
+ kproc->ti_sci_id))
+ dev_warn(dev, "module-reset assert back failed\n");
+ }
+ } else {
+ ret = kproc->ti_sci->ops.dev_ops.get_device(kproc->ti_sci,
+ kproc->ti_sci_id);
+ if (ret)
+ dev_err(dev, "module-reset deassert failed, ret = %d\n", ret);
+ }
+
+ return ret;
+}
+
static int k3_m4_rproc_ping_mbox(struct k3_rproc *kproc)
{
struct device *dev = kproc->dev;
@@ -347,20 +371,15 @@ static void k3_m4_release_tsp(void *data)
static int k3_m4_rproc_start(struct rproc *rproc)
{
struct k3_rproc *kproc = rproc->priv;
- struct device *dev = kproc->dev;
int ret;
ret = k3_m4_rproc_ping_mbox(kproc);
if (ret)
return ret;
- ret = reset_control_deassert(kproc->reset);
- if (ret) {
- dev_err(dev, "local-reset deassert failed, ret = %d\n", ret);
- return ret;
- }
+ ret = k3_m4_rproc_release(kproc);
- return 0;
+ return ret;
}
/*