Commit d2008a96 authored by Mathieu Poirier's avatar Mathieu Poirier Committed by Bjorn Andersson
Browse files

remoteproc: Properly deal with a stop request when attached



Allow a remote processor that was started by another entity to be
switched off by the remoteproc core.  For that to happen a
rproc::ops::stop() operation needs to be available.

Signed-off-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
Reviewed-by: default avatarArnaud Pouliquen <arnaud.pouliquen@st.com>
Link: https://lore.kernel.org/r/20210312162453.1234145-16-mathieu.poirier@linaro.org


Signed-off-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
parent 83d4e671
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -38,7 +38,8 @@ static ssize_t rproc_cdev_write(struct file *filp, const char __user *buf, size_

		ret = rproc_boot(rproc);
	} else if (!strncmp(cmd, "stop", len)) {
		if (rproc->state != RPROC_RUNNING)
		if (rproc->state != RPROC_RUNNING &&
		    rproc->state != RPROC_ATTACHED)
			return -EINVAL;

		rproc_shutdown(rproc);
+4 −0
Original line number Diff line number Diff line
@@ -1802,6 +1802,10 @@ static int rproc_stop(struct rproc *rproc, bool crashed)
	struct device *dev = &rproc->dev;
	int ret;

	/* No need to continue if a stop() operation has not been provided */
	if (!rproc->ops->stop)
		return -EINVAL;

	/* Stop any subdevices for the remote processor */
	rproc_stop_subdevices(rproc, crashed);

+2 −1
Original line number Diff line number Diff line
@@ -202,7 +202,8 @@ static ssize_t state_store(struct device *dev,
		if (ret)
			dev_err(&rproc->dev, "Boot failed: %d\n", ret);
	} else if (sysfs_streq(buf, "stop")) {
		if (rproc->state != RPROC_RUNNING)
		if (rproc->state != RPROC_RUNNING &&
		    rproc->state != RPROC_ATTACHED)
			return -EINVAL;

		rproc_shutdown(rproc);