2 * TI Touch Screen driver
4 * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation version 2.
10 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
11 * kind, whether express or implied; without even the implied warranty
12 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
17 #include <linux/kernel.h>
18 #include <linux/err.h>
19 #include <linux/module.h>
20 #include <linux/input.h>
21 #include <linux/slab.h>
22 #include <linux/interrupt.h>
23 #include <linux/clk.h>
24 #include <linux/platform_device.h>
26 #include <linux/delay.h>
28 #include <linux/of_device.h>
30 #include <linux/mfd/ti_am335x_tscadc.h>
32 #define ADCFSM_STEPID 0x10
33 #define SEQ_SETTLE 275
34 #define MAX_12BIT ((1 << 12) - 1)
36 static const int config_pins
[] = {
44 struct input_dev
*input
;
45 struct ti_tscadc_dev
*mfd_tscadc
;
48 unsigned int x_plate_resistance
;
50 int coordinate_readouts
;
52 u32 bit_xp
, bit_xn
, bit_yp
, bit_yn
;
53 u32 inp_xp
, inp_xn
, inp_yp
, inp_yn
;
57 static unsigned int titsc_readl(struct titsc
*ts
, unsigned int reg
)
59 return readl(ts
->mfd_tscadc
->tscadc_base
+ reg
);
62 static void titsc_writel(struct titsc
*tsc
, unsigned int reg
,
65 writel(val
, tsc
->mfd_tscadc
->tscadc_base
+ reg
);
68 static int titsc_config_wires(struct titsc
*ts_dev
)
74 for (i
= 0; i
< 4; i
++) {
76 * Get the order in which TSC wires are attached
77 * w.r.t. each of the analog input lines on the EVM.
79 analog_line
[i
] = (ts_dev
->config_inp
[i
] & 0xF0) >> 4;
80 wire_order
[i
] = ts_dev
->config_inp
[i
] & 0x0F;
81 if (WARN_ON(analog_line
[i
] > 7))
83 if (WARN_ON(wire_order
[i
] > ARRAY_SIZE(config_pins
)))
87 for (i
= 0; i
< 4; i
++) {
91 an_line
= analog_line
[i
];
92 wi_order
= wire_order
[i
];
93 bit_cfg
= config_pins
[wi_order
];
98 ts_dev
->bit_xp
= bit_cfg
;
99 ts_dev
->inp_xp
= an_line
;
103 ts_dev
->bit_xn
= bit_cfg
;
104 ts_dev
->inp_xn
= an_line
;
108 ts_dev
->bit_yp
= bit_cfg
;
109 ts_dev
->inp_yp
= an_line
;
112 ts_dev
->bit_yn
= bit_cfg
;
113 ts_dev
->inp_yn
= an_line
;
120 static void titsc_step_config(struct titsc
*ts_dev
)
127 config
= STEPCONFIG_MODE_HWSYNC
|
128 STEPCONFIG_AVG_16
| ts_dev
->bit_xp
;
129 switch (ts_dev
->wires
) {
131 config
|= STEPCONFIG_INP(ts_dev
->inp_yp
) | ts_dev
->bit_xn
;
134 config
|= ts_dev
->bit_yn
|
135 STEPCONFIG_INP_AN4
| ts_dev
->bit_xn
|
139 config
|= STEPCONFIG_INP(ts_dev
->inp_yp
) | ts_dev
->bit_xn
;
143 /* 1 … coordinate_readouts is for X */
144 end_step
= ts_dev
->coordinate_readouts
;
145 for (i
= 0; i
< end_step
; i
++) {
146 titsc_writel(ts_dev
, REG_STEPCONFIG(i
), config
);
147 titsc_writel(ts_dev
, REG_STEPDELAY(i
), STEPCONFIG_OPENDLY
);
151 config
= STEPCONFIG_MODE_HWSYNC
|
152 STEPCONFIG_AVG_16
| ts_dev
->bit_yn
|
153 STEPCONFIG_INM_ADCREFM
;
154 switch (ts_dev
->wires
) {
156 config
|= ts_dev
->bit_yp
| STEPCONFIG_INP(ts_dev
->inp_xp
);
159 config
|= ts_dev
->bit_xp
| STEPCONFIG_INP_AN4
|
160 ts_dev
->bit_xn
| ts_dev
->bit_yp
;
163 config
|= ts_dev
->bit_yp
| STEPCONFIG_INP(ts_dev
->inp_xp
);
167 /* coordinate_readouts … coordinate_readouts * 2 is for Y */
168 end_step
= ts_dev
->coordinate_readouts
* 2;
169 for (i
= ts_dev
->coordinate_readouts
; i
< end_step
; i
++) {
170 titsc_writel(ts_dev
, REG_STEPCONFIG(i
), config
);
171 titsc_writel(ts_dev
, REG_STEPDELAY(i
), STEPCONFIG_OPENDLY
);
174 /* Charge step configuration */
175 config
= ts_dev
->bit_xp
| ts_dev
->bit_yn
|
176 STEPCHARGE_RFP_XPUL
| STEPCHARGE_RFM_XNUR
|
177 STEPCHARGE_INM_AN1
| STEPCHARGE_INP(ts_dev
->inp_yp
);
179 titsc_writel(ts_dev
, REG_CHARGECONFIG
, config
);
180 titsc_writel(ts_dev
, REG_CHARGEDELAY
, CHARGEDLY_OPENDLY
);
182 /* coordinate_readouts * 2 … coordinate_readouts * 2 + 2 is for Z */
183 config
= STEPCONFIG_MODE_HWSYNC
|
184 STEPCONFIG_AVG_16
| ts_dev
->bit_yp
|
185 ts_dev
->bit_xn
| STEPCONFIG_INM_ADCREFM
|
186 STEPCONFIG_INP(ts_dev
->inp_xp
);
187 titsc_writel(ts_dev
, REG_STEPCONFIG(end_step
), config
);
188 titsc_writel(ts_dev
, REG_STEPDELAY(end_step
),
192 config
|= STEPCONFIG_INP(ts_dev
->inp_yn
);
193 titsc_writel(ts_dev
, REG_STEPCONFIG(end_step
), config
);
194 titsc_writel(ts_dev
, REG_STEPDELAY(end_step
),
197 /* The steps1 … end and bit 0 for TS_Charge */
198 stepenable
= (1 << (end_step
+ 2)) - 1;
199 ts_dev
->step_mask
= stepenable
;
200 am335x_tsc_se_set_cache(ts_dev
->mfd_tscadc
, ts_dev
->step_mask
);
203 static void titsc_read_coordinates(struct titsc
*ts_dev
,
204 u32
*x
, u32
*y
, u32
*z1
, u32
*z2
)
206 unsigned int fifocount
= titsc_readl(ts_dev
, REG_FIFO0CNT
);
207 unsigned int prev_val_x
= ~0, prev_val_y
= ~0;
208 unsigned int prev_diff_x
= ~0, prev_diff_y
= ~0;
209 unsigned int read
, diff
;
210 unsigned int i
, channel
;
211 unsigned int creads
= ts_dev
->coordinate_readouts
;
214 if (fifocount
% (creads
* 2 + 2))
215 fifocount
-= fifocount
% (creads
* 2 + 2);
217 * Delta filter is used to remove large variations in sampled
218 * values from ADC. The filter tries to predict where the next
219 * coordinate could be. This is done by taking a previous
220 * coordinate and subtracting it form current one. Further the
221 * algorithm compares the difference with that of a present value,
222 * if true the value is reported to the sub system.
224 for (i
= 0; i
< fifocount
; i
++) {
225 read
= titsc_readl(ts_dev
, REG_FIFO0
);
227 channel
= (read
& 0xf0000) >> 16;
229 if (channel
< creads
) {
230 diff
= abs(read
- prev_val_x
);
231 if (diff
< prev_diff_x
) {
237 } else if (channel
< creads
* 2) {
238 diff
= abs(read
- prev_val_y
);
239 if (diff
< prev_diff_y
) {
245 } else if (channel
< creads
* 2 + 1) {
248 } else if (channel
< creads
* 2 + 2) {
254 static irqreturn_t
titsc_irq(int irq
, void *dev
)
256 struct titsc
*ts_dev
= dev
;
257 struct input_dev
*input_dev
= ts_dev
->input
;
258 unsigned int status
, irqclr
= 0;
259 unsigned int x
= 0, y
= 0;
260 unsigned int z1
, z2
, z
;
263 status
= titsc_readl(ts_dev
, REG_IRQSTATUS
);
265 * ADC and touchscreen share the IRQ line.
266 * FIFO1 interrupts are used by ADC. Handle FIFO0 IRQs here only
268 if (status
& IRQENB_FIFO0THRES
) {
270 titsc_read_coordinates(ts_dev
, &x
, &y
, &z1
, &z2
);
272 if (ts_dev
->pen_down
&& z1
!= 0 && z2
!= 0) {
274 * Calculate pressure using formula
275 * Resistance(touch) = x plate resistance *
276 * x postion/4096 * ((z2 / z1) - 1)
280 z
*= ts_dev
->x_plate_resistance
;
282 z
= (z
+ 2047) >> 12;
284 if (z
<= MAX_12BIT
) {
285 input_report_abs(input_dev
, ABS_X
, x
);
286 input_report_abs(input_dev
, ABS_Y
, y
);
287 input_report_abs(input_dev
, ABS_PRESSURE
, z
);
288 input_report_key(input_dev
, BTN_TOUCH
, 1);
289 input_sync(input_dev
);
292 irqclr
|= IRQENB_FIFO0THRES
;
296 * Time for sequencer to settle, to read
297 * correct state of the sequencer.
301 status
= titsc_readl(ts_dev
, REG_RAWIRQSTATUS
);
302 if (status
& IRQENB_PENUP
) {
304 fsm
= titsc_readl(ts_dev
, REG_ADCFSM
);
305 if (fsm
== ADCFSM_STEPID
) {
306 ts_dev
->pen_down
= false;
307 input_report_key(input_dev
, BTN_TOUCH
, 0);
308 input_report_abs(input_dev
, ABS_PRESSURE
, 0);
309 input_sync(input_dev
);
311 ts_dev
->pen_down
= true;
313 irqclr
|= IRQENB_PENUP
;
316 if (status
& IRQENB_HW_PEN
) {
318 titsc_writel(ts_dev
, REG_IRQWAKEUP
, 0x00);
319 titsc_writel(ts_dev
, REG_IRQCLR
, IRQENB_HW_PEN
);
323 titsc_writel(ts_dev
, REG_IRQSTATUS
, irqclr
);
324 am335x_tsc_se_set_cache(ts_dev
->mfd_tscadc
, ts_dev
->step_mask
);
330 static int titsc_parse_dt(struct platform_device
*pdev
,
331 struct titsc
*ts_dev
)
333 struct device_node
*node
= pdev
->dev
.of_node
;
339 err
= of_property_read_u32(node
, "ti,wires", &ts_dev
->wires
);
342 switch (ts_dev
->wires
) {
351 err
= of_property_read_u32(node
, "ti,x-plate-resistance",
352 &ts_dev
->x_plate_resistance
);
357 * Try with the new binding first. If it fails, try again with
358 * bogus, miss-spelled version.
360 err
= of_property_read_u32(node
, "ti,coordinate-readouts",
361 &ts_dev
->coordinate_readouts
);
363 err
= of_property_read_u32(node
, "ti,coordiante-readouts",
364 &ts_dev
->coordinate_readouts
);
368 return of_property_read_u32_array(node
, "ti,wire-config",
369 ts_dev
->config_inp
, ARRAY_SIZE(ts_dev
->config_inp
));
373 * The functions for inserting/removing driver as a module.
376 static int titsc_probe(struct platform_device
*pdev
)
378 struct titsc
*ts_dev
;
379 struct input_dev
*input_dev
;
380 struct ti_tscadc_dev
*tscadc_dev
= ti_tscadc_dev_get(pdev
);
383 /* Allocate memory for device */
384 ts_dev
= kzalloc(sizeof(struct titsc
), GFP_KERNEL
);
385 input_dev
= input_allocate_device();
386 if (!ts_dev
|| !input_dev
) {
387 dev_err(&pdev
->dev
, "failed to allocate memory.\n");
392 tscadc_dev
->tsc
= ts_dev
;
393 ts_dev
->mfd_tscadc
= tscadc_dev
;
394 ts_dev
->input
= input_dev
;
395 ts_dev
->irq
= tscadc_dev
->irq
;
397 err
= titsc_parse_dt(pdev
, ts_dev
);
399 dev_err(&pdev
->dev
, "Could not find valid DT data.\n");
403 err
= request_irq(ts_dev
->irq
, titsc_irq
,
404 IRQF_SHARED
, pdev
->dev
.driver
->name
, ts_dev
);
406 dev_err(&pdev
->dev
, "failed to allocate irq.\n");
410 titsc_writel(ts_dev
, REG_IRQENABLE
, IRQENB_FIFO0THRES
);
411 err
= titsc_config_wires(ts_dev
);
413 dev_err(&pdev
->dev
, "wrong i/p wire configuration\n");
416 titsc_step_config(ts_dev
);
417 titsc_writel(ts_dev
, REG_FIFO0THR
,
418 ts_dev
->coordinate_readouts
* 2 + 2 - 1);
420 input_dev
->name
= "ti-tsc";
421 input_dev
->dev
.parent
= &pdev
->dev
;
423 input_dev
->evbit
[0] = BIT_MASK(EV_KEY
) | BIT_MASK(EV_ABS
);
424 input_dev
->keybit
[BIT_WORD(BTN_TOUCH
)] = BIT_MASK(BTN_TOUCH
);
426 input_set_abs_params(input_dev
, ABS_X
, 0, MAX_12BIT
, 0, 0);
427 input_set_abs_params(input_dev
, ABS_Y
, 0, MAX_12BIT
, 0, 0);
428 input_set_abs_params(input_dev
, ABS_PRESSURE
, 0, MAX_12BIT
, 0, 0);
430 /* register to the input system */
431 err
= input_register_device(input_dev
);
435 platform_set_drvdata(pdev
, ts_dev
);
439 free_irq(ts_dev
->irq
, ts_dev
);
441 input_free_device(input_dev
);
446 static int titsc_remove(struct platform_device
*pdev
)
448 struct titsc
*ts_dev
= platform_get_drvdata(pdev
);
451 free_irq(ts_dev
->irq
, ts_dev
);
453 /* total steps followed by the enable mask */
454 steps
= 2 * ts_dev
->coordinate_readouts
+ 2;
455 steps
= (1 << steps
) - 1;
456 am335x_tsc_se_clr(ts_dev
->mfd_tscadc
, steps
);
458 input_unregister_device(ts_dev
->input
);
465 static int titsc_suspend(struct device
*dev
)
467 struct titsc
*ts_dev
= dev_get_drvdata(dev
);
468 struct ti_tscadc_dev
*tscadc_dev
;
471 tscadc_dev
= ti_tscadc_dev_get(to_platform_device(dev
));
472 if (device_may_wakeup(tscadc_dev
->dev
)) {
473 idle
= titsc_readl(ts_dev
, REG_IRQENABLE
);
474 titsc_writel(ts_dev
, REG_IRQENABLE
,
475 (idle
| IRQENB_HW_PEN
));
476 titsc_writel(ts_dev
, REG_IRQWAKEUP
, IRQWKUP_ENB
);
481 static int titsc_resume(struct device
*dev
)
483 struct titsc
*ts_dev
= dev_get_drvdata(dev
);
484 struct ti_tscadc_dev
*tscadc_dev
;
486 tscadc_dev
= ti_tscadc_dev_get(to_platform_device(dev
));
487 if (device_may_wakeup(tscadc_dev
->dev
)) {
488 titsc_writel(ts_dev
, REG_IRQWAKEUP
,
490 titsc_writel(ts_dev
, REG_IRQCLR
, IRQENB_HW_PEN
);
492 titsc_step_config(ts_dev
);
493 titsc_writel(ts_dev
, REG_FIFO0THR
,
494 ts_dev
->coordinate_readouts
* 2 + 2 - 1);
498 static const struct dev_pm_ops titsc_pm_ops
= {
499 .suspend
= titsc_suspend
,
500 .resume
= titsc_resume
,
502 #define TITSC_PM_OPS (&titsc_pm_ops)
504 #define TITSC_PM_OPS NULL
507 static const struct of_device_id ti_tsc_dt_ids
[] = {
508 { .compatible
= "ti,am3359-tsc", },
511 MODULE_DEVICE_TABLE(of
, ti_tsc_dt_ids
);
513 static struct platform_driver ti_tsc_driver
= {
514 .probe
= titsc_probe
,
515 .remove
= titsc_remove
,
517 .name
= "TI-am335x-tsc",
518 .owner
= THIS_MODULE
,
520 .of_match_table
= ti_tsc_dt_ids
,
523 module_platform_driver(ti_tsc_driver
);
525 MODULE_DESCRIPTION("TI touchscreen controller driver");
526 MODULE_AUTHOR("Rachna Patil <rachna@ti.com>");
527 MODULE_LICENSE("GPL");