* [v7,0/3] mt8183: Add Mediatek thermal driver and dtsi @ 2021-03-16 7:01 Michael Kao 2021-03-16 7:01 ` [v7,1/3] arm64: dts: mt8183: add thermal zone node Michael Kao ` (2 more replies) 0 siblings, 3 replies; 12+ messages in thread From: Michael Kao @ 2021-03-16 7:01 UTC (permalink / raw) To: michael.kao, fan.chen, Zhang Rui, Daniel Lezcano, linux-pm, srv_heupstream Cc: Eduardo Valentin, Rob Herring, Mark Rutland, Matthias Brugger, hsinyi, devicetree, linux-kernel, linux-arm-kernel, linux-mediatek This patchset supports for MT8183 chip to mtk_thermal.c. Add thermal zone of all the thermal sensor in SoC for another get temperatrue. They don't need to thermal throttle. And we bind coolers for thermal zone nodes of cpu_thermal. Changes in v7: - Fix build error in v6. Changes in v6: - Rebase to kernel-5.11-rc1. - [1/3] - add interrupts property. - [2/3] - add the Tested-by in the commit message. - [3/3] - use the mt->conf->msr[id] instead of conf->msr[id] in the _get_sensor_temp and mtk_thermal_bank_temperature. - remove the redundant space in _get_sensor_temp and mtk_read_sensor_temp. - change kmalloc to dev_kmalloc in mtk_thermal_probe. Changes in v5: - Rebase to kernel-5.9-rc1. - Revise the title of cover letter. - Drop "[v4,7/7] thermal: mediatek: use spinlock to protect PTPCORESEL" - [2/2] - Add the judgement to the version of raw_to_mcelsius. Changes in v4: - Rebase to kernel-5.6-rc1. - [1/7] - Squash thermal zone settings in the dtsi from [v3,5/8] arm64: dts: mt8183: Increase polling frequency for CPU thermal zone. - Remove the property of interrupts and mediatek,hw-reset-temp. - [2/7] - Correct commit message. - [4/7] - Change the target temperature to the 80C and change the commit message. - [6/7] - Adjust newline alignment. - Fix the judgement on the return value of registering thermal zone. Changes in v3: - Rebase to kernel-5.5-rc1. - [1/8] - Update sustainable power of cpu, tzts1~5 and tztsABB. - [7/8] - Bypass the failure that non cpu_thermal sensor is not find in thermal-zones in dts, which is normal for mt8173, so prompt a warning here instead of failing. Return -EAGAIN instead of -EACCESS on the first read of sensor that often are bogus values. This can avoid following warning on boot: thermal thermal_zone6: failed to read out thermal zone (-13) Changes in v2: - [1/8] - Add the sustainable-power,trips,cooling-maps to the tzts1~tztsABB. - [4/8] - Add the min opp of cpu throttle. Matthias Kaehlcke (1): arm64: dts: mt8183: Configure CPU cooling Michael Kao (2): thermal: mediatek: add another get_temp ops for thermal sensors arm64: dts: mt8183: add thermal zone node arch/arm64/boot/dts/mediatek/mt8183.dtsi | 141 +++++++++++++++++++++++ drivers/thermal/mtk_thermal.c | 100 ++++++++++++---- 2 files changed, 216 insertions(+), 25 deletions(-) -- 2.18.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 12+ messages in thread
* [v7,1/3] arm64: dts: mt8183: add thermal zone node 2021-03-16 7:01 [v7,0/3] mt8183: Add Mediatek thermal driver and dtsi Michael Kao @ 2021-03-16 7:01 ` Michael Kao 2021-03-22 11:20 ` Hsin-Yi Wang 2021-04-09 8:09 ` Daniel Lezcano 2021-03-16 7:01 ` [v7,2/3] arm64: dts: mt8183: Configure CPU cooling Michael Kao 2021-03-16 7:01 ` [v7, 3/3] thermal: mediatek: add another get_temp ops for thermal sensors Michael Kao 2 siblings, 2 replies; 12+ messages in thread From: Michael Kao @ 2021-03-16 7:01 UTC (permalink / raw) To: michael.kao, fan.chen, Zhang Rui, Daniel Lezcano, linux-pm, srv_heupstream Cc: Eduardo Valentin, Rob Herring, Mark Rutland, Matthias Brugger, hsinyi, devicetree, linux-kernel, linux-arm-kernel, linux-mediatek From: "michael.kao" <michael.kao@mediatek.com> Add thermal zone node to Mediatek MT8183 dts file. Evaluate the thermal zone every 500ms while not cooling and every 100ms when passive cooling is performed. Signed-off-by: Matthias Kaehlcke <mka@chromium.org> Signed-off-by: Michael Kao <michael.kao@mediatek.com> --- arch/arm64/boot/dts/mediatek/mt8183.dtsi | 85 ++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/arch/arm64/boot/dts/mediatek/mt8183.dtsi b/arch/arm64/boot/dts/mediatek/mt8183.dtsi index 5b782a4769e7..d3550af06408 100644 --- a/arch/arm64/boot/dts/mediatek/mt8183.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt8183.dtsi @@ -657,6 +657,87 @@ status = "disabled"; }; + thermal: thermal@1100b000 { + #thermal-sensor-cells = <1>; + compatible = "mediatek,mt8183-thermal"; + reg = <0 0x1100b000 0 0x1000>; + clocks = <&infracfg CLK_INFRA_THERM>, + <&infracfg CLK_INFRA_AUXADC>; + clock-names = "therm", "auxadc"; + resets = <&infracfg MT8183_INFRACFG_AO_THERM_SW_RST>; + interrupts = <0 76 IRQ_TYPE_LEVEL_LOW>; + mediatek,auxadc = <&auxadc>; + mediatek,apmixedsys = <&apmixedsys>; + nvmem-cells = <&thermal_calibration>; + nvmem-cell-names = "calibration-data"; + }; + + thermal-zones { + cpu_thermal: cpu_thermal { + polling-delay-passive = <100>; + polling-delay = <500>; + thermal-sensors = <&thermal 0>; + sustainable-power = <5000>; + }; + + /* The tzts1 ~ tzts6 don't need to polling */ + /* The tzts1 ~ tzts6 don't need to thermal throttle */ + + tzts1: tzts1 { + polling-delay-passive = <0>; + polling-delay = <0>; + thermal-sensors = <&thermal 1>; + sustainable-power = <5000>; + trips {}; + cooling-maps {}; + }; + + tzts2: tzts2 { + polling-delay-passive = <0>; + polling-delay = <0>; + thermal-sensors = <&thermal 2>; + sustainable-power = <5000>; + trips {}; + cooling-maps {}; + }; + + tzts3: tzts3 { + polling-delay-passive = <0>; + polling-delay = <0>; + thermal-sensors = <&thermal 3>; + sustainable-power = <5000>; + trips {}; + cooling-maps {}; + }; + + tzts4: tzts4 { + polling-delay-passive = <0>; + polling-delay = <0>; + thermal-sensors = <&thermal 4>; + sustainable-power = <5000>; + trips {}; + cooling-maps {}; + }; + + tzts5: tzts5 { + polling-delay-passive = <0>; + polling-delay = <0>; + thermal-sensors = <&thermal 5>; + sustainable-power = <5000>; + trips {}; + cooling-maps {}; + }; + + tztsABB: tztsABB { + polling-delay-passive = <0>; + polling-delay = <0>; + thermal-sensors = <&thermal 6>; + sustainable-power = <5000>; + trips {}; + cooling-maps {}; + }; + }; + pwm0: pwm@1100e000 { compatible = "mediatek,mt8183-disp-pwm"; reg = <0 0x1100e000 0 0x1000>; @@ -926,6 +1007,10 @@ reg = <0 0x11f10000 0 0x1000>; #address-cells = <1>; #size-cells = <1>; + thermal_calibration: calib@180 { + reg = <0x180 0xc>; + }; + mipi_tx_calibration: calib@190 { reg = <0x190 0xc>; }; -- 2.18.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [v7,1/3] arm64: dts: mt8183: add thermal zone node 2021-03-16 7:01 ` [v7,1/3] arm64: dts: mt8183: add thermal zone node Michael Kao @ 2021-03-22 11:20 ` Hsin-Yi Wang 2021-03-29 17:08 ` Matthias Brugger 2021-04-09 8:09 ` Daniel Lezcano 1 sibling, 1 reply; 12+ messages in thread From: Hsin-Yi Wang @ 2021-03-22 11:20 UTC (permalink / raw) To: Michael Kao Cc: fan.chen, Zhang Rui, Daniel Lezcano, Linux PM, srv_heupstream, Eduardo Valentin, Rob Herring, Mark Rutland, Matthias Brugger, Devicetree List, lkml, moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE, moderated list:ARM/Mediatek SoC support On Tue, Mar 16, 2021 at 3:02 PM Michael Kao <michael.kao@mediatek.com> wrote: > > From: "michael.kao" <michael.kao@mediatek.com> > > Add thermal zone node to Mediatek MT8183 dts file. > > Evaluate the thermal zone every 500ms while not cooling > and every 100ms when passive cooling is performed. > > Signed-off-by: Matthias Kaehlcke <mka@chromium.org> > Signed-off-by: Michael Kao <michael.kao@mediatek.com> Tested-by: Hsin-Yi Wang <hsinyi@chromium.org> Tested this patch on mt8183 devices. > --- > arch/arm64/boot/dts/mediatek/mt8183.dtsi | 85 ++++++++++++++++++++++++ > 1 file changed, 85 insertions(+) > > diff --git a/arch/arm64/boot/dts/mediatek/mt8183.dtsi b/arch/arm64/boot/dts/mediatek/mt8183.dtsi > index 5b782a4769e7..d3550af06408 100644 > --- a/arch/arm64/boot/dts/mediatek/mt8183.dtsi > +++ b/arch/arm64/boot/dts/mediatek/mt8183.dtsi > @@ -657,6 +657,87 @@ > status = "disabled"; > }; > > + thermal: thermal@1100b000 { > + #thermal-sensor-cells = <1>; > + compatible = "mediatek,mt8183-thermal"; > + reg = <0 0x1100b000 0 0x1000>; > + clocks = <&infracfg CLK_INFRA_THERM>, > + <&infracfg CLK_INFRA_AUXADC>; > + clock-names = "therm", "auxadc"; > + resets = <&infracfg MT8183_INFRACFG_AO_THERM_SW_RST>; > + interrupts = <0 76 IRQ_TYPE_LEVEL_LOW>; > + mediatek,auxadc = <&auxadc>; > + mediatek,apmixedsys = <&apmixedsys>; > + nvmem-cells = <&thermal_calibration>; > + nvmem-cell-names = "calibration-data"; > + }; > + > + thermal-zones { > + cpu_thermal: cpu_thermal { > + polling-delay-passive = <100>; > + polling-delay = <500>; > + thermal-sensors = <&thermal 0>; > + sustainable-power = <5000>; > + }; > + > + /* The tzts1 ~ tzts6 don't need to polling */ > + /* The tzts1 ~ tzts6 don't need to thermal throttle */ > + > + tzts1: tzts1 { > + polling-delay-passive = <0>; > + polling-delay = <0>; > + thermal-sensors = <&thermal 1>; > + sustainable-power = <5000>; > + trips {}; > + cooling-maps {}; > + }; > + > + tzts2: tzts2 { > + polling-delay-passive = <0>; > + polling-delay = <0>; > + thermal-sensors = <&thermal 2>; > + sustainable-power = <5000>; > + trips {}; > + cooling-maps {}; > + }; > + > + tzts3: tzts3 { > + polling-delay-passive = <0>; > + polling-delay = <0>; > + thermal-sensors = <&thermal 3>; > + sustainable-power = <5000>; > + trips {}; > + cooling-maps {}; > + }; > + > + tzts4: tzts4 { > + polling-delay-passive = <0>; > + polling-delay = <0>; > + thermal-sensors = <&thermal 4>; > + sustainable-power = <5000>; > + trips {}; > + cooling-maps {}; > + }; > + > + tzts5: tzts5 { > + polling-delay-passive = <0>; > + polling-delay = <0>; > + thermal-sensors = <&thermal 5>; > + sustainable-power = <5000>; > + trips {}; > + cooling-maps {}; > + }; > + > + tztsABB: tztsABB { > + polling-delay-passive = <0>; > + polling-delay = <0>; > + thermal-sensors = <&thermal 6>; > + sustainable-power = <5000>; > + trips {}; > + cooling-maps {}; > + }; > + }; > + > pwm0: pwm@1100e000 { > compatible = "mediatek,mt8183-disp-pwm"; > reg = <0 0x1100e000 0 0x1000>; > @@ -926,6 +1007,10 @@ > reg = <0 0x11f10000 0 0x1000>; > #address-cells = <1>; > #size-cells = <1>; > + thermal_calibration: calib@180 { > + reg = <0x180 0xc>; > + }; > + > mipi_tx_calibration: calib@190 { > reg = <0x190 0xc>; > }; > -- > 2.18.0 > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [v7,1/3] arm64: dts: mt8183: add thermal zone node 2021-03-22 11:20 ` Hsin-Yi Wang @ 2021-03-29 17:08 ` Matthias Brugger 0 siblings, 0 replies; 12+ messages in thread From: Matthias Brugger @ 2021-03-29 17:08 UTC (permalink / raw) To: Hsin-Yi Wang, Michael Kao Cc: fan.chen, Zhang Rui, Daniel Lezcano, Linux PM, srv_heupstream, Eduardo Valentin, Rob Herring, Mark Rutland, Devicetree List, lkml, moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE, moderated list:ARM/Mediatek SoC support On 22/03/2021 12:20, Hsin-Yi Wang wrote: > On Tue, Mar 16, 2021 at 3:02 PM Michael Kao <michael.kao@mediatek.com> wrote: >> >> From: "michael.kao" <michael.kao@mediatek.com> >> >> Add thermal zone node to Mediatek MT8183 dts file. >> >> Evaluate the thermal zone every 500ms while not cooling >> and every 100ms when passive cooling is performed. >> >> Signed-off-by: Matthias Kaehlcke <mka@chromium.org> >> Signed-off-by: Michael Kao <michael.kao@mediatek.com> > > Tested-by: Hsin-Yi Wang <hsinyi@chromium.org> > Applied to v5.12-next/dts64 Thanks! > Tested this patch on mt8183 devices. > >> --- >> arch/arm64/boot/dts/mediatek/mt8183.dtsi | 85 ++++++++++++++++++++++++ >> 1 file changed, 85 insertions(+) >> >> diff --git a/arch/arm64/boot/dts/mediatek/mt8183.dtsi b/arch/arm64/boot/dts/mediatek/mt8183.dtsi >> index 5b782a4769e7..d3550af06408 100644 >> --- a/arch/arm64/boot/dts/mediatek/mt8183.dtsi >> +++ b/arch/arm64/boot/dts/mediatek/mt8183.dtsi >> @@ -657,6 +657,87 @@ >> status = "disabled"; >> }; >> >> + thermal: thermal@1100b000 { >> + #thermal-sensor-cells = <1>; >> + compatible = "mediatek,mt8183-thermal"; >> + reg = <0 0x1100b000 0 0x1000>; >> + clocks = <&infracfg CLK_INFRA_THERM>, >> + <&infracfg CLK_INFRA_AUXADC>; >> + clock-names = "therm", "auxadc"; >> + resets = <&infracfg MT8183_INFRACFG_AO_THERM_SW_RST>; >> + interrupts = <0 76 IRQ_TYPE_LEVEL_LOW>; >> + mediatek,auxadc = <&auxadc>; >> + mediatek,apmixedsys = <&apmixedsys>; >> + nvmem-cells = <&thermal_calibration>; >> + nvmem-cell-names = "calibration-data"; >> + }; >> + >> + thermal-zones { >> + cpu_thermal: cpu_thermal { >> + polling-delay-passive = <100>; >> + polling-delay = <500>; >> + thermal-sensors = <&thermal 0>; >> + sustainable-power = <5000>; >> + }; >> + >> + /* The tzts1 ~ tzts6 don't need to polling */ >> + /* The tzts1 ~ tzts6 don't need to thermal throttle */ >> + >> + tzts1: tzts1 { >> + polling-delay-passive = <0>; >> + polling-delay = <0>; >> + thermal-sensors = <&thermal 1>; >> + sustainable-power = <5000>; >> + trips {}; >> + cooling-maps {}; >> + }; >> + >> + tzts2: tzts2 { >> + polling-delay-passive = <0>; >> + polling-delay = <0>; >> + thermal-sensors = <&thermal 2>; >> + sustainable-power = <5000>; >> + trips {}; >> + cooling-maps {}; >> + }; >> + >> + tzts3: tzts3 { >> + polling-delay-passive = <0>; >> + polling-delay = <0>; >> + thermal-sensors = <&thermal 3>; >> + sustainable-power = <5000>; >> + trips {}; >> + cooling-maps {}; >> + }; >> + >> + tzts4: tzts4 { >> + polling-delay-passive = <0>; >> + polling-delay = <0>; >> + thermal-sensors = <&thermal 4>; >> + sustainable-power = <5000>; >> + trips {}; >> + cooling-maps {}; >> + }; >> + >> + tzts5: tzts5 { >> + polling-delay-passive = <0>; >> + polling-delay = <0>; >> + thermal-sensors = <&thermal 5>; >> + sustainable-power = <5000>; >> + trips {}; >> + cooling-maps {}; >> + }; >> + >> + tztsABB: tztsABB { >> + polling-delay-passive = <0>; >> + polling-delay = <0>; >> + thermal-sensors = <&thermal 6>; >> + sustainable-power = <5000>; >> + trips {}; >> + cooling-maps {}; >> + }; >> + }; >> + >> pwm0: pwm@1100e000 { >> compatible = "mediatek,mt8183-disp-pwm"; >> reg = <0 0x1100e000 0 0x1000>; >> @@ -926,6 +1007,10 @@ >> reg = <0 0x11f10000 0 0x1000>; >> #address-cells = <1>; >> #size-cells = <1>; >> + thermal_calibration: calib@180 { >> + reg = <0x180 0xc>; >> + }; >> + >> mipi_tx_calibration: calib@190 { >> reg = <0x190 0xc>; >> }; >> -- >> 2.18.0 >> _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [v7,1/3] arm64: dts: mt8183: add thermal zone node 2021-03-16 7:01 ` [v7,1/3] arm64: dts: mt8183: add thermal zone node Michael Kao 2021-03-22 11:20 ` Hsin-Yi Wang @ 2021-04-09 8:09 ` Daniel Lezcano 1 sibling, 0 replies; 12+ messages in thread From: Daniel Lezcano @ 2021-04-09 8:09 UTC (permalink / raw) To: Michael Kao, fan.chen, Zhang Rui, linux-pm, srv_heupstream Cc: Eduardo Valentin, Rob Herring, Mark Rutland, Matthias Brugger, hsinyi, devicetree, linux-kernel, linux-arm-kernel, linux-mediatek On 16/03/2021 08:01, Michael Kao wrote: > From: "michael.kao" <michael.kao@mediatek.com> > > Add thermal zone node to Mediatek MT8183 dts file. > > Evaluate the thermal zone every 500ms while not cooling > and every 100ms when passive cooling is performed. > > Signed-off-by: Matthias Kaehlcke <mka@chromium.org> > Signed-off-by: Michael Kao <michael.kao@mediatek.com> > --- > arch/arm64/boot/dts/mediatek/mt8183.dtsi | 85 ++++++++++++++++++++++++ > 1 file changed, 85 insertions(+) > > diff --git a/arch/arm64/boot/dts/mediatek/mt8183.dtsi b/arch/arm64/boot/dts/mediatek/mt8183.dtsi > index 5b782a4769e7..d3550af06408 100644 > --- a/arch/arm64/boot/dts/mediatek/mt8183.dtsi > +++ b/arch/arm64/boot/dts/mediatek/mt8183.dtsi > @@ -657,6 +657,87 @@ > status = "disabled"; > }; > > + thermal: thermal@1100b000 { > + #thermal-sensor-cells = <1>; > + compatible = "mediatek,mt8183-thermal"; > + reg = <0 0x1100b000 0 0x1000>; > + clocks = <&infracfg CLK_INFRA_THERM>, > + <&infracfg CLK_INFRA_AUXADC>; > + clock-names = "therm", "auxadc"; > + resets = <&infracfg MT8183_INFRACFG_AO_THERM_SW_RST>; > + interrupts = <0 76 IRQ_TYPE_LEVEL_LOW>; > + mediatek,auxadc = <&auxadc>; > + mediatek,apmixedsys = <&apmixedsys>; > + nvmem-cells = <&thermal_calibration>; > + nvmem-cell-names = "calibration-data"; > + }; > + > + thermal-zones { > + cpu_thermal: cpu_thermal { > + polling-delay-passive = <100>; > + polling-delay = <500>; > + thermal-sensors = <&thermal 0>; > + sustainable-power = <5000>; > + }; > + > + /* The tzts1 ~ tzts6 don't need to polling */ > + /* The tzts1 ~ tzts6 don't need to thermal throttle */ > + > + tzts1: tzts1 { > + polling-delay-passive = <0>; > + polling-delay = <0>; > + thermal-sensors = <&thermal 1>; > + sustainable-power = <5000>; > + trips {}; > + cooling-maps {}; > + }; What is the point of defining the sustainable power with no cooling device associated ? -- <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 12+ messages in thread
* [v7,2/3] arm64: dts: mt8183: Configure CPU cooling 2021-03-16 7:01 [v7,0/3] mt8183: Add Mediatek thermal driver and dtsi Michael Kao 2021-03-16 7:01 ` [v7,1/3] arm64: dts: mt8183: add thermal zone node Michael Kao @ 2021-03-16 7:01 ` Michael Kao 2021-03-29 17:12 ` Matthias Brugger 2021-03-16 7:01 ` [v7, 3/3] thermal: mediatek: add another get_temp ops for thermal sensors Michael Kao 2 siblings, 1 reply; 12+ messages in thread From: Michael Kao @ 2021-03-16 7:01 UTC (permalink / raw) To: michael.kao, fan.chen, Zhang Rui, Daniel Lezcano, linux-pm, srv_heupstream Cc: Eduardo Valentin, Rob Herring, Mark Rutland, Matthias Brugger, hsinyi, devicetree, linux-kernel, linux-arm-kernel, linux-mediatek, Matthias Kaehlcke [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1: Type: text/plain; charset="y", Size: 2276 bytes --] From: Matthias Kaehlcke <mka@chromium.org> Add two passive trip points at 68°C and 80°C for the CPU temperature. Signed-off-by: Matthias Kaehlcke <mka@chromium.org> Signed-off-by: Michael Kao <michael.kao@mediatek.com> Tested-by: Hsin-Yi Wang <hsinyi@chromium.org> --- arch/arm64/boot/dts/mediatek/mt8183.dtsi | 56 ++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/arch/arm64/boot/dts/mediatek/mt8183.dtsi b/arch/arm64/boot/dts/mediatek/mt8183.dtsi index d3550af06408..1ad0a1d55d53 100644 --- a/arch/arm64/boot/dts/mediatek/mt8183.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt8183.dtsi @@ -13,6 +13,7 @@ #include <dt-bindings/power/mt8183-power.h> #include <dt-bindings/reset-controller/mt8183-resets.h> #include <dt-bindings/phy/phy.h> +#include <dt-bindings/thermal/thermal.h> #include "mt8183-pinfunc.h" / { @@ -678,6 +679,61 @@ polling-delay = <500>; thermal-sensors = <&thermal 0>; sustainable-power = <5000>; + + trips { + threshold: trip-point@0 { + temperature = <68000>; + hysteresis = <2000>; + type = "passive"; + }; + + target: trip-point@1 { + temperature = <80000>; + hysteresis = <2000>; + type = "passive"; + }; + + cpu_crit: cpu-crit { + temperature = <115000>; + hysteresis = <2000>; + type = "critical"; + }; + }; + + cooling-maps { + map0 { + trip = <&target>; + cooling-device = <&cpu0 + THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>, + <&cpu1 + THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>, + <&cpu2 + THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>, + <&cpu3 + THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>; + contribution = <3072>; + }; + map1 { + trip = <&target>; + cooling-device = <&cpu4 + THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>, + <&cpu5 + THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>, + <&cpu6 + THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>, + <&cpu7 + THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>; + contribution = <1024>; + }; + }; }; /* The tzts1 ~ tzts6 don't need to polling */ -- 2.18.0 [-- Attachment #2: Type: text/plain, Size: 176 bytes --] _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [v7,2/3] arm64: dts: mt8183: Configure CPU cooling 2021-03-16 7:01 ` [v7,2/3] arm64: dts: mt8183: Configure CPU cooling Michael Kao @ 2021-03-29 17:12 ` Matthias Brugger 0 siblings, 0 replies; 12+ messages in thread From: Matthias Brugger @ 2021-03-29 17:12 UTC (permalink / raw) To: Michael Kao, fan.chen, Zhang Rui, Daniel Lezcano, linux-pm, srv_heupstream Cc: Eduardo Valentin, Rob Herring, Mark Rutland, hsinyi, devicetree, linux-kernel, linux-arm-kernel, linux-mediatek, Matthias Kaehlcke On 16/03/2021 08:01, Michael Kao wrote: > From: Matthias Kaehlcke <mka@chromium.org> > > Add two passive trip points at 68°C and 80°C for the CPU temperature. > > Signed-off-by: Matthias Kaehlcke <mka@chromium.org> > Signed-off-by: Michael Kao <michael.kao@mediatek.com> > Tested-by: Hsin-Yi Wang <hsinyi@chromium.org> Applied to v5.12-next/dts64 Thanks. Matthias > --- > arch/arm64/boot/dts/mediatek/mt8183.dtsi | 56 ++++++++++++++++++++++++ > 1 file changed, 56 insertions(+) > > diff --git a/arch/arm64/boot/dts/mediatek/mt8183.dtsi b/arch/arm64/boot/dts/mediatek/mt8183.dtsi > index d3550af06408..1ad0a1d55d53 100644 > --- a/arch/arm64/boot/dts/mediatek/mt8183.dtsi > +++ b/arch/arm64/boot/dts/mediatek/mt8183.dtsi > @@ -13,6 +13,7 @@ > #include <dt-bindings/power/mt8183-power.h> > #include <dt-bindings/reset-controller/mt8183-resets.h> > #include <dt-bindings/phy/phy.h> > +#include <dt-bindings/thermal/thermal.h> > #include "mt8183-pinfunc.h" > > / { > @@ -678,6 +679,61 @@ > polling-delay = <500>; > thermal-sensors = <&thermal 0>; > sustainable-power = <5000>; > + > + trips { > + threshold: trip-point@0 { > + temperature = <68000>; > + hysteresis = <2000>; > + type = "passive"; > + }; > + > + target: trip-point@1 { > + temperature = <80000>; > + hysteresis = <2000>; > + type = "passive"; > + }; > + > + cpu_crit: cpu-crit { > + temperature = <115000>; > + hysteresis = <2000>; > + type = "critical"; > + }; > + }; > + > + cooling-maps { > + map0 { > + trip = <&target>; > + cooling-device = <&cpu0 > + THERMAL_NO_LIMIT > + THERMAL_NO_LIMIT>, > + <&cpu1 > + THERMAL_NO_LIMIT > + THERMAL_NO_LIMIT>, > + <&cpu2 > + THERMAL_NO_LIMIT > + THERMAL_NO_LIMIT>, > + <&cpu3 > + THERMAL_NO_LIMIT > + THERMAL_NO_LIMIT>; > + contribution = <3072>; > + }; > + map1 { > + trip = <&target>; > + cooling-device = <&cpu4 > + THERMAL_NO_LIMIT > + THERMAL_NO_LIMIT>, > + <&cpu5 > + THERMAL_NO_LIMIT > + THERMAL_NO_LIMIT>, > + <&cpu6 > + THERMAL_NO_LIMIT > + THERMAL_NO_LIMIT>, > + <&cpu7 > + THERMAL_NO_LIMIT > + THERMAL_NO_LIMIT>; > + contribution = <1024>; > + }; > + }; > }; > > /* The tzts1 ~ tzts6 don't need to polling */ > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 12+ messages in thread
* [v7, 3/3] thermal: mediatek: add another get_temp ops for thermal sensors 2021-03-16 7:01 [v7,0/3] mt8183: Add Mediatek thermal driver and dtsi Michael Kao 2021-03-16 7:01 ` [v7,1/3] arm64: dts: mt8183: add thermal zone node Michael Kao 2021-03-16 7:01 ` [v7,2/3] arm64: dts: mt8183: Configure CPU cooling Michael Kao @ 2021-03-16 7:01 ` Michael Kao 2021-04-07 8:49 ` Michael Kao 2021-04-09 8:16 ` Daniel Lezcano 2 siblings, 2 replies; 12+ messages in thread From: Michael Kao @ 2021-03-16 7:01 UTC (permalink / raw) To: michael.kao, fan.chen, Zhang Rui, Daniel Lezcano, linux-pm, srv_heupstream Cc: Eduardo Valentin, Rob Herring, Mark Rutland, Matthias Brugger, hsinyi, devicetree, linux-kernel, linux-arm-kernel, linux-mediatek Provide thermal zone to read thermal sensor in the SoC. We can read all the thermal sensors value in the SoC by the node /sys/class/thermal/ In mtk_thermal_bank_temperature, return -EAGAIN instead of -EACCESS on the first read of sensor that often are bogus values. This can avoid following warning on boot: thermal thermal_zone6: failed to read out thermal zone (-13) Signed-off-by: Michael Kao <michael.kao@mediatek.com> Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org> --- drivers/thermal/mtk_thermal.c | 100 +++++++++++++++++++++++++--------- 1 file changed, 75 insertions(+), 25 deletions(-) diff --git a/drivers/thermal/mtk_thermal.c b/drivers/thermal/mtk_thermal.c index 149c6d7fd5a0..57e4f08a947e 100644 --- a/drivers/thermal/mtk_thermal.c +++ b/drivers/thermal/mtk_thermal.c @@ -245,6 +245,11 @@ enum mtk_thermal_version { struct mtk_thermal; +struct mtk_thermal_zone { + struct mtk_thermal *mt; + int id; +}; + struct thermal_bank_cfg { unsigned int num_sensors; const int *sensors; @@ -637,6 +642,30 @@ static void mtk_thermal_put_bank(struct mtk_thermal_bank *bank) mutex_unlock(&mt->lock); } +static u32 _get_sensor_temp(struct mtk_thermal *mt, int id) +{ + u32 raw; + int temp; + + raw = readl(mt->thermal_base + mt->conf->msr[id]); + + if (mt->conf->version == MTK_THERMAL_V1) + temp = raw_to_mcelsius_v1(mt, id, raw); + else + temp = raw_to_mcelsius_v2(mt, id, raw); + + /* + * The first read of a sensor often contains very high bogus + * temperature value. Filter these out so that the system does + * not immediately shut down. + */ + + if (temp > 200000) + return -EAGAIN; + else + return temp; +} + /** * mtk_thermal_bank_temperature - get the temperature of a bank * @bank: The bank @@ -647,28 +676,11 @@ static void mtk_thermal_put_bank(struct mtk_thermal_bank *bank) static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank) { struct mtk_thermal *mt = bank->mt; - const struct mtk_thermal_data *conf = mt->conf; int i, temp = INT_MIN, max = INT_MIN; - u32 raw; - - for (i = 0; i < conf->bank_data[bank->id].num_sensors; i++) { - raw = readl(mt->thermal_base + conf->msr[i]); - if (mt->conf->version == MTK_THERMAL_V1) { - temp = raw_to_mcelsius_v1( - mt, conf->bank_data[bank->id].sensors[i], raw); - } else { - temp = raw_to_mcelsius_v2( - mt, conf->bank_data[bank->id].sensors[i], raw); - } + for (i = 0; i < mt->conf->bank_data[bank->id].num_sensors; i++) { - /* - * The first read of a sensor often contains very high bogus - * temperature value. Filter these out so that the system does - * not immediately shut down. - */ - if (temp > 200000) - temp = 0; + temp = _get_sensor_temp(mt, i); if (temp > max) max = temp; @@ -679,7 +691,8 @@ static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank) static int mtk_read_temp(void *data, int *temperature) { - struct mtk_thermal *mt = data; + struct mtk_thermal_zone *tz = data; + struct mtk_thermal *mt = tz->mt; int i; int tempmax = INT_MIN; @@ -698,10 +711,28 @@ static int mtk_read_temp(void *data, int *temperature) return 0; } +static int mtk_read_sensor_temp(void *data, int *temperature) +{ + struct mtk_thermal_zone *tz = data; + struct mtk_thermal *mt = tz->mt; + int id = tz->id - 1; + + if (id < 0) + return -EACCES; + + *temperature = _get_sensor_temp(mt, id); + + return 0; +} + static const struct thermal_zone_of_device_ops mtk_thermal_ops = { .get_temp = mtk_read_temp, }; +static const struct thermal_zone_of_device_ops mtk_thermal_sensor_ops = { + .get_temp = mtk_read_sensor_temp, +}; + static void mtk_thermal_init_bank(struct mtk_thermal *mt, int num, u32 apmixed_phys_base, u32 auxadc_phys_base, int ctrl_id) @@ -992,6 +1023,7 @@ static int mtk_thermal_probe(struct platform_device *pdev) u64 auxadc_phys_base, apmixed_phys_base; struct thermal_zone_device *tzdev; void __iomem *apmixed_base, *auxadc_base; + struct mtk_thermal_zone *tz; mt = devm_kzalloc(&pdev->dev, sizeof(*mt), GFP_KERNEL); if (!mt) @@ -1080,11 +1112,29 @@ static int mtk_thermal_probe(struct platform_device *pdev) platform_set_drvdata(pdev, mt); - tzdev = devm_thermal_zone_of_sensor_register(&pdev->dev, 0, mt, - &mtk_thermal_ops); - if (IS_ERR(tzdev)) { - ret = PTR_ERR(tzdev); - goto err_disable_clk_peri_therm; + for (i = 0; i < mt->conf->num_sensors + 1; i++) { + tz = devm_kmalloc(&pdev->dev, sizeof(*tz), GFP_KERNEL); + if (!tz) + return -ENOMEM; + + tz->mt = mt; + tz->id = i; + + tzdev = devm_thermal_zone_of_sensor_register(&pdev->dev, i, tz, (i == 0) ? + &mtk_thermal_ops : + &mtk_thermal_sensor_ops); + + if (IS_ERR(tzdev)) { + if (PTR_ERR(tzdev) == -ENODEV) { + dev_warn(&pdev->dev, + "sensor %d not registered in thermal zone in dt\n", i); + continue; + } + if (PTR_ERR(tzdev) == -EACCES) { + ret = PTR_ERR(tzdev); + goto err_disable_clk_peri_therm; + } + } } return 0; -- 2.18.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [v7, 3/3] thermal: mediatek: add another get_temp ops for thermal sensors 2021-03-16 7:01 ` [v7, 3/3] thermal: mediatek: add another get_temp ops for thermal sensors Michael Kao @ 2021-04-07 8:49 ` Michael Kao 2021-04-09 8:16 ` Daniel Lezcano 1 sibling, 0 replies; 12+ messages in thread From: Michael Kao @ 2021-04-07 8:49 UTC (permalink / raw) To: Daniel Lezcano Cc: Zhang Rui, linux-pm, srv_heupstream, Eduardo Valentin, Rob Herring, Mark Rutland, Matthias Brugger, hsinyi, devicetree, linux-kernel, linux-arm-kernel, linux-mediatek Hi Maintainers, Gentle pin for this patch. Thanks On Tue, 2021-03-16 at 15:01 +0800, Michael Kao wrote: > Provide thermal zone to read thermal sensor > in the SoC. We can read all the thermal sensors > value in the SoC by the node /sys/class/thermal/ > > In mtk_thermal_bank_temperature, return -EAGAIN instead of -EACCESS > on the first read of sensor that often are bogus values. > This can avoid following warning on boot: > > thermal thermal_zone6: failed to read out thermal zone (-13) > > Signed-off-by: Michael Kao <michael.kao@mediatek.com> > Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org> > --- > drivers/thermal/mtk_thermal.c | 100 +++++++++++++++++++++++++--------- > 1 file changed, 75 insertions(+), 25 deletions(-) > > diff --git a/drivers/thermal/mtk_thermal.c b/drivers/thermal/mtk_thermal.c > index 149c6d7fd5a0..57e4f08a947e 100644 > --- a/drivers/thermal/mtk_thermal.c > +++ b/drivers/thermal/mtk_thermal.c > @@ -245,6 +245,11 @@ enum mtk_thermal_version { > > struct mtk_thermal; > > +struct mtk_thermal_zone { > + struct mtk_thermal *mt; > + int id; > +}; > + > struct thermal_bank_cfg { > unsigned int num_sensors; > const int *sensors; > @@ -637,6 +642,30 @@ static void mtk_thermal_put_bank(struct mtk_thermal_bank *bank) > mutex_unlock(&mt->lock); > } > > +static u32 _get_sensor_temp(struct mtk_thermal *mt, int id) > +{ > + u32 raw; > + int temp; > + > + raw = readl(mt->thermal_base + mt->conf->msr[id]); > + > + if (mt->conf->version == MTK_THERMAL_V1) > + temp = raw_to_mcelsius_v1(mt, id, raw); > + else > + temp = raw_to_mcelsius_v2(mt, id, raw); > + > + /* > + * The first read of a sensor often contains very high bogus > + * temperature value. Filter these out so that the system does > + * not immediately shut down. > + */ > + > + if (temp > 200000) > + return -EAGAIN; > + else > + return temp; > +} > + > /** > * mtk_thermal_bank_temperature - get the temperature of a bank > * @bank: The bank > @@ -647,28 +676,11 @@ static void mtk_thermal_put_bank(struct mtk_thermal_bank *bank) > static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank) > { > struct mtk_thermal *mt = bank->mt; > - const struct mtk_thermal_data *conf = mt->conf; > int i, temp = INT_MIN, max = INT_MIN; > - u32 raw; > - > - for (i = 0; i < conf->bank_data[bank->id].num_sensors; i++) { > - raw = readl(mt->thermal_base + conf->msr[i]); > > - if (mt->conf->version == MTK_THERMAL_V1) { > - temp = raw_to_mcelsius_v1( > - mt, conf->bank_data[bank->id].sensors[i], raw); > - } else { > - temp = raw_to_mcelsius_v2( > - mt, conf->bank_data[bank->id].sensors[i], raw); > - } > + for (i = 0; i < mt->conf->bank_data[bank->id].num_sensors; i++) { > > - /* > - * The first read of a sensor often contains very high bogus > - * temperature value. Filter these out so that the system does > - * not immediately shut down. > - */ > - if (temp > 200000) > - temp = 0; > + temp = _get_sensor_temp(mt, i); > > if (temp > max) > max = temp; > @@ -679,7 +691,8 @@ static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank) > > static int mtk_read_temp(void *data, int *temperature) > { > - struct mtk_thermal *mt = data; > + struct mtk_thermal_zone *tz = data; > + struct mtk_thermal *mt = tz->mt; > int i; > int tempmax = INT_MIN; > > @@ -698,10 +711,28 @@ static int mtk_read_temp(void *data, int *temperature) > return 0; > } > > +static int mtk_read_sensor_temp(void *data, int *temperature) > +{ > + struct mtk_thermal_zone *tz = data; > + struct mtk_thermal *mt = tz->mt; > + int id = tz->id - 1; > + > + if (id < 0) > + return -EACCES; > + > + *temperature = _get_sensor_temp(mt, id); > + > + return 0; > +} > + > static const struct thermal_zone_of_device_ops mtk_thermal_ops = { > .get_temp = mtk_read_temp, > }; > > +static const struct thermal_zone_of_device_ops mtk_thermal_sensor_ops = { > + .get_temp = mtk_read_sensor_temp, > +}; > + > static void mtk_thermal_init_bank(struct mtk_thermal *mt, int num, > u32 apmixed_phys_base, u32 auxadc_phys_base, > int ctrl_id) > @@ -992,6 +1023,7 @@ static int mtk_thermal_probe(struct platform_device *pdev) > u64 auxadc_phys_base, apmixed_phys_base; > struct thermal_zone_device *tzdev; > void __iomem *apmixed_base, *auxadc_base; > + struct mtk_thermal_zone *tz; > > mt = devm_kzalloc(&pdev->dev, sizeof(*mt), GFP_KERNEL); > if (!mt) > @@ -1080,11 +1112,29 @@ static int mtk_thermal_probe(struct platform_device *pdev) > > platform_set_drvdata(pdev, mt); > > - tzdev = devm_thermal_zone_of_sensor_register(&pdev->dev, 0, mt, > - &mtk_thermal_ops); > - if (IS_ERR(tzdev)) { > - ret = PTR_ERR(tzdev); > - goto err_disable_clk_peri_therm; > + for (i = 0; i < mt->conf->num_sensors + 1; i++) { > + tz = devm_kmalloc(&pdev->dev, sizeof(*tz), GFP_KERNEL); > + if (!tz) > + return -ENOMEM; > + > + tz->mt = mt; > + tz->id = i; > + > + tzdev = devm_thermal_zone_of_sensor_register(&pdev->dev, i, tz, (i == 0) ? > + &mtk_thermal_ops : > + &mtk_thermal_sensor_ops); > + > + if (IS_ERR(tzdev)) { > + if (PTR_ERR(tzdev) == -ENODEV) { > + dev_warn(&pdev->dev, > + "sensor %d not registered in thermal zone in dt\n", i); > + continue; > + } > + if (PTR_ERR(tzdev) == -EACCES) { > + ret = PTR_ERR(tzdev); > + goto err_disable_clk_peri_therm; > + } > + } > } > > return 0; _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [v7, 3/3] thermal: mediatek: add another get_temp ops for thermal sensors 2021-03-16 7:01 ` [v7, 3/3] thermal: mediatek: add another get_temp ops for thermal sensors Michael Kao 2021-04-07 8:49 ` Michael Kao @ 2021-04-09 8:16 ` Daniel Lezcano 2021-04-29 2:39 ` [v7,3/3] " Michael Kao 2021-05-06 5:14 ` Michael Kao 1 sibling, 2 replies; 12+ messages in thread From: Daniel Lezcano @ 2021-04-09 8:16 UTC (permalink / raw) To: Michael Kao, fan.chen, Zhang Rui, linux-pm, srv_heupstream Cc: Eduardo Valentin, Rob Herring, Mark Rutland, Matthias Brugger, hsinyi, devicetree, linux-kernel, linux-arm-kernel, linux-mediatek On 16/03/2021 08:01, Michael Kao wrote: > Provide thermal zone to read thermal sensor > in the SoC. We can read all the thermal sensors > value in the SoC by the node /sys/class/thermal/ > > In mtk_thermal_bank_temperature, return -EAGAIN instead of -EACCESS > on the first read of sensor that often are bogus values. > This can avoid following warning on boot: > > thermal thermal_zone6: failed to read out thermal zone (-13) This patch is changing more things than described in the changelog. Is it possible to share some technical details about how the sensor(s) are working or point to some documentation if any ? and possibly the layout ? IIUC there is a fake thermal zone zero with the purpose of aggregating all the other sensors by taking the max temperature of all the sensors. This patch adds a thermal zone per sensor, and each sensor is per CPU. CPU0 being actually the max of all the other sensors, right ? > Signed-off-by: Michael Kao <michael.kao@mediatek.com> > Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org> > --- > drivers/thermal/mtk_thermal.c | 100 +++++++++++++++++++++++++--------- > 1 file changed, 75 insertions(+), 25 deletions(-) > > diff --git a/drivers/thermal/mtk_thermal.c b/drivers/thermal/mtk_thermal.c > index 149c6d7fd5a0..57e4f08a947e 100644 > --- a/drivers/thermal/mtk_thermal.c > +++ b/drivers/thermal/mtk_thermal.c > @@ -245,6 +245,11 @@ enum mtk_thermal_version { > > struct mtk_thermal; > > +struct mtk_thermal_zone { > + struct mtk_thermal *mt; > + int id; > +}; > + > struct thermal_bank_cfg { > unsigned int num_sensors; > const int *sensors; > @@ -637,6 +642,30 @@ static void mtk_thermal_put_bank(struct mtk_thermal_bank *bank) > mutex_unlock(&mt->lock); > } > > +static u32 _get_sensor_temp(struct mtk_thermal *mt, int id) > +{ > + u32 raw; > + int temp; > + > + raw = readl(mt->thermal_base + mt->conf->msr[id]); > + > + if (mt->conf->version == MTK_THERMAL_V1) > + temp = raw_to_mcelsius_v1(mt, id, raw); > + else > + temp = raw_to_mcelsius_v2(mt, id, raw); > + > + /* > + * The first read of a sensor often contains very high bogus > + * temperature value. Filter these out so that the system does > + * not immediately shut down. > + */ > + > + if (temp > 200000) > + return -EAGAIN; > + else > + return temp; > +} > + > /** > * mtk_thermal_bank_temperature - get the temperature of a bank > * @bank: The bank > @@ -647,28 +676,11 @@ static void mtk_thermal_put_bank(struct mtk_thermal_bank *bank) > static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank) > { > struct mtk_thermal *mt = bank->mt; > - const struct mtk_thermal_data *conf = mt->conf; > int i, temp = INT_MIN, max = INT_MIN; > - u32 raw; > - > - for (i = 0; i < conf->bank_data[bank->id].num_sensors; i++) { > - raw = readl(mt->thermal_base + conf->msr[i]); > > - if (mt->conf->version == MTK_THERMAL_V1) { > - temp = raw_to_mcelsius_v1( > - mt, conf->bank_data[bank->id].sensors[i], raw); > - } else { > - temp = raw_to_mcelsius_v2( > - mt, conf->bank_data[bank->id].sensors[i], raw); > - } > + for (i = 0; i < mt->conf->bank_data[bank->id].num_sensors; i++) { > > - /* > - * The first read of a sensor often contains very high bogus > - * temperature value. Filter these out so that the system does > - * not immediately shut down. > - */ > - if (temp > 200000) > - temp = 0; > + temp = _get_sensor_temp(mt, i); > > if (temp > max) > max = temp; > @@ -679,7 +691,8 @@ static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank) > > static int mtk_read_temp(void *data, int *temperature) > { > - struct mtk_thermal *mt = data; > + struct mtk_thermal_zone *tz = data; > + struct mtk_thermal *mt = tz->mt; > int i; > int tempmax = INT_MIN; > > @@ -698,10 +711,28 @@ static int mtk_read_temp(void *data, int *temperature) > return 0; > } > > +static int mtk_read_sensor_temp(void *data, int *temperature) > +{ > + struct mtk_thermal_zone *tz = data; > + struct mtk_thermal *mt = tz->mt; > + int id = tz->id - 1; > + > + if (id < 0) > + return -EACCES; > + > + *temperature = _get_sensor_temp(mt, id); > + > + return 0; > +} > + > static const struct thermal_zone_of_device_ops mtk_thermal_ops = { > .get_temp = mtk_read_temp, > }; > > +static const struct thermal_zone_of_device_ops mtk_thermal_sensor_ops = { > + .get_temp = mtk_read_sensor_temp, > +}; > + > static void mtk_thermal_init_bank(struct mtk_thermal *mt, int num, > u32 apmixed_phys_base, u32 auxadc_phys_base, > int ctrl_id) > @@ -992,6 +1023,7 @@ static int mtk_thermal_probe(struct platform_device *pdev) > u64 auxadc_phys_base, apmixed_phys_base; > struct thermal_zone_device *tzdev; > void __iomem *apmixed_base, *auxadc_base; > + struct mtk_thermal_zone *tz; > > mt = devm_kzalloc(&pdev->dev, sizeof(*mt), GFP_KERNEL); > if (!mt) > @@ -1080,11 +1112,29 @@ static int mtk_thermal_probe(struct platform_device *pdev) > > platform_set_drvdata(pdev, mt); > > - tzdev = devm_thermal_zone_of_sensor_register(&pdev->dev, 0, mt, > - &mtk_thermal_ops); > - if (IS_ERR(tzdev)) { > - ret = PTR_ERR(tzdev); > - goto err_disable_clk_peri_therm; > + for (i = 0; i < mt->conf->num_sensors + 1; i++) { > + tz = devm_kmalloc(&pdev->dev, sizeof(*tz), GFP_KERNEL); > + if (!tz) > + return -ENOMEM; > + > + tz->mt = mt; > + tz->id = i; > + > + tzdev = devm_thermal_zone_of_sensor_register(&pdev->dev, i, tz, (i == 0) ? > + &mtk_thermal_ops : > + &mtk_thermal_sensor_ops); > + > + if (IS_ERR(tzdev)) { > + if (PTR_ERR(tzdev) == -ENODEV) { > + dev_warn(&pdev->dev, > + "sensor %d not registered in thermal zone in dt\n", i); > + continue; > + } > + if (PTR_ERR(tzdev) == -EACCES) { > + ret = PTR_ERR(tzdev); > + goto err_disable_clk_peri_therm; > + } > + } > } > > return 0; > -- <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [v7,3/3] thermal: mediatek: add another get_temp ops for thermal sensors 2021-04-09 8:16 ` Daniel Lezcano @ 2021-04-29 2:39 ` Michael Kao 2021-05-06 5:14 ` Michael Kao 1 sibling, 0 replies; 12+ messages in thread From: Michael Kao @ 2021-04-29 2:39 UTC (permalink / raw) To: Daniel Lezcano, fan.chen, Zhang Rui, linux-pm, srv_heupstream, Ben.Tseng Cc: Eduardo Valentin, Rob Herring, Mark Rutland, Matthias Brugger, hsinyi, devicetree, linux-kernel, linux-arm-kernel, linux-mediatek On Fri, 2021-04-09 at 10:16 +0200, Daniel Lezcano wrote: > On 16/03/2021 08:01, Michael Kao wrote: > > Provide thermal zone to read thermal sensor > > in the SoC. We can read all the thermal sensors > > value in the SoC by the node /sys/class/thermal/ > > > > In mtk_thermal_bank_temperature, return -EAGAIN instead of -EACCESS > > on the first read of sensor that often are bogus values. > > This can avoid following warning on boot: > > > > thermal thermal_zone6: failed to read out thermal zone (-13) > Hi Daniel, > This patch is changing more things than described in the changelog. > Is it possible to share some technical details about how the > sensor(s) > are working or point to some documentation if any ? and possibly the > layout ? => All these sensors are used in the driver, mtk_thermal.c. We just register thermal_zone0 for the max value of the sensors in the SoC before. Now, the svs module need to read the sensor in the soc separately, so we register all the sensor in the soc to thermal zone for other module can read sensor value by get_thermal_zone_by_name. This patch does not change the logic of read thermal sensor. We still use auxadc and select bank to read sensors by thermal controller. > IIUC there is a fake thermal zone zero with the purpose of > aggregating > all the other sensors by taking the max temperature of all the > sensors. => Yes, thermal_zone0 is fake zone that will show the max temperature of all the sensors. The thermal throttle will reference this thermal zone. > This patch adds a thermal zone per sensor, and each sensor is per > CPU. > CPU0 being actually the max of all the other sensors, right ? > => For 8192 [1], we add these thermal sensors in the soc. cpu_big1 cpu_big2 cpu_big3 cpu_big4 cci1 cci2 cpu_little1 cpu_little2 apu mlda gpu1 gpu2 infra camsys [1] https://patchwork.kernel.org/project/linux-mediatek/patch/20201223074944.2061-1-michael.kao@mediatek.com/ > > Signed-off-by: Michael Kao <michael.kao@mediatek.com> > > Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org> > > --- > > drivers/thermal/mtk_thermal.c | 100 +++++++++++++++++++++++++----- > > ---- > > 1 file changed, 75 insertions(+), 25 deletions(-) > > > > diff --git a/drivers/thermal/mtk_thermal.c > > b/drivers/thermal/mtk_thermal.c > > index 149c6d7fd5a0..57e4f08a947e 100644 > > --- a/drivers/thermal/mtk_thermal.c > > +++ b/drivers/thermal/mtk_thermal.c > > @@ -245,6 +245,11 @@ enum mtk_thermal_version { > > > > struct mtk_thermal; > > > > +struct mtk_thermal_zone { > > + struct mtk_thermal *mt; > > + int id; > > +}; > > + > > struct thermal_bank_cfg { > > unsigned int num_sensors; > > const int *sensors; > > @@ -637,6 +642,30 @@ static void mtk_thermal_put_bank(struct > > mtk_thermal_bank *bank) > > mutex_unlock(&mt->lock); > > } > > > > +static u32 _get_sensor_temp(struct mtk_thermal *mt, int id) > > +{ > > + u32 raw; > > + int temp; > > + > > + raw = readl(mt->thermal_base + mt->conf->msr[id]); > > + > > + if (mt->conf->version == MTK_THERMAL_V1) > > + temp = raw_to_mcelsius_v1(mt, id, raw); > > + else > > + temp = raw_to_mcelsius_v2(mt, id, raw); > > + > > + /* > > + * The first read of a sensor often contains very high bogus > > + * temperature value. Filter these out so that the system does > > + * not immediately shut down. > > + */ > > + > > + if (temp > 200000) > > + return -EAGAIN; > > + else > > + return temp; > > +} > > + > > /** > > * mtk_thermal_bank_temperature - get the temperature of a bank > > * @bank: The bank > > @@ -647,28 +676,11 @@ static void mtk_thermal_put_bank(struct > > mtk_thermal_bank *bank) > > static int mtk_thermal_bank_temperature(struct mtk_thermal_bank > > *bank) > > { > > struct mtk_thermal *mt = bank->mt; > > - const struct mtk_thermal_data *conf = mt->conf; > > int i, temp = INT_MIN, max = INT_MIN; > > - u32 raw; > > - > > - for (i = 0; i < conf->bank_data[bank->id].num_sensors; i++) { > > - raw = readl(mt->thermal_base + conf->msr[i]); > > > > - if (mt->conf->version == MTK_THERMAL_V1) { > > - temp = raw_to_mcelsius_v1( > > - mt, conf->bank_data[bank- > > >id].sensors[i], raw); > > - } else { > > - temp = raw_to_mcelsius_v2( > > - mt, conf->bank_data[bank- > > >id].sensors[i], raw); > > - } > > + for (i = 0; i < mt->conf->bank_data[bank->id].num_sensors; i++) > > { > > > > - /* > > - * The first read of a sensor often contains very high > > bogus > > - * temperature value. Filter these out so that the > > system does > > - * not immediately shut down. > > - */ > > - if (temp > 200000) > > - temp = 0; > > + temp = _get_sensor_temp(mt, i); > > > > if (temp > max) > > max = temp; > > @@ -679,7 +691,8 @@ static int mtk_thermal_bank_temperature(struct > > mtk_thermal_bank *bank) > > > > static int mtk_read_temp(void *data, int *temperature) > > { > > - struct mtk_thermal *mt = data; > > + struct mtk_thermal_zone *tz = data; > > + struct mtk_thermal *mt = tz->mt; > > int i; > > int tempmax = INT_MIN; > > > > @@ -698,10 +711,28 @@ static int mtk_read_temp(void *data, int > > *temperature) > > return 0; > > } > > > > +static int mtk_read_sensor_temp(void *data, int *temperature) > > +{ > > + struct mtk_thermal_zone *tz = data; > > + struct mtk_thermal *mt = tz->mt; > > + int id = tz->id - 1; > > + > > + if (id < 0) > > + return -EACCES; > > + > > + *temperature = _get_sensor_temp(mt, id); > > + > > + return 0; > > +} > > + > > static const struct thermal_zone_of_device_ops mtk_thermal_ops = { > > .get_temp = mtk_read_temp, > > }; > > > > +static const struct thermal_zone_of_device_ops > > mtk_thermal_sensor_ops = { > > + .get_temp = mtk_read_sensor_temp, > > +}; > > + > > static void mtk_thermal_init_bank(struct mtk_thermal *mt, int num, > > u32 apmixed_phys_base, u32 > > auxadc_phys_base, > > int ctrl_id) > > @@ -992,6 +1023,7 @@ static int mtk_thermal_probe(struct > > platform_device *pdev) > > u64 auxadc_phys_base, apmixed_phys_base; > > struct thermal_zone_device *tzdev; > > void __iomem *apmixed_base, *auxadc_base; > > + struct mtk_thermal_zone *tz; > > > > mt = devm_kzalloc(&pdev->dev, sizeof(*mt), GFP_KERNEL); > > if (!mt) > > @@ -1080,11 +1112,29 @@ static int mtk_thermal_probe(struct > > platform_device *pdev) > > > > platform_set_drvdata(pdev, mt); > > > > - tzdev = devm_thermal_zone_of_sensor_register(&pdev->dev, 0, mt, > > - &mtk_thermal_ops); > > - if (IS_ERR(tzdev)) { > > - ret = PTR_ERR(tzdev); > > - goto err_disable_clk_peri_therm; > > + for (i = 0; i < mt->conf->num_sensors + 1; i++) { > > + tz = devm_kmalloc(&pdev->dev, sizeof(*tz), GFP_KERNEL); > > + if (!tz) > > + return -ENOMEM; > > + > > + tz->mt = mt; > > + tz->id = i; > > + > > + tzdev = devm_thermal_zone_of_sensor_register(&pdev- > > >dev, i, tz, (i == 0) ? > > + &mtk_therm > > al_ops : > > + &mtk_therm > > al_sensor_ops); > > + > > + if (IS_ERR(tzdev)) { > > + if (PTR_ERR(tzdev) == -ENODEV) { > > + dev_warn(&pdev->dev, > > + "sensor %d not registered in > > thermal zone in dt\n", i); > > + continue; > > + } > > + if (PTR_ERR(tzdev) == -EACCES) { > > + ret = PTR_ERR(tzdev); > > + goto err_disable_clk_peri_therm; > > + } > > + } > > } > > > > return 0; > > > > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [v7,3/3] thermal: mediatek: add another get_temp ops for thermal sensors 2021-04-09 8:16 ` Daniel Lezcano 2021-04-29 2:39 ` [v7,3/3] " Michael Kao @ 2021-05-06 5:14 ` Michael Kao 1 sibling, 0 replies; 12+ messages in thread From: Michael Kao @ 2021-05-06 5:14 UTC (permalink / raw) To: Daniel Lezcano, fan.chen, Zhang Rui, linux-pm, srv_heupstream, Ben.Tseng Cc: Eduardo Valentin, Rob Herring, Mark Rutland, Matthias Brugger, hsinyi, devicetree, linux-kernel, linux-arm-kernel, linux-mediatek Hi Maintainers, Gentle pin for this patch. Thanks On Fri, 2021-04-09 at 10:16 +0200, Daniel Lezcano wrote: > On 16/03/2021 08:01, Michael Kao wrote: > > Provide thermal zone to read thermal sensor > > in the SoC. We can read all the thermal sensors > > value in the SoC by the node /sys/class/thermal/ > > > > In mtk_thermal_bank_temperature, return -EAGAIN instead of -EACCESS > > on the first read of sensor that often are bogus values. > > This can avoid following warning on boot: > > > > thermal thermal_zone6: failed to read out thermal zone (-13) > > This patch is changing more things than described in the changelog. > > Is it possible to share some technical details about how the > sensor(s) > are working or point to some documentation if any ? and possibly the > layout ? > > IIUC there is a fake thermal zone zero with the purpose of > aggregating > all the other sensors by taking the max temperature of all the > sensors. > > This patch adds a thermal zone per sensor, and each sensor is per > CPU. > CPU0 being actually the max of all the other sensors, right ? > > > > Signed-off-by: Michael Kao <michael.kao@mediatek.com> > > Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org> > > --- > > drivers/thermal/mtk_thermal.c | 100 +++++++++++++++++++++++++----- > > ---- > > 1 file changed, 75 insertions(+), 25 deletions(-) > > > > diff --git a/drivers/thermal/mtk_thermal.c > > b/drivers/thermal/mtk_thermal.c > > index 149c6d7fd5a0..57e4f08a947e 100644 > > --- a/drivers/thermal/mtk_thermal.c > > +++ b/drivers/thermal/mtk_thermal.c > > @@ -245,6 +245,11 @@ enum mtk_thermal_version { > > > > struct mtk_thermal; > > > > +struct mtk_thermal_zone { > > + struct mtk_thermal *mt; > > + int id; > > +}; > > + > > struct thermal_bank_cfg { > > unsigned int num_sensors; > > const int *sensors; > > @@ -637,6 +642,30 @@ static void mtk_thermal_put_bank(struct > > mtk_thermal_bank *bank) > > mutex_unlock(&mt->lock); > > } > > > > +static u32 _get_sensor_temp(struct mtk_thermal *mt, int id) > > +{ > > + u32 raw; > > + int temp; > > + > > + raw = readl(mt->thermal_base + mt->conf->msr[id]); > > + > > + if (mt->conf->version == MTK_THERMAL_V1) > > + temp = raw_to_mcelsius_v1(mt, id, raw); > > + else > > + temp = raw_to_mcelsius_v2(mt, id, raw); > > + > > + /* > > + * The first read of a sensor often contains very high bogus > > + * temperature value. Filter these out so that the system does > > + * not immediately shut down. > > + */ > > + > > + if (temp > 200000) > > + return -EAGAIN; > > + else > > + return temp; > > +} > > + > > /** > > * mtk_thermal_bank_temperature - get the temperature of a bank > > * @bank: The bank > > @@ -647,28 +676,11 @@ static void mtk_thermal_put_bank(struct > > mtk_thermal_bank *bank) > > static int mtk_thermal_bank_temperature(struct mtk_thermal_bank > > *bank) > > { > > struct mtk_thermal *mt = bank->mt; > > - const struct mtk_thermal_data *conf = mt->conf; > > int i, temp = INT_MIN, max = INT_MIN; > > - u32 raw; > > - > > - for (i = 0; i < conf->bank_data[bank->id].num_sensors; i++) { > > - raw = readl(mt->thermal_base + conf->msr[i]); > > > > - if (mt->conf->version == MTK_THERMAL_V1) { > > - temp = raw_to_mcelsius_v1( > > - mt, conf->bank_data[bank- > > >id].sensors[i], raw); > > - } else { > > - temp = raw_to_mcelsius_v2( > > - mt, conf->bank_data[bank- > > >id].sensors[i], raw); > > - } > > + for (i = 0; i < mt->conf->bank_data[bank->id].num_sensors; i++) > > { > > > > - /* > > - * The first read of a sensor often contains very high > > bogus > > - * temperature value. Filter these out so that the > > system does > > - * not immediately shut down. > > - */ > > - if (temp > 200000) > > - temp = 0; > > + temp = _get_sensor_temp(mt, i); > > > > if (temp > max) > > max = temp; > > @@ -679,7 +691,8 @@ static int mtk_thermal_bank_temperature(struct > > mtk_thermal_bank *bank) > > > > static int mtk_read_temp(void *data, int *temperature) > > { > > - struct mtk_thermal *mt = data; > > + struct mtk_thermal_zone *tz = data; > > + struct mtk_thermal *mt = tz->mt; > > int i; > > int tempmax = INT_MIN; > > > > @@ -698,10 +711,28 @@ static int mtk_read_temp(void *data, int > > *temperature) > > return 0; > > } > > > > +static int mtk_read_sensor_temp(void *data, int *temperature) > > +{ > > + struct mtk_thermal_zone *tz = data; > > + struct mtk_thermal *mt = tz->mt; > > + int id = tz->id - 1; > > + > > + if (id < 0) > > + return -EACCES; > > + > > + *temperature = _get_sensor_temp(mt, id); > > + > > + return 0; > > +} > > + > > static const struct thermal_zone_of_device_ops mtk_thermal_ops = { > > .get_temp = mtk_read_temp, > > }; > > > > +static const struct thermal_zone_of_device_ops > > mtk_thermal_sensor_ops = { > > + .get_temp = mtk_read_sensor_temp, > > +}; > > + > > static void mtk_thermal_init_bank(struct mtk_thermal *mt, int num, > > u32 apmixed_phys_base, u32 > > auxadc_phys_base, > > int ctrl_id) > > @@ -992,6 +1023,7 @@ static int mtk_thermal_probe(struct > > platform_device *pdev) > > u64 auxadc_phys_base, apmixed_phys_base; > > struct thermal_zone_device *tzdev; > > void __iomem *apmixed_base, *auxadc_base; > > + struct mtk_thermal_zone *tz; > > > > mt = devm_kzalloc(&pdev->dev, sizeof(*mt), GFP_KERNEL); > > if (!mt) > > @@ -1080,11 +1112,29 @@ static int mtk_thermal_probe(struct > > platform_device *pdev) > > > > platform_set_drvdata(pdev, mt); > > > > - tzdev = devm_thermal_zone_of_sensor_register(&pdev->dev, 0, mt, > > - &mtk_thermal_ops); > > - if (IS_ERR(tzdev)) { > > - ret = PTR_ERR(tzdev); > > - goto err_disable_clk_peri_therm; > > + for (i = 0; i < mt->conf->num_sensors + 1; i++) { > > + tz = devm_kmalloc(&pdev->dev, sizeof(*tz), GFP_KERNEL); > > + if (!tz) > > + return -ENOMEM; > > + > > + tz->mt = mt; > > + tz->id = i; > > + > > + tzdev = devm_thermal_zone_of_sensor_register(&pdev- > > >dev, i, tz, (i == 0) ? > > + &mtk_therm > > al_ops : > > + &mtk_therm > > al_sensor_ops); > > + > > + if (IS_ERR(tzdev)) { > > + if (PTR_ERR(tzdev) == -ENODEV) { > > + dev_warn(&pdev->dev, > > + "sensor %d not registered in > > thermal zone in dt\n", i); > > + continue; > > + } > > + if (PTR_ERR(tzdev) == -EACCES) { > > + ret = PTR_ERR(tzdev); > > + goto err_disable_clk_peri_therm; > > + } > > + } > > } > > > > return 0; > > > > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2021-05-06 5:16 UTC | newest] Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-03-16 7:01 [v7,0/3] mt8183: Add Mediatek thermal driver and dtsi Michael Kao 2021-03-16 7:01 ` [v7,1/3] arm64: dts: mt8183: add thermal zone node Michael Kao 2021-03-22 11:20 ` Hsin-Yi Wang 2021-03-29 17:08 ` Matthias Brugger 2021-04-09 8:09 ` Daniel Lezcano 2021-03-16 7:01 ` [v7,2/3] arm64: dts: mt8183: Configure CPU cooling Michael Kao 2021-03-29 17:12 ` Matthias Brugger 2021-03-16 7:01 ` [v7, 3/3] thermal: mediatek: add another get_temp ops for thermal sensors Michael Kao 2021-04-07 8:49 ` Michael Kao 2021-04-09 8:16 ` Daniel Lezcano 2021-04-29 2:39 ` [v7,3/3] " Michael Kao 2021-05-06 5:14 ` Michael Kao
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).