Hi Shawn, On 11/26/2021 3:05 PM, Shawn Guo wrote:
+static int __maybe_unused qcom_mpm_suspend_late(struct device *dev)
why maybe unused?
+{ + struct qcom_mpm_priv *priv = dev_get_drvdata(dev); + int i, ret; + + for (i = 0; i < priv->reg_stride; i++) + qcom_mpm_write(priv, MPM_REG_STATUS, i, 0); + + /* Notify RPM to write vMPM into HW */ + ret = mbox_send_message(priv->mbox_chan, NULL); + if (ret < 0) + return ret; + + return 0; +} + +static int __maybe_unused qcom_mpm_resume_early(struct device *dev) +{ + /* Nothing to do for now */ + return 0; +} + +static const struct dev_pm_ops qcom_mpm_pm_ops = { + SET_LATE_SYSTEM_SLEEP_PM_OPS(qcom_mpm_suspend_late, + qcom_mpm_resume_early) +};
This is not limited to suspend, you will need to notify RPM during deepest cpu idle state entry as well, since MPM may be monitoring interrupts in that case too.
This may be handled for both suspend/CPUidle using cpu pm notifications where in last cpu entering deepest idle may notify RPM (something similar to what rpmh-rsc.c does)
Thanks, Maulik