[Armadeus-commitlog] armadeus branch, master, updated. release-3.3-248-gd42b580
Brought to you by:
sszy
|
From: Julien B a. A. <ar...@us...> - 2011-01-20 19:42:11
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "armadeus".
The branch, master has been updated
via d42b5801ca3ce61773c3cec3bad1292c7b9bfa17 (commit)
from 64726330eb8457081a04495cb12476bd59b60b57 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit d42b5801ca3ce61773c3cec3bad1292c7b9bfa17
Author: Julien Boibessot <jul...@ar...>
Date: Thu Jan 20 20:39:53 2011 +0100
[LINUX] [2.6.38] Updates wm831x driver to state of the art
-----------------------------------------------------------------------
Summary of changes:
...-Add-driver-for-Wolfson-WM831x-PMIC-touch.patch | 145 +++++++++++++++-----
...n-Input-wm831x-Handles_pen_down_interrupt.patch | 115 ----------------
...data_interrupt_when_using_external_signal.patch | 118 ----------------
...cknowledgement-of-WM831x-touchscreen-IRQs.patch | 31 ++++
...ng_external_signal_for_pen_down_interrupt.patch | 115 ----------------
...rt_when_pen_down_is_detected_isnt_working.patch | 43 ------
...deus-input-wm831x-makes_touch_driver_work.patch | 84 +++++++++++
.../417-armadeus-input-wm831x-driver_hacks.patch | 26 +---
8 files changed, 228 insertions(+), 449 deletions(-)
delete mode 100644 buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/413-wolfson-Input-wm831x-Handles_pen_down_interrupt.patch
delete mode 100644 buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/414-wolfson-Input-wm831x-Ack_data_interrupt_when_using_external_signal.patch
create mode 100644 buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/414-wolfson-mfd-Leave-acknowledgement-of-WM831x-touchscreen-IRQs.patch
delete mode 100644 buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/415-armadeus-Input-wm831x-Allows_using_external_signal_for_pen_down_interrupt.patch
delete mode 100644 buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/416-armadeus-Input-wm831x-Data_acquisition_start_when_pen_down_is_detected_isnt_working.patch
create mode 100644 buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/416-armadeus-input-wm831x-makes_touch_driver_work.patch
diff --git a/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/412-wolfson-Input-wm831x-Add-driver-for-Wolfson-WM831x-PMIC-touch.patch b/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/412-wolfson-Input-wm831x-Add-driver-for-Wolfson-WM831x-PMIC-touch.patch
index 8f28319..eec40f2 100644
--- a/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/412-wolfson-Input-wm831x-Add-driver-for-Wolfson-WM831x-PMIC-touch.patch
+++ b/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/412-wolfson-Input-wm831x-Add-driver-for-Wolfson-WM831x-PMIC-touch.patch
@@ -1,6 +1,6 @@
->From 57539f6fc8ebd6c11373b750450d3f0526c8522f Mon Sep 17 00:00:00 2001
+>From a449c9de202f2a970a1e1e856da19fb9531f7ded Mon Sep 17 00:00:00 2001
From: Mark Brown <br...@op...>
-Date: Fri, 10 Dec 2010 21:39:33 +0000
+Date: Fri, 14 Jan 2011 15:07:22 +0000
Subject: [PATCH] Input: wm831x - Add driver for Wolfson WM831x PMIC touchscreen controllers
Some of the WM831x series of PMICs from Wolfson Microelectronics include
@@ -9,8 +9,7 @@ within the input API.
Platform data is supported to allow configuration of system parameters such
as selection between four and five wire touchscreens and for specification
-of an optional direct to CPU IRQ to be used to report the availability of
-samples.
+of optional direct to CPU IRQs for sample availability and for pen down.
THIS DRIVER HAS NOT BEEN TESTED. NO GUARANTEES ARE MADE REGARDING THE
PERFORMANCE OR STABILITY OF THE DRIVER, IT IS EXPECTED THAT SOME DEBUGGING
@@ -20,12 +19,13 @@ Signed-off-by: Mark Brown <br...@op...>
---
drivers/input/touchscreen/Kconfig | 10 +
drivers/input/touchscreen/Makefile | 1 +
- drivers/input/touchscreen/wm831x-ts.c | 340 +++++++++++++++++++++++++++++++++
- 3 files changed, 351 insertions(+), 0 deletions(-)
+ drivers/input/touchscreen/wm831x-ts.c | 399 +++++++++++++++++++++++++++++++++
+ include/linux/mfd/wm831x/pdata.h | 1 +
+ 4 files changed, 411 insertions(+), 0 deletions(-)
create mode 100644 drivers/input/touchscreen/wm831x-ts.c
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
-index 6675bd7..b3b7596 100644
+index 0c9f4b1..f29dab7 100644
--- a/drivers/input/touchscreen/Kconfig
+++ b/drivers/input/touchscreen/Kconfig
@@ -423,6 +423,16 @@ config TOUCHSCREEN_UCB1400
@@ -46,10 +46,10 @@ index 6675bd7..b3b7596 100644
tristate "Support for WM97xx AC97 touchscreen controllers"
depends on AC97_BUS
diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile
-index 7cc1b4f..1a00395 100644
+index 718bcc8..e8dcfab 100644
--- a/drivers/input/touchscreen/Makefile
+++ b/drivers/input/touchscreen/Makefile
-@@ -47,6 +47,7 @@ obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN) += touchwin.o
+@@ -48,6 +48,7 @@ obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN) += touchwin.o
obj-$(CONFIG_TOUCHSCREEN_TSC2007) += tsc2007.o
obj-$(CONFIG_TOUCHSCREEN_UCB1400) += ucb1400_ts.o
obj-$(CONFIG_TOUCHSCREEN_WACOM_W8001) += wacom_w8001.o
@@ -59,10 +59,10 @@ index 7cc1b4f..1a00395 100644
wm97xx-ts-$(CONFIG_TOUCHSCREEN_WM9712) += wm9712.o
diff --git a/drivers/input/touchscreen/wm831x-ts.c b/drivers/input/touchscreen/wm831x-ts.c
new file mode 100644
-index 0000000..51d1863
+index 0000000..a424a80
--- /dev/null
+++ b/drivers/input/touchscreen/wm831x-ts.c
-@@ -0,0 +1,340 @@
+@@ -0,0 +1,399 @@
+/*
+ * wm831x-ts.c - Touchscreen driver for WM831x PMICs
+ *
@@ -85,6 +85,7 @@ index 0000000..51d1863
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/mfd/wm831x/core.h>
++#include <linux/mfd/wm831x/irq.h>
+#include <linux/mfd/wm831x/pdata.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
@@ -162,6 +163,8 @@ index 0000000..51d1863
+ struct input_dev *input_dev;
+ struct wm831x *wm831x;
+ int data_irq;
++ int pd_irq;
++ int rate;
+ bool pressure;
+};
+
@@ -174,6 +177,9 @@ index 0000000..51d1863
+ bool pen_down = true;
+ int count, i, ret;
+
++ wm831x_set_bits(wm831x, WM831X_INTERRUPT_STATUS_1,
++ WM831X_TCHDATA_EINT, WM831X_TCHDATA_EINT);
++
+ if (wm831x_ts->pressure)
+ count = 3;
+ else
@@ -191,16 +197,28 @@ index 0000000..51d1863
+ * individual reading does so.
+ */
+ for (i = 0; i < count; i++) {
++ if (!(data[i] & WM831X_TCH_PD)) {
++ pen_down = false;
++ continue;
++ }
+ input_report_abs(wm831x_ts->input_dev, data_types[i],
+ data[i] & WM831X_TCH_DATA_MASK);
-+ if (!data[i] & WM831X_TCH_PD)
-+ pen_down = false;
+ }
+
-+ if (pen_down) {
-+ input_report_key(wm831x_ts->input_dev, BTN_TOUCH, 1);
-+ } else {
-+ input_report_abs(wm831x_ts->input_dev, ABS_PRESSURE, 0);
++ if (!pen_down) {
++ /* Don't need data any more */
++ wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
++ WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA |
++ WM831X_TCH_Z_ENA, 0);
++
++ /* Drop the conversion rate while pen is up */
++ wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
++ WM831X_TCH_RATE_MASK, 0);
++
++ if (wm831x_ts->pressure)
++ input_report_abs(wm831x_ts->input_dev,
++ ABS_PRESSURE, 0);
++
+ input_report_key(wm831x_ts->input_dev, BTN_TOUCH, 0);
+ }
+
@@ -209,22 +227,45 @@ index 0000000..51d1863
+ return IRQ_HANDLED;
+}
+
-+static int wm831x_ts_input_open(struct input_dev *idev)
++static irqreturn_t wm831x_ts_pen_down_irq(int irq, void *irq_data)
+{
-+ struct wm831x_ts *wm831x_ts = input_get_drvdata(idev);
++ struct wm831x_ts *wm831x_ts = irq_data;
+ struct wm831x *wm831x = wm831x_ts->wm831x;
-+ u16 ena = 0;
++ int ena;
+
++ /* Raise conversion rate to normal rate */
++ wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
++ WM831X_TCH_RATE_MASK, wm831x_ts->rate);
++
++ /* Start collecting data */
+ if (wm831x_ts->pressure)
+ ena |= WM831X_TCH_Z_ENA;
++ else
++ ena = 0;
+
+ wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
-+ WM831X_TCH_ENA | WM831X_TCH_CVT_ENA |
-+ WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA |
-+ WM831X_TCH_Z_ENA,
-+ WM831X_TCH_ENA | WM831X_TCH_CVT_ENA |
-+ WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA |
-+ ena);
++ WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA | WM831X_TCH_Z_ENA,
++ WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA | ena);
++
++ input_report_key(wm831x_ts->input_dev, BTN_TOUCH, 1);
++ input_sync(wm831x_ts->input_dev);
++
++ wm831x_set_bits(wm831x, WM831X_INTERRUPT_STATUS_1,
++ WM831X_TCHPD_EINT, WM831X_TCHPD_EINT);
++
++ return IRQ_HANDLED;
++}
++
++static int wm831x_ts_input_open(struct input_dev *idev)
++{
++ struct wm831x_ts *wm831x_ts = input_get_drvdata(idev);
++ struct wm831x *wm831x = wm831x_ts->wm831x;
++
++ wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
++ WM831X_TCH_ENA, WM831X_TCH_ENA);
++
++ wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
++ WM831X_TCH_CVT_ENA, WM831X_TCH_CVT_ENA);
+
+ return 0;
+}
@@ -240,7 +281,7 @@ index 0000000..51d1863
+ WM831X_TCH_Z_ENA, 0);
+}
+
-+static int wm831x_ts_probe(struct platform_device *pdev)
++static __devinit int wm831x_ts_probe(struct platform_device *pdev)
+{
+ struct wm831x_ts *wm831x_ts;
+ struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
@@ -263,12 +304,18 @@ index 0000000..51d1863
+ /* If we have a direct CPU data IRQ use it, otherwise use
+ * the interrupt through the WM831x IRQ controller.
+ */
-+ if (pdata)
++ if (pdata && pdata->data_irq)
+ wm831x_ts->data_irq = pdata->data_irq;
+ else
+ wm831x_ts->data_irq = platform_get_irq_byname(pdev,
+ "TCHDATA");
+
++ if (pdata && pdata->pd_irq)
++ wm831x_ts->pd_irq = pdata->pd_irq;
++ else
++ wm831x_ts->data_irq = platform_get_irq_byname(pdev,
++ "TCHPD");
++
+ if (pdata && pdata->pressure)
+ wm831x_ts->pressure = true;
+ else
@@ -305,30 +352,39 @@ index 0000000..51d1863
+ }
+ }
+
-+ /* Convert only when pen down */
+ wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_2,
-+ WM831X_TCH_PDONLY, WM831X_TCH_PDONLY);
++ WM831X_TCH_PDONLY, 0);
+
+ /* Default to 192 samples/sec */
-+ wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
-+ WM831X_TCH_RATE_MASK, 12);
++ wm831x_ts->rate = 12;
+
+ ret = request_threaded_irq(wm831x_ts->data_irq, NULL,
+ wm831x_ts_data_irq,
+ IRQF_ONESHOT, /* Trigger */
+ "Touchscreen data", wm831x_ts);
+ if (ret < 0) {
-+ dev_err(&pdev->dev, "Failed to request IRQ %d: %d\n",
++ dev_err(&pdev->dev, "Failed to request data IRQ %d: %d\n",
+ wm831x_ts->data_irq, ret);
+ goto err_alloc;
+ }
+
++ ret = request_threaded_irq(wm831x_ts->pd_irq, NULL,
++ wm831x_ts_pen_down_irq,
++ IRQF_ONESHOT, /* Trigger */
++ "Touchscreen pen down", wm831x_ts);
++
++ if (ret < 0) {
++ dev_err(&pdev->dev, "Failed to request pen down IRQ %d: %d\n",
++ wm831x_ts->pd_irq, ret);
++ goto err_data_irq;
++ }
++
+ platform_set_drvdata(pdev, wm831x_ts);
+
+ input_dev = input_allocate_device();
+ if (input_dev == NULL) {
+ ret = -ENOMEM;
-+ goto err_irq;
++ goto err_pd_irq;
+ }
+ wm831x_ts->input_dev = input_dev;
+
@@ -358,7 +414,9 @@ index 0000000..51d1863
+
+err_dev_alloc:
+ input_free_device(input_dev);
-+err_irq:
++err_pd_irq:
++ free_irq(wm831x_ts->pd_irq, wm831x_ts);
++err_data_irq:
+ free_irq(wm831x_ts->data_irq, wm831x_ts);
+err_alloc:
+ kfree(wm831x_ts);
@@ -366,10 +424,11 @@ index 0000000..51d1863
+ return ret;
+}
+
-+static int wm831x_ts_remove(struct platform_device *pdev)
++static __devexit int wm831x_ts_remove(struct platform_device *pdev)
+{
+ struct wm831x_ts *wm831x_ts = platform_get_drvdata(pdev);
+
++ free_irq(wm831x_ts->pd_irq, wm831x_ts);
+ free_irq(wm831x_ts->data_irq, wm831x_ts);
+ input_unregister_device(wm831x_ts->input_dev);
+ kfree(wm831x_ts);
@@ -403,6 +462,18 @@ index 0000000..51d1863
+MODULE_DESCRIPTION("WM831x PMIC touchscreen driver");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:wm831x-touch");
+diff --git a/include/linux/mfd/wm831x/pdata.h b/include/linux/mfd/wm831x/pdata.h
+index 1ae8499..c6746e8 100644
+--- a/include/linux/mfd/wm831x/pdata.h
++++ b/include/linux/mfd/wm831x/pdata.h
+@@ -81,6 +81,7 @@ struct wm831x_touch_pdata {
+ int rpu; /** Pen down sensitivity resistor divider */
+ int pressure; /** Report pressure (boolean) */
+ int data_irq; /** Touch data ready IRQ */
++ int pd_irq; /** Touch pendown detect IRQ */
+ };
+
+ enum wm831x_watchdog_action {
--
-1.7.1
+1.7.2.3
diff --git a/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/413-wolfson-Input-wm831x-Handles_pen_down_interrupt.patch b/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/413-wolfson-Input-wm831x-Handles_pen_down_interrupt.patch
deleted file mode 100644
index 6bf7f26..0000000
--- a/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/413-wolfson-Input-wm831x-Handles_pen_down_interrupt.patch
+++ /dev/null
@@ -1,115 +0,0 @@
-Handles Pen_Down interrupt.
-
-Signed-off-by: Mark Brown <br...@op...>
-
-diff --git a/drivers/input/touchscreen/wm831x-ts.c b/drivers/input/touchscreen/wm831x-ts.c
-index 51d1863..3617748 100644
---- a/drivers/input/touchscreen/wm831x-ts.c
-+++ b/drivers/input/touchscreen/wm831x-ts.c
-@@ -126,16 +126,21 @@ static irqreturn_t wm831x_ts_data_irq(int irq, void *irq_data)
- * individual reading does so.
- */
- for (i = 0; i < count; i++) {
-+ if (!(data[i] & WM831X_TCH_PD)) {
-+ pen_down = false;
-+ continue;
-+ }
- input_report_abs(wm831x_ts->input_dev, data_types[i],
- data[i] & WM831X_TCH_DATA_MASK);
-- if (!data[i] & WM831X_TCH_PD)
-- pen_down = false;
- }
-
-- if (pen_down) {
-- input_report_key(wm831x_ts->input_dev, BTN_TOUCH, 1);
-- } else {
-- input_report_abs(wm831x_ts->input_dev, ABS_PRESSURE, 0);
-+ if (!pen_down) {
-+ wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
-+ WM831X_TCH_CVT_ENA, 0);
-+
-+ if (wm831x_ts->pressure)
-+ input_report_abs(wm831x_ts->input_dev,
-+ ABS_PRESSURE, 0);
- input_report_key(wm831x_ts->input_dev, BTN_TOUCH, 0);
- }
-
-@@ -144,6 +149,20 @@ static irqreturn_t wm831x_ts_data_irq(int irq, void *irq_data)
- return IRQ_HANDLED;
- }
-
-+static irqreturn_t wm831x_ts_pen_down_irq(int irq, void *irq_data)
-+{
-+ struct wm831x_ts *wm831x_ts = irq_data;
-+ struct wm831x *wm831x = wm831x_ts->wm831x;
-+
-+ wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
-+ WM831X_TCH_CVT_ENA, WM831X_TCH_CVT_ENA);
-+
-+ input_report_key(wm831x_ts->input_dev, BTN_TOUCH, 1);
-+ input_sync(wm831x_ts->input_dev);
-+
-+ return IRQ_HANDLED;
-+}
-+
- static int wm831x_ts_input_open(struct input_dev *idev)
- {
- struct wm831x_ts *wm831x_ts = input_get_drvdata(idev);
-@@ -154,11 +173,9 @@ static int wm831x_ts_input_open(struct input_dev *idev)
- ena |= WM831X_TCH_Z_ENA;
-
- wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
-- WM831X_TCH_ENA | WM831X_TCH_CVT_ENA |
-- WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA |
-+ WM831X_TCH_ENA | WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA |
- WM831X_TCH_Z_ENA,
-- WM831X_TCH_ENA | WM831X_TCH_CVT_ENA |
-- WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA |
-+ WM831X_TCH_ENA | WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA |
- ena);
-
- return 0;
-@@ -258,12 +275,23 @@ static int wm831x_ts_probe(struct platform_device *pdev)
- goto err_alloc;
- }
-
-+ ret = request_threaded_irq(platform_get_irq_byname(pdev,
-+ "TCHPD"),
-+ NULL, wm831x_ts_pen_down_irq,
-+ IRQF_ONESHOT, /* Trigger */
-+ "Touchscreen pen down", wm831x_ts);
-+ if (ret < 0) {
-+ dev_err(&pdev->dev, "Failed to request pen down IRQ: %d\n",
-+ ret);
-+ goto err_data_irq;
-+ }
-+
- platform_set_drvdata(pdev, wm831x_ts);
-
- input_dev = input_allocate_device();
- if (input_dev == NULL) {
- ret = -ENOMEM;
-- goto err_irq;
-+ goto err_pd_irq;
- }
- wm831x_ts->input_dev = input_dev;
-
-@@ -293,7 +321,9 @@ static int wm831x_ts_probe(struct platform_device *pdev)
-
- err_dev_alloc:
- input_free_device(input_dev);
--err_irq:
-+err_pd_irq:
-+ free_irq(platform_get_irq_byname(pdev, "TCHPD"), wm831x_ts);
-+err_data_irq:
- free_irq(wm831x_ts->data_irq, wm831x_ts);
- err_alloc:
- kfree(wm831x_ts);
-@@ -305,6 +335,7 @@ static int wm831x_ts_remove(struct platform_device *pdev)
- {
- struct wm831x_ts *wm831x_ts = platform_get_drvdata(pdev);
-
-+ free_irq(platform_get_irq_byname(pdev, "TCHPD"), wm831x_ts);
- free_irq(wm831x_ts->data_irq, wm831x_ts);
- input_unregister_device(wm831x_ts->input_dev);
- kfree(wm831x_ts);
diff --git a/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/414-wolfson-Input-wm831x-Ack_data_interrupt_when_using_external_signal.patch b/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/414-wolfson-Input-wm831x-Ack_data_interrupt_when_using_external_signal.patch
deleted file mode 100644
index 3bed2a7..0000000
--- a/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/414-wolfson-Input-wm831x-Ack_data_interrupt_when_using_external_signal.patch
+++ /dev/null
@@ -1,118 +0,0 @@
-If we're using a direct signal for the data IRQ we still need to ack the
-interrupt.
-
-Signed-off-by: Mark Brown <br...@op...>
-
-diff --git a/drivers/input/touchscreen/wm831x-ts.c b/drivers/input/touchscreen/wm831x-ts.c
-index 3617748..833979c 100644
---- a/drivers/input/touchscreen/wm831x-ts.c
-+++ b/drivers/input/touchscreen/wm831x-ts.c
-@@ -20,6 +20,7 @@
- #include <linux/interrupt.h>
- #include <linux/io.h>
- #include <linux/mfd/wm831x/core.h>
-+#include <linux/mfd/wm831x/irq.h>
- #include <linux/mfd/wm831x/pdata.h>
- #include <linux/platform_device.h>
- #include <linux/slab.h>
-@@ -146,6 +147,13 @@ static irqreturn_t wm831x_ts_data_irq(int irq, void *irq_data)
-
- input_sync(wm831x_ts->input_dev);
-
-+ /* If we're using a direct signal for the data IRQ we still need
-+ * to ack the interrupt.
-+ */
-+ if (wm831x_ts->data_irq)
-+ wm831x_set_bits(wm831x, WM831X_INTERRUPT_STATUS_1,
-+ WM831X_TCHDATA_EINT, WM831X_TCHDATA_EINT);
-+
- return IRQ_HANDLED;
- }
-
-@@ -169,14 +177,15 @@ static int wm831x_ts_input_open(struct input_dev *idev)
- struct wm831x *wm831x = wm831x_ts->wm831x;
- u16 ena = 0;
-
-+ wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
-+ WM831X_TCH_ENA, WM831X_TCH_ENA);
-+
- if (wm831x_ts->pressure)
- ena |= WM831X_TCH_Z_ENA;
-
- wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
-- WM831X_TCH_ENA | WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA |
-- WM831X_TCH_Z_ENA,
-- WM831X_TCH_ENA | WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA |
-- ena);
-+ WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA | WM831X_TCH_Z_ENA,
-+ WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA | ena);
-
- return 0;
- }
-@@ -217,9 +226,6 @@ static int wm831x_ts_probe(struct platform_device *pdev)
- */
- if (pdata)
- wm831x_ts->data_irq = pdata->data_irq;
-- else
-- wm831x_ts->data_irq = platform_get_irq_byname(pdev,
-- "TCHDATA");
-
- if (pdata && pdata->pressure)
- wm831x_ts->pressure = true;
-@@ -257,18 +263,24 @@ static int wm831x_ts_probe(struct platform_device *pdev)
- }
- }
-
-- /* Convert only when pen down */
- wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_2,
-- WM831X_TCH_PDONLY, WM831X_TCH_PDONLY);
-+ WM831X_TCH_PDONLY, 0);
-
-- /* Default to 192 samples/sec */
-+ /* Default to 112 samples/sec */
- wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
-- WM831X_TCH_RATE_MASK, 12);
-+ WM831X_TCH_RATE_MASK, 6);
-
-- ret = request_threaded_irq(wm831x_ts->data_irq, NULL,
-- wm831x_ts_data_irq,
-- IRQF_ONESHOT, /* Trigger */
-- "Touchscreen data", wm831x_ts);
-+ if (wm831x_ts->data_irq)
-+ ret = request_threaded_irq(wm831x_ts->data_irq, NULL,
-+ wm831x_ts_data_irq,
-+ IRQF_ONESHOT, /* Trigger */
-+ "Touchscreen data", wm831x_ts);
-+ else
-+ ret = request_threaded_irq(platform_get_irq_byname(pdev,
-+ "TCHDATA"),
-+ NULL, wm831x_ts_data_irq,
-+ IRQF_ONESHOT, /* Trigger */
-+ "Touchscreen data", wm831x_ts);
- if (ret < 0) {
- dev_err(&pdev->dev, "Failed to request IRQ %d: %d\n",
- wm831x_ts->data_irq, ret);
-@@ -324,7 +336,10 @@ err_dev_alloc:
- err_pd_irq:
- free_irq(platform_get_irq_byname(pdev, "TCHPD"), wm831x_ts);
- err_data_irq:
-- free_irq(wm831x_ts->data_irq, wm831x_ts);
-+ if (wm831x_ts->data_irq)
-+ free_irq(wm831x_ts->data_irq, wm831x_ts);
-+ else
-+ free_irq(platform_get_irq_byname(pdev, "TCHDATA"), wm831x_ts);
- err_alloc:
- kfree(wm831x_ts);
-
-@@ -336,7 +351,10 @@ static int wm831x_ts_remove(struct platform_device *pdev)
- struct wm831x_ts *wm831x_ts = platform_get_drvdata(pdev);
-
- free_irq(platform_get_irq_byname(pdev, "TCHPD"), wm831x_ts);
-- free_irq(wm831x_ts->data_irq, wm831x_ts);
-+ if (wm831x_ts->data_irq)
-+ free_irq(wm831x_ts->data_irq, wm831x_ts);
-+ else
-+ free_irq(platform_get_irq_byname(pdev, "TCHDATA"), wm831x_ts);
- input_unregister_device(wm831x_ts->input_dev);
- kfree(wm831x_ts);
-
diff --git a/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/414-wolfson-mfd-Leave-acknowledgement-of-WM831x-touchscreen-IRQs.patch b/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/414-wolfson-mfd-Leave-acknowledgement-of-WM831x-touchscreen-IRQs.patch
new file mode 100644
index 0000000..f1371cc
--- /dev/null
+++ b/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/414-wolfson-mfd-Leave-acknowledgement-of-WM831x-touchscreen-IRQs.patch
@@ -0,0 +1,31 @@
+>From c0ddb6e52161faaa4d88967fe955fd9df5bac477 Mon Sep 17 00:00:00 2001
+From: Mark Brown <br...@op...>
+Date: Mon, 10 Jan 2011 18:15:56 +0000
+Subject: [PATCH 2/2] mfd: Leave acknowledgement of WM831x touchscreen IRQs to the driver
+
+The WM831x touchscreen interrupts need acknowledgement even when using
+direct signals to the CPU (which don't go through the core) so leave
+the acknowledgement up to the touchscreen driver for simplicity.
+
+Signed-off-by: Mark Brown <br...@op...>
+---
+ drivers/mfd/wm831x-irq.c | 3 +++
+ 1 files changed, 3 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/mfd/wm831x-irq.c b/drivers/mfd/wm831x-irq.c
+index 0d3cda4..2f26f80 100644
+--- a/drivers/mfd/wm831x-irq.c
++++ b/drivers/mfd/wm831x-irq.c
+@@ -481,6 +481,9 @@ static irqreturn_t wm831x_irq_thread(int irq, void *data)
+ }
+
+ out:
++ /* Touchscreen interrupts are handled specially in the driver */
++ status_regs[0] &= ~(WM831X_TCHDATA_EINT | WM831X_TCHPD_EINT);
++
+ for (i = 0; i < ARRAY_SIZE(status_regs); i++) {
+ if (status_regs[i])
+ wm831x_reg_write(wm831x, WM831X_INTERRUPT_STATUS_1 + i,
+--
+1.7.2.3
+
diff --git a/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/415-armadeus-Input-wm831x-Allows_using_external_signal_for_pen_down_interrupt.patch b/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/415-armadeus-Input-wm831x-Allows_using_external_signal_for_pen_down_interrupt.patch
deleted file mode 100644
index d543d27..0000000
--- a/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/415-armadeus-Input-wm831x-Allows_using_external_signal_for_pen_down_interrupt.patch
+++ /dev/null
@@ -1,115 +0,0 @@
-Handles pen_down interrupt from a direct signal too.
-
-Signed-off-by: Julien Boibessot <jul...@ar...>
-
-Index: linux-2.6.38-alpha/drivers/input/touchscreen/wm831x-ts.c
-===================================================================
---- linux-2.6.38-alpha.orig/drivers/input/touchscreen/wm831x-ts.c 2011-01-03 18:02:37.000000000 +0100
-+++ linux-2.6.38-alpha/drivers/input/touchscreen/wm831x-ts.c 2011-01-03 20:49:49.000000000 +0100
-@@ -98,6 +98,7 @@
- struct input_dev *input_dev;
- struct wm831x *wm831x;
- int data_irq;
-+ int pd_irq;
- bool pressure;
- };
-
-@@ -168,6 +169,13 @@
- input_report_key(wm831x_ts->input_dev, BTN_TOUCH, 1);
- input_sync(wm831x_ts->input_dev);
-
-+ /* If we're using a direct signal for the pen_down IRQ we still need
-+ * to ack the interrupt.
-+ */
-+ if (wm831x_ts->pd_irq)
-+ wm831x_set_bits(wm831x, WM831X_INTERRUPT_STATUS_1,
-+ WM831X_TCHPD_EINT, WM831X_TCHPD_EINT);
-+
- return IRQ_HANDLED;
- }
-
-@@ -224,9 +232,12 @@
- /* If we have a direct CPU data IRQ use it, otherwise use
- * the interrupt through the WM831x IRQ controller.
- */
-- if (pdata)
-+ if (pdata && pdata->data_irq)
- wm831x_ts->data_irq = pdata->data_irq;
-
-+ if (pdata && pdata->pd_irq)
-+ wm831x_ts->pd_irq = pdata->pd_irq;
-+
- if (pdata && pdata->pressure)
- wm831x_ts->pressure = true;
- else
-@@ -282,19 +293,26 @@
- IRQF_ONESHOT, /* Trigger */
- "Touchscreen data", wm831x_ts);
- if (ret < 0) {
-- dev_err(&pdev->dev, "Failed to request IRQ %d: %d\n",
-+ dev_err(&pdev->dev, "Failed to request data IRQ %d: %d\n",
- wm831x_ts->data_irq, ret);
- goto err_alloc;
- }
-
-- ret = request_threaded_irq(platform_get_irq_byname(pdev,
-- "TCHPD"),
-- NULL, wm831x_ts_pen_down_irq,
-- IRQF_ONESHOT, /* Trigger */
-- "Touchscreen pen down", wm831x_ts);
-+ if (wm831x_ts->pd_irq)
-+ ret = request_threaded_irq(wm831x_ts->pd_irq, NULL,
-+ wm831x_ts_pen_down_irq,
-+ IRQF_ONESHOT, /* Trigger */
-+ "Touchscreen pen down", wm831x_ts);
-+ else
-+ ret = request_threaded_irq(platform_get_irq_byname(pdev,
-+ "TCHPD"),
-+ NULL, wm831x_ts_pen_down_irq,
-+ IRQF_ONESHOT, /* Trigger */
-+ "Touchscreen pen down", wm831x_ts);
-+
- if (ret < 0) {
-- dev_err(&pdev->dev, "Failed to request pen down IRQ: %d\n",
-- ret);
-+ dev_err(&pdev->dev, "Failed to request pen down IRQ: %d %d\n",
-+ wm831x_ts->pd_irq, ret);
- goto err_data_irq;
- }
-
-@@ -334,7 +352,10 @@
- err_dev_alloc:
- input_free_device(input_dev);
- err_pd_irq:
-- free_irq(platform_get_irq_byname(pdev, "TCHPD"), wm831x_ts);
-+ if (wm831x_ts->pd_irq)
-+ free_irq(wm831x_ts->pd_irq, wm831x_ts);
-+ else
-+ free_irq(platform_get_irq_byname(pdev, "TCHPD"), wm831x_ts);
- err_data_irq:
- if (wm831x_ts->data_irq)
- free_irq(wm831x_ts->data_irq, wm831x_ts);
-@@ -350,7 +371,10 @@
- {
- struct wm831x_ts *wm831x_ts = platform_get_drvdata(pdev);
-
-- free_irq(platform_get_irq_byname(pdev, "TCHPD"), wm831x_ts);
-+ if (wm831x_ts->pd_irq)
-+ free_irq(wm831x_ts->pd_irq, wm831x_ts);
-+ else
-+ free_irq(platform_get_irq_byname(pdev, "TCHPD"), wm831x_ts);
- if (wm831x_ts->data_irq)
- free_irq(wm831x_ts->data_irq, wm831x_ts);
- else
-Index: linux-2.6.38-alpha/include/linux/mfd/wm831x/pdata.h
-===================================================================
---- linux-2.6.38-alpha.orig/include/linux/mfd/wm831x/pdata.h 2010-12-14 09:55:53.000000000 +0100
-+++ linux-2.6.38-alpha/include/linux/mfd/wm831x/pdata.h 2011-01-03 20:49:02.000000000 +0100
-@@ -81,6 +81,7 @@
- int rpu; /** Pen down sensitivity resistor divider */
- int pressure; /** Report pressure (boolean) */
- int data_irq; /** Touch data ready IRQ */
-+ int pd_irq; /** Touch pendown detect IRQ */
- };
-
- enum wm831x_watchdog_action {
diff --git a/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/416-armadeus-Input-wm831x-Data_acquisition_start_when_pen_down_is_detected_isnt_working.patch b/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/416-armadeus-Input-wm831x-Data_acquisition_start_when_pen_down_is_detected_isnt_working.patch
deleted file mode 100644
index df98cf1..0000000
--- a/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/416-armadeus-Input-wm831x-Data_acquisition_start_when_pen_down_is_detected_isnt_working.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-Feature is not working so don't use it (for the moment).
-
-Signed-off-by: Julien Boibessot <jul...@ar...>
-
-Index: linux-2.6.38-alpha/drivers/input/touchscreen/wm831x-ts.c
-===================================================================
---- linux-2.6.38-alpha.orig/drivers/input/touchscreen/wm831x-ts.c 2011-01-04 10:06:40.000000000 +0100
-+++ linux-2.6.38-alpha/drivers/input/touchscreen/wm831x-ts.c 2011-01-05 15:28:12.000000000 +0100
-@@ -137,9 +137,9 @@
- }
-
- if (!pen_down) {
-- wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
-+/* wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
- WM831X_TCH_CVT_ENA, 0);
--
-+*/
- if (wm831x_ts->pressure)
- input_report_abs(wm831x_ts->input_dev,
- ABS_PRESSURE, 0);
-@@ -163,9 +163,9 @@
- struct wm831x_ts *wm831x_ts = irq_data;
- struct wm831x *wm831x = wm831x_ts->wm831x;
-
-- wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
-+/* wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
- WM831X_TCH_CVT_ENA, WM831X_TCH_CVT_ENA);
--
-+*/
- input_report_key(wm831x_ts->input_dev, BTN_TOUCH, 1);
- input_sync(wm831x_ts->input_dev);
-
-@@ -192,8 +192,8 @@
- ena |= WM831X_TCH_Z_ENA;
-
- wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
-- WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA | WM831X_TCH_Z_ENA,
-- WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA | ena);
-+ WM831X_TCH_CVT_ENA | WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA | WM831X_TCH_Z_ENA,
-+ WM831X_TCH_CVT_ENA | WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA | ena);
-
- return 0;
- }
diff --git a/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/416-armadeus-input-wm831x-makes_touch_driver_work.patch b/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/416-armadeus-input-wm831x-makes_touch_driver_work.patch
new file mode 100644
index 0000000..f1ae70a
--- /dev/null
+++ b/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/416-armadeus-input-wm831x-makes_touch_driver_work.patch
@@ -0,0 +1,84 @@
+Index: linux-2.6.38-alpha/drivers/input/touchscreen/wm831x-ts.c
+===================================================================
+--- linux-2.6.38-alpha.orig/drivers/input/touchscreen/wm831x-ts.c 2011-01-20 20:29:00.000000000 +0100
++++ linux-2.6.38-alpha/drivers/input/touchscreen/wm831x-ts.c 2011-01-20 20:29:10.000000000 +0100
+@@ -101,6 +101,7 @@
+ int pd_irq;
+ int rate;
+ bool pressure;
++ int pd_detected;
+ };
+
+ static irqreturn_t wm831x_ts_data_irq(int irq, void *irq_data)
+@@ -140,7 +141,7 @@
+ data[i] & WM831X_TCH_DATA_MASK);
+ }
+
+- if (!pen_down) {
++ if ((!pen_down) && (wm831x_ts->pd_detected)) {
+ /* Don't need data any more */
+ wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
+ WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA |
+@@ -148,13 +149,14 @@
+
+ /* Drop the conversion rate while pen is up */
+ wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
+- WM831X_TCH_RATE_MASK, 0);
++ WM831X_TCH_RATE_MASK, 1);
+
+ if (wm831x_ts->pressure)
+ input_report_abs(wm831x_ts->input_dev,
+ ABS_PRESSURE, 0);
+
+ input_report_key(wm831x_ts->input_dev, BTN_TOUCH, 0);
++ wm831x_ts->pd_detected = 0;
+ }
+
+ input_sync(wm831x_ts->input_dev);
+@@ -166,7 +168,7 @@
+ {
+ struct wm831x_ts *wm831x_ts = irq_data;
+ struct wm831x *wm831x = wm831x_ts->wm831x;
+- int ena;
++ int ena = 0;
+
+ /* Raise conversion rate to normal rate */
+ wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
+@@ -175,8 +177,6 @@
+ /* Start collecting data */
+ if (wm831x_ts->pressure)
+ ena |= WM831X_TCH_Z_ENA;
+- else
+- ena = 0;
+
+ wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
+ WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA | WM831X_TCH_Z_ENA,
+@@ -185,6 +185,7 @@
+ input_report_key(wm831x_ts->input_dev, BTN_TOUCH, 1);
+ input_sync(wm831x_ts->input_dev);
+
++ wm831x_ts->pd_detected = 1;
+ wm831x_set_bits(wm831x, WM831X_INTERRUPT_STATUS_1,
+ WM831X_TCHPD_EINT, WM831X_TCHPD_EINT);
+
+@@ -248,7 +249,7 @@
+ if (pdata && pdata->pd_irq)
+ wm831x_ts->pd_irq = pdata->pd_irq;
+ else
+- wm831x_ts->data_irq = platform_get_irq_byname(pdev,
++ wm831x_ts->pd_irq = platform_get_irq_byname(pdev,
+ "TCHPD");
+
+ if (pdata && pdata->pressure)
+@@ -290,8 +291,10 @@
+ wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_2,
+ WM831X_TCH_PDONLY, 0);
+
+- /* Default to 192 samples/sec */
++ /* Default to 192 samples/sec when active and 16/sec when inactive */
+ wm831x_ts->rate = 12;
++ wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
++ WM831X_TCH_RATE_MASK, 1);
+
+ ret = request_threaded_irq(wm831x_ts->data_irq, NULL,
+ wm831x_ts_data_irq,
diff --git a/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/417-armadeus-input-wm831x-driver_hacks.patch b/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/417-armadeus-input-wm831x-driver_hacks.patch
index 205d7ef..cb07d96 100644
--- a/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/417-armadeus-input-wm831x-driver_hacks.patch
+++ b/buildroot/target/device/armadeus/linux/kernel-patches/2.6.38/417-armadeus-input-wm831x-driver_hacks.patch
@@ -2,9 +2,9 @@ Signed-off-by: Julien Boibessot <jul...@ar...>
Index: linux-2.6.38-alpha/drivers/input/touchscreen/wm831x-ts.c
===================================================================
---- linux-2.6.38-alpha.orig/drivers/input/touchscreen/wm831x-ts.c 2011-01-03 21:42:27.000000000 +0100
-+++ linux-2.6.38-alpha/drivers/input/touchscreen/wm831x-ts.c 2011-01-03 22:01:20.000000000 +0100
-@@ -218,6 +218,7 @@
+--- linux-2.6.38-alpha.orig/drivers/input/touchscreen/wm831x-ts.c 2011-01-20 20:29:10.000000000 +0100
++++ linux-2.6.38-alpha/drivers/input/touchscreen/wm831x-ts.c 2011-01-20 20:29:22.000000000 +0100
+@@ -226,6 +226,7 @@
struct input_dev *input_dev;
int ret;
@@ -12,7 +12,7 @@ Index: linux-2.6.38-alpha/drivers/input/touchscreen/wm831x-ts.c
wm831x_ts = kzalloc(sizeof(struct wm831x_ts), GFP_KERNEL);
if (!wm831x_ts)
return -ENOMEM;
-@@ -248,7 +249,7 @@
+@@ -262,7 +263,7 @@
wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_2,
WM831X_TCH_5WIRE, WM831X_TCH_5WIRE);
@@ -21,23 +21,7 @@ Index: linux-2.6.38-alpha/drivers/input/touchscreen/wm831x-ts.c
WARN_ON(pdata->pressure && pdata->fivewire);
wm831x_ts->pressure = false;
} else {
-@@ -274,12 +275,13 @@
- }
- }
-
-+ /* "Convert only when pen down" isn't working (yet) so don't use it */
- wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_2,
- WM831X_TCH_PDONLY, 0);
-
-- /* Default to 112 samples/sec */
-+ /* Default to 64 samples/sec */
- wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
-- WM831X_TCH_RATE_MASK, 6);
-+ WM831X_TCH_RATE_MASK, 4);
-
- if (wm831x_ts->data_irq)
- ret = request_threaded_irq(wm831x_ts->data_irq, NULL,
-@@ -318,6 +320,17 @@
+@@ -319,6 +320,17 @@
platform_set_drvdata(pdev, wm831x_ts);
hooks/post-receive
--
armadeus
|