Hi Philipp, Thanks for the advice. On Fri, 2021-07-02 at 10:33 +0200, Philipp Zabel wrote: > Hi Roger, > > On Fri, 2021-07-02 at 11:12 +0800, Roger Lu wrote: > [...] > > diff --git a/drivers/soc/mediatek/mtk-svs.c b/drivers/soc/mediatek/mtk-svs.c > > new file mode 100644 > > index 000000000000..c2fcbc204b1d > > --- /dev/null > > +++ b/drivers/soc/mediatek/mtk-svs.c > > @@ -0,0 +1,1724 @@ > > [...] > > +static int svs_suspend(struct device *dev) > > +{ > > + struct svs_platform *svsp = dev_get_drvdata(dev); > > + struct svs_bank *svsb; > > + unsigned long flags; > > + int ret; > > + u32 idx; > > + > > + for (idx = 0; idx < svsp->bank_num; idx++) { > > + svsb = &svsp->banks[idx]; > > + > > + /* Wait if svs_isr() is still in process. */ > > + spin_lock_irqsave(&mtk_svs_lock, flags); > > + svsp->pbank = svsb; > > + svs_switch_bank(svsp); > > + svs_writel(svsp, SVSB_EN_OFF, SVSEN); > > + svs_writel(svsp, SVSB_INTSTS_CLEAN, INTSTS); > > + spin_unlock_irqrestore(&mtk_svs_lock, flags); > > + > > + svsb->suspended = true; > > + if (svsb->phase != SVSB_PHASE_INIT01) { > > + svsb->phase = SVSB_PHASE_ERROR; > > + svs_adjust_pm_opp_volts(svsb, true); > > + } > > + } > > + > > + if (svsp->rst) { > > This is not necessary, reset_control_assert() checks for (rstc == NULL) > itself. Okay. We'll remove "if (svsp->rst) {" in the next patch. Thanks. > > > + ret = reset_control_assert(svsp->rst); > > + if (ret) { > > + dev_err(svsp->dev, "cannot assert reset %d\n", ret); > > + return ret; > > + } > > + } > > + > > + clk_disable_unprepare(svsp->main_clk); > > + > > + return 0; > > +} > > + > > +static int svs_resume(struct device *dev) > > +{ > > + struct svs_platform *svsp = dev_get_drvdata(dev); > > + struct svs_bank *svsb; > > + int ret; > > + u32 idx; > > + > > + ret = clk_prepare_enable(svsp->main_clk); > > + if (ret) { > > + dev_err(svsp->dev, "cannot enable main_clk, disable svs\n"); > > + return ret; > > + } > > + > > + if (svsp->rst) { > > Same as above, reset_control_deassert(NULL) will just return 0. Okay. We'll remove "if (svsp->rst) {" in the next patch. Thanks. > > > + ret = reset_control_deassert(svsp->rst); > > + if (ret) { > > + dev_err(svsp->dev, "cannot deassert reset %d\n", ret); > > + return ret; > > + } > > + } > > + > > + for (idx = 0; idx < svsp->bank_num; idx++) { > > + svsb = &svsp->banks[idx]; > > + svsb->suspended = false; > > + } > > + > > + ret = svs_init02(svsp); > > + if (ret) > > + return ret; > > + > > + svs_mon_mode(svsp); > > + > > + return 0; > > +} > > regards > Philipp