Re: [PATCH v6 1/7] thermal: sun8i: add thermal driver for H6/H5/H3/A64/A83T/R40
From: Frank Lee
Date: Thu Nov 28 2019 - 10:16:26 EST
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