diff mbox series

[2/2] thermal: sun8i: add R329 THS

Message ID BYAPR20MB24720C488FD2BB42038D9825BCF79@BYAPR20MB2472.namprd20.prod.outlook.com (mailing list archive)
State New
Delegated to: Daniel Lezcano
Headers show
Series [1/2] dt-bindings: thermal: sun8i-thermal: add binding for R329 THS | expand

Commit Message

icenowy@outlook.com April 22, 2022, 4:11 p.m. UTC
From: Icenowy Zheng <icenowy@aosc.io>

The thermal sensor controller on R329 is similar to the one on H6, but
with only one sensor. Calibration method is still unknown because no
calibration is implemented in BSP kernel, neither is it documented in
the user manual.

Add its support to sun8i-thermal driver. Calibrating it is now
prevented.

Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
---
 drivers/thermal/sun8i_thermal.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

Comments

Vasily Khoruzhick April 22, 2022, 6:49 p.m. UTC | #1
On Fri, Apr 22, 2022 at 9:12 AM <icenowy@outlook.com> wrote:
>
> From: Icenowy Zheng <icenowy@aosc.io>
>
> The thermal sensor controller on R329 is similar to the one on H6, but
> with only one sensor. Calibration method is still unknown because no
> calibration is implemented in BSP kernel, neither is it documented in
> the user manual.
>
> Add its support to sun8i-thermal driver. Calibrating it is now
> prevented.
>
> Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
> ---
>  drivers/thermal/sun8i_thermal.c | 15 ++++++++++++++-
>  1 file changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/thermal/sun8i_thermal.c b/drivers/thermal/sun8i_thermal.c
> index d9cd23cbb671..3a2f381005b4 100644
> --- a/drivers/thermal/sun8i_thermal.c
> +++ b/drivers/thermal/sun8i_thermal.c
> @@ -312,7 +312,8 @@ static int sun8i_ths_calibrate(struct ths_device *tmdev)
>                 goto out;
>         }
>
> -       tmdev->chip->calibrate(tmdev, caldata, callen);
> +       if (tmdev->chip->calibrate)
> +               tmdev->chip->calibrate(tmdev, caldata, callen);

I think it's a bit late to check it here since you already read nvmem
cell if you got here. I'd suggest moving the check to
sun8i_ths_resource_init(), i.e. call sun8i_ths_calibrate()
conditionally depending on whether calibrate callback is present.

