Input: sun4i-ts: Support touchpanel controller on A31
Subsystems (4)
cover Input: sun4i-ts: Support touchpanel controller on A31
Hi everyone,
As part of my work to get cpufreq working, this series adds support for the resistive touch panel controller on A31. It is the same hardware as on older SoCs, with a few register bits shifted, and a different temperature curve. I've matched the rest of the registers, and they all seem to fit.
As I do not have a resistive touch screen, I am asking anyone with an A31 board and a touch screen to help test this.
The temperature curve formula was confirmed by Allwinner as correct and working.
I've yet to fully test the remaining cpufreq bits, so I'm sending out this first. At least people will have a usable temperature sensor.
Regards,
ChenYu
Chen-Yu Tsai (2):
Input: sun4i-ts: Add support for touchpanel controller on A31
ARM: dts: sun6i: Add resistive touchscreen controller node to dtsi
.../bindings/input/touchscreen/sun4i.txt | 2 +- arch/arm/boot/dts/sun6i-a31.dtsi | 7 ++++ drivers/input/touchscreen/sun4i-ts.c | 46 ++++++++++++++++------ 3 files changed, 41 insertions(+), 14 deletions(-)
Signature · 1 line
2.1.4
PATCH 1/2 Input: sun4i-ts: Add support for touchpanel controller on A31
The Allwinner A31 SoC (sun6i) has the same resistive touchpanel controller as on other sunxi platforms. The only difference between the variants is the control bits for enabling operations are left-shifted by 1 on the A31.
This patch adds support for this variant.
Also update the comment for the original temperature sensor with information from Allwinner.
--- .../bindings/input/touchscreen/sun4i.txt | 2 +- drivers/input/touchscreen/sun4i-ts.c | 46 ++++++++++++++++------ 2 files changed, 34 insertions(+), 14 deletions(-)
Documentation/devicetree/bindings/input/touchscreen/sun4i.txt +1 -1
@@ -2,7 +2,7 @@ sun4i resistive touchscreen controller -------------------------------------- Required properties: - - compatible: "allwinner,sun4i-a10-ts" + - compatible: "allwinner,sun4i-a10-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
drivers/input/touchscreen/sun4i-ts.c +33 -13
88 lines not on this page · raw message
Signature · 1 line
2.1.4
PATCH 1/2 Input: sun4i-ts: Add support for touchpanel controller on A31
Quoted 11 lines · Chen-Yu Tsai
The Allwinner A31 SoC (sun6i) has the same resistive touchpanel controller as on other sunxi platforms. The only difference between the variants is the control bits for enabling operations are left-shifted by 1 on the A31.
This patch adds support for this variant.
Also update the comment for the original temperature sensor with information from Allwinner.
Signed-off-by Chen-Yu Tsai <[email protected]>
Applied, thank you.
Quoted 120 lines
--- .../bindings/input/touchscreen/sun4i.txt | 2 +- drivers/input/touchscreen/sun4i-ts.c | 46 ++++++++++++++++------ 2 files changed, 34 insertions(+), 14 deletions(-)Documentation/devicetree/bindings/input/touchscreen/sun4i.txt +1
-1@@ -2,7 +2,7 @@ sun4i resistive touchscreen controller -------------------------------------- Required properties: - - compatible: "allwinner,sun4i-a10-ts" + - compatible: "allwinner,sun4i-a10-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 0drivers/input/touchscreen/sun4i-ts.c +33
-13@@ -72,6 +72,9 @@#define TP_ADC_SELECT (x) ((x) << 3)#define ADC_CHAN_SELECT (x) ((x) << 0)/* 3 bits */ +/* on sun6i, bits 3~6 are left shifted by 1 to 4~7 */ +#define SUN6I_TP_MODE_EN (x) ((x) << 5) +/* TP_CTRL2 bits */ #define TP_SENSITIVE_ADJUST (x) ((x) << 28)/* 4 bits */ #define TP_MODE_SELECT (x) ((x) << 26)/* 2 bits */ @@ -113,6 +116,8 @@ struct sun4i_ts_data {unsigned int irq;bool ignore_fifo_data;int temp_data; +int temp_offset; +int temp_step; };static void sun4i_ts_irq_handle_input (struct sun4i_ts_data *ts,u32 reg_val)@@ -188,17 +193,7 @@ static int sun4i_get_temp(const struct sun4i_ts_data *ts, long *temp)if (ts->temp_data ==-1 )return -EAGAIN ; -/* -* The user manuals do not contain the formula for calculating -* the temperature. The formula used here is from the AXP209, -* which is designed by X-Powers, an affiliate of Allwinner: -* -* temperature = -144.7 + (value * 0.1) -* -* This should be replaced with the correct one if such information -* becomes available. -*/ - *temp = (ts->temp_data -1447 ) *100 ; + *temp = (ts->temp_data - ts->temp_offset) * ts->temp_step;return 0 ; }@@ -249,6 +244,7 @@ static int sun4i_ts_probe(struct platform_device *pdev)struct device_node *np = dev->of_node;struct device *hwmon;int error; +u32 reg;bool ts_attached; ts =devm_kzalloc (dev,sizeof (struct sun4i_ts_data ),GFP_KERNEL );@@ -258,6 +254,25 @@ static int sun4i_ts_probe(struct platform_device *pdev) ts->dev = dev; ts->ignore_fifo_data = true; ts->temp_data =-1 ; +if (of_device_is_compatible (np,"allwinner,sun6i-a31-ts" )) { +/* Allwinner SDK has temperature = -271 + (value / 6) (C) */ + ts->temp_offset =1626 ; + ts->temp_step =167 ; + }else { +/* +* The user manuals do not contain the formula for calculating +* the temperature. The formula used here is from the AXP209, +* which is designed by X-Powers, an affiliate of Allwinner: +* +* temperature = -144.7 + (value * 0.1) +* +* Allwinner does not have any documentation whatsoever for +* this hardware. Moreover, it is claimed that the sensor +* is inaccurate and cannot work properly. +*/ + ts->temp_offset =1447 ; + ts->temp_step =100 ; + } ts_attached =of_property_read_bool (np,"allwinner,ts-attached" );if (ts_attached) {@@ -314,8 +329,12 @@ static int sun4i_ts_probe(struct platform_device *pdev)* Set stylus up debounce to aprox 10 ms, enable debounce, and * finally enable tp mode. */ -writel (STYLUS_UP_DEBOUN (5 ) |STYLUS_UP_DEBOUN_EN (1 ) |TP_MODE_EN (1 ), - ts->base +TP_CTRL1 ); + reg =STYLUS_UP_DEBOUN (5 ) |STYLUS_UP_DEBOUN_EN (1 ); +if (of_device_is_compatible (np,"allwinner,sun4i-a10-ts" )) + reg |=TP_MODE_EN (1 ); +else + reg |=SUN6I_TP_MODE_EN (1 ); +writel (reg, ts->base +TP_CTRL1 );/* * The thermal core does not register hwmon devices for DT-based @@ -364,6 +383,7 @@ static int sun4i_ts_remove(struct platform_device *pdev)static const struct of_device_id sun4i_ts_of_match[] = { { .compatible ="allwinner,sun4i-a10-ts" , }, + { .compatible ="allwinner,sun6i-a31-ts" , }, {/* sentinel */ } };MODULE_DEVICE_TABLE (of, sun4i_ts_of_match);Signature · 1 line
2.1.4
Signature · 1 line
Dmitry
PATCH 2/2 ARM: dts: sun6i: Add resistive touchscreen controller node to dtsi
In reply to Chen-Yu TsaiNow that we support the sun6i variant of the touchscreen controller, add the device node to the dtsi so we can use it.
--- arch/arm/boot/dts/sun6i-a31.dtsi | 7 +++++++ 1 file changed, 7 insertions(+)
arch/arm/boot/dts/sun6i-a31.dtsi +7 -0
@@ -664,6 +664,13 @@ reg = <0x01c20ca0 0x20>; }; + rtp: rtp at 01c25000 { + compatible = "allwinner,sun6i-a31-ts"; + reg = <0x01c25000 0x100>; + interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>; + #thermal-sensor-cells = <0>; + }; + uart0: serial at 01c28000 { compatible = "snps,dw-apb-uart"; reg = <0x01c28000 0x400>;
Signature · 1 line
2.1.4
Maxime Ripard
AppliedPATCH 2/2 ARM: dts: sun6i: Add resistive touchscreen controller node to dtsi
Quoted 4 lines · Chen-Yu Tsai
Now that we support the sun6i variant of the touchscreen controller, add the device node to the dtsi so we can use it.
Signed-off-by Chen-Yu Tsai <[email protected]>
Applied, thanks,
Maxime
Signature · 10 lines
Maxime Ripard, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 819 bytes Desc: Digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20150124/d89d02be/attachment.sig>