summaryrefslogtreecommitdiffstats
path: root/drivers/remoteproc/remoteproc_cdev.c
diff options
context:
space:
mode:
authorMathieu Poirier <mathieu.poirier@linaro.org>2021-03-12 17:24:53 +0100
committerBjorn Andersson <bjorn.andersson@linaro.org>2021-03-18 14:02:10 +0100
commit6e71d2b2a2b717c3bddbe72cdf48dd07d53f8364 (patch)
tree999d1f9f934118d6906ae3143671c2d61c103c47 /drivers/remoteproc/remoteproc_cdev.c
parentremoteproc: Properly deal with a detach request when attached (diff)
downloadlinux-6e71d2b2a2b717c3bddbe72cdf48dd07d53f8364.tar.xz
linux-6e71d2b2a2b717c3bddbe72cdf48dd07d53f8364.zip
remoteproc: Refactor function rproc_cdev_release()
Refactor function rproc_cdev_release() to take into account the current state of the remote processor when choosing the state to transition to. Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org> Link: https://lore.kernel.org/r/20210312162453.1234145-18-mathieu.poirier@linaro.org Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Diffstat (limited to 'drivers/remoteproc/remoteproc_cdev.c')
-rw-r--r--drivers/remoteproc/remoteproc_cdev.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/remoteproc/remoteproc_cdev.c b/drivers/remoteproc/remoteproc_cdev.c
index 2db494816d5f..0b8a84c04f76 100644
--- a/drivers/remoteproc/remoteproc_cdev.c
+++ b/drivers/remoteproc/remoteproc_cdev.c
@@ -86,11 +86,17 @@ static long rproc_device_ioctl(struct file *filp, unsigned int ioctl, unsigned l
static int rproc_cdev_release(struct inode *inode, struct file *filp)
{
struct rproc *rproc = container_of(inode->i_cdev, struct rproc, cdev);
+ int ret = 0;
+
+ if (!rproc->cdev_put_on_release)
+ return 0;
- if (rproc->cdev_put_on_release && rproc->state == RPROC_RUNNING)
+ if (rproc->state == RPROC_RUNNING)
rproc_shutdown(rproc);
+ else if (rproc->state == RPROC_ATTACHED)
+ ret = rproc_detach(rproc);
- return 0;
+ return ret;
}
static const struct file_operations rproc_fops = {