aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorBeleswar Padhi <b-padhi@ti.com>2025-05-13 11:14:50 +0530
committerMathieu Poirier <mathieu.poirier@linaro.org>2025-05-20 11:19:11 -0600
commitca8921f44c9464ba0ee285f1e616279ca30fa710 (patch)
tree69f1a94a054f8376fe65d4e7e0b9a7cb1676b4a6
parentremoteproc: k3-dsp: Correct Reset logic for devices without lresets (diff)
downloadwireguard-linux-ca8921f44c9464ba0ee285f1e616279ca30fa710.tar.xz
wireguard-linux-ca8921f44c9464ba0ee285f1e616279ca30fa710.zip
remoteproc: k3-m4: Introduce central function to put rproc into 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_reset() which handles both type of devices (with and without local resets), and use it throughout the driver to put the remote processor into reset. This is done to align the reset 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-17-b-padhi@ti.com Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Diffstat (limited to '')
-rw-r--r--drivers/remoteproc/ti_k3_m4_remoteproc.c36
1 files changed, 23 insertions, 13 deletions
diff --git a/drivers/remoteproc/ti_k3_m4_remoteproc.c b/drivers/remoteproc/ti_k3_m4_remoteproc.c
index 9dcae9412193..150c68e5f396 100644
--- a/drivers/remoteproc/ti_k3_m4_remoteproc.c
+++ b/drivers/remoteproc/ti_k3_m4_remoteproc.c
@@ -21,6 +21,26 @@
#include "ti_sci_proc.h"
#include "ti_k3_common.h"
+/* Put the M4 remote processor into reset */
+static int k3_m4_rproc_reset(struct k3_rproc *kproc)
+{
+ struct device *dev = kproc->dev;
+ int ret;
+
+ if (kproc->data->uses_lreset) {
+ ret = reset_control_assert(kproc->reset);
+ if (ret)
+ dev_err(dev, "local-reset assert failed, ret = %d\n", ret);
+ } else {
+ ret = kproc->ti_sci->ops.dev_ops.put_device(kproc->ti_sci,
+ kproc->ti_sci_id);
+ if (ret)
+ dev_err(dev, "module-reset assert failed, ret = %d\n", ret);
+ }
+
+ return ret;
+}
+
static int k3_m4_rproc_ping_mbox(struct k3_rproc *kproc)
{
struct device *dev = kproc->dev;
@@ -65,11 +85,9 @@ static int k3_m4_rproc_prepare(struct rproc *rproc)
* Ensure the local reset is asserted so the core doesn't
* execute bogus code when the module reset is released.
*/
- ret = reset_control_assert(kproc->reset);
- if (ret) {
- dev_err(dev, "could not assert local reset\n");
+ ret = k3_m4_rproc_reset(kproc);
+ if (ret)
return ret;
- }
ret = reset_control_status(kproc->reset);
if (ret <= 0) {
@@ -374,16 +392,8 @@ static int k3_m4_rproc_start(struct rproc *rproc)
static int k3_m4_rproc_stop(struct rproc *rproc)
{
struct k3_rproc *kproc = rproc->priv;
- struct device *dev = kproc->dev;
- int ret;
- ret = reset_control_assert(kproc->reset);
- if (ret) {
- dev_err(dev, "local-reset assert failed, ret = %d\n", ret);
- return ret;
- }
-
- return 0;
+ return k3_m4_rproc_reset(kproc);
}
/*