Armada thermal: improvements and A7K/A8K SoCs support
Subsystems (4)
v3 cover Armada thermal: improvements and A7K/A8K SoCs support
Hi,
This series takes over Baruch's series by integrating his patches about supporting thermal on Armada 7K and 8K SoCs within a larger series with several improvements on the armada_thermal.c driver.
For now, Armada 380 and CP110 compatibles share the same initialization routine but this will probably change in the near future when adding support for overheat interrupts.
DT bindings documentation is updated to match existing code. A new property is introduced to identify thermal zones, see the commit using it for more details.
Armada AP806 and CP110 DT are also updated with thermal nodes.
Thank you,
Miqu?l
Baruch Siach (4):
dt-bindings: thermal: Describe Armada AP806 and CP110
thermal: armada: Use msleep for long delays
thermal: armada: Add support for Armada AP806
thermal: armada: Add support for Armada CP110
Miquel Raynal (7):
thermal: armada: Simplify the check of the validity bit
thermal: armada: Rationalize register accesses
thermal: armada: Update Kconfig and module description
thermal: armada: Change sensors trim default value
thermal: armada: Wait sensors validity before exiting the init
callback
thermal: armada: Give useful names to the thermal zone
ARM64: dts: marvell: Add thermal support for A7K/A8K
.../devicetree/bindings/thermal/armada-thermal.txt | 29 ++- arch/arm64/boot/dts/marvell/armada-ap806.dtsi | 7 + .../boot/dts/marvell/armada-cp110-master.dtsi | 7 + .../arm64/boot/dts/marvell/armada-cp110-slave.dtsi | 7 + drivers/thermal/Kconfig | 4 +- drivers/thermal/armada_thermal.c | 225 ++++++++++++++++----- 6 files changed, 222 insertions(+), 57 deletions(-)
Signature · 1 line
2.11.0
PATCH v3 1/11 dt-bindings: thermal: Describe Armada AP806 and CP110
From: Baruch Siach <[email protected]>
Add compatible strings for AP806 and CP110 that are part of the Armada 8k/7k line of SoCs.
Add a note on the differences in the size of the control area in different bindings. This is an existing difference between the Armada 375 binding and the other boards already supported. The new AP806 and CP110 bindings are similar to the existing Armada 375 in this regard.
Also add a note about the new property "marvell,thermal-zone-name" to help identify the zones from the sysfs.
[<[email protected]>: reword, additional details, new property]
--- .../devicetree/bindings/thermal/armada-thermal.txt | 29 ++++++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-)
Documentation/devicetree/bindings/thermal/armada-thermal.txt +24 -5
@@ -7,17 +7,36 @@ Required properties: marvell,armada375-thermal marvell,armada380-thermal marvell,armadaxp-thermal + marvell,armada-ap806-thermal + marvell,armada-cp110-thermal - reg: Device's register space. Two entries are expected, see the examples below. - The first one is required for the sensor register; - the second one is required for the control register - to be used for sensor initialization (a.k.a. calibration). + The first one points to the status register (4B). + The second one points to the control registers (8B). + Note: with legacy bindings, the second entry pointed + only on the so called "control MSB" ("control 1"), was + 4B wide and did not let the possibility to reach the + "control LSB" ("control 0") register. -Example: +Optional properties: +- marvell,thermal-zone-name: The name to identify the thermal zone + within the sysfs, useful when multiple + thermal zones are registered (AP, CPx...). + +Examples: + + /* Legacy bindings */ thermal at d0018300 { compatible = "marvell,armada370-thermal"; - reg = <0xd0018300 0x4 + reg = <0xd0018300 0x4 0xd0018304 0x4>; }; + + ap_thermal: thermal at 6f8084 { + compatible = "marvell,armada-ap806-thermal"; + reg = <0x6f808C 0x4>, + <0x6f8084 0x8>; + marvell,thermal-zone-name = "ap_thermal_zone"; + };
Signature · 1 line
2.11.0
PATCH v3 1/11 dt-bindings: thermal: Describe Armada AP806 and CP110
Hi Miquel
Documentation/devicetree/bindings/thermal/armada-thermal.txt Required properties: · line 26
Quoted 3 lines · Miquel Raynal
+- marvell,thermal-zone-name: The name to identify the thermal zone
Documentation/devicetree/bindings/thermal/armada-thermal.txt +2
-0+ within the sysfs, useful when multiple + thermal zones are registered (AP, CPx...).
I don't think that would be acceptable. DT is about describing the hardware. sysfs is a Linux implementation detail which is not tied to any specific hardware. If this is accepted, the property should be named 'linux,thermal-zone-name'.
baruch
Signature · 3 lines
http://baruch.siach.name/blog/ ~. .~ Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
- baruch at tkos.co.il - tel: +972.52.368.4656, http://www.tkos.co.il -PATCH v3 1/11 dt-bindings: thermal: Describe Armada AP806 and CP110
Hello Baruch,
Quoted 8 lines · On Fri, 15 Dec 2017 10:27:59 +0200 Baruch Siach <[email protected]> wrote:
Hi Miquel
Quoted 4 lines · Miquel Raynal
+- marvell,thermal-zone-name: The name to identify the thermal zone
(quoted diff) +2
-0+ within the sysfs, useful when multiple + thermal zones are registered (AP,CPx...).
Quoted 4 lines
I don't think that would be acceptable. DT is about describing the hardware. sysfs is a Linux implementation detail which is not tied to any specific hardware. If this is accepted, the property should be named 'linux,thermal-zone-name'.
You are right the sysfs mention should not appear in the description.
Otherwise for the naming I'm not sure "linux," is a valid prefix in that case.
Miqu?l
PATCH v3 1/11 dt-bindings: thermal: Describe Armada AP806 and CP110
HI Miqu?l
Quoted 9 lines · Miquel RAYNAL
Quoted 7 lines · On Fri, 15 Dec 2017 10:27:59 +0200 Baruch Siach <[email protected]> wrote:
Quoted 4 lines · Miquel Raynal
+- marvell,thermal-zone-name: The name to identify the thermal zone
(quoted diff) +2
-0+ within the sysfs, useful when multiple + thermal zones are registered (AP,CPx...).
Quoted 6 lines
Quoted 4 lines
I don't think that would be acceptable. DT is about describing the hardware. sysfs is a Linux implementation detail which is not tied to any specific hardware. If this is accepted, the property should be named 'linux,thermal-zone-name'.
You are right the sysfs mention should not appear in the description.
My comment was not about the description language. I don't think that this property is acceptable at all. But I'll let DT maintainers comment on that.
Quoted 2 lines
Otherwise for the naming I'm not sure "linux," is a valid prefix in that case.
We use the 'linux' prefix for input key names and led triggers, for example.
baruch
Signature · 3 lines
http://baruch.siach.name/blog/ ~. .~ Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
- baruch at tkos.co.il - tel: +972.52.368.4656, http://www.tkos.co.il -PATCH v3 1/11 dt-bindings: thermal: Describe Armada AP806 and CP110
In reply to Miquel RAYNALHi Miquel,
Quoted 18 lines · Miquel RAYNAL
Hello Baruch,
Quoted 8 lines · On Fri, 15 Dec 2017 10:27:59 +0200 Baruch Siach <[email protected]> wrote:
Hi Miquel
Quoted 4 lines · Miquel Raynal
+- marvell,thermal-zone-name: The name to identify the thermal zone
(quoted diff) +2
-0+ within the sysfs, useful when multiple + thermal zones are registered (AP,CPx...).
Quoted 4 lines
I don't think that would be acceptable. DT is about describing the hardware. sysfs is a Linux implementation detail which is not tied to any specific hardware. If this is accepted, the property should be named 'linux,thermal-zone-name'.
Quoted 4 lines
You are right the sysfs mention should not appear in the description.
Otherwise for the naming I'm not sure "linux," is a valid prefix in that case.
Actually the choice between linux or marvell make me realize that there is something wrong. Having a name associated to a device is something pretty usual with the device tree, however it is as the class device level, such as clock-names, line-name, or regulator-name. So in my opinion if we want to support naming from device tree it would be done for all the thermal device not just for the Marvell one.
However I don't think we need it. For example for the clocks we created the name dynamically using of the base address of the register to keep them unique.
Gregory
Quoted 8 lines
Miqu?l
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Signature · 4 lines
Gregory Clement, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com
PATCH v3 1/11 dt-bindings: thermal: Describe Armada AP806 and CP110
Hello Baruch and Gregory,
Quoted 27 lines · On Fri, 15 Dec 2017 09:44:19 +0100 Gregory CLEMENT…
Hi Miquel,
Quoted 22 lines · Miquel RAYNAL
Hello Baruch,
Quoted 10 lines · On Fri, 15 Dec 2017 10:27:59 +0200 Baruch Siach <[email protected]> wrote:
Hi Miquel
Quoted 6 lines · Miquel Raynal
+- marvell,thermal-zone-name: The name to identify the thermal zone
+ within the sysfs, useful when
multiple
+ thermal zones are registered (AP,
CPx...).Quoted 4 lines
I don't think that would be acceptable. DT is about describing the hardware. sysfs is a Linux implementation detail which is not tied to any specific hardware. If this is accepted, the property should be named 'linux,thermal-zone-name'.
You are right the sysfs mention should not appear in the description.
Actually, you are right for all of it, this property should not exist, sorry for my too quick answer.
Quoted 3 lines
Quoted 3 lines
Otherwise for the naming I'm not sure "linux," is a valid prefix in that case.
Thank you both for your explanations, I was also wrong about the prefix.
Quoted 9 lines
Actually the choice between linux or marvell make me realize that there is something wrong. Having a name associated to a device is something pretty usual with the device tree, however it is as the class device level, such as clock-names, line-name, or regulator-name. So in my opinion if we want to support naming from device tree it would be done for all the thermal device not just for the Marvell one.
Quoted 3 lines
However I don't think we need it. For example for the clocks we created the name dynamically using of the base address of the register to keep them unique.
I was convinced that dev_name's would be the same but after trying it on a 8040-DB, using dev_name(&pdev->dev) gives:
f06f808c.thermal
f2400078.thermal
f4400078.thermalwhich I found meaningful enough.
I will drop the property and use dev_name instead. I still need your help to solve one problem though: how to make the distinction between using "armada_thermal" (the previous name) and dev_name() ? If I don't it kind of breaks userspace, doesn't it ?
Thank you,
Miqu?l
Rob Herring
maintainerPATCH v3 1/11 dt-bindings: thermal: Describe Armada AP806 and CP110
Quoted 62 lines · Miquel RAYNAL
Hello Baruch and Gregory,
Quoted 27 lines · On Fri, 15 Dec 2017 09:44:19 +0100 Gregory CLEMENT…
Hi Miquel,
Quoted 22 lines · Miquel RAYNAL
Hello Baruch,
Quoted 10 lines · On Fri, 15 Dec 2017 10:27:59 +0200 Baruch Siach <[email protected]> wrote:
Hi Miquel
Quoted 6 lines · Miquel Raynal
+- marvell,thermal-zone-name: The name to identify the thermal zone
+ within the sysfs, useful when
multiple
+ thermal zones are registered (AP,
CPx...).Quoted 4 lines
I don't think that would be acceptable. DT is about describing the hardware. sysfs is a Linux implementation detail which is not tied to any specific hardware. If this is accepted, the property should be named 'linux,thermal-zone-name'.
You are right the sysfs mention should not appear in the description.
Actually, you are right for all of it, this property should not exist, sorry for my too quick answer.
Quoted 3 lines
Quoted 3 lines
Otherwise for the naming I'm not sure "linux," is a valid prefix in that case.
Thank you both for your explanations, I was also wrong about the prefix.
Quoted 9 lines
Actually the choice between linux or marvell make me realize that there is something wrong. Having a name associated to a device is something pretty usual with the device tree, however it is as the class device level, such as clock-names, line-name, or regulator-name. So in my opinion if we want to support naming from device tree it would be done for all the thermal device not just for the Marvell one.
Quoted 3 lines
However I don't think we need it. For example for the clocks we created the name dynamically using of the base address of the register to keep them unique.
I was convinced that dev_name's would be the same but after trying it on a 8040-DB, using
dev_name(&pdev->dev)gives:f06f808c.thermal f2400078.thermal f4400078.thermal
Quoted 6 lines
which I found meaningful enough.
I will drop the property and use
dev_nameinstead. I still need your help to solve one problem though: how to make the distinction between using "armada_thermal" (the previous name) anddev_name()? If I don't it kind of breaks userspace, doesn't it ?
No. The /sys/devices/... or /sys/bus/platform/... paths and names are not guaranteed to be stable. These changed for every platform converted to DT for example. Userspace should be accessing things through /sys/class/... (or deal with changes).
Rob
PATCH v3 1/11 dt-bindings: thermal: Describe Armada AP806 and CP110
Hello Rob,
Quoted 71 lines · On Fri, 15 Dec 2017 17:28:54 -0600 Rob Herring <[email protected]> wrote:
Quoted 63 lines · Miquel RAYNAL
Hello Baruch and Gregory,
Quoted 28 lines · On Fri, 15 Dec 2017 09:44:19 +0100 Gregory CLEMENT…
Hi Miquel,
Quoted 23 lines · Miquel RAYNAL
Hello Baruch,
Quoted 11 lines · On Fri, 15 Dec 2017 10:27:59 +0200 Baruch Siach <[email protected]> wrote:
Hi Miquel
Quoted 6 lines · Miquel Raynal
+- marvell,thermal-zone-name: The name to identify the thermal zone
+ within the sysfs, useful when
multiple
+ thermal zones are registered
(AP, CPx...).Quoted 4 lines
I don't think that would be acceptable. DT is about describing the hardware. sysfs is a Linux implementation detail which is not tied to any specific hardware. If this is accepted, the property should be named 'linux,thermal-zone-name'.
You are right the sysfs mention should not appear in the description.
Actually, you are right for all of it, this property should not exist, sorry for my too quick answer.
Quoted 3 lines
Quoted 3 lines
Otherwise for the naming I'm not sure "linux," is a valid prefix in that case.
Thank you both for your explanations, I was also wrong about the prefix.
Quoted 9 lines
Actually the choice between linux or marvell make me realize that there is something wrong. Having a name associated to a device is something pretty usual with the device tree, however it is as the class device level, such as clock-names, line-name, or regulator-name. So in my opinion if we want to support naming from device tree it would be done for all the thermal device not just for the Marvell one.
Quoted 3 lines
However I don't think we need it. For example for the clocks we created the name dynamically using of the base address of the register to keep them unique.
I was convinced that dev_name's would be the same but after trying it on a 8040-DB, using
dev_name(&pdev->dev)gives:f06f808c.thermal f2400078.thermal f4400078.thermalQuoted 6 lines
which I found meaningful enough.
I will drop the property and use
dev_nameinstead. I still need your help to solve one problem though: how to make the distinction between using "armada_thermal" (the previous name) anddev_name()? If I don't it kind of breaks userspace, doesn't it ?
Quoted 4 lines
No. The
/sys/devices/... or/sys/bus/platform/... paths and names are not guaranteed to be stable. These changed for every platform converted to DT for example. Userspace should be accessing things through/sys/class/... (or deal with changes).
Ok, thanks for the explanation.
I will sent a v4 early next week about all the changes requested.
Thank you all for reviewing.
Miqu?l
PATCH v3 2/11 thermal: armada: Use msleep for long delays
In reply to Miquel RaynalFrom: Baruch Siach <[email protected]>
Use msleep for long (> 10ms) delays, instead of the busy waiting mdelay. All delays are called from the probe routine, where scheduling is allowed.
--- drivers/thermal/armada_thermal.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/thermal/armada_thermal.c +4 -4
@@ -113,7 +113,7 @@ static void armada370_init_sensor(struct platform_device *pdev, reg &= ~PMU_TDC0_START_CAL_MASK ;writel (reg, priv->control); -mdelay (10 ); +msleep (10 ); } static void armada375_init_sensor(struct platform_device *pdev,
@@ -127,11 +127,11 @@ static void armada375_init_sensor(struct platform_device *pdev, reg &= ~A375_HW_RESETn;writel (reg, priv->control +4 ); -mdelay (20 ); +msleep (20 ); reg |= A375_HW_RESETn;writel (reg, priv->control +4 ); -mdelay (50 ); +msleep (50 ); } static void armada380_init_sensor(struct platform_device *pdev,
@@ -143,7 +143,7 @@ static void armada380_init_sensor(struct platform_device *pdev,if (!(reg &A380_HW_RESET )) { reg |=A380_HW_RESET ;writel (reg, priv->control); -mdelay (10 ); +msleep (10 ); } }
Signature · 1 line
2.11.0
PATCH v3 2/11 thermal: armada: Use msleep for long delays
Hi Miquel,
Quoted 8 lines · Miquel Raynal
From: Baruch Siach <[email protected]>
Use msleep for long (> 10ms) delays, instead of the busy waiting mdelay. All delays are called from the probe routine, where scheduling is allowed.
Signed-off-by Baruch Siach <[email protected]>Signed-off-by Miquel Raynal <[email protected]>
Thanks,
Gregory
Quoted 48 lines
--- drivers/thermal/armada_thermal.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)drivers/thermal/armada_thermal.c +4
-4@@ -113,7 +113,7 @@ static void armada370_init_sensor(struct platform_device *pdev, reg &= ~PMU_TDC0_START_CAL_MASK ;writel (reg, priv->control); -mdelay (10 ); +msleep (10 ); } static void armada375_init_sensor(struct platform_device *pdev,@@ -127,11 +127,11 @@ static void armada375_init_sensor(struct platform_device *pdev, reg &= ~A375_HW_RESETn;writel (reg, priv->control +4 ); -mdelay (20 ); +msleep (20 ); reg |= A375_HW_RESETn;writel (reg, priv->control +4 ); -mdelay (50 ); +msleep (50 ); } static void armada380_init_sensor(struct platform_device *pdev,@@ -143,7 +143,7 @@ static void armada380_init_sensor(struct platform_device *pdev,if (!(reg &A380_HW_RESET )) { reg |=A380_HW_RESET ;writel (reg, priv->control); -mdelay (10 ); +msleep (10 ); } }Signature · 7 lines
2.11.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel at lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Signature · 4 lines
Gregory Clement, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com
PATCH v3 3/11 thermal: armada: Simplify the check of the validity bit
In reply to Miquel RaynalAll Armada SoCs use one bit to declare if the sensor values are valid. This bit moves across the versions of the IP.
The method until then was to do both a shift and compare with an useless flag of "0x1". It is clearer and quicker to directly save the value that must be ANDed instead of the bit position and do a single bitwise AND operation.
--- drivers/thermal/armada_thermal.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-)
drivers/thermal/armada_thermal.c +5 -7
@@ -24,8 +24,6 @@#include <linux/of_device.h> #include <linux/thermal.h> -#define THERMAL_VALID_MASK 0x1 -/* Thermal Manager Control and Status Register */ #define PMU_TDC0_SW_RST_MASK (0x1 << 1)#define PMU_TM_DISABLE_OFFS 0
@@ -67,7 +65,7 @@ struct armada_thermal_data {/* Register shift and mask to access the sensor temperature */ unsigned int temp_shift;unsigned int temp_mask; -unsigned int is_valid_shift; +unsigned int is_valid_bit; }; static void armadaxp_init_sensor(struct platform_device *pdev,
@@ -151,7 +149,7 @@ static bool armada_is_valid(struct armada_thermal_priv *priv) {unsigned long reg =readl_relaxed (priv->sensor); -return (reg >> priv->data->is_valid_shift) &THERMAL_VALID_MASK ; +return reg & priv->data->is_valid_bit; } static int armada_get_temp(struct thermal_zone_device *thermal,
@@ -199,7 +197,7 @@ static const struct armada_thermal_data armadaxp_data = {static const struct armada_thermal_data armada370_data = { .is_valid = armada_is_valid, .init_sensor = armada370_init_sensor, - .is_valid_shift =9 , + .is_valid_bit =BIT (9 ), .temp_shift =10 , .temp_mask =0x1ff , .coef_b =3153000000UL ,
@@ -210,7 +208,7 @@ static const struct armada_thermal_data armada370_data = {static const struct armada_thermal_data armada375_data = { .is_valid = armada_is_valid, .init_sensor = armada375_init_sensor, - .is_valid_shift =10 , + .is_valid_bit =BIT (10 ), .temp_shift =0 , .temp_mask =0x1ff , .coef_b =3171900000UL ,
@@ -221,7 +219,7 @@ static const struct armada_thermal_data armada375_data = {static const struct armada_thermal_data armada380_data = { .is_valid = armada_is_valid, .init_sensor = armada380_init_sensor, - .is_valid_shift =10 , + .is_valid_bit =BIT (10 ), .temp_shift =0 , .temp_mask =0x3ff , .coef_b =1172499100UL ,
Signature · 1 line
2.11.0
PATCH v3 3/11 thermal: armada: Simplify the check of the validity bit
Hi Miquel,
Quoted 9 lines · Miquel Raynal
All Armada SoCs use one bit to declare if the sensor values are valid. This bit moves across the versions of the IP.
The method until then was to do both a shift and compare with an useless flag of "
0x1". It is clearer and quicker to directly save the value that must be ANDed instead of the bit position and do a single bitwise AND operation.Signed-off-by Miquel Raynal <[email protected]>
Thanks,
Gregory
Quoted 70 lines
--- drivers/thermal/armada_thermal.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-)drivers/thermal/armada_thermal.c +5
-7@@ -24,8 +24,6 @@#include <linux/of_device.h> #include <linux/thermal.h> -#define THERMAL_VALID_MASK 0x1 -/* Thermal Manager Control and Status Register */ #define PMU_TDC0_SW_RST_MASK (0x1 << 1)#define PMU_TM_DISABLE_OFFS 0@@ -67,7 +65,7 @@ struct armada_thermal_data {/* Register shift and mask to access the sensor temperature */ unsigned int temp_shift;unsigned int temp_mask; -unsigned int is_valid_shift; +unsigned int is_valid_bit; }; static void armadaxp_init_sensor(struct platform_device *pdev,@@ -151,7 +149,7 @@ static bool armada_is_valid(struct armada_thermal_priv *priv) {unsigned long reg =readl_relaxed (priv->sensor); -return (reg >> priv->data->is_valid_shift) &THERMAL_VALID_MASK ; +return reg & priv->data->is_valid_bit; } static int armada_get_temp(struct thermal_zone_device *thermal,@@ -199,7 +197,7 @@ static const struct armada_thermal_data armadaxp_data = {static const struct armada_thermal_data armada370_data = { .is_valid = armada_is_valid, .init_sensor = armada370_init_sensor, - .is_valid_shift =9 , + .is_valid_bit =BIT (9 ), .temp_shift =10 , .temp_mask =0x1ff , .coef_b =3153000000UL ,@@ -210,7 +208,7 @@ static const struct armada_thermal_data armada370_data = {static const struct armada_thermal_data armada375_data = { .is_valid = armada_is_valid, .init_sensor = armada375_init_sensor, - .is_valid_shift =10 , + .is_valid_bit =BIT (10 ), .temp_shift =0 , .temp_mask =0x1ff , .coef_b =3171900000UL ,@@ -221,7 +219,7 @@ static const struct armada_thermal_data armada375_data = {static const struct armada_thermal_data armada380_data = { .is_valid = armada_is_valid, .init_sensor = armada380_init_sensor, - .is_valid_shift =10 , + .is_valid_bit =BIT (10 ), .temp_shift =0 , .temp_mask =0x3ff , .coef_b =1172499100UL ,Signature · 7 lines
2.11.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel at lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Signature · 4 lines
Gregory Clement, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com
PATCH v3 3/11 thermal: armada: Simplify the check of the validity bit
In reply to Miquel RaynalHi Miquel,
Quoted 27 lines · Miquel Raynal
All Armada SoCs use one bit to declare if the sensor values are valid. This bit moves across the versions of the IP.
The method until then was to do both a shift and compare with an useless flag of "
0x1". It is clearer and quicker to directly save the value that must be ANDed instead of the bit position and do a single bitwise AND operation.Signed-off-by Miquel Raynal <[email protected]>--- drivers/thermal/armada_thermal.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-)drivers/thermal/armada_thermal.c +0
-2@@ -24,8 +24,6 @@#include <linux/of_device.h> #include <linux/thermal.h> -#define THERMAL_VALID_MASK 0x1 -/* Thermal Manager Control and Status Register */ #define PMU_TDC0_SW_RST_MASK (0x1 << 1)#define PMU_TM_DISABLE_OFFS 0
drivers/thermal/armada_thermal.c struct armada_thermal_data { · line 68
Quoted 5 lines
drivers/thermal/armada_thermal.c +1
-1@@ -67,7 +65,7 @@ struct armada_thermal_data {/* Register shift and mask to access the sensor temperature */ unsigned int temp_shift;unsigned int temp_mask; -unsigned int is_valid_shift; +unsigned int is_valid_bit;
Type should be u32 now, I think.
drivers/thermal/armada_thermal.c static bool armada_is_valid(struct armada_thermal_priv *priv) · line 150
Quoted 6 lines
drivers/thermal/armada_thermal.c +0
-0}; static void armadaxp_init_sensor(struct platform_device *pdev,@@ -151,7 +149,7 @@ static bool armada_is_valid(struct armada_thermal_priv *priv) {unsigned long reg =readl_relaxed (priv->sensor);
u32 here also, I think. But that's unrelated to this patch.
Quoted 24 lines
drivers/thermal/armada_thermal.c +3
-3-return (reg >> priv->data->is_valid_shift) &THERMAL_VALID_MASK ; +return reg & priv->data->is_valid_bit; } static int armada_get_temp(struct thermal_zone_device *thermal,@@ -199,7 +197,7 @@ static const struct armada_thermal_data armadaxp_data = {static const struct armada_thermal_data armada370_data = { .is_valid = armada_is_valid, .init_sensor = armada370_init_sensor, - .is_valid_shift =9 , + .is_valid_bit =BIT (9 ), .temp_shift =10 , .temp_mask =0x1ff , .coef_b =3153000000UL ,@@ -210,7 +208,7 @@ static const struct armada_thermal_data armada370_data = {static const struct armada_thermal_data armada375_data = { .is_valid = armada_is_valid, .init_sensor = armada375_init_sensor, - .is_valid_shift =10 , + .is_valid_bit =BIT (10 ), .temp_shift =0 , .temp_mask =0x1ff , .coef_b =3171900000UL ,
drivers/thermal/armada_thermal.c static const struct armada_thermal_data armada375_data = { · line 225
Quoted 8 lines
drivers/thermal/armada_thermal.c +1
-1@@ -221,7 +219,7 @@ static const struct armada_thermal_data armada375_data = {static const struct armada_thermal_data armada380_data = { .is_valid = armada_is_valid, .init_sensor = armada380_init_sensor, - .is_valid_shift =10 , + .is_valid_bit =BIT (10 ), .temp_shift =0 , .temp_mask =0x3ff , .coef_b =1172499100UL ,
baruch
Signature · 3 lines
http://baruch.siach.name/blog/ ~. .~ Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
- baruch at tkos.co.il - tel: +972.52.368.4656, http://www.tkos.co.il -PATCH v3 3/11 thermal: armada: Simplify the check of the validity bit
Hello Baruch,
Quoted 24 lines · On Fri, 15 Dec 2017 10:33:16 +0200 Baruch Siach <[email protected]> wrote:
Hi Miquel,
Quoted 21 lines · Miquel Raynal
All Armada SoCs use one bit to declare if the sensor values are valid. This bit moves across the versions of the IP.
The method until then was to do both a shift and compare with an useless flag of "
0x1". It is clearer and quicker to directly save the value that must be ANDed instead of the bit position and do a single bitwise AND operation.Signed-off-by Miquel Raynal <[email protected]>--- drivers/thermal/armada_thermal.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-)(quoted diff) +0
-0
b/drivers/thermal/armada_thermal.cindex6c4af2622d4f..26698f2d3ca7100644 ---a/drivers/thermal/armada_thermal.c
+++b/drivers/thermal/armada_thermal.cdrivers/thermal/armada_thermal.c +0
-0@@ -24,8 +24,6 @@#include <linux/of_device.h> #include <linux/thermal.h>
Quoted 13 lines
drivers/thermal/armada_thermal.c struct armada_thermal_data { · line 68
Quoted 11 lines
drivers/thermal/armada_thermal.c +1
-3-#define THERMAL_VALID_MASK 0x1 -/* Thermal Manager Control and Status Register */ #define PMU_TDC0_SW_RST_MASK (0x1 << 1)#define PMU_TM_DISABLE_OFFS 0@@ -67,7 +65,7 @@ struct armada_thermal_data {/* Register shift and mask to access the sensor temperature */ unsigned int temp_shift;unsigned int temp_mask; -unsigned int is_valid_shift; +unsigned int is_valid_bit;Type should be u32 now, I think.
Indeed, I'll change it in next version.
Quoted 9 lines
drivers/thermal/armada_thermal.c static bool armada_is_valid(struct · line 150
Quoted 7 lines
drivers/thermal/armada_thermal.c +0
-0}; static void armadaxp_init_sensor(struct platform_device *pdev,@@ -151,7 +149,7 @@ static bool armada_is_valid(struct armada_thermal_priv *priv) {unsigned long reg =readl_relaxed (priv->sensor);u32 here also, I think. But that's unrelated to this patch.
I completely agree, actually this is done in the next patch, moving all "unsigned long reg" to "u32 reg" while renaming the registers pointers, hope this is fine?
Quoted 28 lines
Quoted 28 lines
drivers/thermal/armada_thermal.c +1
-1-return (reg >> priv->data->is_valid_shift) &THERMAL_VALID_MASK ; +return reg & priv->data->is_valid_bit; } static int armada_get_temp(struct thermal_zone_device *thermal,@@ -199,7 +197,7 @@ static const struct armada_thermal_data
armadaxp_data= { static const structarmada_thermal_dataarmada370_data= { .is_valid =armada_is_valid,drivers/thermal/armada_thermal.c +1
-1.init_sensor = armada370_init_sensor, - .is_valid_shift = 9, + .is_valid_bit = BIT(9), .temp_shift = 10, .temp_mask = 0x1ff, .coef_b = 3153000000UL,@@ -210,7 +208,7 @@ static const struct armada_thermal_data
armada370_data= { static const structarmada_thermal_dataarmada375_data= { .is_valid =armada_is_valid,drivers/thermal/armada_thermal.c +1
-1.init_sensor = armada375_init_sensor, - .is_valid_shift = 10, + .is_valid_bit = BIT(10), .temp_shift = 0, .temp_mask = 0x1ff, .coef_b = 3171900000UL,@@ -221,7 +219,7 @@ static const struct armada_thermal_data
armada375_data= { static const structarmada_thermal_dataarmada380_data= { .is_valid =armada_is_valid,
Quoted 9 lines
drivers/thermal/armada_thermal.c static const struct armada_thermal_data armada375_data = { · line 225
Quoted 6 lines
drivers/thermal/armada_thermal.c +1
-1.init_sensor = armada380_init_sensor, - .is_valid_shift = 10, + .is_valid_bit = BIT(10), .temp_shift = 0, .temp_mask = 0x3ff, .coef_b = 1172499100UL,baruch
Best regards,
Miqu?l
PATCH v3 4/11 thermal: armada: Rationalize register accesses
In reply to Miquel RaynalBindings were incomplete for a long time by only exposing one of the two available control registers. To ease the migration to the full bindings (already in use for the Armada 375 SoC), rename the pointers for clarification. This way, it will only be needed to add another pointer to access the other control register when the time comes.
This avoids dangerous situations where the offset 0 of the control area can be either one register or the other depending on the bindings used. After this change, device trees of other SoCs could be migrated to the "full" bindings if they may benefit from features from the unaccessible register, without any change in the driver.
--- drivers/thermal/armada_thermal.c | 86 +++++++++++++++++++++++++--------------- 1 file changed, 55 insertions(+), 31 deletions(-)
drivers/thermal/armada_thermal.c +55 -31
@@ -39,12 +39,21 @@#define A375_HW_RESETn BIT(8)#define A380_HW_RESET BIT(8) +/* Legacy bindings */ +#define LEGACY_CONTROL_MEM_LEN 0x4 + +/* Current bindings with the 2 control registers under the same memory area */ +#define LEGACY_CONTROL1_OFFSET 0x0 +#define CONTROL0_OFFSET 0x0 +#define CONTROL1_OFFSET 0x4 +struct armada_thermal_data ;/* Marvell EBU Thermal Sensor Dev Structure */ struct armada_thermal_priv { -void __iomem *sensor; -void __iomem *control; +void __iomem *status; +void __iomem *control0; +void __iomem *control1;struct armada_thermal_data *data; };
@@ -71,45 +80,45 @@ struct armada_thermal_data {static void armadaxp_init_sensor (struct platform_device *pdev,struct armada_thermal_priv *priv) { -unsigned long reg; +u32 reg; - reg =readl_relaxed (priv->control); + reg =readl_relaxed (priv->control1); reg |=PMU_TDC0_OTF_CAL_MASK ; -writel (reg, priv->control); +writel (reg, priv->control1);/* Reference calibration value */ reg &= ~PMU_TDC0_REF_CAL_CNT_MASK ; reg |= (0xf1 <<PMU_TDC0_REF_CAL_CNT_OFFS ); -writel (reg, priv->control); +writel (reg, priv->control1);/* Reset the sensor */ - reg =readl_relaxed (priv->control); -writel ((reg |PMU_TDC0_SW_RST_MASK ), priv->control); + reg =readl_relaxed (priv->control1); +writel ((reg |PMU_TDC0_SW_RST_MASK ), priv->control1); -writel (reg, priv->control); +writel (reg, priv->control1);/* Enable the sensor */ - reg =readl_relaxed (priv->sensor); + reg =readl_relaxed (priv->status); reg &= ~PMU_TM_DISABLE_MASK ; -writel (reg, priv->sensor); +writel (reg, priv->status); }static void armada370_init_sensor (struct platform_device *pdev,struct armada_thermal_priv *priv) { -unsigned long reg; +u32 reg; - reg =readl_relaxed (priv->control); + reg =readl_relaxed (priv->control1); reg |=PMU_TDC0_OTF_CAL_MASK ; -writel (reg, priv->control); +writel (reg, priv->control1);/* Reference calibration value */ reg &= ~PMU_TDC0_REF_CAL_CNT_MASK ; reg |= (0xf1 <<PMU_TDC0_REF_CAL_CNT_OFFS ); -writel (reg, priv->control); +writel (reg, priv->control1); reg &= ~PMU_TDC0_START_CAL_MASK ; -writel (reg, priv->control); +writel (reg, priv->control1);msleep (10 ); }
@@ -117,37 +126,37 @@ static void armada370_init_sensor(struct platform_device *pdev,static void armada375_init_sensor (struct platform_device *pdev,struct armada_thermal_priv *priv) { -unsigned long reg; +u32 reg; - reg =readl (priv->control +4 ); + reg =readl (priv->control1); reg &= ~(A375_UNIT_CONTROL_MASK <<A375_UNIT_CONTROL_SHIFT ); reg &= ~A375_READOUT_INVERT ; reg &= ~A375_HW_RESETn; -writel (reg, priv->control +4 ); +writel (reg, priv->control1);msleep (20 ); reg |= A375_HW_RESETn; -writel (reg, priv->control +4 ); +writel (reg, priv->control1);msleep (50 ); }static void armada380_init_sensor (struct platform_device *pdev,struct armada_thermal_priv *priv) { -unsigned long reg =readl_relaxed (priv->control); +u32 reg =readl_relaxed (priv->control1);/* Reset hardware once */ if (!(reg &A380_HW_RESET )) { reg |=A380_HW_RESET ; -writel (reg, priv->control); +writel (reg, priv->control1);msleep (10 ); } }static bool armada_is_valid (struct armada_thermal_priv *priv) { -unsigned long reg =readl_relaxed (priv->sensor); +u32 reg =readl_relaxed (priv->status);return reg & priv->data->is_valid_bit; }
@@ -156,7 +165,7 @@ static int armada_get_temp(struct thermal_zone_device *thermal, int *temp) {struct armada_thermal_priv *priv = thermal->devdata; -unsigned long reg; +u32 reg;unsigned long m, b, div;/* Valid check */
@@ -166,7 +175,7 @@ static int armada_get_temp(struct thermal_zone_device *thermal,return -EIO ; } - reg =readl_relaxed (priv->sensor); + reg =readl_relaxed (priv->status); reg = (reg >> priv->data->temp_shift) & priv->data->temp_mask;/* Get formula coeficients */
@@ -253,6 +262,7 @@ MODULE_DEVICE_TABLE(of, armada_thermal_id_table);static int armada_thermal_probe (struct platform_device *pdev) { +void __iomem *control =NULL ;struct thermal_zone_device *thermal;const struct of_device_id *match;struct armada_thermal_priv *priv;
@@ -267,14 +277,28 @@ static int armada_thermal_probe(struct platform_device *pdev)return -ENOMEM ; res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); - priv->sensor =devm_ioremap_resource (&pdev->dev, res); -if (IS_ERR (priv->sensor)) -return PTR_ERR (priv->sensor); + priv->status =devm_ioremap_resource (&pdev->dev, res); +if (IS_ERR (priv->status)) +return PTR_ERR (priv->status); res =platform_get_resource (pdev,IORESOURCE_MEM ,1 ); - priv->control =devm_ioremap_resource (&pdev->dev, res); -if (IS_ERR (priv->control)) -return PTR_ERR (priv->control); + control =devm_ioremap_resource (&pdev->dev, res); +if (IS_ERR (control)) +return PTR_ERR (control); + +/* +* Legacy DT bindings only described "control1" register (also referred +* as "control MSB" on old documentation). New bindings cover +* "control0/control LSB" and "control1/control MSB" registers within +* the same resource, which is then of size 8 instead of 4. +*/ +if ((res->end - res->start) ==LEGACY_CONTROL_MEM_LEN ) { +/* ->control0 unavailable in this configuration */ + priv->control1 = control +LEGACY_CONTROL1_OFFSET ; + }else { + priv->control0 = control +CONTROL0_OFFSET ; + priv->control1 = control +CONTROL1_OFFSET ; + } priv->data = (struct armada_thermal_data *)match->data; priv->data->init_sensor (pdev, priv);
Signature · 1 line
2.11.0
PATCH v3 4/11 thermal: armada: Rationalize register accesses
Hi Miquel,
Quoted 6 lines · Miquel Raynal
Bindings were incomplete for a long time by only exposing one of the two available control registers. To ease the migration to the full bindings (already in use for the Armada 375 SoC), rename the pointers for clarification. This way, it will only be needed to add another pointer to access the other control register when the time comes.
Quoted 7 lines
This avoids dangerous situations where the offset 0 of the control area can be either one register or the other depending on the bindings used. After this change, device trees of other SoCs could be migrated to the "full" bindings if they may benefit from features from the unaccessible register, without any change in the driver.
Signed-off-by Miquel Raynal <[email protected]>
Thanks,
Gregory
Quoted 206 lines
--- drivers/thermal/armada_thermal.c | 86 +++++++++++++++++++++++++--------------- 1 file changed, 55 insertions(+), 31 deletions(-)drivers/thermal/armada_thermal.c +55
-31@@ -39,12 +39,21 @@#define A375_HW_RESETn BIT(8)#define A380_HW_RESET BIT(8) +/* Legacy bindings */ +#define LEGACY_CONTROL_MEM_LEN 0x4 + +/* Current bindings with the 2 control registers under the same memory area */ +#define LEGACY_CONTROL1_OFFSET 0x0 +#define CONTROL0_OFFSET 0x0 +#define CONTROL1_OFFSET 0x4 +struct armada_thermal_data ;/* Marvell EBU Thermal Sensor Dev Structure */ struct armada_thermal_priv { -void __iomem *sensor; -void __iomem *control; +void __iomem *status; +void __iomem *control0; +void __iomem *control1;struct armada_thermal_data *data; };@@ -71,45 +80,45 @@ struct armada_thermal_data {static void armadaxp_init_sensor (struct platform_device *pdev,struct armada_thermal_priv *priv) { -unsigned long reg; +u32 reg; - reg =readl_relaxed (priv->control); + reg =readl_relaxed (priv->control1); reg |=PMU_TDC0_OTF_CAL_MASK ; -writel (reg, priv->control); +writel (reg, priv->control1);/* Reference calibration value */ reg &= ~PMU_TDC0_REF_CAL_CNT_MASK ; reg |= (0xf1 <<PMU_TDC0_REF_CAL_CNT_OFFS ); -writel (reg, priv->control); +writel (reg, priv->control1);/* Reset the sensor */ - reg =readl_relaxed (priv->control); -writel ((reg |PMU_TDC0_SW_RST_MASK ), priv->control); + reg =readl_relaxed (priv->control1); +writel ((reg |PMU_TDC0_SW_RST_MASK ), priv->control1); -writel (reg, priv->control); +writel (reg, priv->control1);/* Enable the sensor */ - reg =readl_relaxed (priv->sensor); + reg =readl_relaxed (priv->status); reg &= ~PMU_TM_DISABLE_MASK ; -writel (reg, priv->sensor); +writel (reg, priv->status); }static void armada370_init_sensor (struct platform_device *pdev,struct armada_thermal_priv *priv) { -unsigned long reg; +u32 reg; - reg =readl_relaxed (priv->control); + reg =readl_relaxed (priv->control1); reg |=PMU_TDC0_OTF_CAL_MASK ; -writel (reg, priv->control); +writel (reg, priv->control1);/* Reference calibration value */ reg &= ~PMU_TDC0_REF_CAL_CNT_MASK ; reg |= (0xf1 <<PMU_TDC0_REF_CAL_CNT_OFFS ); -writel (reg, priv->control); +writel (reg, priv->control1); reg &= ~PMU_TDC0_START_CAL_MASK ; -writel (reg, priv->control); +writel (reg, priv->control1);msleep (10 ); }@@ -117,37 +126,37 @@ static void armada370_init_sensor(struct platform_device *pdev,static void armada375_init_sensor (struct platform_device *pdev,struct armada_thermal_priv *priv) { -unsigned long reg; +u32 reg; - reg =readl (priv->control +4 ); + reg =readl (priv->control1); reg &= ~(A375_UNIT_CONTROL_MASK <<A375_UNIT_CONTROL_SHIFT ); reg &= ~A375_READOUT_INVERT ; reg &= ~A375_HW_RESETn; -writel (reg, priv->control +4 ); +writel (reg, priv->control1);msleep (20 ); reg |= A375_HW_RESETn; -writel (reg, priv->control +4 ); +writel (reg, priv->control1);msleep (50 ); }static void armada380_init_sensor (struct platform_device *pdev,struct armada_thermal_priv *priv) { -unsigned long reg =readl_relaxed (priv->control); +u32 reg =readl_relaxed (priv->control1);/* Reset hardware once */ if (!(reg &A380_HW_RESET )) { reg |=A380_HW_RESET ; -writel (reg, priv->control); +writel (reg, priv->control1);msleep (10 ); } }static bool armada_is_valid (struct armada_thermal_priv *priv) { -unsigned long reg =readl_relaxed (priv->sensor); +u32 reg =readl_relaxed (priv->status);return reg & priv->data->is_valid_bit; }@@ -156,7 +165,7 @@ static int armada_get_temp(struct thermal_zone_device *thermal, int *temp) {struct armada_thermal_priv *priv = thermal->devdata; -unsigned long reg; +u32 reg;unsigned long m, b, div;/* Valid check */ @@ -166,7 +175,7 @@ static int armada_get_temp(struct thermal_zone_device *thermal,return -EIO ; } - reg =readl_relaxed (priv->sensor); + reg =readl_relaxed (priv->status); reg = (reg >> priv->data->temp_shift) & priv->data->temp_mask;/* Get formula coeficients */ @@ -253,6 +262,7 @@ MODULE_DEVICE_TABLE(of, armada_thermal_id_table);static int armada_thermal_probe (struct platform_device *pdev) { +void __iomem *control =NULL ;struct thermal_zone_device *thermal;const struct of_device_id *match;struct armada_thermal_priv *priv;@@ -267,14 +277,28 @@ static int armada_thermal_probe(struct platform_device *pdev)return -ENOMEM ; res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); - priv->sensor =devm_ioremap_resource (&pdev->dev, res); -if (IS_ERR (priv->sensor)) -return PTR_ERR (priv->sensor); + priv->status =devm_ioremap_resource (&pdev->dev, res); +if (IS_ERR (priv->status)) +return PTR_ERR (priv->status); res =platform_get_resource (pdev,IORESOURCE_MEM ,1 ); - priv->control =devm_ioremap_resource (&pdev->dev, res); -if (IS_ERR (priv->control)) -return PTR_ERR (priv->control); + control =devm_ioremap_resource (&pdev->dev, res); +if (IS_ERR (control)) +return PTR_ERR (control); + +/* +* Legacy DT bindings only described "control1" register (also referred +* as "control MSB" on old documentation). New bindings cover +* "control0/control LSB" and "control1/control MSB" registers within +* the same resource, which is then of size 8 instead of 4. +*/ +if ((res->end - res->start) ==LEGACY_CONTROL_MEM_LEN ) { +/* ->control0 unavailable in this configuration */ + priv->control1 = control +LEGACY_CONTROL1_OFFSET ; + }else { + priv->control0 = control +CONTROL0_OFFSET ; + priv->control1 = control +CONTROL1_OFFSET ; + } priv->data = (struct armada_thermal_data *)match->data; priv->data->init_sensor (pdev, priv);Signature · 7 lines
2.11.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel at lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Signature · 4 lines
Gregory Clement, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com
PATCH v3 4/11 thermal: armada: Rationalize register accesses
In reply to Miquel RaynalHi Miqu?l,
Quoted 32 lines · Miquel Raynal
Bindings were incomplete for a long time by only exposing one of the two available control registers. To ease the migration to the full bindings (already in use for the Armada 375 SoC), rename the pointers for clarification. This way, it will only be needed to add another pointer to access the other control register when the time comes.
This avoids dangerous situations where the offset 0 of the control area can be either one register or the other depending on the bindings used. After this change, device trees of other SoCs could be migrated to the "full" bindings if they may benefit from features from the unaccessible register, without any change in the driver.
Signed-off-by Miquel Raynal <[email protected]>--- drivers/thermal/armada_thermal.c | 86 +++++++++++++++++++++++++--------------- 1 file changed, 55 insertions(+), 31 deletions(-)drivers/thermal/armada_thermal.c +7
-0@@ -39,12 +39,21 @@#define A375_HW_RESETn BIT(8)#define A380_HW_RESET BIT(8) +/* Legacy bindings */ +#define LEGACY_CONTROL_MEM_LEN 0x4 + +/* Current bindings with the 2 control registers under the same memory area */ +#define LEGACY_CONTROL1_OFFSET 0x0 +#define CONTROL0_OFFSET 0x0 +#define CONTROL1_OFFSET 0x4
drivers/thermal/armada_thermal.c line 56
Quoted 10 lines
drivers/thermal/armada_thermal.c +4
-2+struct armada_thermal_data ;/* Marvell EBU Thermal Sensor Dev Structure */ struct armada_thermal_priv { -void __iomem *sensor; -void __iomem *control; +void __iomem *status; +void __iomem *control0; +void __iomem *control1;
The 'status' -> 'sensor' rename is not mentioned in the commit log. I'd say it is a matter for a separate patch.
Otherwise, good cleanup.
baruch
Quoted 169 lines
drivers/thermal/armada_thermal.c +44
-29struct armada_thermal_data *data; };@@ -71,45 +80,45 @@ struct armada_thermal_data {static void armadaxp_init_sensor (struct platform_device *pdev,struct armada_thermal_priv *priv) { -unsigned long reg; +u32 reg; - reg =readl_relaxed (priv->control); + reg =readl_relaxed (priv->control1); reg |=PMU_TDC0_OTF_CAL_MASK ; -writel (reg, priv->control); +writel (reg, priv->control1);/* Reference calibration value */ reg &= ~PMU_TDC0_REF_CAL_CNT_MASK ; reg |= (0xf1 <<PMU_TDC0_REF_CAL_CNT_OFFS ); -writel (reg, priv->control); +writel (reg, priv->control1);/* Reset the sensor */ - reg =readl_relaxed (priv->control); -writel ((reg |PMU_TDC0_SW_RST_MASK ), priv->control); + reg =readl_relaxed (priv->control1); +writel ((reg |PMU_TDC0_SW_RST_MASK ), priv->control1); -writel (reg, priv->control); +writel (reg, priv->control1);/* Enable the sensor */ - reg =readl_relaxed (priv->sensor); + reg =readl_relaxed (priv->status); reg &= ~PMU_TM_DISABLE_MASK ; -writel (reg, priv->sensor); +writel (reg, priv->status); }static void armada370_init_sensor (struct platform_device *pdev,struct armada_thermal_priv *priv) { -unsigned long reg; +u32 reg; - reg =readl_relaxed (priv->control); + reg =readl_relaxed (priv->control1); reg |=PMU_TDC0_OTF_CAL_MASK ; -writel (reg, priv->control); +writel (reg, priv->control1);/* Reference calibration value */ reg &= ~PMU_TDC0_REF_CAL_CNT_MASK ; reg |= (0xf1 <<PMU_TDC0_REF_CAL_CNT_OFFS ); -writel (reg, priv->control); +writel (reg, priv->control1); reg &= ~PMU_TDC0_START_CAL_MASK ; -writel (reg, priv->control); +writel (reg, priv->control1);msleep (10 ); }@@ -117,37 +126,37 @@ static void armada370_init_sensor(struct platform_device *pdev,static void armada375_init_sensor (struct platform_device *pdev,struct armada_thermal_priv *priv) { -unsigned long reg; +u32 reg; - reg =readl (priv->control +4 ); + reg =readl (priv->control1); reg &= ~(A375_UNIT_CONTROL_MASK <<A375_UNIT_CONTROL_SHIFT ); reg &= ~A375_READOUT_INVERT ; reg &= ~A375_HW_RESETn; -writel (reg, priv->control +4 ); +writel (reg, priv->control1);msleep (20 ); reg |= A375_HW_RESETn; -writel (reg, priv->control +4 ); +writel (reg, priv->control1);msleep (50 ); }static void armada380_init_sensor (struct platform_device *pdev,struct armada_thermal_priv *priv) { -unsigned long reg =readl_relaxed (priv->control); +u32 reg =readl_relaxed (priv->control1);/* Reset hardware once */ if (!(reg &A380_HW_RESET )) { reg |=A380_HW_RESET ; -writel (reg, priv->control); +writel (reg, priv->control1);msleep (10 ); } }static bool armada_is_valid (struct armada_thermal_priv *priv) { -unsigned long reg =readl_relaxed (priv->sensor); +u32 reg =readl_relaxed (priv->status);return reg & priv->data->is_valid_bit; }@@ -156,7 +165,7 @@ static int armada_get_temp(struct thermal_zone_device *thermal, int *temp) {struct armada_thermal_priv *priv = thermal->devdata; -unsigned long reg; +u32 reg;unsigned long m, b, div;/* Valid check */ @@ -166,7 +175,7 @@ static int armada_get_temp(struct thermal_zone_device *thermal,return -EIO ; } - reg =readl_relaxed (priv->sensor); + reg =readl_relaxed (priv->status); reg = (reg >> priv->data->temp_shift) & priv->data->temp_mask;/* Get formula coeficients */ @@ -253,6 +262,7 @@ MODULE_DEVICE_TABLE(of, armada_thermal_id_table);static int armada_thermal_probe (struct platform_device *pdev) { +void __iomem *control =NULL ;struct thermal_zone_device *thermal;const struct of_device_id *match;struct armada_thermal_priv *priv;@@ -267,14 +277,28 @@ static int armada_thermal_probe(struct platform_device *pdev)return -ENOMEM ; res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); - priv->sensor =devm_ioremap_resource (&pdev->dev, res); -if (IS_ERR (priv->sensor)) -return PTR_ERR (priv->sensor); + priv->status =devm_ioremap_resource (&pdev->dev, res); +if (IS_ERR (priv->status)) +return PTR_ERR (priv->status); res =platform_get_resource (pdev,IORESOURCE_MEM ,1 ); - priv->control =devm_ioremap_resource (&pdev->dev, res); -if (IS_ERR (priv->control)) -return PTR_ERR (priv->control); + control =devm_ioremap_resource (&pdev->dev, res); +if (IS_ERR (control)) +return PTR_ERR (control); + +/* +* Legacy DT bindings only described "control1" register (also referred +* as "control MSB" on old documentation). New bindings cover +* "control0/control LSB" and "control1/control MSB" registers within +* the same resource, which is then of size 8 instead of 4. +*/ +if ((res->end - res->start) ==LEGACY_CONTROL_MEM_LEN ) { +/* ->control0 unavailable in this configuration */ + priv->control1 = control +LEGACY_CONTROL1_OFFSET ; + }else { + priv->control0 = control +CONTROL0_OFFSET ; + priv->control1 = control +CONTROL1_OFFSET ; + } priv->data = (struct armada_thermal_data *)match->data; priv->data->init_sensor (pdev, priv);
Signature · 3 lines
http://baruch.siach.name/blog/ ~. .~ Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
- baruch at tkos.co.il - tel: +972.52.368.4656, http://www.tkos.co.il -PATCH v3 4/11 thermal: armada: Rationalize register accesses
Quoted 41 lines · On Fri, 15 Dec 2017 10:56:22 +0200 Baruch Siach <[email protected]> wrote:
Hi Miqu?l,
Quoted 38 lines · Miquel Raynal
Bindings were incomplete for a long time by only exposing one of the two available control registers. To ease the migration to the full bindings (already in use for the Armada 375 SoC), rename the pointers for clarification. This way, it will only be needed to add another pointer to access the other control register when the time comes.
This avoids dangerous situations where the offset 0 of the control area can be either one register or the other depending on the bindings used. After this change, device trees of other SoCs could be migrated to the "full" bindings if they may benefit from features from the unaccessible register, without any change in the driver.
Signed-off-by Miquel Raynal <[email protected]>--- drivers/thermal/armada_thermal.c | 86+++++++++++++++++++++++++--------------- 1 file changed, 55 insertions(+), 31 deletions(-)
(quoted diff) +0
-0
b/drivers/thermal/armada_thermal.cindex26698f2d3ca7..e5b184cee79b100644 ---a/drivers/thermal/armada_thermal.c
+++b/drivers/thermal/armada_thermal.cdrivers/thermal/armada_thermal.c +4
-0@@ -39,12 +39,21 @@#define A375_HW_RESETn BIT(8)#define A380_HW_RESET BIT(8) +/* Legacy bindings */ +#define LEGACY_CONTROL_MEM_LEN 0x4 + +/* Current bindings with the 2 control registers under the same memory area */ +#define
LEGACY_CONTROL1_OFFSET0x0drivers/thermal/armada_thermal.c +3
-0+#define CONTROL0_OFFSET 0x0 +#define CONTROL1_OFFSET 0x4 +struct armada_thermal_data ;
Quoted 10 lines
drivers/thermal/armada_thermal.c line 56
Quoted 7 lines
/* Marvell EBU Thermal Sensor Dev Structure */
structarmada_thermal_priv{drivers/thermal/armada_thermal.c +3
-2-void __iomem *sensor; -void __iomem *control; +void __iomem *status; +void __iomem *control0; +void __iomem *control1;The 'status' -> 'sensor' rename is not mentioned in the commit log. I'd say it is a matter for a separate patch.
Sure, I'll split.
Quoted 2 lines
Otherwise, good cleanup.
Thanks!
Miqu?l
Quoted 176 lines
baruch
Quoted 172 lines
drivers/thermal/armada_thermal.c +14
-14struct armada_thermal_data *data; };@@ -71,45 +80,45 @@ struct armada_thermal_data {static void armadaxp_init_sensor (struct platform_device *pdev,struct armada_thermal_priv *priv) { -unsigned long reg; +u32 reg; - reg =readl_relaxed (priv->control); + reg =readl_relaxed (priv->control1); reg |=PMU_TDC0_OTF_CAL_MASK ; -writel (reg, priv->control); +writel (reg, priv->control1);/* Reference calibration value */ reg &= ~PMU_TDC0_REF_CAL_CNT_MASK ; reg |= (0xf1 <<PMU_TDC0_REF_CAL_CNT_OFFS ); -writel (reg, priv->control); +writel (reg, priv->control1);/* Reset the sensor */ - reg =readl_relaxed (priv->control); -writel ((reg |PMU_TDC0_SW_RST_MASK ), priv->control); + reg =readl_relaxed (priv->control1); +writel ((reg |PMU_TDC0_SW_RST_MASK ), priv->control1); -writel (reg, priv->control); +writel (reg, priv->control1);/* Enable the sensor */ - reg =readl_relaxed (priv->sensor); + reg =readl_relaxed (priv->status); reg &= ~PMU_TM_DISABLE_MASK ; -writel (reg, priv->sensor); +writel (reg, priv->status); }static void armada370_init_sensor (struct platform_device *pdev,struct armada_thermal_priv *priv) { -unsigned long reg; +u32 reg; - reg =readl_relaxed (priv->control); + reg =readl_relaxed (priv->control1); reg |=PMU_TDC0_OTF_CAL_MASK ; -writel (reg, priv->control); +writel (reg, priv->control1);/* Reference calibration value */ reg &= ~PMU_TDC0_REF_CAL_CNT_MASK ; reg |= (0xf1 <<PMU_TDC0_REF_CAL_CNT_OFFS ); -writel (reg, priv->control); +writel (reg, priv->control1); reg &= ~PMU_TDC0_START_CAL_MASK ; -writel (reg, priv->control); +writel (reg, priv->control1);msleep (10 ); }@@ -117,37 +126,37 @@ static void armada370_init_sensor(struct
platform_device*pdev, static voidarmada375_init_sensor(struct platform_device *pdev, struct armada_thermal_priv *priv)
{drivers/thermal/armada_thermal.c +2
-2-unsigned long reg; +u32 reg; - reg =readl (priv->control +4 ); + reg =readl (priv->control1); reg &= ~(A375_UNIT_CONTROL_MASK <<
A375_UNIT_CONTROL_SHIFT); reg &= ~A375_READOUT_INVERT;drivers/thermal/armada_thermal.c +17
-13reg &= ~A375_HW_RESETn; -writel (reg, priv->control +4 ); +writel (reg, priv->control1);msleep (20 ); reg |= A375_HW_RESETn; -writel (reg, priv->control +4 ); +writel (reg, priv->control1);msleep (50 ); }static void armada380_init_sensor (struct platform_device *pdev,struct armada_thermal_priv *priv) { -unsigned long reg =readl_relaxed (priv->control); +u32 reg =readl_relaxed (priv->control1);/* Reset hardware once */ if (!(reg &A380_HW_RESET )) { reg |=A380_HW_RESET ; -writel (reg, priv->control); +writel (reg, priv->control1);msleep (10 ); } }static bool armada_is_valid (struct armada_thermal_priv *priv) { -unsigned long reg =readl_relaxed (priv->sensor); +u32 reg =readl_relaxed (priv->status);return reg & priv->data->is_valid_bit; }@@ -156,7 +165,7 @@ static int armada_get_temp(struct thermal_zone_device *thermal, int *temp) {struct armada_thermal_priv *priv = thermal->devdata; -unsigned long reg; +u32 reg;unsigned long m, b, div;/* Valid check */ @@ -166,7 +175,7 @@ static int armada_get_temp(struct thermal_zone_device *thermal, return -EIO ; } - reg =readl_relaxed (priv->sensor); + reg =readl_relaxed (priv->status); reg = (reg >> priv->data->temp_shift) & priv->data->temp_mask;/* Get formula coeficients */ @@ -253,6 +262,7 @@ MODULE_DEVICE_TABLE(of, armada_thermal_id_table);static int armada_thermal_probe (struct platform_device *pdev) { +void __iomem *control =NULL ;struct thermal_zone_device *thermal;const struct of_device_id *match;struct armada_thermal_priv *priv;@@ -267,14 +277,28 @@ static int armada_thermal_probe(struct platform_device *pdev) return -ENOMEM; res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); - priv->sensor =devm_ioremap_resource (&pdev->dev, res); -if (IS_ERR (priv->sensor)) -return PTR_ERR (priv->sensor); + priv->status =devm_ioremap_resource (&pdev->dev, res); +if (IS_ERR (priv->status)) +return PTR_ERR (priv->status); res =platform_get_resource (pdev,IORESOURCE_MEM ,1 ); - priv->control =devm_ioremap_resource (&pdev->dev, res); -if (IS_ERR (priv->control)) -return PTR_ERR (priv->control); + control =devm_ioremap_resource (&pdev->dev, res); +if (IS_ERR (control)) +return PTR_ERR (control); + +/* +* Legacy DT bindings only described "control1" register (also referred
(quoted diff) +1
-0+ * as "control MSB" on old documentation). New bindingscover
(quoted diff) +1
-0+ * "control0/control LSB" and "control1/control MSB"registers within
drivers/thermal/armada_thermal.c +9
-0+* the same resource, which is then of size 8 instead of 4. +*/ +if ((res->end - res->start) ==LEGACY_CONTROL_MEM_LEN ) { +/* ->control0 unavailable in this configuration */ + priv->control1 = control +LEGACY_CONTROL1_OFFSET ; + }else { + priv->control0 = control +CONTROL0_OFFSET ; + priv->control1 = control +CONTROL1_OFFSET ; + } priv->data = (struct armada_thermal_data *)match->data; priv->data->init_sensor (pdev, priv);
Signature · 3 lines
Miquel Raynal, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com
PATCH v3 4/11 thermal: armada: Rationalize register accesses
In reply to Miquel RaynalHi Miqu?l,
Quoted 14 lines · Miquel Raynal
Bindings were incomplete for a long time by only exposing one of the two available control registers. To ease the migration to the full bindings (already in use for the Armada 375 SoC), rename the pointers for clarification. This way, it will only be needed to add another pointer to access the other control register when the time comes.
This avoids dangerous situations where the offset 0 of the control area can be either one register or the other depending on the bindings used. After this change, device trees of other SoCs could be migrated to the "full" bindings if they may benefit from features from the unaccessible register, without any change in the driver.
Signed-off-by Miquel Raynal <[email protected]>---
[...]
drivers/thermal/armada_thermal.c static int armada_thermal_probe(struct platform_device *pdev) · line 301
Quoted 13 lines
drivers/thermal/armada_thermal.c +13
-0+/* +* Legacy DT bindings only described "control1" register (also referred +* as "control MSB" on old documentation). New bindings cover +* "control0/control LSB" and "control1/control MSB" registers within +* the same resource, which is then of size 8 instead of 4. +*/ +if ((res->end - res->start) ==LEGACY_CONTROL_MEM_LEN ) { +/* ->control0 unavailable in this configuration */ + priv->control1 = control +LEGACY_CONTROL1_OFFSET ; + }else { + priv->control0 = control +CONTROL0_OFFSET ; + priv->control1 = control +CONTROL1_OFFSET ; + }
I think we need to add a check here that the control registers area size matches the expected value given the compatible string. In case of mismatch probe should fail.
drivers/thermal/armada_thermal.c static int armada_thermal_probe(struct platform_device *pdev) · line 304
Quoted 2 lines
drivers/thermal/armada_thermal.c +0
-0priv->data = (struct armada_thermal_data *)match->data; priv->data->init_sensor (pdev, priv);
baruch
Signature · 3 lines
http://baruch.siach.name/blog/ ~. .~ Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
- baruch at tkos.co.il - tel: +972.52.368.4656, http://www.tkos.co.il -PATCH v3 4/11 thermal: armada: Rationalize register accesses
Hi Miqu?l,
Quoted 27 lines · Baruch Siach
Quoted 14 lines · Miquel Raynal
Bindings were incomplete for a long time by only exposing one of the two available control registers. To ease the migration to the full bindings (already in use for the Armada 375 SoC), rename the pointers for clarification. This way, it will only be needed to add another pointer to access the other control register when the time comes.
This avoids dangerous situations where the offset 0 of the control area can be either one register or the other depending on the bindings used. After this change, device trees of other SoCs could be migrated to the "full" bindings if they may benefit from features from the unaccessible register, without any change in the driver.
Signed-off-by Miquel Raynal <[email protected]>---
[...]
Quoted 9 lines
drivers/thermal/armada_thermal.c +9
-0+/* +* Legacy DT bindings only described "control1" register (also referred +* as "control MSB" on old documentation). New bindings cover +* "control0/control LSB" and "control1/control MSB" registers within +* the same resource, which is then of size 8 instead of 4. +*/ +if ((res->end - res->start) ==LEGACY_CONTROL_MEM_LEN ) { +/* ->control0 unavailable in this configuration */ + priv->control1 = control +LEGACY_CONTROL1_OFFSET ;
Quoted 8 lines
drivers/thermal/armada_thermal.c static int armada_thermal_probe(struct platform_device *pdev) · line 301
Quoted 4 lines
drivers/thermal/armada_thermal.c +4
-0+ }else { + priv->control0 = control +CONTROL0_OFFSET ; + priv->control1 = control +CONTROL1_OFFSET ; + }I think we need to add a check here that the control registers area size matches the expected value given the compatible string. In case of mismatch probe should fail.
One more thing. You should probably use resource_size() instead of open coding it. resource_size() does "res->end - res->start + 1". Are you sure your code is correct?
Quoted 2 lines
drivers/thermal/armada_thermal.c static int armada_thermal_probe(struct platform_device *pdev) · line 304
Quoted 2 lines
drivers/thermal/armada_thermal.c +0
-0priv->data = (struct armada_thermal_data *)match->data; priv->data->init_sensor (pdev, priv);
baruch
Signature · 3 lines
http://baruch.siach.name/blog/ ~. .~ Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
- baruch at tkos.co.il - tel: +972.52.368.4656, http://www.tkos.co.il -PATCH v3 4/11 thermal: armada: Rationalize register accesses
Quoted 46 lines · On Mon, 18 Dec 2017 00:02:35 +0200 Baruch Siach <[email protected]> wrote:
Hi Miqu?l,
Quoted 43 lines · Baruch Siach
Quoted 16 lines · Miquel Raynal
Bindings were incomplete for a long time by only exposing one of the two available control registers. To ease the migration to the full bindings (already in use for the Armada 375 SoC), rename the pointers for clarification. This way, it will only be needed to add another pointer to access the other control register when the time comes.
This avoids dangerous situations where the offset 0 of the control area can be either one register or the other depending on the bindings used. After this change, device trees of other SoCs could be migrated to the "full" bindings if they may benefit from features from the unaccessible register, without any change in the driver.
Signed-off-by Miquel Raynal <[email protected]>---
[...]
Quoted 15 lines
(quoted diff) +2
-0+ /* + * Legacy DT bindings only described "control1" register(also referred
(quoted diff) +1
-0+ * as "control MSB" on old documentation). New bindingscover
(quoted diff) +1
-0+ * "control0/control LSB" and "control1/control MSB"registers within
(quoted diff) +1
-0+ * the same resource, which is then of size 8 instead of4.
drivers/thermal/armada_thermal.c +3
-0+*/ +if ((res->end - res->start) ==LEGACY_CONTROL_MEM_LEN ) { +/* ->control0 unavailable in this configuration */
(quoted diff) +1
-0+ priv->control1 = control +
LEGACY_CONTROL1_OFFSET;drivers/thermal/armada_thermal.c static int armada_thermal_probe(struct platform_device *pdev) · line 301
Quoted 4 lines
drivers/thermal/armada_thermal.c +4
-0+ }else { + priv->control0 = control +CONTROL0_OFFSET ; + priv->control1 = control +CONTROL1_OFFSET ; + }I think we need to add a check here that the control registers area size matches the expected value given the compatible string. In case of mismatch probe should fail.
Ok I will check here for the bindings used.
Still, in the a380_init() I will have to check if control0 is valid or not because this function should handle both bindings.
Quoted 4 lines
One more thing. You should probably use
resource_size()instead of open coding it.resource_size()does "res->end-res->start+ 1". Are you sure your code is correct?
It is not regarding the implementation of resource_size() (which I'm gonna use).
Quoted 6 lines
Quoted 3 lines
drivers/thermal/armada_thermal.c static int armada_thermal_probe(struct platform_device *pdev) · line 304
Quoted 3 lines
drivers/thermal/armada_thermal.c +0
-0priv->data = (struct armada_thermal_data *)match->data; priv->data->init_sensor (pdev, priv);baruch
Thank you,
Miqu?l
PATCH v3 5/11 thermal: armada: Add support for Armada AP806
In reply to Miquel RaynalFrom: Baruch Siach <[email protected]>
The AP806 component is integrated in the Armada 8k and 7k lines of processors.
The thermal sensor sample field on the status register is a signed value. Extend armada_get_temp() to handle signed values.
--- drivers/thermal/armada_thermal.c | 51 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-)
drivers/thermal/armada_thermal.c +49 -2
@@ -47,6 +47,11 @@#define CONTROL0_OFFSET 0x0#define CONTROL1_OFFSET 0x4 +/* TSEN refers to the temperature sensors within the AP */ +#define CONTROL0_TSEN_START BIT(0) +#define CONTROL0_TSEN_RESET BIT(1) +#define CONTROL0_TSEN_ENABLE BIT(2) +struct armada_thermal_data ;/* Marvell EBU Thermal Sensor Dev Structure */
@@ -70,6 +75,7 @@ struct armada_thermal_data {unsigned long coef_m;unsigned long coef_div;bool inverted; +bool signed_sample;/* Register shift and mask to access the sensor temperature */ unsigned int temp_shift;
@@ -154,6 +160,24 @@ static void armada380_init_sensor(struct platform_device *pdev, } } +static void armada_ap806_init_sensor (struct platform_device *pdev, +struct armada_thermal_priv *priv) +{ +u32 reg; + +if (!priv->control0) { +dev_err (&pdev->dev, +"Cannot access to control0 (control LSB) register\n" ); +return ; + } + + reg =readl_relaxed (priv->control0); + reg &= ~CONTROL0_TSEN_RESET ; + reg |=CONTROL0_TSEN_START |CONTROL0_TSEN_ENABLE ; +writel (reg, priv->control0); +msleep (10 ); +} +static bool armada_is_valid (struct armada_thermal_priv *priv) {u32 reg =readl_relaxed (priv->status);
@@ -167,6 +191,7 @@ static int armada_get_temp(struct thermal_zone_device *thermal,struct armada_thermal_priv *priv = thermal->devdata;u32 reg;unsigned long m, b, div; +int sample;/* Valid check */ if (priv->data->is_valid && !priv->data->is_valid (priv)) {
@@ -177,6 +202,11 @@ static int armada_get_temp(struct thermal_zone_device *thermal, reg =readl_relaxed (priv->status); reg = (reg >> priv->data->temp_shift) & priv->data->temp_mask; +if (priv->data->signed_sample) +/* The most significant bit is the sign bit */ + sample =sign_extend32 (reg,fls (priv->data->temp_mask) -1 ); +else + sample = reg;/* Get formula coeficients */ b = priv->data->coef_b;
@@ -184,9 +214,9 @@ static int armada_get_temp(struct thermal_zone_device *thermal, div = priv->data->coef_div;if (priv->data->inverted) - *temp = ((m * reg) - b) / div; + *temp = ((m * sample) - b) / div;else - *temp = (b - (m * reg)) / div; + *temp = (b - (m * sample)) / div;return 0 ; }
@@ -237,6 +267,19 @@ static const struct armada_thermal_data armada380_data = { .inverted = true, }; +static const struct armada_thermal_data armada_ap806_data = { + .is_valid = armada_is_valid, + .init_sensor = armada_ap806_init_sensor, + .is_valid_bit =BIT (16 ), + .temp_shift =0 , + .temp_mask =0x3ff , + .coef_b =-150000 , + .coef_m =423UL , + .coef_div =1 , + .inverted = true, + .signed_sample = true, +}; +static const struct of_device_id armada_thermal_id_table[] = { { .compatible ="marvell,armadaxp-thermal" ,
@@ -255,6 +298,10 @@ static const struct of_device_id armada_thermal_id_table[] = { .data = &armada380_data, }, { + .compatible = "marvell,armada-ap806-thermal", + .data = &armada_ap806_data, + }, + {/* sentinel */ }, };
Signature · 1 line
2.11.0
PATCH v3 5/11 thermal: armada: Add support for Armada AP806
Hi Miquel,
Quoted 10 lines · Miquel Raynal
From: Baruch Siach <[email protected]>
The AP806 component is integrated in the Armada 8k and 7k lines of processors.
The thermal sensor sample field on the status register is a signed value. Extend
armada_get_temp()to handle signed values.Signed-off-by Baruch Siach <[email protected]>Signed-off-by Miquel Raynal <[email protected]>
Maybe you should mention that you have made some changes at least to be able to use the previous modification you have done.
Quoted 86 lines
--- drivers/thermal/armada_thermal.c | 51 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-)drivers/thermal/armada_thermal.c +32
-2@@ -47,6 +47,11 @@#define CONTROL0_OFFSET 0x0#define CONTROL1_OFFSET 0x4 +/* TSEN refers to the temperature sensors within the AP */ +#define CONTROL0_TSEN_START BIT(0) +#define CONTROL0_TSEN_RESET BIT(1) +#define CONTROL0_TSEN_ENABLE BIT(2) +struct armada_thermal_data ;/* Marvell EBU Thermal Sensor Dev Structure */ @@ -70,6 +75,7 @@ struct armada_thermal_data {unsigned long coef_m;unsigned long coef_div;bool inverted; +bool signed_sample;/* Register shift and mask to access the sensor temperature */ unsigned int temp_shift;@@ -154,6 +160,24 @@ static void armada380_init_sensor(struct platform_device *pdev, } } +static void armada_ap806_init_sensor (struct platform_device *pdev, +struct armada_thermal_priv *priv) +{ +u32 reg; + +if (!priv->control0) { +dev_err (&pdev->dev, +"Cannot access to control0 (control LSB) register\n" ); +return ; + } + + reg =readl_relaxed (priv->control0); + reg &= ~CONTROL0_TSEN_RESET ; + reg |=CONTROL0_TSEN_START |CONTROL0_TSEN_ENABLE ; +writel (reg, priv->control0); +msleep (10 ); +} +static bool armada_is_valid (struct armada_thermal_priv *priv) {u32 reg =readl_relaxed (priv->status);@@ -167,6 +191,7 @@ static int armada_get_temp(struct thermal_zone_device *thermal,struct armada_thermal_priv *priv = thermal->devdata;u32 reg;unsigned long m, b, div; +int sample;/* Valid check */ if (priv->data->is_valid && !priv->data->is_valid (priv)) {@@ -177,6 +202,11 @@ static int armada_get_temp(struct thermal_zone_device *thermal, reg =readl_relaxed (priv->status); reg = (reg >> priv->data->temp_shift) & priv->data->temp_mask; +if (priv->data->signed_sample) +/* The most significant bit is the sign bit */ + sample =sign_extend32 (reg,fls (priv->data->temp_mask) -1 ); +else + sample = reg;/* Get formula coeficients */ b = priv->data->coef_b;@@ -184,9 +214,9 @@ static int armada_get_temp(struct thermal_zone_device *thermal, div = priv->data->coef_div;if (priv->data->inverted) - *temp = ((m * reg) - b) / div; + *temp = ((m * sample) - b) / div;else - *temp = (b - (m * reg)) / div; + *temp = (b - (m * sample)) / div;return 0 ; }
drivers/thermal/armada_thermal.c static const struct armada_thermal_data armada380_data = { · line 276
Quoted 10 lines
drivers/thermal/armada_thermal.c +7
-0@@ -237,6 +267,19 @@ static const struct armada_thermal_data armada380_data = { .inverted = true, }; +static const struct armada_thermal_data armada_ap806_data = { + .is_valid = armada_is_valid, + .init_sensor = armada_ap806_init_sensor, + .is_valid_bit =BIT (16 ), + .temp_shift =0 , + .temp_mask =0x3ff , + .coef_b =-150000 ,
Don't you expect any side effect by storing a negative value in a unsigned variable?
Thanks,
Gregory
Quoted 28 lines
drivers/thermal/armada_thermal.c +10
-0+ .coef_m = 423UL, + .coef_div = 1, + .inverted = true, + .signed_sample = true, +}; +static const struct of_device_id armada_thermal_id_table[] = { { .compatible ="marvell,armadaxp-thermal" ,@@ -255,6 +298,10 @@ static const struct of_device_id armada_thermal_id_table[] = { .data = &armada380_data, }, { + .compatible = "marvell,armada-ap806-thermal", + .data = &armada_ap806_data, + }, + {/* sentinel */ }, };Signature · 7 lines
2.11.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel at lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Signature · 4 lines
Gregory Clement, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com
PATCH v3 5/11 thermal: armada: Add support for Armada AP806
Hello Gregory & Baruch,
Quoted 16 lines · On Thu, 14 Dec 2017 12:05:43 +0100 Gregory CLEMENT…
Quoted 16 lines
drivers/thermal/armada_thermal.c +2
-2@@ -184,9 +214,9 @@ static int armada_get_temp(structthermal_zone_device *thermal, div = priv->data->coef_div;if (priv->data->inverted) - *temp = ((m * reg) - b) / div; + *temp = ((m * sample) - b) / div;else - *temp = (b - (m * reg)) / div; + *temp = (b - (m * sample)) / div;return 0 ; }@@ -237,6 +267,19 @@ static const struct armada_thermal_data armada380_data = { .inverted = true, };
Quoted 10 lines
drivers/thermal/armada_thermal.c static const struct armada_thermal_data armada380_data = { · line 276
Quoted 7 lines
drivers/thermal/armada_thermal.c +7
-0+static const struct armada_thermal_data armada_ap806_data = { + .is_valid = armada_is_valid, + .init_sensor = armada_ap806_init_sensor, + .is_valid_bit =BIT (16 ), + .temp_shift =0 , + .temp_mask =0x3ff , + .coef_b =-150000 ,Don't you expect any side effect by storing a negative value in a unsigned variable?
That is a fair question, I did not spot that.
As other values are really close to 2^32 I don't know what is the best option for us in this case. Should I:
- don't care?
- use signed values? (dangerous IMHO)
- use a union with a signed and an unsigned value? (problem moved to ->get_temp())
Thanks for your input.
Miqu?l
PATCH v3 5/11 thermal: armada: Add support for Armada AP806
Hi Miqu?l,
Quoted 32 lines · Miquel RAYNAL
Hello Gregory & Baruch,
Quoted 16 lines · On Thu, 14 Dec 2017 12:05:43 +0100 Gregory CLEMENT…
Quoted 16 lines
drivers/thermal/armada_thermal.c +2
-2@@ -184,9 +214,9 @@ static int armada_get_temp(structthermal_zone_device *thermal, div = priv->data->coef_div;if (priv->data->inverted) - *temp = ((m * reg) - b) / div; + *temp = ((m * sample) - b) / div;else - *temp = (b - (m * reg)) / div; + *temp = (b - (m * sample)) / div;return 0 ; }@@ -237,6 +267,19 @@ static const struct armada_thermal_data armada380_data = { .inverted = true, };Quoted 10 lines
drivers/thermal/armada_thermal.c static const struct armada_thermal_data armada380_data = { · line 276
Quoted 7 lines
drivers/thermal/armada_thermal.c +7
-0+static const struct armada_thermal_data armada_ap806_data = { + .is_valid = armada_is_valid, + .init_sensor = armada_ap806_init_sensor, + .is_valid_bit =BIT (16 ), + .temp_shift =0 , + .temp_mask =0x3ff , + .coef_b =-150000 ,Don't you expect any side effect by storing a negative value in a unsigned variable?
Quoted 8 lines
That is a fair question, I did not spot that.
As other values are really close to 2^32 I don't know what is the best option for us in this case. Should I:
- don't care?
- use signed values? (dangerous IMHO)
- use a union with a signed and an unsigned value? (problem moved to ->get_temp())
Another option is to use s64 type.
baruch
Signature · 3 lines
http://baruch.siach.name/blog/ ~. .~ Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
- baruch at tkos.co.il - tel: +972.2.679.5364, http://www.tkos.co.il -PATCH v3 5/11 thermal: armada: Add support for Armada AP806
Hi Baruch,
Quoted 37 lines · On Mon, 18 Dec 2017 13:11:56 +0200 Baruch Siach <[email protected]> wrote:
Hi Miqu?l,
Quoted 34 lines · Miquel RAYNAL
Hello Gregory & Baruch,
Quoted 16 lines · On Thu, 14 Dec 2017 12:05:43 +0100 Gregory CLEMENT…
Quoted 16 lines
drivers/thermal/armada_thermal.c +2
-2@@ -184,9 +214,9 @@ static int armada_get_temp(structthermal_zone_device *thermal, div = priv->data->coef_div;if (priv->data->inverted) - *temp = ((m * reg) - b) / div; + *temp = ((m * sample) - b) / div;else - *temp = (b - (m * reg)) / div; + *temp = (b - (m * sample)) / div;return 0 ; }@@ -237,6 +267,19 @@ static const struct armada_thermal_data armada380_data = { .inverted = true, };Quoted 10 lines
drivers/thermal/armada_thermal.c static const struct armada_thermal_data armada380_data = { · line 276
Quoted 7 lines
drivers/thermal/armada_thermal.c +7
-0+static const struct armada_thermal_data armada_ap806_data = { + .is_valid = armada_is_valid, + .init_sensor = armada_ap806_init_sensor, + .is_valid_bit =BIT (16 ), + .temp_shift =0 , + .temp_mask =0x3ff , + .coef_b =-150000 ,Don't you expect any side effect by storing a negative value in a unsigned variable?
That is a fair question, I did not spot that.
Quoted 8 lines
Quoted 6 lines
As other values are really close to 2^32 I don't know what is the best option for us in this case. Should I:
- don't care?
- use signed values? (dangerous IMHO)
- use a union with a signed and an unsigned value? (problem moved to ->get_temp())Another option is to use s64 type.
I prefer this one!
Thank you,
Miqu?l
Quoted 3 lines
baruch
Signature · 3 lines
Miquel Raynal, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com
PATCH v3 5/11 thermal: armada: Add support for Armada AP806
In reply to Miquel RaynalHi Miqu?l,
Quoted 11 lines · Miquel Raynal
From: Baruch Siach <[email protected]>
The AP806 component is integrated in the Armada 8k and 7k lines of processors.
The thermal sensor sample field on the status register is a signed value. Extend
armada_get_temp()to handle signed values.Signed-off-by Baruch Siach <[email protected]>Signed-off-by Miquel Raynal <[email protected]>---
[...]
drivers/thermal/armada_thermal.c static void armada380_init_sensor(struct platform_device *pdev, · line 172
Quoted 10 lines
drivers/thermal/armada_thermal.c +10
-0+static void armada_ap806_init_sensor (struct platform_device *pdev, +struct armada_thermal_priv *priv) +{ +u32 reg; + +if (!priv->control0) { +dev_err (&pdev->dev, +"Cannot access to control0 (control LSB) register\n" ); +return ; + }
With the probe time control area size validation this check would not be needed.
baruch
Quoted 7 lines
drivers/thermal/armada_thermal.c +7
-0+ + reg =readl_relaxed (priv->control0); + reg &= ~CONTROL0_TSEN_RESET ; + reg |=CONTROL0_TSEN_START |CONTROL0_TSEN_ENABLE ; +writel (reg, priv->control0); +msleep (10 ); +}
Signature · 3 lines
http://baruch.siach.name/blog/ ~. .~ Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
- baruch at tkos.co.il - tel: +972.52.368.4656, http://www.tkos.co.il -PATCH v3 6/11 thermal: armada: Add support for Armada CP110
In reply to Miquel RaynalFrom: Baruch Siach <[email protected]>
The CP110 component is integrated in the Armada 8k and 7k lines of processors.
--- drivers/thermal/armada_thermal.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-)
drivers/thermal/armada_thermal.c +24 -6
@@ -37,7 +37,6 @@#define A375_UNIT_CONTROL_MASK 0x7#define A375_READOUT_INVERT BIT(15)#define A375_HW_RESETn BIT(8) -#define A380_HW_RESET BIT(8)/* Legacy bindings */ #define LEGACY_CONTROL_MEM_LEN 0x4
@@ -52,6 +51,10 @@#define CONTROL0_TSEN_RESET BIT(1)#define CONTROL0_TSEN_ENABLE BIT(2) +/* EXT_TSEN refers to the external temperature sensors, out of the AP */ +#define CONTROL1_EXT_TSEN_SW_RESET BIT(7) +#define CONTROL1_EXT_TSEN_HW_RESETn BIT(8) +struct armada_thermal_data ;/* Marvell EBU Thermal Sensor Dev Structure */
@@ -153,11 +156,10 @@ static void armada380_init_sensor(struct platform_device *pdev,u32 reg =readl_relaxed (priv->control1);/* Reset hardware once */ -if (!(reg &A380_HW_RESET )) { - reg |=A380_HW_RESET ; -writel (reg, priv->control1); -msleep (10 ); - } + reg |= CONTROL1_EXT_TSEN_HW_RESETn; + reg &= ~CONTROL1_EXT_TSEN_SW_RESET ; +writel (reg, priv->control1); +msleep (10 ); } static void armada_ap806_init_sensor(struct platform_device *pdev,
@@ -280,6 +282,18 @@ static const struct armada_thermal_data armada_ap806_data = { .signed_sample = true, }; +static const struct armada_thermal_data armada_cp110_data = { + .is_valid = armada_is_valid, + .init_sensor = armada380_init_sensor, + .is_valid_bit =BIT (10 ), + .temp_shift =0 , + .temp_mask =0x3ff , + .coef_b =1172499100UL , + .coef_m =2000096UL , + .coef_div =4201 , + .inverted = true, +}; +static const struct of_device_id armada_thermal_id_table[] = { { .compatible ="marvell,armadaxp-thermal" ,
@@ -302,6 +316,10 @@ static const struct of_device_id armada_thermal_id_table[] = { .data = &armada_ap806_data, }, { + .compatible = "marvell,armada-cp110-thermal", + .data = &armada_cp110_data, + }, + {/* sentinel */ }, };
Signature · 1 line
2.11.0
PATCH v3 6/11 thermal: armada: Add support for Armada CP110
Hi Miquel,
Quoted 7 lines · Miquel Raynal
From: Baruch Siach <[email protected]>
The CP110 component is integrated in the Armada 8k and 7k lines of processors.
Signed-off-by Baruch Siach <[email protected]>[<[email protected]>: renamed the register pointers]
Actually you did more thant this see below
Quoted 18 lines
Signed-off-by Miquel Raynal <[email protected]>--- drivers/thermal/armada_thermal.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-)drivers/thermal/armada_thermal.c +0
-1@@ -37,7 +37,6 @@#define A375_UNIT_CONTROL_MASK 0x7#define A375_READOUT_INVERT BIT(15)#define A375_HW_RESETn BIT(8) -#define A380_HW_RESET BIT(8)/* Legacy bindings */ #define LEGACY_CONTROL_MEM_LEN 0x4
drivers/thermal/armada_thermal.c line 56
Quoted 6 lines
drivers/thermal/armada_thermal.c +3
-0@@ -52,6 +51,10 @@#define CONTROL0_TSEN_RESET BIT(1)#define CONTROL0_TSEN_ENABLE BIT(2) +/* EXT_TSEN refers to the external temperature sensors, out of the AP */ +#define CONTROL1_EXT_TSEN_SW_RESET BIT(7) +#define CONTROL1_EXT_TSEN_HW_RESETn BIT(8)
You added or rename these values
Quoted 6 lines
drivers/thermal/armada_thermal.c +1
-0+struct armada_thermal_data ;/* Marvell EBU Thermal Sensor Dev Structure */ @@ -153,11 +156,10 @@ static void armada380_init_sensor(struct platform_device *pdev,u32 reg =readl_relaxed (priv->control1);
drivers/thermal/armada_thermal.c static void armada380_init_sensor(struct platform_device *pdev, · line 161
Quoted 10 lines
drivers/thermal/armada_thermal.c +3
-5/* Reset hardware once */ -if (!(reg &A380_HW_RESET )) { - reg |=A380_HW_RESET ; -writel (reg, priv->control1); -msleep (10 ); - } + reg |= CONTROL1_EXT_TSEN_HW_RESETn; + reg &= ~CONTROL1_EXT_TSEN_SW_RESET ; +writel (reg, priv->control1);
And here you modified the behavior of this function. Did you checked that it is valid for Armada 38x?
Given the comment we had, I thought we should not do anything if CONTROL1_EXT_TSEN_HW_RESETn was not set.
By the way, if the new sequence is valid, this comment should be removed or at least updated.
Gregory
Quoted 42 lines
drivers/thermal/armada_thermal.c +17
-0+msleep (10 ); } static void armada_ap806_init_sensor(struct platform_device *pdev,@@ -280,6 +282,18 @@ static const struct armada_thermal_data armada_ap806_data = { .signed_sample = true, }; +static const struct armada_thermal_data armada_cp110_data = { + .is_valid = armada_is_valid, + .init_sensor = armada380_init_sensor, + .is_valid_bit =BIT (10 ), + .temp_shift =0 , + .temp_mask =0x3ff , + .coef_b =1172499100UL , + .coef_m =2000096UL , + .coef_div =4201 , + .inverted = true, +}; +static const struct of_device_id armada_thermal_id_table[] = { { .compatible ="marvell,armadaxp-thermal" ,@@ -302,6 +316,10 @@ static const struct of_device_id armada_thermal_id_table[] = { .data = &armada_ap806_data, }, { + .compatible = "marvell,armada-cp110-thermal", + .data = &armada_cp110_data, + }, + {/* sentinel */ }, };Signature · 7 lines
2.11.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel at lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Signature · 4 lines
Gregory Clement, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com
PATCH v3 6/11 thermal: armada: Add support for Armada CP110
Quoted 51 lines · On Thu, 14 Dec 2017 12:11:49 +0100 Gregory CLEMENT…
Hi Miquel,
Quoted 8 lines · Miquel Raynal
From: Baruch Siach <[email protected]>
The CP110 component is integrated in the Armada 8k and 7k lines of processors.
Signed-off-by Baruch Siach <[email protected]>[<[email protected]>: renamed the register pointers]
Actually you did more thant this see below
Quoted 19 lines
Signed-off-by Miquel Raynal <[email protected]>--- drivers/thermal/armada_thermal.c | 30++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-)
(quoted diff) +0
-0
b/drivers/thermal/armada_thermal.cindex279d01937bb8..f5c911524656100644 ---a/drivers/thermal/armada_thermal.c
+++b/drivers/thermal/armada_thermal.cdrivers/thermal/armada_thermal.c +0
-1@@ -37,7 +37,6 @@#define A375_UNIT_CONTROL_MASK 0x7#define A375_READOUT_INVERT BIT(15)#define A375_HW_RESETn BIT(8) -#define A380_HW_RESET BIT(8)/* Legacy bindings */ #define LEGACY_CONTROL_MEM_LEN 0x4drivers/thermal/armada_thermal.c line 56
Quoted 6 lines
drivers/thermal/armada_thermal.c +2
-0@@ -52,6 +51,10 @@#define CONTROL0_TSEN_RESET BIT(1)#define CONTROL0_TSEN_ENABLE BIT(2) +/* EXT_TSEN refers to the external temperature sensors, out of the AP */ +#define CONTROL1_EXT_TSEN_SW_RESET BIT(7) +#define CONTROL1_EXT_TSEN_HW_RESETn BIT(8)You added or rename these values
Quoted 7 lines
drivers/thermal/armada_thermal.c +1
-0+struct armada_thermal_data ;/* Marvell EBU Thermal Sensor Dev Structure */ @@ -153,11 +156,10 @@ static void armada380_init_sensor(struct platform_device *pdev, u32 reg = readl_relaxed(priv->control1);
Quoted 12 lines
drivers/thermal/armada_thermal.c static void armada380_init_sensor(struct platform_device *pdev, · line 161
Quoted 9 lines
drivers/thermal/armada_thermal.c +3
-5/* Reset hardware once */ -if (!(reg &A380_HW_RESET )) { - reg |=A380_HW_RESET ; -writel (reg, priv->control1); -msleep (10 ); - } + reg |= CONTROL1_EXT_TSEN_HW_RESETn; + reg &= ~CONTROL1_EXT_TSEN_SW_RESET ; +writel (reg, priv->control1);And here you modified the behavior of this function. Did you checked that it is valid for Armada 38x?
There is nothing about it the documentation and anyway this register can be accessed later, so writing it is harmless ayway.
Quoted 3 lines
Given the comment we had, I thought we should not do anything if
CONTROL1_EXT_TSEN_HW_RESETnwas not set.
That is the opposite, if it is not set (ie. reset is active), you have to set it (reset is then disabled).
Quoted 3 lines
By the way, if the new sequence is valid, this comment should be removed or at least updated.
That's right, I will in v4.
Thanks for reviewing,
Miqu?l
PATCH v3 6/11 thermal: armada: Add support for Armada CP110
Hi Miquel,
Quoted 71 lines · Miquel RAYNAL
Quoted 51 lines · On Thu, 14 Dec 2017 12:11:49 +0100 Gregory CLEMENT…
Hi Miquel,
Quoted 8 lines · Miquel Raynal
From: Baruch Siach <[email protected]>
The CP110 component is integrated in the Armada 8k and 7k lines of processors.
Signed-off-by Baruch Siach <[email protected]>[<[email protected]>: renamed the register pointers]
Actually you did more thant this see below
Quoted 19 lines
Signed-off-by Miquel Raynal <[email protected]>--- drivers/thermal/armada_thermal.c | 30++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-)
(quoted diff) +0
-0
b/drivers/thermal/armada_thermal.cindex279d01937bb8..f5c911524656100644 ---a/drivers/thermal/armada_thermal.c
+++b/drivers/thermal/armada_thermal.cdrivers/thermal/armada_thermal.c +0
-1@@ -37,7 +37,6 @@#define A375_UNIT_CONTROL_MASK 0x7#define A375_READOUT_INVERT BIT(15)#define A375_HW_RESETn BIT(8) -#define A380_HW_RESET BIT(8)/* Legacy bindings */ #define LEGACY_CONTROL_MEM_LEN 0x4drivers/thermal/armada_thermal.c line 56
Quoted 6 lines
drivers/thermal/armada_thermal.c +2
-0@@ -52,6 +51,10 @@#define CONTROL0_TSEN_RESET BIT(1)#define CONTROL0_TSEN_ENABLE BIT(2) +/* EXT_TSEN refers to the external temperature sensors, out of the AP */ +#define CONTROL1_EXT_TSEN_SW_RESET BIT(7) +#define CONTROL1_EXT_TSEN_HW_RESETn BIT(8)You added or rename these values
Quoted 7 lines
drivers/thermal/armada_thermal.c +1
-0+struct armada_thermal_data ;/* Marvell EBU Thermal Sensor Dev Structure */ @@ -153,11 +156,10 @@ static void armada380_init_sensor(struct platform_device *pdev, u32 reg = readl_relaxed(priv->control1);Quoted 12 lines
drivers/thermal/armada_thermal.c static void armada380_init_sensor(struct platform_device *pdev, · line 161
Quoted 9 lines
drivers/thermal/armada_thermal.c +3
-5/* Reset hardware once */ -if (!(reg &A380_HW_RESET )) { - reg |=A380_HW_RESET ; -writel (reg, priv->control1); -msleep (10 ); - } + reg |= CONTROL1_EXT_TSEN_HW_RESETn; + reg &= ~CONTROL1_EXT_TSEN_SW_RESET ; +writel (reg, priv->control1);And here you modified the behavior of this function. Did you checked that it is valid for Armada 38x?
There is nothing about it the documentation and anyway this register can be accessed later, so writing it is harmless ayway.
Quoted 1 line
Quoted 5 lines
Quoted 2 lines
Given the comment we had, I thought we should not do anything if
CONTROL1_EXT_TSEN_HW_RESETnwas not set.That is the opposite, if it is not set (ie. reset is active), you have to set it (reset is then disabled).
Actually I was concerned by the "once" for me it means "only one time", but maybe it just meant it was useless to reset it again but not harmful.
Gregory
Quoted 11 lines
Quoted 4 lines
By the way, if the new sequence is valid, this comment should be removed or at least updated.
That's right, I will in v4.
Thanks for reviewing,
Miqu?l
Signature · 4 lines
Gregory Clement, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com
PATCH v3 6/11 thermal: armada: Add support for Armada CP110
Quoted 79 lines · On Thu, 14 Dec 2017 12:37:32 +0100 Gregory CLEMENT…
Hi Miquel,
Quoted 74 lines · Miquel RAYNAL
Quoted 51 lines · On Thu, 14 Dec 2017 12:11:49 +0100 Gregory CLEMENT…
Hi Miquel,
Quoted 8 lines · Miquel Raynal
From: Baruch Siach <[email protected]>
The CP110 component is integrated in the Armada 8k and 7k lines of processors.
Signed-off-by Baruch Siach <[email protected]>[<[email protected]>: renamed the register pointers]
Actually you did more thant this see below
Quoted 19 lines
Signed-off-by Miquel Raynal <[email protected]>--- drivers/thermal/armada_thermal.c | 30++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-)
(quoted diff) +0
-0
b/drivers/thermal/armada_thermal.cindex279d01937bb8..f5c911524656100644 ---a/drivers/thermal/armada_thermal.c+++b/drivers/thermal/armada_thermal.c@@ -37,7 +37,6 @@
#defineA375_UNIT_CONTROL_MASK0x7
#defineA375_READOUT_INVERTBIT(15)
#defineA375_HW_RESETnBIT(8)drivers/thermal/armada_thermal.c +0
-1-#define A380_HW_RESET BIT(8)/* Legacy bindings */ #define LEGACY_CONTROL_MEM_LEN 0x4drivers/thermal/armada_thermal.c line 56
Quoted 6 lines
drivers/thermal/armada_thermal.c +2
-0@@ -52,6 +51,10 @@#define CONTROL0_TSEN_RESET BIT(1)#define CONTROL0_TSEN_ENABLE BIT(2) +/* EXT_TSEN refers to the external temperature sensors, out of the AP */ +#define CONTROL1_EXT_TSEN_SW_RESET BIT(7) +#define CONTROL1_EXT_TSEN_HW_RESETn BIT(8)You added or rename these values
Quoted 7 lines
drivers/thermal/armada_thermal.c +1
-0+struct armada_thermal_data ;/* Marvell EBU Thermal Sensor Dev Structure */ @@ -153,11 +156,10 @@ static void armada380_init_sensor(struct platform_device *pdev, u32 reg = readl_relaxed(priv->control1);Quoted 12 lines
drivers/thermal/armada_thermal.c static void armada380_init_sensor(struct platform_device *pdev, · line 161
Quoted 9 lines
drivers/thermal/armada_thermal.c +3
-5/* Reset hardware once */ -if (!(reg &A380_HW_RESET )) { - reg |=A380_HW_RESET ; -writel (reg, priv->control1); -msleep (10 ); - } + reg |= CONTROL1_EXT_TSEN_HW_RESETn; + reg &= ~CONTROL1_EXT_TSEN_SW_RESET ; +writel (reg, priv->control1);And here you modified the behavior of this function. Did you checked that it is valid for Armada 38x?
There is nothing about it the documentation and anyway this register can be accessed later, so writing it is harmless ayway.
Quoted 3 lines
Given the comment we had, I thought we should not do anything if
CONTROL1_EXT_TSEN_HW_RESETnwas not set.
Quoted 6 lines
Quoted 2 lines
That is the opposite, if it is not set (ie. reset is active), you have to set it (reset is then disabled).
Actually I was concerned by the "once" for me it means "only one time", but maybe it just meant it was useless to reset it again but not harmful.
This:
reg |= CONTROL1_EXT_TSEN_HW_RESETn;
does not reset the IP, instead it cancels the reset, if one is happening. So no, doing it unconditionally is not harmful.
Miqu?l
Quoted 15 lines
Gregory
Quoted 11 lines
Quoted 4 lines
By the way, if the new sequence is valid, this comment should be removed or at least updated.
That's right, I will in v4.
Thanks for reviewing,
Miqu?l
Signature · 3 lines
Miquel Raynal, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com
PATCH v3 7/11 thermal: armada: Update Kconfig and module description
In reply to Miquel RaynalUpdate Armada thermal driver Kconfig entry as well as the driver's MODULE_DESCRIPTION content, now that 64-bit SoCs are also supported, eg. Armada 7K and Armada 8K.
--- drivers/thermal/Kconfig | 4 ++-- drivers/thermal/armada_thermal.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
drivers/thermal/Kconfig +2 -2
@@ -301,13 +301,13 @@ config DB8500_THERMAL thermal zone if trip points reached. config ARMADA_THERMAL - tristate "Armada 370/XP thermal management" + tristate "Armada 370/XP/7K/8K thermal management" depends on ARCH_MVEBU || COMPILE_TEST depends on HAS_IOMEM depends on OF help Enable this option if you want to have support for thermal management - controller present in Armada 370 and Armada XP SoC. + controller present in Armada 370, Armada XP, Armada 7K/8K SoCs. config DA9062_THERMAL tristate "DA9062/DA9061 Dialog Semiconductor thermal driver"
drivers/thermal/armada_thermal.c +1 -1
@@ -403,5 +403,5 @@ static struct platform_driver armada_thermal_driver = {module_platform_driver (armada_thermal_driver);MODULE_AUTHOR ("Ezequiel Garcia <[email protected]>" ); -MODULE_DESCRIPTION ("Armada 370/XP thermal driver" ); +MODULE_DESCRIPTION ("Armada SoCs thermal driver" );MODULE_LICENSE ("GPL v2" );
Signature · 1 line
2.11.0
PATCH v3 7/11 thermal: armada: Update Kconfig and module description
Hi Miquel,
Quoted 15 lines · Miquel Raynal
Update Armada thermal driver
Kconfigentry as well as the driver'sMODULE_DESCRIPTIONcontent, now that 64-bit SoCs are also supported, eg. Armada 7K and Armada 8K.Signed-off-by Miquel Raynal <[email protected]>--- drivers/thermal/Kconfig | 4 ++-- drivers/thermal/armada_thermal.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)drivers/thermal/Kconfig +0
-0
drivers/thermal/Kconfig config DB8500_THERMAL · line 304
Quoted 5 lines
drivers/thermal/Kconfig +1
-1@@ -301,13 +301,13 @@ config DB8500_THERMAL thermal zone if trip points reached. config ARMADA_THERMAL - tristate "Armada 370/XP thermal management" + tristate "Armada 370/XP/7K/8K thermal management"
if you want to be exhaustive you should also add Armada 375 and 38x.
Quoted 8 lines
drivers/thermal/Kconfig +1
-1depends on ARCH_MVEBU || COMPILE_TEST depends on HAS_IOMEM depends on OF help Enable this option if you want to have support for thermal management - controller present in Armada 370 and Armada XP SoC. + controller present in Armada 370, Armada XP, Armada 7K/8KSoCs.
here as well.
Gregory
Quoted 22 lines
config
DA9062_THERMALdrivers/thermal/Kconfig +0
-0tristate "DA9062/DA9061 Dialog Semiconductor thermal driver"drivers/thermal/armada_thermal.c +1
-1@@ -403,5 +403,5 @@ static struct platform_driver armada_thermal_driver = {module_platform_driver (armada_thermal_driver);MODULE_AUTHOR ("Ezequiel Garcia <[email protected]>" ); -MODULE_DESCRIPTION ("Armada 370/XP thermal driver" ); +MODULE_DESCRIPTION ("Armada SoCs thermal driver" );MODULE_LICENSE ("GPL v2" );Signature · 7 lines
2.11.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel at lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Signature · 4 lines
Gregory Clement, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com
PATCH v3 7/11 thermal: armada: Update Kconfig and module description
Hi Gregory,
Quoted 22 lines · On Thu, 14 Dec 2017 12:13:51 +0100 Gregory CLEMENT…
Hi Miquel,
Quoted 17 lines · Miquel Raynal
Update Armada thermal driver
Kconfigentry as well as the driver'sMODULE_DESCRIPTIONcontent, now that 64-bit SoCs are also supported, eg. Armada 7K and Armada 8K.Signed-off-by Miquel Raynal <[email protected]>--- drivers/thermal/Kconfig | 4 ++-- drivers/thermal/armada_thermal.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)drivers/thermal/Kconfig +0
-0@@ -301,13 +301,13 @@ config DB8500_THERMAL thermal zone if trip points reached.
Quoted 4 lines
drivers/thermal/Kconfig config DB8500_THERMAL · line 304
Quoted 3 lines
drivers/thermal/Kconfig +1
-1config ARMADA_THERMAL - tristate "Armada 370/XP thermal management" + tristate "Armada 370/XP/7K/8K thermal management"if you want to be exhaustive you should also add Armada 375 and 38x.
That is right, both are missing from the description, but wouldn't it be better to just state "Armada SoCs" instead of patching that file everythime a new SoC reuses this IP?
Thanks,
Miqu?l
PATCH v3 7/11 thermal: armada: Update Kconfig and module description
Hi Miquel,
Quoted 27 lines · Miquel RAYNAL
Hi Gregory,
Quoted 22 lines · On Thu, 14 Dec 2017 12:13:51 +0100 Gregory CLEMENT…
Hi Miquel,
Quoted 17 lines · Miquel Raynal
Update Armada thermal driver
Kconfigentry as well as the driver'sMODULE_DESCRIPTIONcontent, now that 64-bit SoCs are also supported, eg. Armada 7K and Armada 8K.Signed-off-by Miquel Raynal <[email protected]>--- drivers/thermal/Kconfig | 4 ++-- drivers/thermal/armada_thermal.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)drivers/thermal/Kconfig +0
-0@@ -301,13 +301,13 @@ config DB8500_THERMAL thermal zone if trip points reached.
Quoted 8 lines
Quoted 4 lines
drivers/thermal/Kconfig config DB8500_THERMAL · line 304
Quoted 3 lines
drivers/thermal/Kconfig +1
-1config ARMADA_THERMAL - tristate "Armada 370/XP thermal management" + tristate "Armada 370/XP/7K/8K thermal management"if you want to be exhaustive you should also add Armada 375 and 38x.
That is right, both are missing from the description, but wouldn't it be better to just state "Armada SoCs" instead of patching that file everythime a new SoC reuses this IP?
Unfortunately Armada SoCs is more that just these SoC!
Have a look on Documentation/arm/Marvell/README to see how the Marvell marketing guys had been creative :)
Some kirkwood are called Armada 300 and Armada 310.
The Dove is also called Armada 510.
Some PXA are called Armada too such as Armada 168 or Armada 610. And finally the Berlin also use Aramda as code name: Armada 1000 or Aramda 1500
Gregory
Quoted 4 lines
Thanks,
Miqu?l
Signature · 4 lines
Gregory Clement, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com
PATCH v3 7/11 thermal: armada: Update Kconfig and module description
Hi Gregory,
Quoted 44 lines · On Thu, 14 Dec 2017 12:30:08 +0100 Gregory CLEMENT…
Hi Miquel,
Quoted 33 lines · Miquel RAYNAL
Hi Gregory,
Quoted 22 lines · On Thu, 14 Dec 2017 12:13:51 +0100 Gregory CLEMENT…
Hi Miquel,
Quoted 17 lines · Miquel Raynal
Update Armada thermal driver
Kconfigentry as well as the driver'sMODULE_DESCRIPTIONcontent, now that 64-bit SoCs are also supported, eg. Armada 7K and Armada 8K.Signed-off-by Miquel Raynal <[email protected]>--- drivers/thermal/Kconfig | 4 ++-- drivers/thermal/armada_thermal.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)drivers/thermal/Kconfig +0
-0@@ -301,13 +301,13 @@ config DB8500_THERMAL thermal zone if trip points reached.Quoted 5 lines
drivers/thermal/Kconfig config DB8500_THERMAL · line 304
Quoted 3 lines
drivers/thermal/Kconfig +1
-1config ARMADA_THERMAL - tristate "Armada 370/XP thermal management" + tristate "Armada 370/XP/7K/8K thermal management"if you want to be exhaustive you should also add Armada 375 and 38x.
Quoted 3 lines
That is right, both are missing from the description, but wouldn't it be better to just state "Armada SoCs" instead of patching that file everythime a new SoC reuses this IP?
Unfortunately Armada SoCs is more that just these SoC!
Quoted 8 lines
Have a look on
Documentation/arm/Marvell/READMEto see how the Marvell marketing guys had been creative :)Some kirkwood are called Armada 300 and Armada 310.
The Dove is also called Armada 510.
Some PXA are called Armada too such as Armada 168 or Armada 610. And finally the Berlin also use Aramda as code name: Armada 1000 or Aramda 1500
Ehr...
Ok, I'll stick to "Armada 37x/38x/XP/7K/8K SoCs".
Miqu?l
PATCH v3 7/11 thermal: armada: Update Kconfig and module description
In reply to Gregory CLEMENTHello,
Quoted 10 lines · Gregory CLEMENT
Unfortunately Armada SoCs is more that just these SoC!
Have a look on
Documentation/arm/Marvell/READMEto see how the Marvell marketing guys had been creative :)Some kirkwood are called Armada 300 and Armada 310.
The Dove is also called Armada 510.
Some PXA are called Armada too such as Armada 168 or Armada 610. And finally the Berlin also use Aramda as code name: Armada 1000 or Aramda 1500
However: "Marvell EBU Armada" should be distinctive enough.
Thomas
Signature · 3 lines
Thomas Petazzoni, CTO, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com
PATCH v3 8/11 thermal: armada: Change sensors trim default value
In reply to Miquel RaynalErrata #132698 highlights an error in the default value of Tc trim. Set this parameter to b'011.
--- drivers/thermal/armada_thermal.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
drivers/thermal/armada_thermal.c +13 -0
@@ -46,6 +46,10 @@#define CONTROL0_OFFSET 0x0#define CONTROL1_OFFSET 0x4 +/* Errata fields */ +#define CONTROL0_TSEN_TC_TRIM_MASK 0x7 +#define CONTROL0_TSEN_TC_TRIM_VAL 0x3 +/* TSEN refers to the temperature sensors within the AP */ #define CONTROL0_TSEN_START BIT(0)#define CONTROL0_TSEN_RESET BIT(1)
@@ -160,6 +164,15 @@ static void armada380_init_sensor(struct platform_device *pdev, reg &= ~CONTROL1_EXT_TSEN_SW_RESET ;writel (reg, priv->control1);msleep (10 ); + +/* Set Tsen Tc Trim to correct default value (errata #132698) */ +if (priv->control0) { + reg =readl_relaxed (priv->control0); + reg &= ~CONTROL0_TSEN_TC_TRIM_MASK ; + reg |=CONTROL0_TSEN_TC_TRIM_VAL ; +writel (reg, priv->control0); +msleep (10 ); + } } static void armada_ap806_init_sensor(struct platform_device *pdev,
Signature · 1 line
2.11.0
PATCH v3 9/11 thermal: armada: Wait sensors validity before exiting the init callback
In reply to Miquel RaynalThe thermal core will check for sensors validity right after the initialization callback has returned. As the initialization routine make a reset, the sensors are not ready immediately and the core spawns an error in the dmesg. Avoid this annoying situation by polling on the validity bit before exiting from these routines. This also avoid the use of blind sleeps.
--- drivers/thermal/armada_thermal.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-)
drivers/thermal/armada_thermal.c +20 -3
@@ -23,6 +23,7 @@#include <linux/platform_device.h> #include <linux/of_device.h> #include <linux/thermal.h> +#include <linux/iopoll.h> /* Thermal Manager Control and Status Register */ #define PMU_TDC0_SW_RST_MASK (0x1 << 1)
@@ -59,6 +60,9 @@#define CONTROL1_EXT_TSEN_SW_RESET BIT(7)#define CONTROL1_EXT_TSEN_HW_RESETn BIT(8) +#define STATUS_POLL_PERIOD_US 1000 +#define STATUS_POLL_TIMEOUT_US 100000 +struct armada_thermal_data ;/* Marvell EBU Thermal Sensor Dev Structure */
@@ -154,6 +158,16 @@ static void armada375_init_sensor(struct platform_device *pdev,msleep (50 ); } +static void armada_wait_sensor_validity (struct armada_thermal_priv *priv) +{ +u32 reg; + +readl_relaxed_poll_timeout (priv->status, reg, + reg & priv->data->is_valid_bit, +STATUS_POLL_PERIOD_US , +STATUS_POLL_TIMEOUT_US ); +} +static void armada380_init_sensor (struct platform_device *pdev,struct armada_thermal_priv *priv) {
@@ -163,7 +177,6 @@ static void armada380_init_sensor(struct platform_device *pdev, reg |= CONTROL1_EXT_TSEN_HW_RESETn; reg &= ~CONTROL1_EXT_TSEN_SW_RESET ;writel (reg, priv->control1); -msleep (10 );/* Set Tsen Tc Trim to correct default value (errata #132698) */ if (priv->control0) {
@@ -171,8 +184,10 @@ static void armada380_init_sensor(struct platform_device *pdev, reg &= ~CONTROL0_TSEN_TC_TRIM_MASK ; reg |=CONTROL0_TSEN_TC_TRIM_VAL ;writel (reg, priv->control0); -msleep (10 ); } + +/* Wait the sensors to be valid or the core will warn the user */ +armada_wait_sensor_validity (priv); } static void armada_ap806_init_sensor(struct platform_device *pdev,
@@ -190,7 +205,9 @@ static void armada_ap806_init_sensor(struct platform_device *pdev, reg &= ~CONTROL0_TSEN_RESET ; reg |=CONTROL0_TSEN_START |CONTROL0_TSEN_ENABLE ;writel (reg, priv->control0); -msleep (10 ); + +/* Wait the sensors to be valid or the core will warn the user */ +armada_wait_sensor_validity (priv); }static bool armada_is_valid (struct armada_thermal_priv *priv)
Signature · 1 line
2.11.0
PATCH v3 9/11 thermal: armada: Wait sensors validity before exiting the init callback
Hi Miquel,
Quoted 6 lines · Miquel Raynal
The thermal core will check for sensors validity right after the initialization callback has returned. As the initialization routine make a reset, the sensors are not ready immediately and the core spawns an error in the dmesg. Avoid this annoying situation by polling on the validity bit before exiting from these routines. This also avoid the use of blind sleeps.
You only modified the armada 380 and ap806 init function. Does it means that this feature is not supported on the other variant?
Gregory
Quoted 85 lines
Suggested-by David Sniatkiwicz <[email protected]>Signed-off-by Miquel Raynal <[email protected]>--- drivers/thermal/armada_thermal.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-)drivers/thermal/armada_thermal.c +20
-3@@ -23,6 +23,7 @@#include <linux/platform_device.h> #include <linux/of_device.h> #include <linux/thermal.h> +#include <linux/iopoll.h> /* Thermal Manager Control and Status Register */ #define PMU_TDC0_SW_RST_MASK (0x1 << 1)@@ -59,6 +60,9 @@#define CONTROL1_EXT_TSEN_SW_RESET BIT(7)#define CONTROL1_EXT_TSEN_HW_RESETn BIT(8) +#define STATUS_POLL_PERIOD_US 1000 +#define STATUS_POLL_TIMEOUT_US 100000 +struct armada_thermal_data ;/* Marvell EBU Thermal Sensor Dev Structure */ @@ -154,6 +158,16 @@ static void armada375_init_sensor(struct platform_device *pdev,msleep (50 ); } +static void armada_wait_sensor_validity (struct armada_thermal_priv *priv) +{ +u32 reg; + +readl_relaxed_poll_timeout (priv->status, reg, + reg & priv->data->is_valid_bit, +STATUS_POLL_PERIOD_US , +STATUS_POLL_TIMEOUT_US ); +} +static void armada380_init_sensor (struct platform_device *pdev,struct armada_thermal_priv *priv) {@@ -163,7 +177,6 @@ static void armada380_init_sensor(struct platform_device *pdev, reg |= CONTROL1_EXT_TSEN_HW_RESETn; reg &= ~CONTROL1_EXT_TSEN_SW_RESET ;writel (reg, priv->control1); -msleep (10 );/* Set Tsen Tc Trim to correct default value (errata #132698) */ if (priv->control0) {@@ -171,8 +184,10 @@ static void armada380_init_sensor(struct platform_device *pdev, reg &= ~CONTROL0_TSEN_TC_TRIM_MASK ; reg |=CONTROL0_TSEN_TC_TRIM_VAL ;writel (reg, priv->control0); -msleep (10 ); } + +/* Wait the sensors to be valid or the core will warn the user */ +armada_wait_sensor_validity (priv); } static void armada_ap806_init_sensor(struct platform_device *pdev,@@ -190,7 +205,9 @@ static void armada_ap806_init_sensor(struct platform_device *pdev, reg &= ~CONTROL0_TSEN_RESET ; reg |=CONTROL0_TSEN_START |CONTROL0_TSEN_ENABLE ;writel (reg, priv->control0); -msleep (10 ); + +/* Wait the sensors to be valid or the core will warn the user */ +armada_wait_sensor_validity (priv); }static bool armada_is_valid (struct armada_thermal_priv *priv)Signature · 7 lines
2.11.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel at lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Signature · 4 lines
Gregory Clement, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com
PATCH v3 9/11 thermal: armada: Wait sensors validity before exiting the init callback
Quoted 12 lines · On Thu, 14 Dec 2017 12:23:11 +0100 Gregory CLEMENT…
Hi Miquel,
Quoted 6 lines · Miquel Raynal
The thermal core will check for sensors validity right after the initialization callback has returned. As the initialization routine make a reset, the sensors are not ready immediately and the core spawns an error in the dmesg. Avoid this annoying situation by polling on the validity bit before exiting from these routines. This also avoid the use of blind sleeps.
Quoted 2 lines
You only modified the armada 380 and ap806 init function. Does it means that this feature is not supported on the other variant?
I can't tell for other boards, It does not seem they actually need it so I did not hacked their init callback. Should I? IMOH, if there is not problem, there is no fix to add neither.
Miqu?l
PATCH v3 10/11 thermal: armada: Give useful names to the thermal zone
In reply to Miquel RaynalAfter registration to the thermal core, sysfs will make one entry per instance of the driver in /sys/class/thermal_zoneX and /sys/class/hwmon/hwmonX, X being the index of the instance, all of them having the type/name "armada_thermal".
Until now there was only one thermal zone per SoC but SoCs like Armada A7K and Armada A8K have respectively two and three thermal zones (one per AP and one per CP) and this number is subject to grow in the future.
Because there is no easy way to name them effectively, use the new DT property "marvell,thermal-zone-name" if it is available.
--- drivers/thermal/armada_thermal.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
drivers/thermal/armada_thermal.c +10 -2
@@ -357,6 +357,8 @@ MODULE_DEVICE_TABLE(of, armada_thermal_id_table);static int armada_thermal_probe (struct platform_device *pdev) { +struct device_node *np = pdev->dev.of_node; +const char *zone_name ="armada_thermal" ;void __iomem *control =NULL ;struct thermal_zone_device *thermal;const struct of_device_id *match;
@@ -398,8 +400,14 @@ static int armada_thermal_probe(struct platform_device *pdev) priv->data = (struct armada_thermal_data *)match->data; priv->data->init_sensor (pdev, priv); - thermal =thermal_zone_device_register ("armada_thermal" ,0 ,0 , - priv, &ops,NULL ,0 ,0 ); +/* +* Some platforms use several instances of this driver without any way +* to identify them. Use a new property to gave the thermal zone name a +* valid meaning (used by hwmon too). +*/ +of_property_read_string (np,"marvell,thermal-zone-name" , &zone_name); + thermal =thermal_zone_device_register (zone_name,0 ,0 , priv, &ops, +NULL ,0 ,0 );if (IS_ERR (thermal)) {dev_err (&pdev->dev,"Failed to register thermal zone device\n" );
Signature · 1 line
2.11.0
PATCH v3 11/11 ARM64: dts: marvell: Add thermal support for A7K/A8K
In reply to Miquel RaynalAdd thermal DT nodes in AP806 and CP110 master/slave DTSI files.
--- arch/arm64/boot/dts/marvell/armada-ap806.dtsi | 7 +++++++ arch/arm64/boot/dts/marvell/armada-cp110-master.dtsi | 7 +++++++ arch/arm64/boot/dts/marvell/armada-cp110-slave.dtsi | 7 +++++++ 3 files changed, 21 insertions(+)
arch/arm64/boot/dts/marvell/armada-ap806.dtsi +7 -0
@@ -285,6 +285,13 @@ gpio-ranges = <&ap_pinctrl 0 0 20>; }; }; + + ap_thermal: thermal at 6f808C { + compatible = "marvell,armada-ap806-thermal"; + reg = <0x6f808C 0x4>, + <0x6f8084 0x8>; + marvell,thermal-zone-name = "ap_thermal_zone"; + }; }; }; };
arch/arm64/boot/dts/marvell/armada-cp110-master.dtsi +7 -0
@@ -182,6 +182,13 @@ interrupts = <ICU_GRP_NSR 77 IRQ_TYPE_LEVEL_HIGH>; }; + cpm_thermal: thermal at 400078 { + compatible = "marvell,armada-cp110-thermal"; + reg = <0x400078 0x4>, + <0x400070 0x8>; + marvell,thermal-zone-name = "cp0_thermal_zone"; + }; + cpm_syscon0: system-controller at 440000 { compatible = "syscon", "simple-mfd"; reg = <0x440000 0x2000>;
arch/arm64/boot/dts/marvell/armada-cp110-slave.dtsi +7 -0
@@ -182,6 +182,13 @@ interrupts = <ICU_GRP_NSR 77 IRQ_TYPE_LEVEL_HIGH>; }; + cps_thermal: thermal at 400078 { + compatible = "marvell,armada-cp110-thermal"; + reg = <0x400078 0x4>, + <0x400070 0x8>; + marvell,thermal-zone-name = "cp1_thermal_zone"; + }; + cps_syscon0: system-controller at 440000 { compatible = "syscon", "simple-mfd"; reg = <0x440000 0x2000>;
Signature · 1 line
2.11.0