add thermal throttling to Allwinner A33 SoC
Subsystems (5)
v2 cover add thermal throttling to Allwinner A33 SoC
The Allwinner SoCs all have an ADC that can also act as a touchscreen controller and a thermal sensor. The first four channels can be used either for the ADC or the touchscreen and the fifth channel is used for the thermal sensor. We currently have a driver for the two latter functions in drivers/input/touchscreen/sun4i-ts.c but we don't have access to the ADC feature at all. It is meant to replace the current driver by using MFD and subdrivers for existing bindings.
The Allwinner A33 only has a thermal sensor present in the GPADC. In addition, there is not an existing DT binding for the GPADC. Thus, we do not need the sun4i-gpadc MFD driver which was made to keep DT compatibility and probe subdrivers without the need to add DT subnodes.
This series of patch adds the thermal sensor for the A33 and GPU/CPU thermal throttling. It also adds the cpu-supply property to the CPU node needed by the Sinlinx SinA33 and Olinuxino A33 to adapt their CPU regulator voltage depending on the currently used OPP. The other A33 boards all have their cpu-supply property set.
This series also fixes the missing operating-points-v2 property in cpu DT nodes. Finally, it also adds all remaining OPPs which can be found in Allwinner 3.4 linux and fex files of all A33 boards.
This patch *HAS NOT* been tested on the Olinuxino A33.
@Stefan (or anyone owning an Olinuxino A33), could you test this patch series on your board, test CPUfreq and tell us if it works in a stable manner? Thanks!
This series of patch is based on this[1] series of patch.
[1] https://lkml.org/lkml/2016/12/13/298 : "[PATCH v9] add support for Allwinner SoCs ADC"
Thanks,
Quentin
Maxime Ripard (1):
ARM: sun8i: a33: Add devfreq-based GPU cooling
Quentin Schulz (10):
ARM: sun8i: a33: add operating-points-v2 property to all nodes
ARM: sun8i: a33: add all operating points
ARM: dts: sun8i: sina33: add cpu-supply
ARM: dts: sun8i: olinuxino: add cpu-supply
Documentation: DT: bindings: mfd: add A33 GPADC binding
Documentation: DT: bindings: input: touschcreen: remove sun4i
documentation
iio: adc: sun4i-gpadc-iio: move code used in MFD probing to new
function
iio: adc: sun4i-gpadc-iio: add support for A33 thermal sensor
ARM: dtsi: sun8i: a33: add thermal sensor
ARM: dtsi: sun8i: a33: add CPU thermal throttling
.../touchscreen/sun4i.txt => mfd/sun4i-gpadc.txt} | 21 +++
arch/arm/boot/dts/sun8i-a23-a33.dtsi | 3 +
arch/arm/boot/dts/sun8i-a33-olinuxino.dts | 4 +
arch/arm/boot/dts/sun8i-a33-sinlinx-sina33.dts | 4 +
arch/arm/boot/dts/sun8i-a33.dtsi | 149 ++++++++++++++++++
drivers/iio/adc/Kconfig | 2 +-
drivers/iio/adc/sun4i-gpadc-iio.c | 170 +++++++++++++++++----
include/linux/mfd/sun4i-gpadc.h | 4 +
8 files changed, 324 insertions(+), 33 deletions(-)
rename Documentation/devicetree/bindings/{input/touchscreen/sun4i.txt => mfd/sun4i-gpadc.txt} (64%)Signature · 1 line
2.9.3
PATCH v2 1/11 ARM: sun8i: a33: add operating-points-v2 property to all nodes
The OPP are declared as shared but no operating points are declared for cpu1, 2 and 3. Thus, the following error happens during the boot:
cpu cpu1: dev_pm_opp_of_get_sharing_cpus: Couldn't find tcpu_dev node.
This patch applies the operating points to each cpu of the A33.
---
added in v2
arch/arm/boot/dts/sun8i-a33.dtsi | 6 ++++++ 1 file changed, 6 insertions(+)
arch/arm/boot/dts/sun8i-a33.dtsi +6 -0
@@ -81,16 +81,22 @@ operating-points-v2 = <&cpu0_opp_table>; }; + cpu at 1 { + operating-points-v2 = <&cpu0_opp_table>; + }; + cpu at 2 { compatible = "arm,cortex-a7"; device_type = "cpu"; reg = <2>; + operating-points-v2 = <&cpu0_opp_table>; }; cpu at 3 { compatible = "arm,cortex-a7"; device_type = "cpu"; reg = <3>; + operating-points-v2 = <&cpu0_opp_table>; }; };
Signature · 1 line
2.9.3
PATCH v2 2/11 ARM: sun8i: a33: add all operating points
In reply to Quentin SchulzThis adds all operating points allowed for the A33 as defined by fex files available at:
https://github.com/linux-sunxi/sunxi-boards/tree/master/sys_config/a33
---
added in v2
arch/arm/boot/dts/sun8i-a33.dtsi | 60 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+)
arch/arm/boot/dts/sun8i-a33.dtsi +60 -0
@@ -49,24 +49,84 @@ compatible = "operating-points-v2"; opp-shared; + opp at 120000000 { + opp-hz = /bits/ 64 <120000000>; + opp-microvolt = <1040000>; + clock-latency-ns = <244144>; /* 8 32k periods */ + }; + + opp at 240000000 { + opp-hz = /bits/ 64 <240000000>; + opp-microvolt = <1040000>; + clock-latency-ns = <244144>; /* 8 32k periods */ + }; + + opp at 312000000 { + opp-hz = /bits/ 64 <312000000>; + opp-microvolt = <1040000>; + clock-latency-ns = <244144>; /* 8 32k periods */ + }; + + opp at 408000000 { + opp-hz = /bits/ 64 <408000000>; + opp-microvolt = <1040000>; + clock-latency-ns = <244144>; /* 8 32k periods */ + }; + + opp at 480000000 { + opp-hz = /bits/ 64 <480000000>; + opp-microvolt = <1040000>; + clock-latency-ns = <244144>; /* 8 32k periods */ + }; + + opp at 504000000 { + opp-hz = /bits/ 64 <504000000>; + opp-microvolt = <1040000>; + clock-latency-ns = <244144>; /* 8 32k periods */ + }; + + opp at 600000000 { + opp-hz = /bits/ 64 <600000000>; + opp-microvolt = <1040000>; + clock-latency-ns = <244144>; /* 8 32k periods */ + }; + opp at 648000000 { opp-hz = /bits/ 64 <648000000>; opp-microvolt = <1040000>; clock-latency-ns = <244144>; /* 8 32k periods */ }; + opp at 720000000 { + opp-hz = /bits/ 64 <720000000>; + opp-microvolt = <1100000>; + clock-latency-ns = <244144>; /* 8 32k periods */ + }; + opp at 816000000 { opp-hz = /bits/ 64 <816000000>; opp-microvolt = <1100000>; clock-latency-ns = <244144>; /* 8 32k periods */ }; + opp at 912000000 { + opp-hz = /bits/ 64 <912000000>; + opp-microvolt = <1200000>; + clock-latency-ns = <244144>; /* 8 32k periods */ + }; + opp at 1008000000 { opp-hz = /bits/ 64 <1008000000>; opp-microvolt = <1200000>; clock-latency-ns = <244144>; /* 8 32k periods */ }; + opp at 1104000000 { + opp-hz = /bits/ 64 <1104000000>; + opp-microvolt = <1320000>; + clock-latency-ns = <244144>; /* 8 32k periods */ + }; + opp at 1200000000 { opp-hz = /bits/ 64 <1200000000>; opp-microvolt = <1320000>;
Signature · 1 line
2.9.3
PATCH v2 3/11 ARM: dts: sun8i: sina33: add cpu-supply
In reply to Quentin SchulzThis adds the cpu-supply DT property to the cpu0 DT node needed by the board to adapt the regulator voltage depending on the currently used OPP.
--- arch/arm/boot/dts/sun8i-a33-sinlinx-sina33.dts | 4 ++++ 1 file changed, 4 insertions(+)
arch/arm/boot/dts/sun8i-a33-sinlinx-sina33.dts +4 -0
@@ -91,6 +91,10 @@ status = "okay"; }; +&cpu0 { + cpu-supply = <®_dcdc3>; +}; + &ehci0 { status = "okay"; };
Signature · 1 line
2.9.3
PATCH v2 4/11 ARM: dts: sun8i: olinuxino: add cpu-supply
In reply to Quentin SchulzThis adds the cpu-supply DT property to the cpu0 DT node needed by the board to adapt the regulator voltage depending on the currently use OPP.
--- arch/arm/boot/dts/sun8i-a33-olinuxino.dts | 4 ++++ 1 file changed, 4 insertions(+)
arch/arm/boot/dts/sun8i-a33-olinuxino.dts +4 -0
@@ -72,6 +72,10 @@ }; }; +&cpu0 { + cpu-supply = <®_dcdc3>; +}; + &ehci0 { status = "okay"; };
Signature · 1 line
2.9.3
PATCH v2 5/11 Documentation: DT: bindings: mfd: add A33 GPADC binding
In reply to Quentin SchulzThis patch adds documentation for the A33 GPADC binding.
---
added in v2
.../devicetree/bindings/mfd/sun4i-gpadc.txt | 59 ++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 Documentation/devicetree/bindings/mfd/sun4i-gpadc.txt
Documentation/devicetree/bindings/mfd/sun4i-gpadc.txt new file +59 -0
@@ -0,0 +1,59 @@ +Allwinner SoCs' GPADC Device Tree bindings +------------------------------------------ +The Allwinner SoCs all have an ADC that can also act as a thermal sensor +and sometimes as a touchscreen controller. + +Required properties: + - compatible: "sun8i-a33-gpadc-iio", + - reg: mmio address range of the chip, + - #thermal-sensor-cells: shall be 0, + - #io-channel-cells: shall be 0, + +Example: + rtp: rtp at 01c25000 { + compatible = "allwinner,sun8i-a33-gpadc-iio"; + reg = <0x01c25000 0x100>; + #thermal-sensor-cells = <0>; + #io-channel-cells = <0>; + }; + +sun4i, sun5i and sun6i SoCs are also supported via the older binding: + +sun4i resistive touchscreen controller +-------------------------------------- + +Required properties: + - compatible: "allwinner,sun4i-a10-ts", "allwinner,sun5i-a13-ts" or + "allwinner,sun6i-a31-ts" + - reg: mmio address range of the chip + - interrupts: interrupt to which the chip is connected + - #thermal-sensor-cells: shall be 0 + +Optional properties: + - allwinner,ts-attached : boolean indicating that an actual touchscreen + is attached to the controller + - allwinner,tp-sensitive-adjust : integer (4 bits) + adjust sensitivity of pen down detection + between 0 (least sensitive) and 15 + (defaults to 15) + - allwinner,filter-type : integer (2 bits) + select median and averaging filter + samples used for median / averaging filter + 0: 4/2 + 1: 5/3 + 2: 8/4 + 3: 16/8 + (defaults to 1) + +Example: + + rtp: rtp at 01c25000 { + compatible = "allwinner,sun4i-a10-ts"; + reg = <0x01c25000 0x100>; + interrupts = <29>; + allwinner,ts-attached; + #thermal-sensor-cells = <0>; + /* sensitive/noisy touch panel */ + allwinner,tp-sensitive-adjust = <0>; + allwinner,filter-type = <3>; + };
Signature · 1 line
2.9.3
Re: [PATCH v2 05/11] Documentation: DT: bindings: mfd: add A33 GPADC binding
Quoted 17 lines · Quentin Schulz
This patch adds documentation for the A33 GPADC binding.
Signed-off-by Quentin Schulz <[email protected]>---
added in v2
.../devicetree/bindings/mfd/sun4i-gpadc.txt | 59 ++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 Documentation/devicetree/bindings/mfd/sun4i-gpadc.txtDocumentation/devicetree/bindings/mfd/sun4i-gpadc.txt new file +0
-0
Documentation/devicetree/bindings/mfd/sun4i-gpadc.txt line 7
Quoted 7 lines
Documentation/devicetree/bindings/mfd/sun4i-gpadc.txt new file +7
-0@@ -0,0 +1,59 @@ +Allwinner SoCs' GPADC Device Tree bindings +------------------------------------------ +The Allwinner SoCs all have an ADC that can also act as a thermal sensor +and sometimes as a touchscreen controller. + +Required properties: + - compatible: "sun8i-a33-gpadc-iio",
This doesn't match your example, and you shouldn't have IIO in there. Compatibles shouldn't be tied to a given framework, since that is Linux specific (and might even change in the future).
Maxime
Signature · 10 lines
Maxime Ripard, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 801 bytes Desc: not available URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20170310/dcdb3187/attachment.sig>
PATCH v2 5/11 Documentation: DT: bindings: mfd: add A33 GPADC binding
10.03.2017, 20:26, "Maxime Ripard" <[email protected]>:
Quoted 26 lines · Quentin Schulz
Quoted 11 lines
?This patch adds documentation for the A33 GPADC binding.
?Signed-off-by: Quentin Schulz <[email protected]> ?---
?added in v2
??.../devicetree/bindings/mfd/sun4i-gpadc.txt | 59 ++++++++++++++++++++++ ??1 file changed, 59 insertions(+)
??create mode 100644Documentation/devicetree/bindings/mfd/sun4i-gpadc.txtQuoted 13 lines
?diff --git
a/Documentation/devicetree/bindings/mfd/sun4i-gpadc.txtb/Documentation/devicetree/bindings/mfd/sun4i-gpadc.txt?new file mode 100644
?index 0000000..17242c8
?---/dev/null
?+++b/Documentation/devicetree/bindings/mfd/sun4i-gpadc.txt
?@@ -0,0 +1,59 @@
?+Allwinner SoCs' GPADC Device Tree bindings
?+------------------------------------------
?+The Allwinner SoCs all have an ADC that can also act as a thermal sensor
?+and sometimes as a touchscreen controller.
?+
?+Required properties:
?+ - compatible: "sun8i-a33-gpadc-iio",
Quoted 5 lines
This doesn't match your example, and you shouldn't have IIO in there. Compatibles shouldn't be tied to a given framework, since that is Linux specific (and might even change in the future).
From this aspect, I think we shouldn't even call it gpadc in compatible --
as it's not GP at all on A33.
Quoted 13 lines
Maxime
--
Maxime Ripard, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
,_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
PATCH v2 5/11 Documentation: DT: bindings: mfd: add A33 GPADC binding
In reply to Quentin Schulz10.03.2017, 18:56, "Quentin Schulz" <[email protected]>:
Quoted 20 lines
This patch adds documentation for the A33 GPADC binding.
Signed-off-by Quentin Schulz <[email protected]>---
added in v2
?.../devicetree/bindings/mfd/sun4i-gpadc.txt | 59 ++++++++++++++++++++++ ?1 file changed, 59 insertions(+)
?create mode 100644Documentation/devicetree/bindings/mfd/sun4i-gpadc.txtDocumentation/devicetree/bindings/mfd/sun4i-gpadc.txt new file +3
-0@@ -0,0 +1,59 @@ +Allwinner SoCs' GPADC Device Tree bindings +------------------------------------------ +The Allwinner SoCs all have an ADC that can also act as a thermal sensor
Documentation/devicetree/bindings/mfd/sun4i-gpadc.txt line 13
Quoted 10 lines
Documentation/devicetree/bindings/mfd/sun4i-gpadc.txt new file +10
-0+and sometimes as a touchscreen controller. + +Required properties: + - compatible: "sun8i-a33-gpadc-iio", + - reg: mmio address range of the chip, + - #thermal-sensor-cells: shall be 0, + - #io-channel-cells: shall be 0, + +Example: + rtp: rtp at 01c25000 {
I think we'd better call it ths.
And can you make thermal-sensor-cells become 1?
Maxime Ripard wants to base H3/H5/A64 thermal driver on this patchset, and for H5/A64 there's 2/3 thermal sensors.
Thus for A33/H3 we will have thermal-sensor-cells to 1, but only have <&ths 0>.
Quoted 53 lines
Documentation/devicetree/bindings/mfd/sun4i-gpadc.txt new file +46
-1+ compatible = "allwinner,sun8i-a33-gpadc-iio"; + reg = <0x01c25000 0x100>; + #thermal-sensor-cells = <0>; + #io-channel-cells = <0>; + }; + +sun4i, sun5i and sun6i SoCs are also supported via the older binding: + +sun4i resistive touchscreen controller +-------------------------------------- + +Required properties: + - compatible: "allwinner,sun4i-a10-ts", "allwinner,sun5i-a13-ts" or + "allwinner,sun6i-a31-ts" + - reg: mmio address range of the chip + - interrupts: interrupt to which the chip is connected + - #thermal-sensor-cells: shall be 0 + +Optional properties: + - allwinner,ts-attached : boolean indicating that an actual touchscreen + is attached to the controller + - allwinner,tp-sensitive-adjust : integer (4 bits) + adjust sensitivity of pen down detection + between 0 (least sensitive) and 15 + (defaults to 15) + - allwinner,filter-type : integer (2 bits) + select median and averaging filter + samples used for median / averaging filter + 0: 4/2 + 1: 5/3 + 2: 8/4 + 3: 16/8 + (defaults to 1) + +Example: + + rtp: rtp at 01c25000 { + compatible = "allwinner,sun4i-a10-ts"; + reg = <0x01c25000 0x100>; + interrupts = <29>; + allwinner,ts-attached; + #thermal-sensor-cells = <0>; + /* sensitive/noisy touch panel */ + allwinner,tp-sensitive-adjust = <0>; + allwinner,filter-type = <3>; + }; --2.9.3
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Re: [PATCH v2 05/11] Documentation: DT: bindings: mfd: add A33 GPADC binding
Hi Icenowy,
Quoted 27 lines · Icenowy Zheng
10.03.2017, 18:56, "Quentin Schulz" <[email protected]>:
Quoted 24 lines
This patch adds documentation for the A33 GPADC binding.
Signed-off-by Quentin Schulz <[email protected]>---
added in v2
.../devicetree/bindings/mfd/sun4i-gpadc.txt | 59 ++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 Documentation/devicetree/bindings/mfd/sun4i-gpadc.txtDocumentation/devicetree/bindings/mfd/sun4i-gpadc.txt new file +7
-0@@ -0,0 +1,59 @@ +Allwinner SoCs' GPADC Device Tree bindings +------------------------------------------ +The Allwinner SoCs all have an ADC that can also act as a thermal sensor +and sometimes as a touchscreen controller. + +Required properties: + - compatible: "sun8i-a33-gpadc-iio",
Quoted 9 lines
Documentation/devicetree/bindings/mfd/sun4i-gpadc.txt line 13
Quoted 6 lines
Documentation/devicetree/bindings/mfd/sun4i-gpadc.txt new file +6
-0+ - reg: mmio address range of the chip, + - #thermal-sensor-cells: shall be 0, + - #io-channel-cells: shall be 0, + +Example: + rtp: rtp at 01c25000 {I think we'd better call it ths.
To match the datasheet, I agree.
Quoted 5 lines
And can you make thermal-sensor-cells become 1?
Maxime Ripard wants to base H3/H5/A64 thermal driver on this patchset, and for H5/A64 there's 2/3 thermal sensors.
Yes, that'll require a specific DT node for those thermal sensors. Then since we would update the possible compatibles in the documentation anyway, that would be a good idea to update to say that thermal-sensor-cells could be different from 0 too.
That was my mindset to set thermal-sensor-cells to 0, since we only support SoC which has only one thermal sensor at the moment.
Quoted 3 lines
Thus for A33/H3 we will have thermal-sensor-cells to 1, but only have <&ths 0>.
That's non-sense. There is one thermal sensor for the A33, thermal-sensor-cells has to be 0.
I don't mind to remove the requirement for thermal-sensor-cells to be 0 but I won't put a requirement for it to be 1 as it isn't true.
Thanks,
Quentin
Quoted 59 lines
Quoted 49 lines
Documentation/devicetree/bindings/mfd/sun4i-gpadc.txt new file +46
-1+ compatible = "allwinner,sun8i-a33-gpadc-iio"; + reg = <0x01c25000 0x100>; + #thermal-sensor-cells = <0>; + #io-channel-cells = <0>; + }; + +sun4i, sun5i and sun6i SoCs are also supported via the older binding: + +sun4i resistive touchscreen controller +-------------------------------------- + +Required properties: + - compatible: "allwinner,sun4i-a10-ts", "allwinner,sun5i-a13-ts" or + "allwinner,sun6i-a31-ts" + - reg: mmio address range of the chip + - interrupts: interrupt to which the chip is connected + - #thermal-sensor-cells: shall be 0 + +Optional properties: + - allwinner,ts-attached : boolean indicating that an actual touchscreen + is attached to the controller + - allwinner,tp-sensitive-adjust : integer (4 bits) + adjust sensitivity of pen down detection + between 0 (least sensitive) and 15 + (defaults to 15) + - allwinner,filter-type : integer (2 bits) + select median and averaging filter + samples used for median / averaging filter + 0: 4/2 + 1: 5/3 + 2: 8/4 + 3: 16/8 + (defaults to 1) + +Example: + + rtp: rtp at 01c25000 { + compatible = "allwinner,sun4i-a10-ts"; + reg = <0x01c25000 0x100>; + interrupts = <29>; + allwinner,ts-attached; + #thermal-sensor-cells = <0>; + /* sensitive/noisy touch panel */ + allwinner,tp-sensitive-adjust = <0>; + allwinner,filter-type = <3>; + }; --2.9.3
Quoted 4 lines
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Signature · 3 lines
Quentin Schulz, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com
Re: [PATCH v2 05/11] Documentation: DT: bindings: mfd: add A33 GPADC binding
Hi,
Quoted 39 lines · Quentin Schulz
Hi Icenowy,
Quoted 27 lines · Icenowy Zheng
10.03.2017, 18:56, "Quentin Schulz" <[email protected]>:
Quoted 24 lines
This patch adds documentation for the A33 GPADC binding.
Signed-off-by Quentin Schulz <[email protected]>---
added in v2
.../devicetree/bindings/mfd/sun4i-gpadc.txt | 59 ++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 Documentation/devicetree/bindings/mfd/sun4i-gpadc.txtDocumentation/devicetree/bindings/mfd/sun4i-gpadc.txt new file +7
-0@@ -0,0 +1,59 @@ +Allwinner SoCs' GPADC Device Tree bindings +------------------------------------------ +The Allwinner SoCs all have an ADC that can also act as a thermal sensor +and sometimes as a touchscreen controller. + +Required properties: + - compatible: "sun8i-a33-gpadc-iio",Quoted 8 lines
Documentation/devicetree/bindings/mfd/sun4i-gpadc.txt line 13
Quoted 6 lines
Documentation/devicetree/bindings/mfd/sun4i-gpadc.txt new file +6
-0+ - reg: mmio address range of the chip, + - #thermal-sensor-cells: shall be 0, + - #io-channel-cells: shall be 0, + +Example: + rtp: rtp at 01c25000 {I think we'd better call it ths.
Quoted 1 line
To match the datasheet, I agree.
I agree too.
Quoted 5 lines
Quoted 4 lines
And can you make thermal-sensor-cells become 1?
Maxime Ripard wants to base H3/H5/A64 thermal driver on this patchset, and for H5/A64 there's 2/3 thermal sensors.
Quoted 7 lines
Yes, that'll require a specific DT node for those thermal sensors. Then since we would update the possible compatibles in the documentation anyway, that would be a good idea to update to say that thermal-sensor-cells could be different from 0 too.
That was my mindset to set thermal-sensor-cells to 0, since we only support SoC which has only one thermal sensor at the moment.
And I agree here as well.
Maxime
Signature · 10 lines
Maxime Ripard, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 801 bytes Desc: not available URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20170320/e15c6e41/attachment.sig>
PATCH v2 6/11 Documentation: DT: bindings: input: touschcreen: remove sun4i documentation
In reply to Quentin SchulzThis patch removes the sun4i touchscreen controller binding documentation since it has been merged with the sun4i GPADC binding documentation.
---
added in v2
.../bindings/input/touchscreen/sun4i.txt | 38 ---------------------- 1 file changed, 38 deletions(-) delete mode 100644 Documentation/devicetree/bindings/input/touchscreen/sun4i.txt
Documentation/devicetree/bindings/input/touchscreen/sun4i.txt deleted +0 -38
@@ -1,38 +0,0 @@ -sun4i resistive touchscreen controller --------------------------------------- - -Required properties: - - compatible: "allwinner,sun4i-a10-ts", "allwinner,sun5i-a13-ts" or - "allwinner,sun6i-a31-ts" - - reg: mmio address range of the chip - - interrupts: interrupt to which the chip is connected - - #thermal-sensor-cells: shall be 0 - -Optional properties: - - allwinner,ts-attached : boolean indicating that an actual touchscreen - is attached to the controller - - allwinner,tp-sensitive-adjust : integer (4 bits) - adjust sensitivity of pen down detection - between 0 (least sensitive) and 15 - (defaults to 15) - - allwinner,filter-type : integer (2 bits) - select median and averaging filter - samples used for median / averaging filter - 0: 4/2 - 1: 5/3 - 2: 8/4 - 3: 16/8 - (defaults to 1) - -Example: - - rtp: rtp at 01c25000 { - compatible = "allwinner,sun4i-a10-ts"; - reg = <0x01c25000 0x100>; - interrupts = <29>; - allwinner,ts-attached; - #thermal-sensor-cells = <0>; - /* sensitive/noisy touch panel */ - allwinner,tp-sensitive-adjust = <0>; - allwinner,filter-type = <3>; - };
Signature · 1 line
2.9.3
Re: [PATCH v2 06/11] Documentation: DT: bindings: input: touschcreen: remove sun4i documentation
Quoted 4 lines · Quentin Schulz
This patch removes the sun4i touchscreen controller binding documentation since it has been merged with the sun4i GPADC binding documentation.
Quoted 8 lines
Signed-off-by Quentin Schulz <[email protected]>---
added in v2
.../bindings/input/touchscreen/sun4i.txt | 38 ---------------------- 1 file changed, 38 deletions(-) delete mode 100644 Documentation/devicetree/bindings/input/touchscreen/sun4i.txt
PATCH v2 7/11 iio: adc: sun4i-gpadc-iio: move code used in MFD probing to new function
In reply to Quentin SchulzThis moves code used in MFD probing to a new sun4i_gpadc_probe_mfd function.
---
added in v2
drivers/iio/adc/sun4i-gpadc-iio.c | 78 ++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 33 deletions(-)
drivers/iio/adc/sun4i-gpadc-iio.c +45 -33
@@ -454,31 +454,16 @@ static int sun4i_irq_init(struct platform_device *pdev, const char *name,return 0 ; } -static int sun4i_gpadc_probe (struct platform_device *pdev) +static int sun4i_gpadc_probe_mfd (struct platform_device *pdev, +struct iio_dev *indio_dev) { -struct sun4i_gpadc_iio *info; -struct iio_dev *indio_dev; +struct sun4i_gpadc_iio *info =iio_priv (indio_dev); +struct sun4i_gpadc_dev *sun4i_gpadc_dev = +dev_get_drvdata (pdev->dev.parent);int ret; -struct sun4i_gpadc_dev *sun4i_gpadc_dev; - - sun4i_gpadc_dev =dev_get_drvdata (pdev->dev.parent); - - indio_dev =devm_iio_device_alloc (&pdev->dev,sizeof (*info)); -if (!indio_dev) -return -ENOMEM ; - info =iio_priv (indio_dev); -platform_set_drvdata (pdev, indio_dev); - -mutex_init (&info->mutex); info->regmap = sun4i_gpadc_dev->regmap; - info->indio_dev = indio_dev; -init_completion (&info->completion); - indio_dev->name =dev_name (&pdev->dev); - indio_dev->dev.parent = &pdev->dev; - indio_dev->dev.of_node = pdev->dev.of_node; - indio_dev->info = &sun4i_gpadc_iio_info; - indio_dev->modes =INDIO_DIRECT_MODE ; + indio_dev->num_channels =ARRAY_SIZE (sun4i_gpadc_channels); indio_dev->channels = sun4i_gpadc_channels;
@@ -519,8 +504,7 @@ static int sun4i_gpadc_probe(struct platform_device *pdev)dev_err (&pdev->dev,"could not register thermal sensor: %ld\n" ,PTR_ERR (tzd)); - ret =PTR_ERR (tzd); - goto err; +return PTR_ERR (tzd); } }else { indio_dev->num_channels =
@@ -528,36 +512,65 @@ static int sun4i_gpadc_probe(struct platform_device *pdev) indio_dev->channels = sun4i_gpadc_channels_no_temp; } -pm_runtime_set_autosuspend_delay (&pdev->dev, -SUN4I_GPADC_AUTOSUSPEND_DELAY ); -pm_runtime_use_autosuspend (&pdev->dev); -pm_runtime_set_suspended (&pdev->dev); -pm_runtime_enable (&pdev->dev); -if (IS_ENABLED (CONFIG_THERMAL_OF )) { ret =sun4i_irq_init (pdev,"TEMP_DATA_PENDING" , sun4i_gpadc_temp_data_irq_handler,"temp_data" , &info->temp_data_irq, &info->ignore_temp_data_irq);if (ret <0 ) - goto err; +return ret; } ret =sun4i_irq_init (pdev,"FIFO_DATA_PENDING" , sun4i_gpadc_fifo_data_irq_handler,"fifo_data" , &info->fifo_data_irq, &info->ignore_fifo_data_irq);if (ret <0 ) - goto err; +return ret;if (IS_ENABLED (CONFIG_THERMAL_OF )) { ret =iio_map_array_register (indio_dev, sun4i_gpadc_hwmon_maps);if (ret <0 ) {dev_err (&pdev->dev,"failed to register iio map array\n" ); - goto err; +return ret; } } +return 0 ; +} + +static int sun4i_gpadc_probe (struct platform_device *pdev) +{ +struct sun4i_gpadc_iio *info; +struct iio_dev *indio_dev; +int ret; + + indio_dev =devm_iio_device_alloc (&pdev->dev,sizeof (*info)); +if (!indio_dev) +return -ENOMEM ; + + info =iio_priv (indio_dev); +platform_set_drvdata (pdev, indio_dev); + +mutex_init (&info->mutex); + info->indio_dev = indio_dev; +init_completion (&info->completion); + indio_dev->name =dev_name (&pdev->dev); + indio_dev->dev.parent = &pdev->dev; + indio_dev->dev.of_node = pdev->dev.of_node; + indio_dev->info = &sun4i_gpadc_iio_info; + indio_dev->modes =INDIO_DIRECT_MODE ; + + ret =sun4i_gpadc_probe_mfd (pdev, indio_dev); +if (ret) +return ret; + +pm_runtime_set_autosuspend_delay (&pdev->dev, +SUN4I_GPADC_AUTOSUSPEND_DELAY ); +pm_runtime_use_autosuspend (&pdev->dev); +pm_runtime_set_suspended (&pdev->dev); +pm_runtime_enable (&pdev->dev); + ret =devm_iio_device_register (&pdev->dev, indio_dev);if (ret <0 ) {dev_err (&pdev->dev,"could not register the device\n" );
@@ -570,7 +583,6 @@ static int sun4i_gpadc_probe(struct platform_device *pdev)if (IS_ENABLED (CONFIG_THERMAL_OF ))iio_map_array_unregister (indio_dev); -err:pm_runtime_put (&pdev->dev);pm_runtime_disable (&pdev->dev);
Signature · 1 line
2.9.3
PATCH v2 7/11 iio: adc: sun4i-gpadc-iio: move code used in MFD probing to new function
10.03.2017, 18:56, "Quentin Schulz" <[email protected]>:
Quoted 9 lines
This moves code used in MFD probing to a new
sun4i_gpadc_probe_mfdfunction.Signed-off-by Quentin Schulz <[email protected]>---
added in v2
?drivers/iio/adc/sun4i-gpadc-iio.c | 78 ++++++++++++++++++++++-----------------
I cannot find this source file even in linux-next.
Quoted 144 lines
?1 file changed, 45 insertions(+), 33 deletions(-)
drivers/iio/adc/sun4i-gpadc-iio.c +7
-23@@ -454,31 +454,16 @@ static int sun4i_irq_init(struct platform_device *pdev, const char *name, ?????????return 0; ?} -static int sun4i_gpadc_probe (struct platform_device *pdev) +static int sun4i_gpadc_probe_mfd (struct platform_device *pdev, +struct iio_dev *indio_dev) ?{ -struct sun4i_gpadc_iio *info; -struct iio_dev *indio_dev; +struct sun4i_gpadc_iio *info =iio_priv (indio_dev); +struct sun4i_gpadc_dev *sun4i_gpadc_dev = +dev_get_drvdata (pdev->dev.parent); ?????????int ret; -struct sun4i_gpadc_dev *sun4i_gpadc_dev; - - sun4i_gpadc_dev =dev_get_drvdata (pdev->dev.parent); - - indio_dev =devm_iio_device_alloc (&pdev->dev,sizeof (*info)); -if (!indio_dev) -return -ENOMEM ; - info =iio_priv (indio_dev); -platform_set_drvdata (pdev, indio_dev); - -mutex_init (&info->mutex); ?????????info->regmap = sun4i_gpadc_dev->regmap; - info->indio_dev = indio_dev; -init_completion (&info->completion); - indio_dev->name =dev_name (&pdev->dev); - indio_dev->dev.parent = &pdev->dev; - indio_dev->dev.of_node = pdev->dev.of_node; - indio_dev->info = &sun4i_gpadc_iio_info; - indio_dev->modes =INDIO_DIRECT_MODE ; + ?????????indio_dev->num_channels = ARRAY_SIZE(sun4i_gpadc_channels); ?????????indio_dev->channels = sun4i_gpadc_channels;@@ -519,8 +504,7 @@ static int sun4i_gpadc_probe(struct platform_device *pdev) ?????????????????????????dev_err(&pdev->dev, ?????????????????????????????????"could not register thermal sensor: %ld\n", ?????????????????????????????????PTR_ERR(tzd)); - ret =PTR_ERR (tzd); - goto err; +return PTR_ERR (tzd); ?????????????????} ?????????} else {?????????????????indio_dev->num_channels =
drivers/iio/adc/sun4i-gpadc-iio.c +38
-11@@ -528,36 +512,65 @@ static int sun4i_gpadc_probe(struct platform_device *pdev) ?????????????????indio_dev->channels = sun4i_gpadc_channels_no_temp; ?????????} -pm_runtime_set_autosuspend_delay (&pdev->dev, -SUN4I_GPADC_AUTOSUSPEND_DELAY ); -pm_runtime_use_autosuspend (&pdev->dev); -pm_runtime_set_suspended (&pdev->dev); -pm_runtime_enable (&pdev->dev); - ?????????if (IS_ENABLED(CONFIG_THERMAL_OF)) { ?????????????????ret = sun4i_irq_init(pdev, "TEMP_DATA_PENDING", ??????????????????????????????????????sun4i_gpadc_temp_data_irq_handler, ??????????????????????????????????????"temp_data", &info->temp_data_irq, ??????????????????????????????????????&info->ignore_temp_data_irq); ?????????????????if (ret < 0) - goto err; +return ret; ?????????} ?????????ret = sun4i_irq_init(pdev, "FIFO_DATA_PENDING", ??????????????????????????????sun4i_gpadc_fifo_data_irq_handler, "fifo_data", ??????????????????????????????&info->fifo_data_irq, &info->ignore_fifo_data_irq); ?????????if (ret < 0) - goto err; +return ret; ?????????if (IS_ENABLED(CONFIG_THERMAL_OF)) { ?????????????????ret = iio_map_array_register(indio_dev, sun4i_gpadc_hwmon_maps); ?????????????????if (ret < 0) { ?????????????????????????dev_err(&pdev->dev, ?????????????????????????????????"failed to register iio map array\n"); - goto err; +return ret; ?????????????????} ?????????} +return 0 ; +} + +static int sun4i_gpadc_probe (struct platform_device *pdev) +{ +struct sun4i_gpadc_iio *info; +struct iio_dev *indio_dev; +int ret; + + indio_dev =devm_iio_device_alloc (&pdev->dev,sizeof (*info)); +if (!indio_dev) +return -ENOMEM ; + + info =iio_priv (indio_dev); +platform_set_drvdata (pdev, indio_dev); + +mutex_init (&info->mutex); + info->indio_dev = indio_dev; +init_completion (&info->completion); + indio_dev->name =dev_name (&pdev->dev); + indio_dev->dev.parent = &pdev->dev; + indio_dev->dev.of_node = pdev->dev.of_node; + indio_dev->info = &sun4i_gpadc_iio_info; + indio_dev->modes =INDIO_DIRECT_MODE ; + + ret =sun4i_gpadc_probe_mfd (pdev, indio_dev); +if (ret) +return ret; + +pm_runtime_set_autosuspend_delay (&pdev->dev, +SUN4I_GPADC_AUTOSUSPEND_DELAY ); +pm_runtime_use_autosuspend (&pdev->dev); +pm_runtime_set_suspended (&pdev->dev); +pm_runtime_enable (&pdev->dev); + ?????????ret = devm_iio_device_register(&pdev->dev, indio_dev); ?????????if (ret < 0) { ?????????????????dev_err(&pdev->dev, "could not register the device\n");@@ -570,7 +583,6 @@ static int sun4i_gpadc_probe(struct platform_device *pdev) ?????????if (IS_ENABLED(CONFIG_THERMAL_OF)) ?????????????????iio_map_array_unregister(indio_dev); -err: ?????????pm_runtime_put(&pdev->dev); ?????????pm_runtime_disable(&pdev->dev); --2.9.3
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Re: [PATCH v2 07/11] iio: adc: sun4i-gpadc-iio: move code used in MFD probing to new function
Hi Icenowy,
Quoted 9 lines · Icenowy Zheng
10.03.2017, 18:56, "Quentin Schulz" <[email protected]>:
Quoted 6 lines
This moves code used in MFD probing to a new
sun4i_gpadc_probe_mfdfunction.Signed-off-by Quentin Schulz <[email protected]>---
Quoted 8 lines
Quoted 3 lines
added in v2
drivers/iio/adc/sun4i-gpadc-iio.c | 78 ++++++++++++++++++++++-----------------I cannot find this source file even in linux-next.
From the cover letter:
This series of patch is based on this[1] series of patch.
[1] https://lkml.org/lkml/2016/12/13/298 : "[PATCH v9] add support for Allwinner SoCs ADC"
Quentin
Quoted 145 lines
Quoted 144 lines
1 file changed, 45 insertions(+), 33 deletions(-)drivers/iio/adc/sun4i-gpadc-iio.c +45
-34@@ -454,31 +454,16 @@ static int sun4i_irq_init(struct platform_device *pdev, const char *name,return 0 ; } -static int sun4i_gpadc_probe (struct platform_device *pdev) +static int sun4i_gpadc_probe_mfd (struct platform_device *pdev, +struct iio_dev *indio_dev) { -struct sun4i_gpadc_iio *info; -struct iio_dev *indio_dev; +struct sun4i_gpadc_iio *info =iio_priv (indio_dev); +struct sun4i_gpadc_dev *sun4i_gpadc_dev = +dev_get_drvdata (pdev->dev.parent);int ret; -struct sun4i_gpadc_dev *sun4i_gpadc_dev; - - sun4i_gpadc_dev =dev_get_drvdata (pdev->dev.parent); - - indio_dev =devm_iio_device_alloc (&pdev->dev,sizeof (*info)); -if (!indio_dev) -return -ENOMEM ; - info =iio_priv (indio_dev); -platform_set_drvdata (pdev, indio_dev); - -mutex_init (&info->mutex); info->regmap = sun4i_gpadc_dev->regmap; - info->indio_dev = indio_dev; -init_completion (&info->completion); - indio_dev->name =dev_name (&pdev->dev); - indio_dev->dev.parent = &pdev->dev; - indio_dev->dev.of_node = pdev->dev.of_node; - indio_dev->info = &sun4i_gpadc_iio_info; - indio_dev->modes =INDIO_DIRECT_MODE ; + indio_dev->num_channels =ARRAY_SIZE (sun4i_gpadc_channels); indio_dev->channels = sun4i_gpadc_channels;@@ -519,8 +504,7 @@ static int sun4i_gpadc_probe(struct platform_device *pdev)dev_err (&pdev->dev,"could not register thermal sensor: %ld\n" ,PTR_ERR (tzd)); - ret =PTR_ERR (tzd); - goto err; +return PTR_ERR (tzd); } }else { indio_dev->num_channels =@@ -528,36 +512,65 @@ static int sun4i_gpadc_probe(struct platform_device *pdev) indio_dev->channels = sun4i_gpadc_channels_no_temp; } -pm_runtime_set_autosuspend_delay (&pdev->dev, -SUN4I_GPADC_AUTOSUSPEND_DELAY ); -pm_runtime_use_autosuspend (&pdev->dev); -pm_runtime_set_suspended (&pdev->dev); -pm_runtime_enable (&pdev->dev); -if (IS_ENABLED (CONFIG_THERMAL_OF )) { ret =sun4i_irq_init (pdev,"TEMP_DATA_PENDING" , sun4i_gpadc_temp_data_irq_handler,"temp_data" , &info->temp_data_irq, &info->ignore_temp_data_irq);if (ret <0 ) - goto err; +return ret; } ret =sun4i_irq_init (pdev,"FIFO_DATA_PENDING" , sun4i_gpadc_fifo_data_irq_handler,"fifo_data" , &info->fifo_data_irq, &info->ignore_fifo_data_irq);if (ret <0 ) - goto err; +return ret;if (IS_ENABLED (CONFIG_THERMAL_OF )) { ret =iio_map_array_register (indio_dev, sun4i_gpadc_hwmon_maps);if (ret <0 ) {dev_err (&pdev->dev,"failed to register iio map array\n" ); - goto err; +return ret; } } +return 0 ; +} + +static int sun4i_gpadc_probe (struct platform_device *pdev) +{ +struct sun4i_gpadc_iio *info; +struct iio_dev *indio_dev; +int ret; + + indio_dev =devm_iio_device_alloc (&pdev->dev,sizeof (*info)); +if (!indio_dev) +return -ENOMEM ; + + info =iio_priv (indio_dev); +platform_set_drvdata (pdev, indio_dev); + +mutex_init (&info->mutex); + info->indio_dev = indio_dev; +init_completion (&info->completion); + indio_dev->name =dev_name (&pdev->dev); + indio_dev->dev.parent = &pdev->dev; + indio_dev->dev.of_node = pdev->dev.of_node; + indio_dev->info = &sun4i_gpadc_iio_info; + indio_dev->modes =INDIO_DIRECT_MODE ; + + ret =sun4i_gpadc_probe_mfd (pdev, indio_dev); +if (ret) +return ret; + +pm_runtime_set_autosuspend_delay (&pdev->dev, +SUN4I_GPADC_AUTOSUSPEND_DELAY ); +pm_runtime_use_autosuspend (&pdev->dev); +pm_runtime_set_suspended (&pdev->dev); +pm_runtime_enable (&pdev->dev); + ret =devm_iio_device_register (&pdev->dev, indio_dev);if (ret <0 ) {dev_err (&pdev->dev,"could not register the device\n" );@@ -570,7 +583,6 @@ static int sun4i_gpadc_probe(struct platform_device *pdev)if (IS_ENABLED (CONFIG_THERMAL_OF ))iio_map_array_unregister (indio_dev); -err:pm_runtime_put (&pdev->dev);pm_runtime_disable (&pdev->dev); --2.9.3
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Signature · 3 lines
Quentin Schulz, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com
Re: [PATCH v2 07/11] iio: adc: sun4i-gpadc-iio: move code used in MFD probing to new function
In reply to Quentin SchulzQuoted 4 lines · Quentin Schulz
This moves code used in MFD probing to a new
sun4i_gpadc_probe_mfdfunction.Signed-off-by Quentin Schulz <[email protected]>
Looks sane to me - though a hint on why in the explanation wouldn't go amiss!
We'll have to figure out the path for this series at somepoint. In meantime
Quoted 143 lines
---
added in v2
drivers/iio/adc/sun4i-gpadc-iio.c | 78 ++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 33 deletions(-)drivers/iio/adc/sun4i-gpadc-iio.c +45
-33@@ -454,31 +454,16 @@ static int sun4i_irq_init(struct platform_device *pdev, const char *name,return 0 ; } -static int sun4i_gpadc_probe (struct platform_device *pdev) +static int sun4i_gpadc_probe_mfd (struct platform_device *pdev, +struct iio_dev *indio_dev) { -struct sun4i_gpadc_iio *info; -struct iio_dev *indio_dev; +struct sun4i_gpadc_iio *info =iio_priv (indio_dev); +struct sun4i_gpadc_dev *sun4i_gpadc_dev = +dev_get_drvdata (pdev->dev.parent);int ret; -struct sun4i_gpadc_dev *sun4i_gpadc_dev; - - sun4i_gpadc_dev =dev_get_drvdata (pdev->dev.parent); - - indio_dev =devm_iio_device_alloc (&pdev->dev,sizeof (*info)); -if (!indio_dev) -return -ENOMEM ; - info =iio_priv (indio_dev); -platform_set_drvdata (pdev, indio_dev); - -mutex_init (&info->mutex); info->regmap = sun4i_gpadc_dev->regmap; - info->indio_dev = indio_dev; -init_completion (&info->completion); - indio_dev->name =dev_name (&pdev->dev); - indio_dev->dev.parent = &pdev->dev; - indio_dev->dev.of_node = pdev->dev.of_node; - indio_dev->info = &sun4i_gpadc_iio_info; - indio_dev->modes =INDIO_DIRECT_MODE ; + indio_dev->num_channels =ARRAY_SIZE (sun4i_gpadc_channels); indio_dev->channels = sun4i_gpadc_channels;@@ -519,8 +504,7 @@ static int sun4i_gpadc_probe(struct platform_device *pdev)dev_err (&pdev->dev,"could not register thermal sensor: %ld\n" ,PTR_ERR (tzd)); - ret =PTR_ERR (tzd); - goto err; +return PTR_ERR (tzd); } }else { indio_dev->num_channels =@@ -528,36 +512,65 @@ static int sun4i_gpadc_probe(struct platform_device *pdev) indio_dev->channels = sun4i_gpadc_channels_no_temp; } -pm_runtime_set_autosuspend_delay (&pdev->dev, -SUN4I_GPADC_AUTOSUSPEND_DELAY ); -pm_runtime_use_autosuspend (&pdev->dev); -pm_runtime_set_suspended (&pdev->dev); -pm_runtime_enable (&pdev->dev); -if (IS_ENABLED (CONFIG_THERMAL_OF )) { ret =sun4i_irq_init (pdev,"TEMP_DATA_PENDING" , sun4i_gpadc_temp_data_irq_handler,"temp_data" , &info->temp_data_irq, &info->ignore_temp_data_irq);if (ret <0 ) - goto err; +return ret; } ret =sun4i_irq_init (pdev,"FIFO_DATA_PENDING" , sun4i_gpadc_fifo_data_irq_handler,"fifo_data" , &info->fifo_data_irq, &info->ignore_fifo_data_irq);if (ret <0 ) - goto err; +return ret;if (IS_ENABLED (CONFIG_THERMAL_OF )) { ret =iio_map_array_register (indio_dev, sun4i_gpadc_hwmon_maps);if (ret <0 ) {dev_err (&pdev->dev,"failed to register iio map array\n" ); - goto err; +return ret; } } +return 0 ; +} + +static int sun4i_gpadc_probe (struct platform_device *pdev) +{ +struct sun4i_gpadc_iio *info; +struct iio_dev *indio_dev; +int ret; + + indio_dev =devm_iio_device_alloc (&pdev->dev,sizeof (*info)); +if (!indio_dev) +return -ENOMEM ; + + info =iio_priv (indio_dev); +platform_set_drvdata (pdev, indio_dev); + +mutex_init (&info->mutex); + info->indio_dev = indio_dev; +init_completion (&info->completion); + indio_dev->name =dev_name (&pdev->dev); + indio_dev->dev.parent = &pdev->dev; + indio_dev->dev.of_node = pdev->dev.of_node; + indio_dev->info = &sun4i_gpadc_iio_info; + indio_dev->modes =INDIO_DIRECT_MODE ; + + ret =sun4i_gpadc_probe_mfd (pdev, indio_dev); +if (ret) +return ret; + +pm_runtime_set_autosuspend_delay (&pdev->dev, +SUN4I_GPADC_AUTOSUSPEND_DELAY ); +pm_runtime_use_autosuspend (&pdev->dev); +pm_runtime_set_suspended (&pdev->dev); +pm_runtime_enable (&pdev->dev); + ret =devm_iio_device_register (&pdev->dev, indio_dev);if (ret <0 ) {dev_err (&pdev->dev,"could not register the device\n" );@@ -570,7 +583,6 @@ static int sun4i_gpadc_probe(struct platform_device *pdev)if (IS_ENABLED (CONFIG_THERMAL_OF ))iio_map_array_unregister (indio_dev); -err:pm_runtime_put (&pdev->dev);pm_runtime_disable (&pdev->dev);
PATCH v2 8/11 iio: adc: sun4i-gpadc-iio: add support for A33 thermal sensor
In reply to Quentin SchulzThis adds support for the Allwinner A33 thermal sensor.
Unlike the A10, A13 and A31, the Allwinner A33 only has one channel which is dedicated to the thermal sensor. Moreover, its thermal sensor does not generate interruptions, thus we only need to directly read the register storing the temperature value.
The MFD used by the A10, A13 and A31, was created to avoid breaking the DT binding, but since the nodes for the ADC weren't there for the A33, it is not needed.
---
v2:
- removed added comments in Kconfig,
- simplified Kconfig depends on condition,
- removed THERMAL_OF requirement for sun8i,
- renamed sun8i_gpadc_channels to sun8i_a33_gpadc_channels,
- renamed use_dt boolean in no_irq as it reflects better why we need it,
- removed spurious/unneeded modifications done in v1,
drivers/iio/adc/Kconfig | 2 +- drivers/iio/adc/sun4i-gpadc-iio.c | 100 ++++++++++++++++++++++++++++++++++++-- include/linux/mfd/sun4i-gpadc.h | 4 ++ 3 files changed, 102 insertions(+), 4 deletions(-)
drivers/iio/adc/Kconfig +1 -1
@@ -562,7 +562,7 @@ config STX104 config SUN4I_GPADC tristate "Support for the Allwinner SoCs GPADC" depends on IIO - depends on MFD_SUN4I_GPADC + depends on MFD_SUN4I_GPADC || MACH_SUN8I help Say yes here to build support for Allwinner (A10, A13 and A31) SoCs GPADC. This ADC provides 4 channels which can be used as an ADC or as
drivers/iio/adc/sun4i-gpadc-iio.c +97 -3
163 lines not on this page · raw message
include/linux/mfd/sun4i-gpadc.h +4 -0
@@ -38,6 +38,10 @@#define SUN6I_GPADC_CTRL1_ADC_CHAN_SELECT (x) (GENMASK(3, 0) & BIT(x))#define SUN6I_GPADC_CTRL1_ADC_CHAN_MASK GENMASK(3, 0) +/* TP_CTRL1 bits for sun8i SoCs */ +#define SUN8I_GPADC_CTRL1_CHOP_TEMP_EN BIT(8) +#define SUN8I_GPADC_CTRL1_GPADC_CALI_EN BIT(7) +#define SUN4I_GPADC_CTRL2 0x08#define SUN4I_GPADC_CTRL2_TP_SENSITIVE_ADJUST (x) ((GENMASK(3, 0) & (x)) << 28)
Signature · 1 line
2.9.3
Jonathan Cameron
maintainerRe: [PATCH v2 08/11] iio: adc: sun4i-gpadc-iio: add support for A33 thermal sensor
Quoted 7 lines · Quentin Schulz
This adds support for the Allwinner A33 thermal sensor.
Unlike the A10, A13 and A31, the Allwinner A33 only has one channel which is dedicated to the thermal sensor. Moreover, its thermal sensor does not generate interruptions, thus we only need to directly read the register storing the temperature value.
Quoted 5 lines
The MFD used by the A10, A13 and A31, was created to avoid breaking the DT binding, but since the nodes for the ADC weren't there for the A33, it is not needed.
Signed-off-by Quentin Schulz <[email protected]>
Talk me through why it makes sense to do this rather than simply spin out a really simple thermal driver for the A33?
I'm not against what you have here, but don't feel it has been fully argued.
Jonathan
Quoted 221 lines
---
v2:
- removed added comments inKconfig,
- simplifiedKconfigdepends on condition,
- removedTHERMAL_OFrequirement for sun8i,
- renamedsun8i_gpadc_channelstosun8i_a33_gpadc_channels,
- renameduse_dtboolean inno_irqas it reflects better why we need it,
- removed spurious/unneeded modifications done in v1,drivers/iio/adc/Kconfig | 2 +- drivers/iio/adc/sun4i-gpadc-iio.c | 100 ++++++++++++++++++++++++++++++++++++-- include/linux/mfd/sun4i-gpadc.h | 4 ++ 3 files changed, 102 insertions(+), 4 deletions(-)drivers/iio/adc/Kconfig +1
-1@@ -562,7 +562,7 @@ config STX104 config SUN4I_GPADC tristate "Support for the Allwinner SoCs GPADC" depends on IIO - depends on MFD_SUN4I_GPADC + depends on MFD_SUN4I_GPADC || MACH_SUN8I help Say yes here to build support for Allwinner (A10, A13 and A31) SoCs GPADC. This ADC provides 4 channels which can be used as an ADC or asdrivers/iio/adc/sun4i-gpadc-iio.c +97
-3@@ -85,6 +85,12 @@ static const struct gpadc_data sun6i_gpadc_data = { .adc_chan_mask = SUN6I_GPADC_CTRL1_ADC_CHAN_MASK, }; +static const struct gpadc_data sun8i_a33_gpadc_data = { + .temp_offset =-1662 , + .temp_scale =162 , + .tp_mode_en =SUN8I_GPADC_CTRL1_CHOP_TEMP_EN , +}; +struct sun4i_gpadc_iio {struct iio_dev *indio_dev;struct completion completion;@@ -96,6 +102,7 @@ struct sun4i_gpadc_iio {unsigned int temp_data_irq;atomic_t ignore_temp_data_irq;const struct gpadc_data *data; +bool no_irq;/* prevents concurrent reads of temperature and ADC */ struct mutex mutex; };@@ -138,6 +145,23 @@ static const struct iio_chan_spec sun4i_gpadc_channels_no_temp[] = { SUN4I_GPADC_ADC_CHANNEL(3, "adc_chan3"), }; +static const struct iio_chan_spec sun8i_a33_gpadc_channels[] = { + { + .type =IIO_TEMP , + .info_mask_separate =BIT (IIO_CHAN_INFO_RAW ) | +BIT (IIO_CHAN_INFO_SCALE ) | +BIT (IIO_CHAN_INFO_OFFSET ), + .datasheet_name ="temp_adc" , + }, +}; + +static const struct regmap_config sun4i_gpadc_regmap_config = { + .reg_bits =32 , + .val_bits =32 , + .reg_stride =4 , + .fast_io = true, +}; +static int sun4i_prepare_for_irq (struct iio_dev *indio_dev,int channel,unsigned int irq) {@@ -247,6 +271,17 @@ static int sun4i_gpadc_temp_read(struct iio_dev *indio_dev, int *val) {struct sun4i_gpadc_iio *info =iio_priv (indio_dev); +if (info->no_irq) { +pm_runtime_get_sync (indio_dev->dev.parent); + +regmap_read (info->regmap,SUN4I_GPADC_TEMP_DATA , val); + +pm_runtime_mark_last_busy (indio_dev->dev.parent); +pm_runtime_put_autosuspend (indio_dev->dev.parent); + +return 0 ; + } +return sun4i_gpadc_read (indio_dev,0 , val, info->temp_data_irq); }@@ -454,6 +489,58 @@ static int sun4i_irq_init(struct platform_device *pdev, const char *name,return 0 ; } +static const struct of_device_id sun4i_gpadc_of_id[] = { + { + .compatible ="allwinner,sun8i-a33-gpadc-iio" , + .data = &sun8i_a33_gpadc_data, + }, + {/* sentinel */ } +}; + +static int sun4i_gpadc_probe_dt (struct platform_device *pdev, +struct iio_dev *indio_dev) +{ +struct sun4i_gpadc_iio *info =iio_priv (indio_dev); +const struct of_device_id *of_dev; +struct thermal_zone_device *tzd; +struct resource *mem; +void __iomem *base; +int ret; + + of_dev =of_match_device (sun4i_gpadc_of_id, &pdev->dev); +if (!of_dev) +return -ENODEV ; + + info->no_irq = true; + info->data = (struct gpadc_data *)of_dev->data; + indio_dev->num_channels =ARRAY_SIZE (sun8i_a33_gpadc_channels); + indio_dev->channels = sun8i_a33_gpadc_channels; + + mem =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); + base =devm_ioremap_resource (&pdev->dev, mem); +if (IS_ERR (base)) +return PTR_ERR (base); + + info->regmap =devm_regmap_init_mmio (&pdev->dev, base, + &sun4i_gpadc_regmap_config); +if (IS_ERR (info->regmap)) { + ret =PTR_ERR (info->regmap); +dev_err (&pdev->dev,"failed to init regmap: %d\n" , ret); +return ret; + } + +if (!IS_ENABLED (THERMAL_OF )) +return 0 ; + + tzd =devm_thermal_zone_of_sensor_register (&pdev->dev,0 , info, + &sun4i_ts_tz_ops); +if (IS_ERR (tzd)) +dev_err (&pdev->dev,"could not register thermal sensor: %ld\n" , +PTR_ERR (tzd)); + +return PTR_ERR_OR_ZERO (tzd); +} +static int sun4i_gpadc_probe_mfd (struct platform_device *pdev,struct iio_dev *indio_dev) {@@ -462,6 +549,7 @@ static int sun4i_gpadc_probe_mfd(struct platform_device *pdev,dev_get_drvdata (pdev->dev.parent);int ret; + info->no_irq = false; info->regmap = sun4i_gpadc_dev->regmap; indio_dev->num_channels =ARRAY_SIZE (sun4i_gpadc_channels);@@ -561,7 +649,11 @@ static int sun4i_gpadc_probe(struct platform_device *pdev) indio_dev->info = &sun4i_gpadc_iio_info; indio_dev->modes =INDIO_DIRECT_MODE ; - ret =sun4i_gpadc_probe_mfd (pdev, indio_dev); +if (pdev->dev.of_node) + ret =sun4i_gpadc_probe_dt (pdev, indio_dev); +else + ret =sun4i_gpadc_probe_mfd (pdev, indio_dev); +if (ret)return ret;@@ -580,7 +672,7 @@ static int sun4i_gpadc_probe(struct platform_device *pdev)return 0 ; err_map: -if (IS_ENABLED (CONFIG_THERMAL_OF )) +if (!info->no_irq &&IS_ENABLED (CONFIG_THERMAL_OF ))iio_map_array_unregister (indio_dev);pm_runtime_put (&pdev->dev);@@ -592,10 +684,11 @@ static int sun4i_gpadc_probe(struct platform_device *pdev)static int sun4i_gpadc_remove (struct platform_device *pdev) {struct iio_dev *indio_dev =platform_get_drvdata (pdev); +struct sun4i_gpadc_iio *info =iio_priv (indio_dev);pm_runtime_put (&pdev->dev);pm_runtime_disable (&pdev->dev); -if (IS_ENABLED (CONFIG_THERMAL_OF )) +if (!info->no_irq &&IS_ENABLED (CONFIG_THERMAL_OF ))iio_map_array_unregister (indio_dev);return 0 ;@@ -611,6 +704,7 @@ static const struct platform_device_id sun4i_gpadc_id[] = {static struct platform_driver sun4i_gpadc_driver = { .driver = { .name ="sun4i-gpadc-iio" , + .of_match_table = sun4i_gpadc_of_id, .pm = &sun4i_gpadc_pm_ops, }, .id_table = sun4i_gpadc_id,include/linux/mfd/sun4i-gpadc.h +4
-0@@ -38,6 +38,10 @@#define SUN6I_GPADC_CTRL1_ADC_CHAN_SELECT (x) (GENMASK(3, 0) & BIT(x))#define SUN6I_GPADC_CTRL1_ADC_CHAN_MASK GENMASK(3, 0) +/* TP_CTRL1 bits for sun8i SoCs */ +#define SUN8I_GPADC_CTRL1_CHOP_TEMP_EN BIT(8) +#define SUN8I_GPADC_CTRL1_GPADC_CALI_EN BIT(7) +#define SUN4I_GPADC_CTRL2 0x08#define SUN4I_GPADC_CTRL2_TP_SENSITIVE_ADJUST (x) ((GENMASK(3, 0) & (x)) << 28)
PATCH v2 8/11 iio: adc: sun4i-gpadc-iio: add support for A33 thermal sensor
14.03.2017, 05:08, "Jonathan Cameron" <[email protected]>:
Quoted 8 lines · Quentin Schulz
Quoted 7 lines
?This adds support for the Allwinner A33 thermal sensor.
?Unlike the A10, A13 and A31, the Allwinner A33 only has one channel ?which is dedicated to the thermal sensor. Moreover, its thermal sensor ?does not generate interruptions, thus we only need to directly read the ?register storing the temperature value.
Quoted 8 lines
Quoted 5 lines
?The MFD used by the A10, A13 and A31, was created to avoid breaking the ?DT binding, but since the nodes for the ADC weren't there for the A33, ?it is not needed.
?Signed-off-by: Quentin Schulz <[email protected]>
Talk me through why it makes sense to do this rather than simply spin out a really simple thermal driver for the A33?
According to him the A33 thermal sensor is a simplified version of the GPADC.
I have already did a simple thermal driver ~8 months ago, but is rejected for this reason.
Quoted 229 lines
I'm not against what you have here, but don't feel it has been fully argued.
Jonathan
Quoted 213 lines
?---
?v2:
???- removed added comments inKconfig,
???- simplifiedKconfigdepends on condition,
???- removedTHERMAL_OFrequirement for sun8i,
???- renamedsun8i_gpadc_channelstosun8i_a33_gpadc_channels, ???- renameduse_dtboolean inno_irqas it reflects better why we need it, ???- removed spurious/unneeded modifications done in v1,??drivers/iio/adc/Kconfig | 2 +- ??drivers/iio/adc/sun4i-gpadc-iio.c | 100 ++++++++++++++++++++++++++++++++++++-- ??include/linux/mfd/sun4i-gpadc.h | 4 ++
??3 files changed, 102 insertions(+), 4 deletions(-)?diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
?index 9f8b4b1..8c8ead6 100644
?--- a/drivers/iio/adc/Kconfig
?+++ b/drivers/iio/adc/Kconfig
?@@ -562,7 +562,7 @@ config STX104
??configSUN4I_GPADC
??????????tristate "Support for the Allwinner SoCs GPADC" ??????????depends on IIO
?- depends onMFD_SUN4I_GPADC
?+ depends onMFD_SUN4I_GPADC||MACH_SUN8I
??????????help
????????????Say yes here to build support for Allwinner (A10, A13 and A31) SoCs ????????????GPADC. This ADC provides 4 channels which can be used as an ADC or as ?diff --gita/drivers/iio/adc/sun4i-gpadc-iio.cb/drivers/iio/adc/sun4i-gpadc-iio.c?index 7cb997a..70684cd 100644
?---a/drivers/iio/adc/sun4i-gpadc-iio.c
?+++b/drivers/iio/adc/sun4i-gpadc-iio.c
?@@ -85,6 +85,12 @@ static const structgpadc_datasun6i_gpadc_data= { ??????????.adc_chan_mask =SUN6I_GPADC_CTRL1_ADC_CHAN_MASK,
??};?+static const struct
gpadc_datasun8i_a33_gpadc_data= {
?+ .temp_offset = -1662,
?+ .temp_scale = 162,
?+ .tp_mode_en =SUN8I_GPADC_CTRL1_CHOP_TEMP_EN,
?+};
?+
??structsun4i_gpadc_iio{
??????????structiio_dev*indio_dev;
??????????struct completion completion;
?@@ -96,6 +102,7 @@ structsun4i_gpadc_iio{
??????????unsigned inttemp_data_irq;
??????????atomic_tignore_temp_data_irq;
??????????const structgpadc_data*data;
?+ boolno_irq;
??????????/* prevents concurrent reads of temperature and ADC */ ??????????struct mutex mutex;
??};
?@@ -138,6 +145,23 @@ static const structiio_chan_specsun4i_gpadc_channels_no_temp[] = { ??????????SUN4I_GPADC_ADC_CHANNEL(3, "adc_chan3"),
??};?+static const struct
iio_chan_specsun8i_a33_gpadc_channels[] = {
?+ {
?+ .type =IIO_TEMP,
?+ .info_mask_separate =BIT(IIO_CHAN_INFO_RAW)|
?+BIT(IIO_CHAN_INFO_SCALE)|
?+BIT(IIO_CHAN_INFO_OFFSET),
?+ .datasheet_name = "temp_adc",
?+ },
?+};
?+
?+static const structregmap_configsun4i_gpadc_regmap_config= {
?+ .reg_bits = 32,
?+ .val_bits = 32,
?+ .reg_stride = 4,
?+ .fast_io = true,
?+};
?+
??static intsun4i_prepare_for_irq(struct iio_dev *indio_dev, int channel, ???????????????????????????????????unsigned int irq)
??{
?@@ -247,6 +271,17 @@ static intsun4i_gpadc_temp_read(struct iio_dev *indio_dev, int *val)??{
??????????structsun4i_gpadc_iio*info =iio_priv(indio_dev);?+ if (
info->no_irq) {
?+pm_runtime_get_sync(indio_dev->dev.parent);
?+
?+regmap_read(info->regmap, SUN4I_GPADC_TEMP_DATA, val);
?+
?+pm_runtime_mark_last_busy(indio_dev->dev.parent);
?+pm_runtime_put_autosuspend(indio_dev->dev.parent);
?+
?+ return 0;
?+ }
?+
??????????returnsun4i_gpadc_read(indio_dev, 0, val, info->temp_data_irq); ??}?@@ -454,6 +489,58 @@ static int sun4i_irq_init(struct
platform_device*pdev, const char *name, ??????????return 0;
??}?+static const struct
of_device_idsun4i_gpadc_of_id[] = {
?+ {
?+ .compatible = "allwinner,sun8i-a33-gpadc-iio",
?+ .data =&sun8i_a33_gpadc_data,
?+ },
?+ { /* sentinel */ }
?+};
?+
?+static int sun4i_gpadc_probe_dt(structplatform_device*pdev,
?+ structiio_dev*indio_dev)
?+{
?+ structsun4i_gpadc_iio*info =iio_priv(indio_dev);
?+ const structof_device_id*of_dev;
?+ structthermal_zone_device*tzd;
?+ struct resource *mem;
?+ void__iomem*base;
?+ int ret;
?+
?+of_dev=of_match_device(sun4i_gpadc_of_id, &pdev->dev);
?+ if (!of_dev)
?+ return-ENODEV;
?+
?+info->no_irq= true;
?+info->data= (structgpadc_data*)of_dev->data;
?+indio_dev->num_channels=ARRAY_SIZE(sun8i_a33_gpadc_channels);
?+indio_dev->channels=sun8i_a33_gpadc_channels;
?+
?+ mem =platform_get_resource(pdev, IORESOURCE_MEM, 0);
?+ base =devm_ioremap_resource(&pdev->dev, mem);
?+ if (IS_ERR(base))
?+ returnPTR_ERR(base);
?+
?+info->regmap= devm_regmap_init_mmio(&pdev->dev, base,
?+&sun4i_gpadc_regmap_config);
?+ if (IS_ERR(info->regmap)) {
?+ ret =PTR_ERR(info->regmap);
?+dev_err(&pdev->dev, "failed to init regmap: %d\n", ret);
?+ return ret;
?+ }
?+
?+ if (!IS_ENABLED(THERMAL_OF))
?+ return 0;
?+
?+ tzd = devm_thermal_zone_of_sensor_register(&pdev->dev, 0, info,
?+&sun4i_ts_tz_ops);
?+ if (IS_ERR(tzd))
?+ dev_err(&pdev->dev, "could not register thermal sensor: %ld\n",
?+PTR_ERR(tzd));
?+
?+ returnPTR_ERR_OR_ZERO(tzd);
?+}
?+
??static intsun4i_gpadc_probe_mfd(struct platform_device *pdev, ???????????????????????????????????struct iio_dev *indio_dev)
??{
?@@ -462,6 +549,7 @@ static int sun4i_gpadc_probe_mfd(structplatform_device*pdev, ??????????????????dev_get_drvdata(pdev->dev.parent);
??????????int ret;?+
info->no_irq= false;
??????????info->regmap =sun4i_gpadc_dev->regmap;??????????indio_dev->num_channels =
ARRAY_SIZE(sun4i_gpadc_channels); ?@@ -561,7 +649,11 @@ static intsun4i_gpadc_probe(struct platform_device *pdev)??????????indio_dev->info =&sun4i_gpadc_iio_info; ??????????indio_dev->modes =INDIO_DIRECT_MODE;?- ret =
sun4i_gpadc_probe_mfd(pdev, indio_dev);
?+ if (pdev->dev.of_node)
?+ ret =sun4i_gpadc_probe_dt(pdev, indio_dev);
?+ else
?+ ret =sun4i_gpadc_probe_mfd(pdev, indio_dev);
?+
??????????if (ret)
??????????????????return ret;?@@ -580,7 +672,7 @@ static int
sun4i_gpadc_probe(struct platform_device *pdev)??????????return 0;??err_map:
?- if (IS_ENABLED(CONFIG_THERMAL_OF))
?+ if (!info->no_irq &&IS_ENABLED(CONFIG_THERMAL_OF)) ??????????????????iio_map_array_unregister(indio_dev);??????????pm_runtime_put(&pdev->dev);
?@@ -592,10 +684,11 @@ static intsun4i_gpadc_probe(struct platform_device *pdev)??static intsun4i_gpadc_remove(struct platform_device *pdev)
??{
??????????structiio_dev*indio_dev=platform_get_drvdata(pdev);
?+ structsun4i_gpadc_iio*info =iio_priv(indio_dev);??????????pm_runtime_put(&pdev->dev); ??????????pm_runtime_disable(&pdev->dev);
?- if (IS_ENABLED(CONFIG_THERMAL_OF))
?+ if (!info->no_irq &&IS_ENABLED(CONFIG_THERMAL_OF)) ??????????????????iio_map_array_unregister(indio_dev);??????????return 0;
?@@ -611,6 +704,7 @@ static const structplatform_device_idsun4i_gpadc_id[] = { ??static structplatform_driversun4i_gpadc_driver= { ??????????.driver = {
??????????????????.name = "sun4i-gpadc-iio",
?+ .of_match_table =sun4i_gpadc_of_id,
??????????????????.pm =&sun4i_gpadc_pm_ops,
??????????},
??????????.id_table =sun4i_gpadc_id,
?diff --gita/include/linux/mfd/sun4i-gpadc.hb/include/linux/mfd/sun4i-gpadc.h?index 509e736..139872c 100644
?---a/include/linux/mfd/sun4i-gpadc.h
?+++b/include/linux/mfd/sun4i-gpadc.h
?@@ -38,6 +38,10 @@
??#defineSUN6I_GPADC_CTRL1_ADC_CHAN_SELECT(x)(GENMASK(3, 0)& BIT(x)) ??#defineSUN6I_GPADC_CTRL1_ADC_CHAN_MASKGENMASK(3, 0)Quoted 7 lines
?+/*
TP_CTRL1bits for sun8i SoCs */
?+#defineSUN8I_GPADC_CTRL1_CHOP_TEMP_ENBIT(8)
?+#defineSUN8I_GPADC_CTRL1_GPADC_CALI_ENBIT(7)
?+
??#defineSUN4I_GPADC_CTRL20x08??#define
SUN4I_GPADC_CTRL2_TP_SENSITIVE_ADJUST(x)((GENMASK(3, 0)& (x)) << 28)_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Re: [PATCH v2 08/11] iio: adc: sun4i-gpadc-iio: add support for A33 thermal sensor
Hi Jonathan,
Quoted 15 lines · Icenowy Zheng
14.03.2017, 05:08, "Jonathan Cameron" <[email protected]>:
Quoted 12 lines · Quentin Schulz
Quoted 11 lines
This adds support for the Allwinner A33 thermal sensor.
Unlike the A10, A13 and A31, the Allwinner A33 only has one channel which is dedicated to the thermal sensor. Moreover, its thermal sensor does not generate interruptions, thus we only need to directly read the register storing the temperature value.
The MFD used by the A10, A13 and A31, was created to avoid breaking the DT binding, but since the nodes for the ADC weren't there for the A33, it is not needed.
Quoted 7 lines
Quoted 4 lines
Quoted 1 line
Signed-off-by Quentin Schulz <[email protected]>Talk me through why it makes sense to do this rather than simply spin out a really simple thermal driver for the A33?
According to him the A33 thermal sensor is a simplified version of the GPADC.
Same registers with almost same bits for the same purpose (temperature). Some SoCs have an ADC and one or more thermal sensors (A10, A13, A31, H3) while others have only one thermal sensor (A23, A33). Same IP with or without ADC/Touchscreen so same driver, that was my mindset.
The thermal part behaves the same except for the presence of interrupts or not. (A33 has bits for interrupts in the datasheet but that just does not work).
Thanks,
Quentin
Quoted 232 lines
I have already did a simple thermal driver ~8 months ago, but is rejected for this reason.
Quoted 229 lines
I'm not against what you have here, but don't feel it has been fully argued.
Jonathan
Quoted 213 lines
---
v2:
- removed added comments inKconfig,
- simplifiedKconfigdepends on condition,
- removedTHERMAL_OFrequirement for sun8i,
- renamedsun8i_gpadc_channelstosun8i_a33_gpadc_channels,
- renameduse_dtboolean inno_irqas it reflects better why we need it,
- removed spurious/unneeded modifications done in v1,drivers/iio/adc/Kconfig | 2 +- drivers/iio/adc/sun4i-gpadc-iio.c | 100 ++++++++++++++++++++++++++++++++++++-- include/linux/mfd/sun4i-gpadc.h | 4 ++ 3 files changed, 102 insertions(+), 4 deletions(-)diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
index 9f8b4b1..8c8ead6 100644
--- a/drivers/iio/adc/Kconfig
+++ b/drivers/iio/adc/Kconfig
@@ -562,7 +562,7 @@ config STX104
configSUN4I_GPADC
tristate "Support for the Allwinner SoCs GPADC"
depends on IIO
- depends onMFD_SUN4I_GPADC
+ depends onMFD_SUN4I_GPADC||MACH_SUN8I
help
Say yes here to build support for Allwinner (A10, A13 and A31) SoCs GPADC. This ADC provides 4 channels which can be used as an ADC or as
diff --gita/drivers/iio/adc/sun4i-gpadc-iio.cb/drivers/iio/adc/sun4i-gpadc-iio.cindex 7cb997a..70684cd 100644
---a/drivers/iio/adc/sun4i-gpadc-iio.c
+++b/drivers/iio/adc/sun4i-gpadc-iio.c
@@ -85,6 +85,12 @@ static const structgpadc_datasun6i_gpadc_data= {
.adc_chan_mask =SUN6I_GPADC_CTRL1_ADC_CHAN_MASK,
};+static const struct
gpadc_datasun8i_a33_gpadc_data= {
+ .temp_offset = -1662,
+ .temp_scale = 162,
+ .tp_mode_en =SUN8I_GPADC_CTRL1_CHOP_TEMP_EN, +};
+struct sun4i_gpadc_iio { struct iio_dev *indio_dev; struct completion completion; @@ -96,6 +102,7 @@ struct sun4i_gpadc_iio { unsigned int temp_data_irq; atomic_t ignore_temp_data_irq; const struct gpadc_data *data; + bool no_irq; /* prevents concurrent reads of temperature and ADC */ struct mutex mutex; }; @@ -138,6 +145,23 @@ static const struct iio_chan_spec sun4i_gpadc_channels_no_temp[] = { SUN4I_GPADC_ADC_CHANNEL(3, "adc_chan3"),};
+static const struct
iio_chan_specsun8i_a33_gpadc_channels[] = {
+ {
+ .type =IIO_TEMP,
+ .info_mask_separate =BIT(IIO_CHAN_INFO_RAW)|
+BIT(IIO_CHAN_INFO_SCALE)|
+BIT(IIO_CHAN_INFO_OFFSET),
+ .datasheet_name = "temp_adc",
+ },
+};
+
+static const structregmap_configsun4i_gpadc_regmap_config= {
+ .reg_bits = 32,
+ .val_bits = 32,
+ .reg_stride = 4,
+ .fast_io = true,
+};
+
static int sun4i_prepare_for_irq(structiio_dev*indio_dev, int channel,
unsigned int irq)
{
@@ -247,6 +271,17 @@ static intsun4i_gpadc_temp_read(struct iio_dev *indio_dev, int *val){ struct sun4i_gpadc_iio *info = iio_priv(indio_dev);+ if (
info->no_irq) {
+pm_runtime_get_sync(indio_dev->dev.parent);
+
+regmap_read(info->regmap, SUN4I_GPADC_TEMP_DATA, val); +
+pm_runtime_mark_last_busy(indio_dev->dev.parent);
+pm_runtime_put_autosuspend(indio_dev->dev.parent); +
+ return 0;
+ }
+return sun4i_gpadc_read(indio_dev, 0, val, info->temp_data_irq);}
@@ -454,6 +489,58 @@ static int sun4i_irq_init(struct
platform_device*pdev, const char *name,return 0;}
+static const struct
of_device_idsun4i_gpadc_of_id[] = {
+ {
+ .compatible = "allwinner,sun8i-a33-gpadc-iio",
+ .data =&sun8i_a33_gpadc_data,
+ },
+ { /* sentinel */ }
+};
+
+static int sun4i_gpadc_probe_dt(structplatform_device*pdev,
+ structiio_dev*indio_dev)
+{
+ structsun4i_gpadc_iio*info =iio_priv(indio_dev);
+ const structof_device_id*of_dev;
+ structthermal_zone_device*tzd;
+ struct resource *mem;
+ void__iomem*base;
+ int ret;
+
+of_dev=of_match_device(sun4i_gpadc_of_id, &pdev->dev);
+ if (!of_dev)
+ return-ENODEV;
+
+info->no_irq= true;
+info->data= (structgpadc_data*)of_dev->data;
+indio_dev->num_channels=ARRAY_SIZE(sun8i_a33_gpadc_channels);
+indio_dev->channels=sun8i_a33_gpadc_channels;
+
+ mem =platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ base =devm_ioremap_resource(&pdev->dev, mem);
+ if (IS_ERR(base))
+ returnPTR_ERR(base);
+
+info->regmap= devm_regmap_init_mmio(&pdev->dev, base,
+&sun4i_gpadc_regmap_config);
+ if (IS_ERR(info->regmap)) {
+ ret =PTR_ERR(info->regmap);
+dev_err(&pdev->dev, "failed to init regmap: %d\n", ret);
+ return ret;
+ }
+
+ if (!IS_ENABLED(THERMAL_OF))
+ return 0;
+
+ tzd = devm_thermal_zone_of_sensor_register(&pdev->dev, 0, info,
+&sun4i_ts_tz_ops);
+ if (IS_ERR(tzd))
+ dev_err(&pdev->dev, "could not register thermal sensor: %ld\n",
+PTR_ERR(tzd));
+
+ returnPTR_ERR_OR_ZERO(tzd);
+}
+
static int sun4i_gpadc_probe_mfd(structplatform_device*pdev,
structiio_dev*indio_dev)
{
@@ -462,6 +549,7 @@ static int sun4i_gpadc_probe_mfd(structplatform_device*pdev,dev_get_drvdata(pdev->dev.parent); int ret;+ info->no_irq = false; info->regmap = sun4i_gpadc_dev->regmap; indio_dev->num_channels = ARRAY_SIZE(sun4i_gpadc_channels); @@ -561,7 +649,11 @@ static int sun4i_gpadc_probe(struct platform_device *pdev) indio_dev->info = &sun4i_gpadc_iio_info; indio_dev->modes = INDIO_DIRECT_MODE;- ret =
sun4i_gpadc_probe_mfd(pdev, indio_dev);
+ if (pdev->dev.of_node)
+ ret =sun4i_gpadc_probe_dt(pdev, indio_dev);
+ else
+ ret =sun4i_gpadc_probe_mfd(pdev, indio_dev);
+if (ret) return ret;@@ -580,7 +672,7 @@ static int
sun4i_gpadc_probe(struct platform_device *pdev)return 0;
err_map:
- if (IS_ENABLED(CONFIG_THERMAL_OF))
+ if (!info->no_irq &&IS_ENABLED(CONFIG_THERMAL_OF))iio_map_array_unregister(indio_dev); pm_runtime_put(&pdev->dev); @@ -592,10 +684,11 @@ static int sun4i_gpadc_probe(struct platform_device *pdev) static int sun4i_gpadc_remove(struct platform_device *pdev) { struct iio_dev *indio_dev = platform_get_drvdata(pdev);+ struct
sun4i_gpadc_iio*info =iio_priv(indio_dev);pm_runtime_put(&pdev->dev); pm_runtime_disable(&pdev->dev); - if (IS_ENABLED(CONFIG_THERMAL_OF)) + if (!info->no_irq && IS_ENABLED(CONFIG_THERMAL_OF)) iio_map_array_unregister(indio_dev); return 0; @@ -611,6 +704,7 @@ static const struct platform_device_id sun4i_gpadc_id[] = { static struct platform_driver sun4i_gpadc_driver = { .driver = { .name = "sun4i-gpadc-iio", + .of_match_table = sun4i_gpadc_of_id, .pm = &sun4i_gpadc_pm_ops, }, .id_table = sun4i_gpadc_id,diff --git
a/include/linux/mfd/sun4i-gpadc.hb/include/linux/mfd/sun4i-gpadc.hindex 509e736..139872c 100644
---a/include/linux/mfd/sun4i-gpadc.h
+++b/include/linux/mfd/sun4i-gpadc.h
@@ -38,6 +38,10 @@
#defineSUN6I_GPADC_CTRL1_ADC_CHAN_SELECT(x)(GENMASK(3, 0)& BIT(x)) #defineSUN6I_GPADC_CTRL1_ADC_CHAN_MASKGENMASK(3, 0)Quoted 7 lines
+/*
TP_CTRL1bits for sun8i SoCs */
+#defineSUN8I_GPADC_CTRL1_CHOP_TEMP_ENBIT(8)
+#defineSUN8I_GPADC_CTRL1_GPADC_CALI_ENBIT(7)
+
#defineSUN4I_GPADC_CTRL20x08#define SUN4I_GPADC_CTRL2_TP_SENSITIVE_ADJUST(x) ((GENMASK(3, 0) & (x)) << 28)_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Signature · 3 lines
Quentin Schulz, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com
Jonathan Cameron
maintainerRe: [PATCH v2 08/11] iio: adc: sun4i-gpadc-iio: add support for A33 thermal sensor
Quoted 26 lines · Quentin Schulz
Hi Jonathan,
Quoted 15 lines · Icenowy Zheng
14.03.2017, 05:08, "Jonathan Cameron" <[email protected]>:
Quoted 12 lines · Quentin Schulz
Quoted 11 lines
This adds support for the Allwinner A33 thermal sensor.
Unlike the A10, A13 and A31, the Allwinner A33 only has one channel which is dedicated to the thermal sensor. Moreover, its thermal sensor does not generate interruptions, thus we only need to directly read the register storing the temperature value.
The MFD used by the A10, A13 and A31, was created to avoid breaking the DT binding, but since the nodes for the ADC weren't there for the A33, it is not needed.
Quoted 7 lines
Quoted 4 lines
Quoted 1 line
Signed-off-by Quentin Schulz <[email protected]>Talk me through why it makes sense to do this rather than simply spin out a really simple thermal driver for the A33?
According to him the A33 thermal sensor is a simplified version of the GPADC.
Quoted 8 lines
Same registers with almost same bits for the same purpose (temperature). Some SoCs have an ADC and one or more thermal sensors (A10, A13, A31, H3) while others have only one thermal sensor (A23, A33). Same IP with or without ADC/Touchscreen so same driver, that was my mindset.
The thermal part behaves the same except for the presence of interrupts or not. (A33 has bits for interrupts in the datasheet but that just does not work).
Hmm. I'm just about convinced by this argument, please make it in the patch description going forward.
Jonathan
Quoted 237 lines
Thanks,
QuentinQuoted 232 lines
I have already did a simple thermal driver ~8 months ago, but is rejected for this reason.
Quoted 229 lines
I'm not against what you have here, but don't feel it has been fully argued.
Jonathan
Quoted 213 lines
---
v2:
- removed added comments inKconfig,
- simplifiedKconfigdepends on condition,
- removedTHERMAL_OFrequirement for sun8i,
- renamedsun8i_gpadc_channelstosun8i_a33_gpadc_channels,
- renameduse_dtboolean inno_irqas it reflects better why we need it,
- removed spurious/unneeded modifications done in v1,drivers/iio/adc/Kconfig | 2 +- drivers/iio/adc/sun4i-gpadc-iio.c | 100 ++++++++++++++++++++++++++++++++++++-- include/linux/mfd/sun4i-gpadc.h | 4 ++ 3 files changed, 102 insertions(+), 4 deletions(-)diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
index 9f8b4b1..8c8ead6 100644
--- a/drivers/iio/adc/Kconfig
+++ b/drivers/iio/adc/Kconfig
@@ -562,7 +562,7 @@ config STX104
configSUN4I_GPADC
tristate "Support for the Allwinner SoCs GPADC"
depends on IIO
- depends onMFD_SUN4I_GPADC
+ depends onMFD_SUN4I_GPADC||MACH_SUN8I
help
Say yes here to build support for Allwinner (A10, A13 and A31) SoCs GPADC. This ADC provides 4 channels which can be used as an ADC or as
diff --gita/drivers/iio/adc/sun4i-gpadc-iio.cb/drivers/iio/adc/sun4i-gpadc-iio.cindex 7cb997a..70684cd 100644
---a/drivers/iio/adc/sun4i-gpadc-iio.c
+++b/drivers/iio/adc/sun4i-gpadc-iio.c
@@ -85,6 +85,12 @@ static const structgpadc_datasun6i_gpadc_data= {
.adc_chan_mask =SUN6I_GPADC_CTRL1_ADC_CHAN_MASK,
};+static const struct
gpadc_datasun8i_a33_gpadc_data= {
+ .temp_offset = -1662,
+ .temp_scale = 162,
+ .tp_mode_en =SUN8I_GPADC_CTRL1_CHOP_TEMP_EN, +};
+struct sun4i_gpadc_iio { struct iio_dev *indio_dev; struct completion completion; @@ -96,6 +102,7 @@ struct sun4i_gpadc_iio { unsigned int temp_data_irq; atomic_t ignore_temp_data_irq; const struct gpadc_data *data; + bool no_irq; /* prevents concurrent reads of temperature and ADC */ struct mutex mutex; }; @@ -138,6 +145,23 @@ static const struct iio_chan_spec sun4i_gpadc_channels_no_temp[] = { SUN4I_GPADC_ADC_CHANNEL(3, "adc_chan3"),};
+static const struct
iio_chan_specsun8i_a33_gpadc_channels[] = {
+ {
+ .type =IIO_TEMP,
+ .info_mask_separate =BIT(IIO_CHAN_INFO_RAW)|
+BIT(IIO_CHAN_INFO_SCALE)|
+BIT(IIO_CHAN_INFO_OFFSET),
+ .datasheet_name = "temp_adc",
+ },
+};
+
+static const structregmap_configsun4i_gpadc_regmap_config= {
+ .reg_bits = 32,
+ .val_bits = 32,
+ .reg_stride = 4,
+ .fast_io = true,
+};
+
static int sun4i_prepare_for_irq(structiio_dev*indio_dev, int channel,
unsigned int irq)
{
@@ -247,6 +271,17 @@ static intsun4i_gpadc_temp_read(struct iio_dev *indio_dev, int *val){ struct sun4i_gpadc_iio *info = iio_priv(indio_dev);+ if (
info->no_irq) {
+pm_runtime_get_sync(indio_dev->dev.parent);
+
+regmap_read(info->regmap, SUN4I_GPADC_TEMP_DATA, val); +
+pm_runtime_mark_last_busy(indio_dev->dev.parent);
+pm_runtime_put_autosuspend(indio_dev->dev.parent); +
+ return 0;
+ }
+return sun4i_gpadc_read(indio_dev, 0, val, info->temp_data_irq);}
@@ -454,6 +489,58 @@ static int sun4i_irq_init(struct
platform_device*pdev, const char *name,return 0;}
+static const struct
of_device_idsun4i_gpadc_of_id[] = {
+ {
+ .compatible = "allwinner,sun8i-a33-gpadc-iio",
+ .data =&sun8i_a33_gpadc_data,
+ },
+ { /* sentinel */ }
+};
+
+static int sun4i_gpadc_probe_dt(structplatform_device*pdev,
+ structiio_dev*indio_dev)
+{
+ structsun4i_gpadc_iio*info =iio_priv(indio_dev);
+ const structof_device_id*of_dev;
+ structthermal_zone_device*tzd;
+ struct resource *mem;
+ void__iomem*base;
+ int ret;
+
+of_dev=of_match_device(sun4i_gpadc_of_id, &pdev->dev);
+ if (!of_dev)
+ return-ENODEV;
+
+info->no_irq= true;
+info->data= (structgpadc_data*)of_dev->data;
+indio_dev->num_channels=ARRAY_SIZE(sun8i_a33_gpadc_channels);
+indio_dev->channels=sun8i_a33_gpadc_channels;
+
+ mem =platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ base =devm_ioremap_resource(&pdev->dev, mem);
+ if (IS_ERR(base))
+ returnPTR_ERR(base);
+
+info->regmap= devm_regmap_init_mmio(&pdev->dev, base,
+&sun4i_gpadc_regmap_config);
+ if (IS_ERR(info->regmap)) {
+ ret =PTR_ERR(info->regmap);
+dev_err(&pdev->dev, "failed to init regmap: %d\n", ret);
+ return ret;
+ }
+
+ if (!IS_ENABLED(THERMAL_OF))
+ return 0;
+
+ tzd = devm_thermal_zone_of_sensor_register(&pdev->dev, 0, info,
+&sun4i_ts_tz_ops);
+ if (IS_ERR(tzd))
+ dev_err(&pdev->dev, "could not register thermal sensor: %ld\n",
+PTR_ERR(tzd));
+
+ returnPTR_ERR_OR_ZERO(tzd);
+}
+
static int sun4i_gpadc_probe_mfd(structplatform_device*pdev,
structiio_dev*indio_dev)
{
@@ -462,6 +549,7 @@ static int sun4i_gpadc_probe_mfd(structplatform_device*pdev,dev_get_drvdata(pdev->dev.parent); int ret;+ info->no_irq = false; info->regmap = sun4i_gpadc_dev->regmap; indio_dev->num_channels = ARRAY_SIZE(sun4i_gpadc_channels); @@ -561,7 +649,11 @@ static int sun4i_gpadc_probe(struct platform_device *pdev) indio_dev->info = &sun4i_gpadc_iio_info; indio_dev->modes = INDIO_DIRECT_MODE;- ret =
sun4i_gpadc_probe_mfd(pdev, indio_dev);
+ if (pdev->dev.of_node)
+ ret =sun4i_gpadc_probe_dt(pdev, indio_dev);
+ else
+ ret =sun4i_gpadc_probe_mfd(pdev, indio_dev);
+if (ret) return ret;@@ -580,7 +672,7 @@ static int
sun4i_gpadc_probe(struct platform_device *pdev)return 0;
err_map:
- if (IS_ENABLED(CONFIG_THERMAL_OF))
+ if (!info->no_irq &&IS_ENABLED(CONFIG_THERMAL_OF))iio_map_array_unregister(indio_dev); pm_runtime_put(&pdev->dev); @@ -592,10 +684,11 @@ static int sun4i_gpadc_probe(struct platform_device *pdev) static int sun4i_gpadc_remove(struct platform_device *pdev) { struct iio_dev *indio_dev = platform_get_drvdata(pdev);+ struct
sun4i_gpadc_iio*info =iio_priv(indio_dev);pm_runtime_put(&pdev->dev); pm_runtime_disable(&pdev->dev); - if (IS_ENABLED(CONFIG_THERMAL_OF)) + if (!info->no_irq && IS_ENABLED(CONFIG_THERMAL_OF)) iio_map_array_unregister(indio_dev); return 0; @@ -611,6 +704,7 @@ static const struct platform_device_id sun4i_gpadc_id[] = { static struct platform_driver sun4i_gpadc_driver = { .driver = { .name = "sun4i-gpadc-iio", + .of_match_table = sun4i_gpadc_of_id, .pm = &sun4i_gpadc_pm_ops, }, .id_table = sun4i_gpadc_id,diff --git
a/include/linux/mfd/sun4i-gpadc.hb/include/linux/mfd/sun4i-gpadc.hindex 509e736..139872c 100644
---a/include/linux/mfd/sun4i-gpadc.h
+++b/include/linux/mfd/sun4i-gpadc.h
@@ -38,6 +38,10 @@
#defineSUN6I_GPADC_CTRL1_ADC_CHAN_SELECT(x)(GENMASK(3, 0)& BIT(x)) #defineSUN6I_GPADC_CTRL1_ADC_CHAN_MASKGENMASK(3, 0)Quoted 7 lines
+/*
TP_CTRL1bits for sun8i SoCs */
+#defineSUN8I_GPADC_CTRL1_CHOP_TEMP_ENBIT(8)
+#defineSUN8I_GPADC_CTRL1_GPADC_CALI_ENBIT(7)
+
#defineSUN4I_GPADC_CTRL20x08#define SUN4I_GPADC_CTRL2_TP_SENSITIVE_ADJUST(x) ((GENMASK(3, 0) & (x)) << 28)_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Re: [PATCH v2 08/11] iio: adc: sun4i-gpadc-iio: add support for A33 thermal sensor
In reply to Quentin SchulzQuoted 22 lines · Quentin Schulz
This adds support for the Allwinner A33 thermal sensor.
Unlike the A10, A13 and A31, the Allwinner A33 only has one channel which is dedicated to the thermal sensor. Moreover, its thermal sensor does not generate interruptions, thus we only need to directly read the register storing the temperature value.
The MFD used by the A10, A13 and A31, was created to avoid breaking the DT binding, but since the nodes for the ADC weren't there for the A33, it is not needed.
Signed-off-by Quentin Schulz <[email protected]>---
v2:
- removed added comments inKconfig,
- simplifiedKconfigdepends on condition,
- removedTHERMAL_OFrequirement for sun8i,
- renamedsun8i_gpadc_channelstosun8i_a33_gpadc_channels,
- renameduse_dtboolean inno_irqas it reflects better why we need it,
- removed spurious/unneeded modifications done in v1,
Quoted 4 lines
drivers/iio/adc/Kconfig | 2 +- drivers/iio/adc/sun4i-gpadc-iio.c | 100 ++++++++++++++++++++++++++++++++++++--include/linux/mfd/sun4i-gpadc.h | 4 ++
For the MFD parts only:
Quoted 207 lines
3 files changed, 102 insertions(+), 4 deletions(-)drivers/iio/adc/Kconfig +1
-1@@ -562,7 +562,7 @@ config STX104 config SUN4I_GPADC tristate "Support for the Allwinner SoCs GPADC" depends on IIO - depends on MFD_SUN4I_GPADC + depends on MFD_SUN4I_GPADC || MACH_SUN8I help Say yes here to build support for Allwinner (A10, A13 and A31) SoCs GPADC. This ADC provides 4 channels which can be used as an ADC or asdrivers/iio/adc/sun4i-gpadc-iio.c +97
-3@@ -85,6 +85,12 @@ static const struct gpadc_data sun6i_gpadc_data = { .adc_chan_mask = SUN6I_GPADC_CTRL1_ADC_CHAN_MASK, }; +static const struct gpadc_data sun8i_a33_gpadc_data = { + .temp_offset =-1662 , + .temp_scale =162 , + .tp_mode_en =SUN8I_GPADC_CTRL1_CHOP_TEMP_EN , +}; +struct sun4i_gpadc_iio {struct iio_dev *indio_dev;struct completion completion;@@ -96,6 +102,7 @@ struct sun4i_gpadc_iio {unsigned int temp_data_irq;atomic_t ignore_temp_data_irq;const struct gpadc_data *data; +bool no_irq;/* prevents concurrent reads of temperature and ADC */ struct mutex mutex; };@@ -138,6 +145,23 @@ static const struct iio_chan_spec sun4i_gpadc_channels_no_temp[] = { SUN4I_GPADC_ADC_CHANNEL(3, "adc_chan3"), }; +static const struct iio_chan_spec sun8i_a33_gpadc_channels[] = { + { + .type =IIO_TEMP , + .info_mask_separate =BIT (IIO_CHAN_INFO_RAW ) | +BIT (IIO_CHAN_INFO_SCALE ) | +BIT (IIO_CHAN_INFO_OFFSET ), + .datasheet_name ="temp_adc" , + }, +}; + +static const struct regmap_config sun4i_gpadc_regmap_config = { + .reg_bits =32 , + .val_bits =32 , + .reg_stride =4 , + .fast_io = true, +}; +static int sun4i_prepare_for_irq (struct iio_dev *indio_dev,int channel,unsigned int irq) {@@ -247,6 +271,17 @@ static int sun4i_gpadc_temp_read(struct iio_dev *indio_dev, int *val) {struct sun4i_gpadc_iio *info =iio_priv (indio_dev); +if (info->no_irq) { +pm_runtime_get_sync (indio_dev->dev.parent); + +regmap_read (info->regmap,SUN4I_GPADC_TEMP_DATA , val); + +pm_runtime_mark_last_busy (indio_dev->dev.parent); +pm_runtime_put_autosuspend (indio_dev->dev.parent); + +return 0 ; + } +return sun4i_gpadc_read (indio_dev,0 , val, info->temp_data_irq); }@@ -454,6 +489,58 @@ static int sun4i_irq_init(struct platform_device *pdev, const char *name,return 0 ; } +static const struct of_device_id sun4i_gpadc_of_id[] = { + { + .compatible ="allwinner,sun8i-a33-gpadc-iio" , + .data = &sun8i_a33_gpadc_data, + }, + {/* sentinel */ } +}; + +static int sun4i_gpadc_probe_dt (struct platform_device *pdev, +struct iio_dev *indio_dev) +{ +struct sun4i_gpadc_iio *info =iio_priv (indio_dev); +const struct of_device_id *of_dev; +struct thermal_zone_device *tzd; +struct resource *mem; +void __iomem *base; +int ret; + + of_dev =of_match_device (sun4i_gpadc_of_id, &pdev->dev); +if (!of_dev) +return -ENODEV ; + + info->no_irq = true; + info->data = (struct gpadc_data *)of_dev->data; + indio_dev->num_channels =ARRAY_SIZE (sun8i_a33_gpadc_channels); + indio_dev->channels = sun8i_a33_gpadc_channels; + + mem =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); + base =devm_ioremap_resource (&pdev->dev, mem); +if (IS_ERR (base)) +return PTR_ERR (base); + + info->regmap =devm_regmap_init_mmio (&pdev->dev, base, + &sun4i_gpadc_regmap_config); +if (IS_ERR (info->regmap)) { + ret =PTR_ERR (info->regmap); +dev_err (&pdev->dev,"failed to init regmap: %d\n" , ret); +return ret; + } + +if (!IS_ENABLED (THERMAL_OF )) +return 0 ; + + tzd =devm_thermal_zone_of_sensor_register (&pdev->dev,0 , info, + &sun4i_ts_tz_ops); +if (IS_ERR (tzd)) +dev_err (&pdev->dev,"could not register thermal sensor: %ld\n" , +PTR_ERR (tzd)); + +return PTR_ERR_OR_ZERO (tzd); +} +static int sun4i_gpadc_probe_mfd (struct platform_device *pdev,struct iio_dev *indio_dev) {@@ -462,6 +549,7 @@ static int sun4i_gpadc_probe_mfd(struct platform_device *pdev,dev_get_drvdata (pdev->dev.parent);int ret; + info->no_irq = false; info->regmap = sun4i_gpadc_dev->regmap; indio_dev->num_channels =ARRAY_SIZE (sun4i_gpadc_channels);@@ -561,7 +649,11 @@ static int sun4i_gpadc_probe(struct platform_device *pdev) indio_dev->info = &sun4i_gpadc_iio_info; indio_dev->modes =INDIO_DIRECT_MODE ; - ret =sun4i_gpadc_probe_mfd (pdev, indio_dev); +if (pdev->dev.of_node) + ret =sun4i_gpadc_probe_dt (pdev, indio_dev); +else + ret =sun4i_gpadc_probe_mfd (pdev, indio_dev); +if (ret)return ret;@@ -580,7 +672,7 @@ static int sun4i_gpadc_probe(struct platform_device *pdev)return 0 ; err_map: -if (IS_ENABLED (CONFIG_THERMAL_OF )) +if (!info->no_irq &&IS_ENABLED (CONFIG_THERMAL_OF ))iio_map_array_unregister (indio_dev);pm_runtime_put (&pdev->dev);@@ -592,10 +684,11 @@ static int sun4i_gpadc_probe(struct platform_device *pdev)static int sun4i_gpadc_remove (struct platform_device *pdev) {struct iio_dev *indio_dev =platform_get_drvdata (pdev); +struct sun4i_gpadc_iio *info =iio_priv (indio_dev);pm_runtime_put (&pdev->dev);pm_runtime_disable (&pdev->dev); -if (IS_ENABLED (CONFIG_THERMAL_OF )) +if (!info->no_irq &&IS_ENABLED (CONFIG_THERMAL_OF ))iio_map_array_unregister (indio_dev);return 0 ;@@ -611,6 +704,7 @@ static const struct platform_device_id sun4i_gpadc_id[] = {static struct platform_driver sun4i_gpadc_driver = { .driver = { .name ="sun4i-gpadc-iio" , + .of_match_table = sun4i_gpadc_of_id, .pm = &sun4i_gpadc_pm_ops, }, .id_table = sun4i_gpadc_id,include/linux/mfd/sun4i-gpadc.h +4
-0@@ -38,6 +38,10 @@#define SUN6I_GPADC_CTRL1_ADC_CHAN_SELECT (x) (GENMASK(3, 0) & BIT(x))#define SUN6I_GPADC_CTRL1_ADC_CHAN_MASK GENMASK(3, 0) +/* TP_CTRL1 bits for sun8i SoCs */ +#define SUN8I_GPADC_CTRL1_CHOP_TEMP_EN BIT(8) +#define SUN8I_GPADC_CTRL1_GPADC_CALI_EN BIT(7) +#define SUN4I_GPADC_CTRL2 0x08#define SUN4I_GPADC_CTRL2_TP_SENSITIVE_ADJUST (x) ((GENMASK(3, 0) & (x)) << 28)
Signature · 4 lines
Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org ? Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog
PATCH v2 9/11 ARM: dtsi: sun8i: a33: add thermal sensor
In reply to Quentin SchulzThis adds the DT node for the thermal sensor present in the Allwinner A33 GPADC.
--- arch/arm/boot/dts/sun8i-a33.dtsi | 12 ++++++++++++ 1 file changed, 12 insertions(+)
arch/arm/boot/dts/sun8i-a33.dtsi +12 -0
@@ -278,6 +278,13 @@ status = "disabled"; }; + rtp: rtp at 01c25000 { + compatible = "allwinner,sun8i-a33-gpadc-iio"; + reg = <0x01c25000 0x100>; + #thermal-sensor-cells = <0>; + #io-channel-cells = <0>; + }; + fe0: display-frontend at 01e00000 { compatible = "allwinner,sun8i-a33-display-frontend"; reg = <0x01e00000 0x20000>;
@@ -388,6 +395,11 @@ }; }; }; + + iio-hwmon { + compatible = "iio-hwmon"; + io-channels = <&rtp>; + }; }; &ccu {
Signature · 1 line
2.9.3
PATCH v2 9/11 ARM: dtsi: sun8i: a33: add thermal sensor
10.03.2017, 18:42, "Quentin Schulz" <[email protected]>:
Quoted 13 lines
This adds the DT node for the thermal sensor present in the Allwinner A33 GPADC.
Signed-off-by Quentin Schulz <[email protected]>---
?arch/arm/boot/dts/sun8i-a33.dtsi | 12 ++++++++++++ ?1 file changed, 12 insertions(+)arch/arm/boot/dts/sun8i-a33.dtsi +0
-0
arch/arm/boot/dts/sun8i-a33.dtsi line 286
Quoted 9 lines
arch/arm/boot/dts/sun8i-a33.dtsi +6
-0@@ -278,6 +278,13 @@ ?????????????????????????status = "disabled"; ?????????????????}; + rtp: rtp at 01c25000 { + compatible = "allwinner,sun8i-a33-gpadc-iio"; + reg = <0x01c25000 0x100>; + #thermal-sensor-cells = <0>; + #io-channel-cells = <0>; + };
As I said, it's not a "rtp" (Resistive touch panel).
Quoted 23 lines
arch/arm/boot/dts/sun8i-a33.dtsi +6
-1+ ?????????????????fe0: display-frontend at 01e00000 { ?????????????????????????compatible = "allwinner,sun8i-a33-display-frontend"; ?????????????????????????reg = <0x01e00000 0x20000>;@@ -388,6 +395,11 @@ ?????????????????????????}; ?????????????????}; ?????????}; + + iio-hwmon { + compatible = "iio-hwmon"; + io-channels = <&rtp>; + }; ?}; ?&ccu { --2.9.3
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
PATCH v2 10/11 ARM: dtsi: sun8i: a33: add CPU thermal throttling
In reply to Quentin SchulzThis adds CPU thermal throttling for the Allwinner A33. It uses the thermal sensor present in the SoC's GPADC.
---
v2:
- updated cooling-max-level to reflect newly added OPPs,
arch/arm/boot/dts/sun8i-a33.dtsi | 47 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)
arch/arm/boot/dts/sun8i-a33.dtsi +47 -0
@@ -43,6 +43,7 @@ */ #include "sun8i-a23-a33.dtsi" +#include <dt-bindings/thermal/thermal.h> / { cpu0_opp_table: opp_table0 {
@@ -139,6 +140,9 @@ clocks = <&ccu CLK_CPUX>; clock-names = "cpu"; operating-points-v2 = <&cpu0_opp_table>; + cooling-min-level = <0>; + cooling-max-level = <13>; + #cooling-cells = <2>; }; cpu at 1 {
@@ -182,6 +186,49 @@ }; }; + thermal-zones { + cpu_thermal { + /* milliseconds */ + polling-delay-passive = <250>; + polling-delay = <1000>; + thermal-sensors = <&rtp>; + + cooling-maps { + map0 { + trip = <&cpu_alert0>; + cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; + }; + map1 { + trip = <&cpu_alert1>; + cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; + }; + }; + + trips { + cpu_alert0: cpu_alert0 { + /* milliCelsius */ + temperature = <75000>; + hysteresis = <2000>; + type = "passive"; + }; + + cpu_alert1: cpu_alert1 { + /* milliCelsius */ + temperature = <90000>; + hysteresis = <2000>; + type = "hot"; + }; + + cpu_crit: cpu_crit { + /* milliCelsius */ + temperature = <110000>; + hysteresis = <2000>; + type = "critical"; + }; + }; + }; + }; + memory { reg = <0x40000000 0x80000000>; };
Signature · 1 line
2.9.3
PATCH v2 11/11 ARM: sun8i: a33: Add devfreq-based GPU cooling
In reply to Quentin SchulzFrom: Maxime Ripard <[email protected]>
This adds GPU thermal throttling for the Allwinner A33.
---
added in v2
arch/arm/boot/dts/sun8i-a23-a33.dtsi | 3 +++ arch/arm/boot/dts/sun8i-a33.dtsi | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+)
arch/arm/boot/dts/sun8i-a23-a33.dtsi +3 -0
@@ -495,6 +495,9 @@ assigned-clocks = <&ccu CLK_GPU>; assigned-clock-rates = <384000000>; + cooling-min-level = <0>; + cooling-max-level = <2>; + #cooling-cells = <2>; }; gic: interrupt-controller at 01c81000 {
arch/arm/boot/dts/sun8i-a33.dtsi +24 -0
@@ -202,6 +202,16 @@ trip = <&cpu_alert1>; cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; }; + + map2 { + trip = <&gpu_alert0>; + cooling-device = <&mali 1 THERMAL_NO_LIMIT>; + }; + + map3 { + trip = <&gpu_alert1>; + cooling-device = <&mali 2 THERMAL_NO_LIMIT>; + }; }; trips {
@@ -212,6 +222,13 @@ type = "passive"; }; + gpu_alert0: gpu_alert0 { + /* milliCelsius */ + temperature = <85000>; + hysteresis = <2000>; + type = "passive"; + }; + cpu_alert1: cpu_alert1 { /* milliCelsius */ temperature = <90000>;
@@ -219,6 +236,13 @@ type = "hot"; }; + gpu_alert1: gpu_alert1 { + /* milliCelsius */ + temperature = <95000>; + hysteresis = <2000>; + type = "hot"; + }; + cpu_crit: cpu_crit { /* milliCelsius */ temperature = <110000>;
Signature · 1 line
2.9.3