11 #include <linux/module.h>
13 #include <linux/kernel.h>
22 #include <linux/slab.h>
24 #define AC97C_ICA 0x10
25 #define AC97C_CBRHR 0x30
26 #define AC97C_CBSR 0x38
27 #define AC97C_CBMR 0x3c
28 #define AC97C_IER 0x54
29 #define AC97C_IDR 0x58
31 #define AC97C_RXRDY (1 << 4)
32 #define AC97C_OVRUN (1 << 5)
34 #define AC97C_CMR_SIZE_20 (0 << 16)
35 #define AC97C_CMR_SIZE_18 (1 << 16)
36 #define AC97C_CMR_SIZE_16 (2 << 16)
37 #define AC97C_CMR_SIZE_10 (3 << 16)
38 #define AC97C_CMR_CEM_LITTLE (1 << 18)
39 #define AC97C_CMR_CEM_BIG (0 << 18)
40 #define AC97C_CMR_CENA (1 << 21)
42 #define AC97C_INT_CBEVT (1 << 4)
44 #define AC97C_SR_CAEVT (1 << 3)
46 #define AC97C_CH_MASK(slot) \
47 (0x7 << (3 * (slot - 3)))
48 #define AC97C_CH_ASSIGN(slot, channel) \
49 (AC97C_CHANNEL_##channel << (3 * (slot - 3)))
50 #define AC97C_CHANNEL_NONE 0x0
51 #define AC97C_CHANNEL_B 0x2
53 #define ac97c_writel(chip, reg, val) \
54 __raw_writel((val), (chip)->regs + AC97C_##reg)
55 #define ac97c_readl(chip, reg) \
56 __raw_readl((chip)->regs + AC97C_##reg)
58 #ifdef CONFIG_CPU_AT32AP700X
59 #define ATMEL_WM97XX_AC97C_IOMEM (0xfff02800)
60 #define ATMEL_WM97XX_AC97C_IRQ (29)
61 #define ATMEL_WM97XX_GPIO_DEFAULT (32+16)
63 #error Unknown CPU, this driver only supports AT32AP700X CPUs.
73 #define WM_READS(sp) ((sp / HZ) + 1)
96 static int cont_rate = 188;
106 static int pen_int = 1;
108 MODULE_PARM_DESC(pen_int,
"Pen down detection (1 = interrupt, 0 = polling)");
117 MODULE_PARM_DESC(pressure,
"Pressure readback (1 = pressure, 0 = no pressure)");
124 static int ac97_touch_slot = 5;
133 static int atmel_gpio_line = ATMEL_WM97XX_GPIO_DEFAULT;
151 struct wm97xx *wm = atmel_wm97xx->
wm;
166 value = data & 0x0fff;
194 static void atmel_wm97xx_acc_pen_up(
struct wm97xx *wm)
196 struct atmel_wm97xx *atmel_wm97xx = platform_get_drvdata(wm->
touch_dev);
197 struct input_dev *input_dev = wm->
input_dev;
206 input_report_key(input_dev,
BTN_TOUCH, 0);
207 input_sync(input_dev);
211 static void atmel_wm97xx_pen_timer(
unsigned long data)
213 atmel_wm97xx_acc_pen_up((
struct wm97xx *)data);
216 static int atmel_wm97xx_acc_startup(
struct wm97xx *wm)
218 struct atmel_wm97xx *atmel_wm97xx = platform_get_drvdata(wm->
touch_dev);
224 for (idx = 0; idx <
ARRAY_SIZE(cinfo); idx++) {
225 if (wm->
id != cinfo[idx].
id)
230 if (cont_rate <= cinfo[idx].speed)
237 "%d samples/sec\n", cinfo[sp_idx].
speed);
286 "supported on this device\n");
295 static void atmel_wm97xx_acc_shutdown(
struct wm97xx *wm)
298 struct atmel_wm97xx *atmel_wm97xx =
302 switch (wm->
id & 0xffff) {
321 static void atmel_wm97xx_irq_enable(
struct wm97xx *wm,
int enable)
328 .acc_pen_up = atmel_wm97xx_acc_pen_up,
329 .acc_startup = atmel_wm97xx_acc_startup,
330 .acc_shutdown = atmel_wm97xx_acc_shutdown,
331 .irq_enable = atmel_wm97xx_irq_enable,
337 struct wm97xx *wm = platform_get_drvdata(pdev);
338 struct atmel_wm97xx *atmel_wm97xx;
341 atmel_wm97xx = kzalloc(
sizeof(
struct atmel_wm97xx),
GFP_KERNEL);
347 atmel_wm97xx->
wm =
wm;
348 atmel_wm97xx->
regs = (
void *)ATMEL_WM97XX_AC97C_IOMEM;
349 atmel_wm97xx->
ac97c_irq = ATMEL_WM97XX_AC97C_IRQ;
350 atmel_wm97xx->
gpio_pen = atmel_gpio_line;
357 atmel_wm97xx_channel_b_interrupt,
360 dev_dbg(&pdev->
dev,
"could not request ac97c irq\n");
364 platform_set_drvdata(pdev, atmel_wm97xx);
375 platform_set_drvdata(pdev,
NULL);
382 struct atmel_wm97xx *atmel_wm97xx = platform_get_drvdata(pdev);
383 struct wm97xx *wm = atmel_wm97xx->
wm;
389 platform_set_drvdata(pdev,
NULL);
395 #ifdef CONFIG_PM_SLEEP
396 static int atmel_wm97xx_suspend(
struct *
dev)
399 struct atmel_wm97xx *atmel_wm97xx = platform_get_drvdata(pdev);
408 static int atmel_wm97xx_resume(
struct device *
dev)
411 struct atmel_wm97xx *atmel_wm97xx = platform_get_drvdata(pdev);
412 struct wm97xx *wm = atmel_wm97xx->
wm;
424 atmel_wm97xx_suspend, atmel_wm97xx_resume);
427 .remove =
__exit_p(atmel_wm97xx_remove),
429 .name =
"wm97xx-touch",
431 .pm = &atmel_wm97xx_pm_ops,
435 static int __init atmel_wm97xx_init(
void)
441 static void __exit atmel_wm97xx_exit(
void)