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.poir...@linaro.org>
---
 drivers/remoteproc/remoteproc_cdev.c | 10 ++++++++--
 1 file 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 = {
-- 
2.25.1

Reply via email to