lkml.org 
[lkml]   [2020]   [Apr]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRE: [PATCH] mailbox: imx: Add context save/restore for suspend/resume
    Date
    > From: Anson Huang <Anson.Huang@nxp.com>
    > Sent: Friday, April 24, 2020 7:01 AM
    >
    > For "mem" mode suspend on i.MX8 SoCs, MU settings could be lost because its
    > power is off, so save/restore is needed for MU settings during suspend/resume.
    > However, the restore can ONLY be done when MU settings are actually lost, for
    > the scenario of settings NOT lost in "freeze" mode suspend, since there could be
    > still IPC going on multiple CPUs, restoring the MU settings could overwrite the
    > TIE by mistake and cause system freeze, so need to make sure ONLY restore the
    > MU settings when it is powered off.
    >
    > Signed-off-by: Anson Huang <Anson.Huang@nxp.com>

    As mentioned before, we'd better keep the original author.

    > ---
    > drivers/mailbox/imx-mailbox.c | 35
    > +++++++++++++++++++++++++++++++++++
    > 1 file changed, 35 insertions(+)
    >
    > diff --git a/drivers/mailbox/imx-mailbox.c b/drivers/mailbox/imx-mailbox.c
    > index 97bf0ac..b53cf63 100644
    > --- a/drivers/mailbox/imx-mailbox.c
    > +++ b/drivers/mailbox/imx-mailbox.c
    > @@ -67,6 +67,8 @@ struct imx_mu_priv {
    > struct clk *clk;
    > int irq;
    >
    > + u32 xcr;
    > +
    > bool side_b;
    > };
    >
    > @@ -583,12 +585,45 @@ static const struct of_device_id imx_mu_dt_ids[] =
    > { }; MODULE_DEVICE_TABLE(of, imx_mu_dt_ids);
    >
    > +static int imx_mu_suspend_noirq(struct device *dev) {
    > + struct imx_mu_priv *priv = dev_get_drvdata(dev);
    > +
    > + priv->xcr = imx_mu_read(priv, priv->dcfg->xCR);
    > +
    > + return 0;
    > +}
    > +
    > +static int imx_mu_resume_noirq(struct device *dev) {
    > + struct imx_mu_priv *priv = dev_get_drvdata(dev);
    > +
    > + /*
    > + * ONLY restore MU when context lost, the TIE could
    > + * be set during noirq resume as there is MU data
    > + * communication going on, and restore the saved
    > + * value will overwrite the TIE and cause MU data
    > + * send failed, may lead to system freeze. This issue
    > + * is observed by testing freeze mode suspend.
    > + */
    > + if (!imx_mu_read(priv, priv->dcfg->xCR))
    > + imx_mu_write(priv, priv->xcr, priv->dcfg->xCR);

    This could be separate patch if it aims to fix a specific corner case.

    Regards
    Aisheng

    > +
    > + return 0;
    > +}
    > +
    > +static const struct dev_pm_ops imx_mu_pm_ops = {
    > + SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(imx_mu_suspend_noirq,
    > + imx_mu_resume_noirq)
    > +};
    > +
    > static struct platform_driver imx_mu_driver = {
    > .probe = imx_mu_probe,
    > .remove = imx_mu_remove,
    > .driver = {
    > .name = "imx_mu",
    > .of_match_table = imx_mu_dt_ids,
    > + .pm = &imx_mu_pm_ops,
    > },
    > };
    > module_platform_driver(imx_mu_driver);
    > --
    > 2.7.4

    \
     
     \ /
      Last update: 2020-04-24 04:28    [W:3.794 / U:0.656 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site