On Thu, Nov 28, 2019 at 6:24 AM Ondřej Jirman <megous@xxxxxxxxxx> wrote: > > On Wed, Nov 27, 2019 at 11:48:32AM -0800, Vasily Khoruzhick wrote: > > On Wed, Nov 27, 2019 at 11:44 AM Frank Lee <tiny.windzz@xxxxxxxxx> wrote: > > > > > > Hello Vasily, > > > > > > Thank you very much for your work on this. > > > This looks good to me. > > > > Thanks! > > > > > By the way, I would like to ask comments about adding the following code. > > > > Can we add it as follow up patch? I don't think that I have a device > > with working suspend to test it and I'm hesitant to add any code that > > I can't test. > > I have, but it doesn't use any of the clocks and resets, so it wouldn't > test this fully, and basicaly doesn't need re-calibration at all, probably. > > So that may be one feedback. On a83t, I'd made these callbacks a no-op. This is just that the mainline code does not yet have the S2RAM code implementation of these SOCs. Each module has its own suspend function and resume function as part of the system suspend function. When the system is in S2RAM, the entire SOC will be completely powered off, and each module needs to save and restore its own state. Yangtao > > regards, > o. > > > > > > > diff --git a/drivers/thermal/sun8i_thermal.c b/drivers/thermal/sun8i_thermal.c > > > index c0ed60782b11..579dde5e0701 100644 > > > --- a/drivers/thermal/sun8i_thermal.c > > > +++ b/drivers/thermal/sun8i_thermal.c > > > @@ -629,11 +629,63 @@ static const struct of_device_id of_ths_match[] = { > > > }; > > > MODULE_DEVICE_TABLE(of, of_ths_match); > > > > > > +static int __maybe_unused sun8i_thermal_suspend(struct device *dev) > > > +{ > > > + struct ths_device *tmdev; = dev_get_drvdata(dev); > > > + > > > + clk_disable(tmdev->mod_clk); > > > + clk_disable(tmdev->bus_clk); > > > + > > > + reset_control_assert(tmdev->reset); > > > + > > > + return 0; > > > +} > > > + > > > +static int __maybe_unused sun8i_thermal_resume(struct device *dev) > > > +{ > > > + struct ths_device *tmdev; = dev_get_drvdata(dev); > > > + int error; > > > + > > > + error = reset_control_deassert(tmdev->reset); > > > + if (error) > > > + return error; > > > + > > > + error = clk_enable(tmdev->bus_clk); > > > + if (error) > > > + goto assert_reset; > > > + > > > + clk_set_rate(tmdev->mod_clk, 24000000); > > > + error = clk_enable(tmdev->mod_clk); > > > + if (error) > > > + goto bus_disable; > > > + > > > + sun8i_ths_calibrate(tmdev); > > > + > > > + ret = tmdev->chip->init(tmdev); > > > + if (ret) > > > + goto mod_disable; > > > + > > > + return 0; > > > + > > > +mod_disable: > > > + clk_disable(tmdev->mod_clk); > > > +bus_disable: > > > + clk_disable(tmdev->bus_clk); > > > +assert_reset: > > > + reset_control_assert(tmdev->reset); > > > + > > > + return 0; > > > +} > > > + > > > +static SIMPLE_DEV_PM_OPS(sun8i_thermal_pm_ops, > > > + sun8i_thermal_suspend, sun8i_thermal_resume); > > > + > > > static struct platform_driver ths_driver = { > > > .probe = sun8i_ths_probe, > > > .remove = sun8i_ths_remove, > > > .driver = { > > > .name = "sun8i-thermal", > > > + .pm = &sun8i_thermal_pm_ops, > > > .of_match_table = of_ths_match, > > > }, > > > }; > > > > > > Yangtao > > > > _______________________________________________ > > linux-arm-kernel mailing list > > linux-arm-kernel@xxxxxxxxxxxxxxxxxxx > > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel