On Fri 24 Jul 11:11 PDT 2020, Alex Elder wrote: > Use the new SSR notifier infrastructure to request notifications of > modem events, rather than the remoteproc IPA notification system. > The latter was put in place temporarily with the knowledge that the > new mechanism would become available. >
Reviewed-by: Bjorn Andersson <bjorn.anders...@linaro.org> > Signed-off-by: Alex Elder <el...@linaro.org> > --- > David: If you approve, please only ACK; Bjorn will merge. > David, this depends on changes I carry in the rproc-next tree, so if you're okay with it I can pick this patch through my tree. Otherwise it will have to wait until 5.9 is out and I won't be able to remove the old ipa_notify code that this depends on until 5.11... Thanks, Bjorn > drivers/net/ipa/ipa.h | 3 ++ > drivers/net/ipa/ipa_modem.c | 56 +++++++++++++++++++++++-------------- > 2 files changed, 38 insertions(+), 21 deletions(-) > > diff --git a/drivers/net/ipa/ipa.h b/drivers/net/ipa/ipa.h > index b10a853929525..55115cfb29720 100644 > --- a/drivers/net/ipa/ipa.h > +++ b/drivers/net/ipa/ipa.h > @@ -10,6 +10,7 @@ > #include <linux/device.h> > #include <linux/notifier.h> > #include <linux/pm_wakeup.h> > +#include <linux/notifier.h> > > #include "ipa_version.h" > #include "gsi.h" > @@ -73,6 +74,8 @@ struct ipa { > enum ipa_version version; > struct platform_device *pdev; > struct rproc *modem_rproc; > + struct notifier_block nb; > + void *notifier; > struct ipa_smp2p *smp2p; > struct ipa_clock *clock; > atomic_t suspend_ref; > diff --git a/drivers/net/ipa/ipa_modem.c b/drivers/net/ipa/ipa_modem.c > index ed10818dd99f2..e34fe2d77324e 100644 > --- a/drivers/net/ipa/ipa_modem.c > +++ b/drivers/net/ipa/ipa_modem.c > @@ -9,7 +9,7 @@ > #include <linux/netdevice.h> > #include <linux/skbuff.h> > #include <linux/if_rmnet.h> > -#include <linux/remoteproc/qcom_q6v5_ipa_notify.h> > +#include <linux/remoteproc/qcom_rproc.h> > > #include "ipa.h" > #include "ipa_data.h" > @@ -311,43 +311,40 @@ static void ipa_modem_crashed(struct ipa *ipa) > dev_err(dev, "error %d zeroing modem memory regions\n", ret); > } > > -static void ipa_modem_notify(void *data, enum qcom_rproc_event event) > +static int ipa_modem_notify(struct notifier_block *nb, unsigned long action, > + void *data) > { > - struct ipa *ipa = data; > - struct device *dev; > + struct ipa *ipa = container_of(nb, struct ipa, nb); > + struct qcom_ssr_notify_data *notify_data = data; > + struct device *dev = &ipa->pdev->dev; > > - dev = &ipa->pdev->dev; > - switch (event) { > - case MODEM_STARTING: > + switch (action) { > + case QCOM_SSR_BEFORE_POWERUP: > dev_info(dev, "received modem starting event\n"); > ipa_smp2p_notify_reset(ipa); > break; > > - case MODEM_RUNNING: > + case QCOM_SSR_AFTER_POWERUP: > dev_info(dev, "received modem running event\n"); > break; > > - case MODEM_STOPPING: > - case MODEM_CRASHED: > + case QCOM_SSR_BEFORE_SHUTDOWN: > dev_info(dev, "received modem %s event\n", > - event == MODEM_STOPPING ? "stopping" > - : "crashed"); > + notify_data->crashed ? "crashed" : "stopping"); > if (ipa->setup_complete) > ipa_modem_crashed(ipa); > break; > > - case MODEM_OFFLINE: > + case QCOM_SSR_AFTER_SHUTDOWN: > dev_info(dev, "received modem offline event\n"); > break; > > - case MODEM_REMOVING: > - dev_info(dev, "received modem stopping event\n"); > - break; > - > default: > - dev_err(&ipa->pdev->dev, "unrecognized event %u\n", event); > + dev_err(dev, "received unrecognized event %lu\n", action); > break; > } > + > + return NOTIFY_OK; > } > > int ipa_modem_init(struct ipa *ipa, bool modem_init) > @@ -362,13 +359,30 @@ void ipa_modem_exit(struct ipa *ipa) > > int ipa_modem_config(struct ipa *ipa) > { > - return qcom_register_ipa_notify(ipa->modem_rproc, ipa_modem_notify, > - ipa); > + void *notifier; > + > + ipa->nb.notifier_call = ipa_modem_notify; > + > + notifier = qcom_register_ssr_notifier("mpss", &ipa->nb); > + if (IS_ERR(notifier)) > + return PTR_ERR(notifier); > + > + ipa->notifier = notifier; > + > + return 0; > } > > void ipa_modem_deconfig(struct ipa *ipa) > { > - qcom_deregister_ipa_notify(ipa->modem_rproc); > + struct device *dev = &ipa->pdev->dev; > + int ret; > + > + ret = qcom_unregister_ssr_notifier(ipa->notifier, &ipa->nb); > + if (ret) > + dev_err(dev, "error %d unregistering notifier", ret); > + > + ipa->notifier = NULL; > + memset(&ipa->nb, 0, sizeof(ipa->nb)); > } > > int ipa_modem_setup(struct ipa *ipa) > -- > 2.20.1 >