>         kfree(caldata);
>  out:
> @@ -628,6 +629,17 @@ static const struct ths_thermal_chip sun50i_h6_ths = {
>         .calc_temp = sun8i_ths_calc_temp,
>  };
>
> +static const struct ths_thermal_chip sun50i_r329_ths = {
> +       .sensor_num = 1,
> +       .has_bus_clk_reset = true,
> +       .offset = 188744,
> +       .scale = 672,
> +       .temp_data_base = SUN50I_H6_THS_TEMP_DATA,
> +       .init = sun50i_h6_thermal_init,
> +       .irq_ack = sun50i_h6_irq_ack,
> +       .calc_temp = sun8i_ths_calc_temp,
> +};
> +
>  static const struct of_device_id of_ths_match[] = {
>         { .compatible = "allwinner,sun8i-a83t-ths", .data = &sun8i_a83t_ths },
>         { .compatible = "allwinner,sun8i-h3-ths", .data = &sun8i_h3_ths },
> @@ -636,6 +648,7 @@ static const struct of_device_id of_ths_match[] = {
>         { .compatible = "allwinner,sun50i-a100-ths", .data = &sun50i_a100_ths },
>         { .compatible = "allwinner,sun50i-h5-ths", .data = &sun50i_h5_ths },
>         { .compatible = "allwinner,sun50i-h6-ths", .data = &sun50i_h6_ths },
> +       { .compatible = "allwinner,sun50i-r329-ths", .data = &sun50i_r329_ths },
>         { /* sentinel */ },
>  };
>  MODULE_DEVICE_TABLE(of, of_ths_match);
> --
> 2.35.1
>
Samuel Holland April 22, 2022, 11:39 p.m. UTC | #2
Hi Icenowy,

On 4/22/22 11:11 AM, icenowy@outlook.com wrote:
> From: Icenowy Zheng <icenowy@aosc.io>
> 
> The thermal sensor controller on R329 is similar to the one on H6, but
> with only one sensor. Calibration method is still unknown because no
> calibration is implemented in BSP kernel, neither is it documented in
> the user manual.

Looking at the BSP smartx-r329-tina-for-jishu-community-v0.2, I see:

ths_calib: calib@14 {
        reg = <0x14 4>;
};

And the BSP driver (drivers/thermal/sunxi_thermal-ng.c) claims that R329 uses
the same calibration method as for H616. Maybe you are looking at an older BSP?

Regards,
Samuel

> 
> Add its support to sun8i-thermal driver. Calibrating it is now
> prevented.
> 
> Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
> ---
>  drivers/thermal/sun8i_thermal.c | 15 ++++++++++++++-
>  1 file changed, 14 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/thermal/sun8i_thermal.c b/drivers/thermal/sun8i_thermal.c
> index d9cd23cbb671..3a2f381005b4 100644
> --- a/drivers/thermal/sun8i_thermal.c
> +++ b/drivers/thermal/sun8i_thermal.c
> @@ -312,7 +312,8 @@ static int sun8i_ths_calibrate(struct ths_device *tmdev)
>  		goto out;
>  	}
>  
> -	tmdev->chip->calibrate(tmdev, caldata, callen);
> +	if (tmdev->chip->calibrate)
> +		tmdev->chip->calibrate(tmdev, caldata, callen);
>  
>  	kfree(caldata);
>  out:
> @@ -628,6 +629,17 @@ static const struct ths_thermal_chip sun50i_h6_ths = {
>  	.calc_temp = sun8i_ths_calc_temp,
>  };
>  
> +static const struct ths_thermal_chip sun50i_r329_ths = {
> +	.sensor_num = 1,
> +	.has_bus_clk_reset = true,
> +	.offset = 188744,
> +	.scale = 672,
> +	.temp_data_base = SUN50I_H6_THS_TEMP_DATA,
> +	.init = sun50i_h6_thermal_init,
> +	.irq_ack = sun50i_h6_irq_ack,
> +	.calc_temp = sun8i_ths_calc_temp,
> +};
> +
>  static const struct of_device_id of_ths_match[] = {
>  	{ .compatible = "allwinner,sun8i-a83t-ths", .data = &sun8i_a83t_ths },
>  	{ .compatible = "allwinner,sun8i-h3-ths", .data = &sun8i_h3_ths },
> @@ -636,6 +648,7 @@ static const struct of_device_id of_ths_match[] = {
>  	{ .compatible = "allwinner,sun50i-a100-ths", .data = &sun50i_a100_ths },
>  	{ .compatible = "allwinner,sun50i-h5-ths", .data = &sun50i_h5_ths },
>  	{ .compatible = "allwinner,sun50i-h6-ths", .data = &sun50i_h6_ths },
> +	{ .compatible = "allwinner,sun50i-r329-ths", .data = &sun50i_r329_ths },
>  	{ /* sentinel */ },
>  };
>  MODULE_DEVICE_TABLE(of, of_ths_match);
>
Icenowy Zheng April 22, 2022, 11:41 p.m. UTC | #3
在 2022-04-22星期五的 18:39 -0500,Samuel Holland写道:
> Hi Icenowy,
> 
> On 4/22/22 11:11 AM, icenowy@outlook.com wrote:
> > From: Icenowy Zheng <icenowy@aosc.io>
> > 
> > The thermal sensor controller on R329 is similar to the one on H6,
> > but
> > with only one sensor. Calibration method is still unknown because
> > no
> > calibration is implemented in BSP kernel, neither is it documented
> > in
> > the user manual.
> 
> Looking at the BSP smartx-r329-tina-for-jishu-community-v0.2, I see:
> 
> ths_calib: calib@14 {
>         reg = <0x14 4>;
> };
> 
> And the BSP driver (drivers/thermal/sunxi_thermal-ng.c) claims that
> R329 uses
> the same calibration method as for H616. Maybe you are looking at an
> older BSP?

Yes. All these r329 work is done the last year during my internship at
Sipeed.

I will check the newer version of BSP and if okay I will add the
calibrate routine in the next revision.

> 
> Regards,
> Samuel
> 
> > 
> > Add its support to sun8i-thermal driver. Calibrating it is now
> > prevented.
> > 
> > Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
> > ---
> >  drivers/thermal/sun8i_thermal.c | 15 ++++++++++++++-
> >  1 file changed, 14 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/thermal/sun8i_thermal.c
> > b/drivers/thermal/sun8i_thermal.c
> > index d9cd23cbb671..3a2f381005b4 100644
> > --- a/drivers/thermal/sun8i_thermal.c
> > +++ b/drivers/thermal/sun8i_thermal.c
> > @@ -312,7 +312,8 @@ static int sun8i_ths_calibrate(struct
> > ths_device *tmdev)
> >                 goto out;
> >         }
> >  
> > -       tmdev->chip->calibrate(tmdev, caldata, callen);
> > +       if (tmdev->chip->calibrate)
> > +               tmdev->chip->calibrate(tmdev, caldata, callen);
> >  
> >         kfree(caldata);
> >  out:
> > @@ -628,6 +629,17 @@ static const struct ths_thermal_chip
> > sun50i_h6_ths = {
> >         .calc_temp = sun8i_ths_calc_temp,
> >  };
> >  
> > +static const struct ths_thermal_chip sun50i_r329_ths = {
> > +       .sensor_num = 1,
> > +       .has_bus_clk_reset = true,
> > +       .offset = 188744,
> > +       .scale = 672,
> > +       .temp_data_base = SUN50I_H6_THS_TEMP_DATA,
> > +       .init = sun50i_h6_thermal_init,
> > +       .irq_ack = sun50i_h6_irq_ack,
> > +       .calc_temp = sun8i_ths_calc_temp,
> > +};
> > +
> >  static const struct of_device_id of_ths_match[] = {
> >         { .compatible = "allwinner,sun8i-a83t-ths", .data =
> > &sun8i_a83t_ths },
> >         { .compatible = "allwinner,sun8i-h3-ths", .data =
> > &sun8i_h3_ths },
> > @@ -636,6 +648,7 @@ static const struct of_device_id of_ths_match[]
> > = {
> >         { .compatible = "allwinner,sun50i-a100-ths", .data =
> > &sun50i_a100_ths },
> >         { .compatible = "allwinner,sun50i-h5-ths", .data =
> > &sun50i_h5_ths },
> >         { .compatible = "allwinner,sun50i-h6-ths", .data =
> > &sun50i_h6_ths },
> > +       { .compatible = "allwinner,sun50i-r329-ths", .data =
> > &sun50i_r329_ths },
> >         { /* sentinel */ },
> >  };
> >  MODULE_DEVICE_TABLE(of, of_ths_match);
> > 
> 
>
diff mbox series

Patch

diff --git a/drivers/thermal/sun8i_thermal.c b/drivers/thermal/sun8i_thermal.c
index d9cd23cbb671..3a2f381005b4 100644
--- a/drivers/thermal/sun8i_thermal.c
+++ b/drivers/thermal/sun8i_thermal.c
@@ -312,7 +312,8 @@  static int sun8i_ths_calibrate(struct ths_device *tmdev)
 		goto out;
 	}
 
