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:
Родитель
8d9be5c6bd
Коммит
c13b780c45
|
@ -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);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче