Skip to contentSkip to conversation

Input: sun4i-ts: Support touchpanel controller on A31

PATCH New Chen-Yu Tsai 3 participants 5 messages Jan 24, 2015 – Jan 27, 2015

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

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
#1 lore raw

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
index a8405bab6c00..433332d3b2ba 100644
@@ -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
maintainer Applied
#2 lore raw

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.

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
index a8405bab6c00..433332d3b2ba 100644
@@ -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
index 9ae53d4289fb..b93a28b955fd 100644
@@ -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
#3 lore raw

PATCH 2/2 ARM: dts: sun6i: Add resistive touchscreen controller node to dtsi

In reply to 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.

---
 arch/arm/boot/dts/sun6i-a31.dtsi | 7 +++++++
 1 file changed, 7 insertions(+)
arch/arm/boot/dts/sun6i-a31.dtsi +7 -0
index 188f59e558bc..ec70454b0add 100644
@@ -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
#4 lore raw

PATCH 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.

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>