-	tmdev->chip->calibrate(tmdev, caldata, callen);
+	if (tmdev->chip->calibrate)
+		tmdev->chip->calibrate(tmdev, caldata, callen);
 
 	kfree(caldata);
 out:
@@ -628,6 +629,17 @@  static const struct ths_thermal_chip sun50i_h6_ths = {
 	.calc_temp = sun8i_ths_calc_temp,
 };
 
+static const struct ths_thermal_chip sun50i_r329_ths = {
+	.sensor_num = 1,
+	.has_bus_clk_reset = true,
+	.offset = 188744,
+	.scale = 672,
+	.temp_data_base = SUN50I_H6_THS_TEMP_DATA,
+	.init = sun50i_h6_thermal_init,
+	.irq_ack = sun50i_h6_irq_ack,
+	.calc_temp = sun8i_ths_calc_temp,
+};
+
 static const struct of_device_id of_ths_match[] = {
 	{ .compatible = "allwinner,sun8i-a83t-ths", .data = &sun8i_a83t_ths },
 	{ .compatible = "allwinner,sun8i-h3-ths", .data = &sun8i_h3_ths },
@@ -636,6 +648,7 @@  static const struct of_device_id of_ths_match[] = {
 	{ .compatible = "allwinner,sun50i-a100-ths", .data = &sun50i_a100_ths },
 	{ .compatible = "allwinner,sun50i-h5-ths", .data = &sun50i_h5_ths },
 	{ .compatible = "allwinner,sun50i-h6-ths", .data = &sun50i_h6_ths },
+	{ .compatible = "allwinner,sun50i-r329-ths", .data = &sun50i_r329_ths },
 	{ /* sentinel */ },
 };
 MODULE_DEVICE_TABLE(of, of_ths_match);