On Fri, Aug 9, 2019 at 10:31 PM Yangtao Li <tiny.win...@gmail.com> wrote: > > H3 has extra clock, so introduce something in ths_thermal_chip/ths_device > and adds the process of the clock. > > This is pre-work for supprt it. > > Signed-off-by: Yangtao Li <tiny.win...@gmail.com> > --- > drivers/thermal/sun8i_thermal.c | 17 ++++++++++++++++- > 1 file changed, 16 insertions(+), 1 deletion(-) > > diff --git a/drivers/thermal/sun8i_thermal.c b/drivers/thermal/sun8i_thermal.c > index b934bc81eba7..6f4294c2aba7 100644 > --- a/drivers/thermal/sun8i_thermal.c > +++ b/drivers/thermal/sun8i_thermal.c > @@ -54,6 +54,7 @@ struct tsensor { > }; > > struct ths_thermal_chip { > + bool has_mod_clk; > int sensor_num; > int offset; > int scale; > @@ -69,6 +70,7 @@ struct ths_device { > struct regmap *regmap; > struct reset_control *reset; > struct clk *bus_clk; > + struct clk *mod_clk; > struct tsensor sensor[MAX_SENSOR_NUM]; > }; > > @@ -274,6 +276,12 @@ static int sun8i_ths_resource_init(struct ths_device > *tmdev) > if (IS_ERR(tmdev->bus_clk)) > return PTR_ERR(tmdev->bus_clk); > > + if (tmdev->chip->has_mod_clk) { > + tmdev->mod_clk = devm_clk_get(&pdev->dev, "mod"); > + if (IS_ERR(tmdev->mod_clk)) > + return PTR_ERR(tmdev->mod_clk); > + } > + > ret = reset_control_deassert(tmdev->reset); > if (ret) > return ret; > @@ -282,12 +290,18 @@ static int sun8i_ths_resource_init(struct ths_device > *tmdev) > if (ret) > goto assert_reset; > > - ret = sun50i_ths_calibrate(tmdev); > + ret = clk_prepare_enable(tmdev->mod_clk);
You have to set rate of modclk before enabling it since you can't rely on whatever bootloader left for you. Also I found that parameters you're using for PC_TEMP_PERIOD, ACQ0 and ACQ1 are too aggressive and may result in high interrupt rate to the point when it may stall RCU. I changed driver a bit to use params from Philipp Rossak's work (modclk set to 4MHz, PC_TEMP_PERIOD is 7, ACQ0 is 255, ACQ1 is 63) and it fixed RCU stalls for me, see [1] for details. [1] https://github.com/anarsoul/linux-2.6/commit/46b8bb0fe2ccd1cd88fa9181a2ecbf79e8d513b2 > if (ret) > goto bus_disable; > > + ret = sun50i_ths_calibrate(tmdev); > + if (ret) > + goto mod_disable; > + > return 0; > > +mod_disable: > + clk_disable_unprepare(tmdev->mod_clk); > bus_disable: > clk_disable_unprepare(tmdev->bus_clk); > assert_reset: > @@ -395,6 +409,7 @@ static int sun8i_ths_remove(struct platform_device *pdev) > { > struct ths_device *tmdev = platform_get_drvdata(pdev); > > + clk_disable_unprepare(tmdev->mod_clk); > clk_disable_unprepare(tmdev->bus_clk); > reset_control_assert(tmdev->reset); > > -- > 2.17.1 > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-ker...@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel