diff options
-rw-r--r-- | drivers/remoteproc/ti_k3_m4_remoteproc.c | 36 |
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); } /* |