diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-09-09 14:30:50 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-09-09 14:30:50 -0700 |
commit | d7efc352abb8903ccb8600e1148f59dd9164317e (patch) | |
tree | a13453b78a8fadb620f731930bfcaefb3d722535 /drivers/remoteproc/qcom_common.c | |
parent | 8c1d70b2de517e7b44dcac24416e60c9662db507 (diff) | |
parent | 7c89717f82bd305e3102963485f3da160d11bcf6 (diff) |
Merge tag 'rproc-v4.14' of git://github.com/andersson/remoteproc
Pull remoteproc updates from Bjorn Andersson:
"This adds and improves remoteproc support for TI DA8xx/OMAP-L13x DSP,
TI Keystone 66AK2G DSP and iMX6SX/7D Cortex M4 coprocessors. It
introduces the Qualcomm restart notifier and a few fixes"
* tag 'rproc-v4.14' of git://github.com/andersson/remoteproc:
remoteproc: Introduce rproc handle accessor for children
remoteproc: qcom: Make ssr_notifiers local
remoteproc: Stop subdevices in reverse order
remoteproc: imx_rproc: add a NXP/Freescale imx_rproc driver
remoteproc: dt: Provide bindings for iMX6SX/7D Remote Processor Controller driver
remoteproc: qcom: Use PTR_ERR_OR_ZERO
remoteproc: st: explicitly request exclusive reset control
remoteproc: qcom: explicitly request exclusive reset control
remoteproc/keystone: explicitly request exclusive reset control
remoteproc/keystone: Add support for Keystone 66AK2G SOCs
remoteproc/davinci: Add device tree support for OMAP-L138 DSP
dt-bindings: remoteproc: Add bindings for Davinci DSP processors
remoteproc/davinci: Add support to parse internal memories
remoteproc/davinci: Switch to platform_get_resource_byname()
remoteproc: make device_type const
soc: qcom: GLINK SSR notifier
remoteproc: qcom: Add support for SSR notifications
remoteproc: Merge __rproc_boot() with rproc_boot()
Diffstat (limited to 'drivers/remoteproc/qcom_common.c')
-rw-r--r-- | drivers/remoteproc/qcom_common.c | 73 |
1 files changed, 72 insertions, 1 deletions
diff --git a/drivers/remoteproc/qcom_common.c b/drivers/remoteproc/qcom_common.c index bb90481215c6..257680f82b27 100644 --- a/drivers/remoteproc/qcom_common.c +++ b/drivers/remoteproc/qcom_common.c @@ -18,6 +18,7 @@ #include <linux/firmware.h> #include <linux/kernel.h> #include <linux/module.h> +#include <linux/notifier.h> #include <linux/remoteproc.h> #include <linux/rpmsg/qcom_smd.h> @@ -25,6 +26,9 @@ #include "qcom_common.h" #define to_smd_subdev(d) container_of(d, struct qcom_rproc_subdev, subdev) +#define to_ssr_subdev(d) container_of(d, struct qcom_rproc_ssr, subdev) + +static BLOCKING_NOTIFIER_HEAD(ssr_notifiers); /** * qcom_mdt_find_rsc_table() - provide dummy resource table for remoteproc @@ -51,7 +55,7 @@ static int smd_subdev_probe(struct rproc_subdev *subdev) smd->edge = qcom_smd_register_edge(smd->dev, smd->node); - return IS_ERR(smd->edge) ? PTR_ERR(smd->edge) : 0; + return PTR_ERR_OR_ZERO(smd->edge); } static void smd_subdev_remove(struct rproc_subdev *subdev) @@ -92,5 +96,72 @@ void qcom_remove_smd_subdev(struct rproc *rproc, struct qcom_rproc_subdev *smd) } EXPORT_SYMBOL_GPL(qcom_remove_smd_subdev); +/** + * qcom_register_ssr_notifier() - register SSR notification handler + * @nb: notifier_block to notify for restart notifications + * + * Returns 0 on success, negative errno on failure. + * + * This register the @notify function as handler for restart notifications. As + * remote processors are stopped this function will be called, with the SSR + * name passed as a parameter. + */ +int qcom_register_ssr_notifier(struct notifier_block *nb) +{ + return blocking_notifier_chain_register(&ssr_notifiers, nb); +} +EXPORT_SYMBOL_GPL(qcom_register_ssr_notifier); + +/** + * qcom_unregister_ssr_notifier() - unregister SSR notification handler + * @nb: notifier_block to unregister + */ +void qcom_unregister_ssr_notifier(struct notifier_block *nb) +{ + blocking_notifier_chain_unregister(&ssr_notifiers, nb); +} +EXPORT_SYMBOL_GPL(qcom_unregister_ssr_notifier); + +static int ssr_notify_start(struct rproc_subdev *subdev) +{ + return 0; +} + +static void ssr_notify_stop(struct rproc_subdev *subdev) +{ + struct qcom_rproc_ssr *ssr = to_ssr_subdev(subdev); + + blocking_notifier_call_chain(&ssr_notifiers, 0, (void *)ssr->name); +} + +/** + * qcom_add_ssr_subdev() - register subdevice as restart notification source + * @rproc: rproc handle + * @ssr: SSR subdevice handle + * @ssr_name: identifier to use for notifications originating from @rproc + * + * As the @ssr is registered with the @rproc SSR events will be sent to all + * registered listeners in the system as the remoteproc is shut down. + */ +void qcom_add_ssr_subdev(struct rproc *rproc, struct qcom_rproc_ssr *ssr, + const char *ssr_name) +{ + ssr->name = ssr_name; + + rproc_add_subdev(rproc, &ssr->subdev, ssr_notify_start, ssr_notify_stop); +} +EXPORT_SYMBOL_GPL(qcom_add_ssr_subdev); + +/** + * qcom_remove_ssr_subdev() - remove subdevice as restart notification source + * @rproc: rproc handle + * @ssr: SSR subdevice handle + */ +void qcom_remove_ssr_subdev(struct rproc *rproc, struct qcom_rproc_ssr *ssr) +{ + rproc_remove_subdev(rproc, &ssr->subdev); +} +EXPORT_SYMBOL_GPL(qcom_remove_ssr_subdev); + MODULE_DESCRIPTION("Qualcomm Remoteproc helper driver"); MODULE_LICENSE("GPL v2"); |