Message ID | 20190623164206.7467-9-tiny.windzz@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | add thermal driver for h6 | expand |
On Sun, Jun 23, 2019 at 12:42:03PM -0400, Yangtao Li 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.windzz@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 ed1c19bb27cf..04f53ffb6a14 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_ahb_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 *ahb_clk; Hmm, thinking a bit about this, the name of those two clocks doesn't make sense. AHB is the bus being used to access that device, so the bus clock is the AHB clock. What is that clock being used for? Maxime -- Maxime Ripard, Bootlin Embedded Linux and Kernel engineering https://bootlin.com
On Mon, Jun 24, 2019 at 08:23:33PM +0200, Maxime Ripard wrote: > On Sun, Jun 23, 2019 at 12:42:03PM -0400, Yangtao Li 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.windzz@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 ed1c19bb27cf..04f53ffb6a14 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_ahb_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 *ahb_clk; > > Hmm, thinking a bit about this, the name of those two clocks doesn't > make sense. AHB is the bus being used to access that device, so the > bus clock is the AHB clock. > > What is that clock being used for? To control the A/D and sample averaging logic, I suppose. It's controlled by the THS_CLK_REG (THS Clock Register) in H3 user manual. bus_clk controls THS_GATING in BUS_CLK_GATING_REG2 (THS module is connected to APB bus). I'd call it ths_clk and bus_clk. regards, o. > Maxime > > -- > Maxime Ripard, Bootlin > Embedded Linux and Kernel engineering > https://bootlin.com > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
On Tue, Jun 25, 2019 at 02:34:16AM +0200, Ondřej Jirman wrote: > On Mon, Jun 24, 2019 at 08:23:33PM +0200, Maxime Ripard wrote: > > On Sun, Jun 23, 2019 at 12:42:03PM -0400, Yangtao Li 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.windzz@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 ed1c19bb27cf..04f53ffb6a14 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_ahb_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 *ahb_clk; > > > > Hmm, thinking a bit about this, the name of those two clocks doesn't > > make sense. AHB is the bus being used to access that device, so the > > bus clock is the AHB clock. > > > > What is that clock being used for? > > To control the A/D and sample averaging logic, I suppose. It's controlled by the > THS_CLK_REG (THS Clock Register) in H3 user manual. > > bus_clk controls THS_GATING in BUS_CLK_GATING_REG2 (THS module is connected to > APB bus). > > I'd call it ths_clk and bus_clk. Thanks. We've tried to make clock names a bit more generic and consistent, so let's use mod instead. Maxime -- Maxime Ripard, Bootlin Embedded Linux and Kernel engineering https://bootlin.com
diff --git a/drivers/thermal/sun8i_thermal.c b/drivers/thermal/sun8i_thermal.c index ed1c19bb27cf..04f53ffb6a14 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_ahb_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 *ahb_clk; struct tsensor sensor[MAX_SENSOR_NUM]; }; @@ -280,6 +282,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_ahb_clk) { + tmdev->ahb_clk = devm_clk_get(&pdev->dev, "ahb"); + if (IS_ERR(tmdev->ahb_clk)) + return PTR_ERR(tmdev->ahb_clk); + } + ret = reset_control_deassert(tmdev->reset); if (ret) return ret; @@ -288,12 +296,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->ahb_clk); if (ret) goto bus_disable; + ret = sun50i_ths_calibrate(tmdev); + if (ret) + goto ahb_disable; + return 0; +ahb_disable: + clk_disable_unprepare(tmdev->ahb_clk); bus_disable: clk_disable_unprepare(tmdev->bus_clk); assert_reset: @@ -401,6 +415,7 @@ static int sun8i_ths_remove(struct platform_device *pdev) { struct ths_device *tmdev = platform_get_drvdata(pdev); + clk_disable_unprepare(tmdev->ahb_clk); clk_disable_unprepare(tmdev->bus_clk); reset_control_assert(tmdev->reset);
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.windzz@gmail.com> --- drivers/thermal/sun8i_thermal.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-)