提交 b833306f 编写于 作者: M Marek Vasut 提交者: Dmitry Torokhov

Input: wm97xx - add Palm support to Mainstone accelerated touch

This patch refactors the Mainstone accelerated touch code a little and
adds support for interrupt driven touchscreen on Palm LifeDrive, TX and
Tungsten T5.
Signed-off-by: NMarek Vasut <marek.vasut@gmail.com>
Acked-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
上级 b7788c5f
...@@ -366,11 +366,11 @@ config TOUCHSCREEN_WM97XX_ATMEL ...@@ -366,11 +366,11 @@ config TOUCHSCREEN_WM97XX_ATMEL
be called atmel-wm97xx. be called atmel-wm97xx.
config TOUCHSCREEN_WM97XX_MAINSTONE config TOUCHSCREEN_WM97XX_MAINSTONE
tristate "WM97xx Mainstone accelerated touch" tristate "WM97xx Mainstone/Palm accelerated touch"
depends on TOUCHSCREEN_WM97XX && ARCH_PXA depends on TOUCHSCREEN_WM97XX && ARCH_PXA
help help
Say Y here for support for streaming mode with WM97xx touchscreens Say Y here for support for streaming mode with WM97xx touchscreens
on Mainstone systems. on Mainstone, Palm Tungsten T5, TX and LifeDrive systems.
If unsure, say N. If unsure, say N.
......
...@@ -31,9 +31,11 @@ ...@@ -31,9 +31,11 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/wm97xx.h> #include <linux/wm97xx.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/gpio.h>
#include <mach/regs-ac97.h> #include <mach/regs-ac97.h>
#define VERSION "0.13" #include <asm/mach-types.h>
struct continuous { struct continuous {
u16 id; /* codec id */ u16 id; /* codec id */
...@@ -62,6 +64,7 @@ static const struct continuous cinfo[] = { ...@@ -62,6 +64,7 @@ static const struct continuous cinfo[] = {
/* continuous speed index */ /* continuous speed index */
static int sp_idx; static int sp_idx;
static u16 last, tries; static u16 last, tries;
static int irq;
/* /*
* Pen sampling frequency (Hz) in continuous mode. * Pen sampling frequency (Hz) in continuous mode.
...@@ -171,7 +174,7 @@ static int wm97xx_acc_pen_down(struct wm97xx *wm) ...@@ -171,7 +174,7 @@ static int wm97xx_acc_pen_down(struct wm97xx *wm)
static int wm97xx_acc_startup(struct wm97xx *wm) static int wm97xx_acc_startup(struct wm97xx *wm)
{ {
int idx = 0; int idx = 0, ret = 0;
/* check we have a codec */ /* check we have a codec */
if (wm->ac97 == NULL) if (wm->ac97 == NULL)
...@@ -191,18 +194,37 @@ static int wm97xx_acc_startup(struct wm97xx *wm) ...@@ -191,18 +194,37 @@ static int wm97xx_acc_startup(struct wm97xx *wm)
"mainstone accelerated touchscreen driver, %d samples/sec\n", "mainstone accelerated touchscreen driver, %d samples/sec\n",
cinfo[sp_idx].speed); cinfo[sp_idx].speed);
/* IRQ driven touchscreen is used on Palm hardware */
if (machine_is_palmt5() || machine_is_palmtx() || machine_is_palmld()) {
pen_int = 1;
irq = 27;
} else if (machine_is_mainstone() && pen_int)
irq = 4;
if (irq) {
ret = gpio_request(irq, "Touchscreen IRQ");
if (ret)
goto out;
ret = gpio_direction_input(irq);
if (ret) {
gpio_free(irq);
goto out;
}
wm->pen_irq = gpio_to_irq(irq);
set_irq_type(wm->pen_irq, IRQ_TYPE_EDGE_BOTH);
} else /* pen irq not supported */
pen_int = 0;
/* codec specific irq config */ /* codec specific irq config */
if (pen_int) { if (pen_int) {
switch (wm->id) { switch (wm->id) {
case WM9705_ID2: case WM9705_ID2:
wm->pen_irq = IRQ_GPIO(4);
set_irq_type(IRQ_GPIO(4), IRQ_TYPE_EDGE_BOTH);
break; break;
case WM9712_ID2: case WM9712_ID2:
case WM9713_ID2: case WM9713_ID2:
/* enable pen down interrupt */
/* use PEN_DOWN GPIO 13 to assert IRQ on GPIO line 2 */ /* use PEN_DOWN GPIO 13 to assert IRQ on GPIO line 2 */
wm->pen_irq = MAINSTONE_AC97_IRQ;
wm97xx_config_gpio(wm, WM97XX_GPIO_13, WM97XX_GPIO_IN, wm97xx_config_gpio(wm, WM97XX_GPIO_13, WM97XX_GPIO_IN,
WM97XX_GPIO_POL_HIGH, WM97XX_GPIO_POL_HIGH,
WM97XX_GPIO_STICKY, WM97XX_GPIO_STICKY,
...@@ -220,23 +242,17 @@ static int wm97xx_acc_startup(struct wm97xx *wm) ...@@ -220,23 +242,17 @@ static int wm97xx_acc_startup(struct wm97xx *wm)
} }
} }
return 0; out:
return ret;
} }
static void wm97xx_acc_shutdown(struct wm97xx *wm) static void wm97xx_acc_shutdown(struct wm97xx *wm)
{ {
/* codec specific deconfig */ /* codec specific deconfig */
if (pen_int) { if (pen_int) {
switch (wm->id & 0xffff) { if (irq)
case WM9705_ID2: gpio_free(irq);
wm->pen_irq = 0; wm->pen_irq = 0;
break;
case WM9712_ID2:
case WM9713_ID2:
/* disable interrupt */
wm->pen_irq = 0;
break;
}
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册