mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
remoteproc: Pass type of shutdown to subdev remove
remoteproc instances can be stopped either by invoking shutdown or by an attempt to recover from a crash. For some subdev types it's expected to clean up gracefully during a shutdown, but are unable to do so during a crash - so pass this information to the subdev remove functions. Acked-By: Chris Lew <[email protected]> Signed-off-by: Bjorn Andersson <[email protected]>
This commit is contained in:
parent
dcb57ed43d
commit
880f5b3882
3 changed files with 16 additions and 15 deletions
|
|
@ -42,7 +42,7 @@ static int glink_subdev_probe(struct rproc_subdev *subdev)
|
|||
return PTR_ERR_OR_ZERO(glink->edge);
|
||||
}
|
||||
|
||||
static void glink_subdev_remove(struct rproc_subdev *subdev)
|
||||
static void glink_subdev_remove(struct rproc_subdev *subdev, bool crashed)
|
||||
{
|
||||
struct qcom_rproc_glink *glink = to_glink_subdev(subdev);
|
||||
|
||||
|
|
@ -132,7 +132,7 @@ static int smd_subdev_probe(struct rproc_subdev *subdev)
|
|||
return PTR_ERR_OR_ZERO(smd->edge);
|
||||
}
|
||||
|
||||
static void smd_subdev_remove(struct rproc_subdev *subdev)
|
||||
static void smd_subdev_remove(struct rproc_subdev *subdev, bool crashed)
|
||||
{
|
||||
struct qcom_rproc_subdev *smd = to_smd_subdev(subdev);
|
||||
|
||||
|
|
@ -201,7 +201,7 @@ static int ssr_notify_start(struct rproc_subdev *subdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void ssr_notify_stop(struct rproc_subdev *subdev)
|
||||
static void ssr_notify_stop(struct rproc_subdev *subdev, bool crashed)
|
||||
{
|
||||
struct qcom_rproc_ssr *ssr = to_ssr_subdev(subdev);
|
||||
|
||||
|
|
|
|||
|
|
@ -308,7 +308,7 @@ static int rproc_vdev_do_probe(struct rproc_subdev *subdev)
|
|||
return rproc_add_virtio_dev(rvdev, rvdev->id);
|
||||
}
|
||||
|
||||
static void rproc_vdev_do_remove(struct rproc_subdev *subdev)
|
||||
static void rproc_vdev_do_remove(struct rproc_subdev *subdev, bool crashed)
|
||||
{
|
||||
struct rproc_vdev *rvdev = container_of(subdev, struct rproc_vdev, subdev);
|
||||
|
||||
|
|
@ -789,17 +789,17 @@ static int rproc_probe_subdevices(struct rproc *rproc)
|
|||
|
||||
unroll_registration:
|
||||
list_for_each_entry_continue_reverse(subdev, &rproc->subdevs, node)
|
||||
subdev->remove(subdev);
|
||||
subdev->remove(subdev, true);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void rproc_remove_subdevices(struct rproc *rproc)
|
||||
static void rproc_remove_subdevices(struct rproc *rproc, bool crashed)
|
||||
{
|
||||
struct rproc_subdev *subdev;
|
||||
|
||||
list_for_each_entry_reverse(subdev, &rproc->subdevs, node)
|
||||
subdev->remove(subdev);
|
||||
subdev->remove(subdev, crashed);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1009,13 +1009,13 @@ static int rproc_trigger_auto_boot(struct rproc *rproc)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int rproc_stop(struct rproc *rproc)
|
||||
static int rproc_stop(struct rproc *rproc, bool crashed)
|
||||
{
|
||||
struct device *dev = &rproc->dev;
|
||||
int ret;
|
||||
|
||||
/* remove any subdevices for the remote processor */
|
||||
rproc_remove_subdevices(rproc);
|
||||
rproc_remove_subdevices(rproc, crashed);
|
||||
|
||||
/* the installed resource table is no longer accessible */
|
||||
rproc->table_ptr = rproc->cached_table;
|
||||
|
|
@ -1163,7 +1163,7 @@ int rproc_trigger_recovery(struct rproc *rproc)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = rproc_stop(rproc);
|
||||
ret = rproc_stop(rproc, false);
|
||||
if (ret)
|
||||
goto unlock_mutex;
|
||||
|
||||
|
|
@ -1316,7 +1316,7 @@ void rproc_shutdown(struct rproc *rproc)
|
|||
if (!atomic_dec_and_test(&rproc->power))
|
||||
goto out;
|
||||
|
||||
ret = rproc_stop(rproc);
|
||||
ret = rproc_stop(rproc, true);
|
||||
if (ret) {
|
||||
atomic_inc(&rproc->power);
|
||||
goto out;
|
||||
|
|
@ -1663,7 +1663,7 @@ EXPORT_SYMBOL(rproc_del);
|
|||
void rproc_add_subdev(struct rproc *rproc,
|
||||
struct rproc_subdev *subdev,
|
||||
int (*probe)(struct rproc_subdev *subdev),
|
||||
void (*remove)(struct rproc_subdev *subdev))
|
||||
void (*remove)(struct rproc_subdev *subdev, bool crashed))
|
||||
{
|
||||
subdev->probe = probe;
|
||||
subdev->remove = remove;
|
||||
|
|
|
|||
Loading…
Reference in a new issue