remoteproc: Change rproc_shutdown() to return a status

The rproc_shutdown() function is currently not returning any
error code, and any failures within rproc_stop() are not passed
back to the users. Change the signature to return a success value
back to the callers.

The remoteproc sysfs and cdev interfaces are also updated to
return back this status to userspace.

Signed-off-by: Suman Anna <s-anna@ti.com>
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Link: https://lore.kernel.org/r/20220213201246.25952-2-s-anna@ti.com
This commit is contained in:
Suman Anna 2022-02-13 14:12:42 -06:00 коммит произвёл Bjorn Andersson
Родитель 8d9be5c6bd
Коммит c13b780c45
5 изменённых файлов: 11 добавлений и 7 удалений

Просмотреть файл

@ -49,13 +49,14 @@ might also consider using dev_archdata for this).
:: ::
void rproc_shutdown(struct rproc *rproc) int rproc_shutdown(struct rproc *rproc)
Power off a remote processor (previously booted with rproc_boot()). Power off a remote processor (previously booted with rproc_boot()).
In case @rproc is still being used by an additional user(s), then In case @rproc is still being used by an additional user(s), then
this function will just decrement the power refcount and exit, this function will just decrement the power refcount and exit,
without really powering off the device. without really powering off the device.
Returns 0 on success, and an appropriate error value otherwise.
Every call to rproc_boot() must (eventually) be accompanied by a call Every call to rproc_boot() must (eventually) be accompanied by a call
to rproc_shutdown(). Calling rproc_shutdown() redundantly is a bug. to rproc_shutdown(). Calling rproc_shutdown() redundantly is a bug.

Просмотреть файл

@ -42,7 +42,7 @@ static ssize_t rproc_cdev_write(struct file *filp, const char __user *buf, size_
rproc->state != RPROC_ATTACHED) rproc->state != RPROC_ATTACHED)
return -EINVAL; return -EINVAL;
rproc_shutdown(rproc); ret = rproc_shutdown(rproc);
} else if (!strncmp(cmd, "detach", len)) { } else if (!strncmp(cmd, "detach", len)) {
if (rproc->state != RPROC_ATTACHED) if (rproc->state != RPROC_ATTACHED)
return -EINVAL; return -EINVAL;

Просмотреть файл

@ -2061,16 +2061,18 @@ EXPORT_SYMBOL(rproc_boot);
* which means that the @rproc handle stays valid even after rproc_shutdown() * which means that the @rproc handle stays valid even after rproc_shutdown()
* returns, and users can still use it with a subsequent rproc_boot(), if * returns, and users can still use it with a subsequent rproc_boot(), if
* needed. * needed.
*
* Return: 0 on success, and an appropriate error value otherwise
*/ */
void rproc_shutdown(struct rproc *rproc) int rproc_shutdown(struct rproc *rproc)
{ {
struct device *dev = &rproc->dev; struct device *dev = &rproc->dev;
int ret; int ret = 0;
ret = mutex_lock_interruptible(&rproc->lock); ret = mutex_lock_interruptible(&rproc->lock);
if (ret) { if (ret) {
dev_err(dev, "can't lock rproc %s: %d\n", rproc->name, ret); dev_err(dev, "can't lock rproc %s: %d\n", rproc->name, ret);
return; return ret;
} }
/* if the remote proc is still needed, bail out */ /* if the remote proc is still needed, bail out */
@ -2097,6 +2099,7 @@ void rproc_shutdown(struct rproc *rproc)
rproc->table_ptr = NULL; rproc->table_ptr = NULL;
out: out:
mutex_unlock(&rproc->lock); mutex_unlock(&rproc->lock);
return ret;
} }
EXPORT_SYMBOL(rproc_shutdown); EXPORT_SYMBOL(rproc_shutdown);

Просмотреть файл

@ -206,7 +206,7 @@ static ssize_t state_store(struct device *dev,
rproc->state != RPROC_ATTACHED) rproc->state != RPROC_ATTACHED)
return -EINVAL; return -EINVAL;
rproc_shutdown(rproc); ret = rproc_shutdown(rproc);
} else if (sysfs_streq(buf, "detach")) { } else if (sysfs_streq(buf, "detach")) {
if (rproc->state != RPROC_ATTACHED) if (rproc->state != RPROC_ATTACHED)
return -EINVAL; return -EINVAL;

Просмотреть файл

@ -671,7 +671,7 @@ rproc_of_resm_mem_entry_init(struct device *dev, u32 of_resm_idx, size_t len,
u32 da, const char *name, ...); u32 da, const char *name, ...);
int rproc_boot(struct rproc *rproc); int rproc_boot(struct rproc *rproc);
void rproc_shutdown(struct rproc *rproc); int rproc_shutdown(struct rproc *rproc);
int rproc_detach(struct rproc *rproc); int rproc_detach(struct rproc *rproc);
int rproc_set_firmware(struct rproc *rproc, const char *fw_name); int rproc_set_firmware(struct rproc *rproc, const char *fw_name);
void rproc_report_crash(struct rproc *rproc, enum rproc_crash_type type); void rproc_report_crash(struct rproc *rproc, enum rproc_crash_type type);