1
2
3
4
5
6
7
8
9
10
11
12
13
14#include <linux/kernel.h>
15#include <linux/module.h>
16#include <linux/sched.h>
17#include <linux/interrupt.h>
18#include <linux/device.h>
19#include <linux/of.h>
20#include <linux/platform_device.h>
21#include <linux/input.h>
22#include <linux/slab.h>
23#include <linux/delay.h>
24#include <linux/i2c.h>
25#include <linux/workqueue.h>
26
27#include <linux/mfd/stmpe.h>
28
29
30
31
32#define STMPE_REG_INT_STA 0x0B
33#define STMPE_REG_ADC_CTRL1 0x20
34#define STMPE_REG_ADC_CTRL2 0x21
35#define STMPE_REG_TSC_CTRL 0x40
36#define STMPE_REG_TSC_CFG 0x41
37#define STMPE_REG_FIFO_TH 0x4A
38#define STMPE_REG_FIFO_STA 0x4B
39#define STMPE_REG_FIFO_SIZE 0x4C
40#define STMPE_REG_TSC_DATA_XYZ 0x52
41#define STMPE_REG_TSC_FRACTION_Z 0x56
42#define STMPE_REG_TSC_I_DRIVE 0x58
43
44#define OP_MOD_XYZ 0
45
46#define STMPE_TSC_CTRL_TSC_EN (1<<0)
47
48#define STMPE_FIFO_STA_RESET (1<<0)
49
50#define STMPE_IRQ_TOUCH_DET 0
51
52#define SAMPLE_TIME(x) ((x & 0xf) << 4)
53#define MOD_12B(x) ((x & 0x1) << 3)
54#define REF_SEL(x) ((x & 0x1) << 1)
55#define ADC_FREQ(x) (x & 0x3)
56#define AVE_CTRL(x) ((x & 0x3) << 6)
57#define DET_DELAY(x) ((x & 0x7) << 3)
58#define SETTLING(x) (x & 0x7)
59#define FRACTION_Z(x) (x & 0x7)
60#define I_DRIVE(x) (x & 0x1)
61#define OP_MODE(x) ((x & 0x7) << 1)
62
63#define STMPE_TS_NAME "stmpe-ts"
64#define XY_MASK 0xfff
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97struct stmpe_touch {
98 struct stmpe *stmpe;
99 struct input_dev *idev;
100 struct delayed_work work;
101 struct device *dev;
102 u8 sample_time;
103 u8 mod_12b;
104 u8 ref_sel;
105 u8 adc_freq;
106 u8 ave_ctrl;
107 u8 touch_det_delay;
108 u8 settling;
109 u8 fraction_z;
110 u8 i_drive;
111};
112
113static int __stmpe_reset_fifo(struct stmpe *stmpe)
114{
115 int ret;
116
117 ret = stmpe_set_bits(stmpe, STMPE_REG_FIFO_STA,
118 STMPE_FIFO_STA_RESET, STMPE_FIFO_STA_RESET);
119 if (ret)
120 return ret;
121
122 return stmpe_set_bits(stmpe, STMPE_REG_FIFO_STA,
123 STMPE_FIFO_STA_RESET, 0);
124}
125
126static void stmpe_work(struct work_struct *work)
127{
128 int int_sta;
129 u32 timeout = 40;
130
131 struct stmpe_touch *ts =
132 container_of(work, struct stmpe_touch, work.work);
133
134 int_sta = stmpe_reg_read(ts->stmpe, STMPE_REG_INT_STA);
135
136
137
138
139
140
141
142
143 while ((int_sta & (1 << STMPE_IRQ_TOUCH_DET)) && (timeout > 0)) {
144 timeout--;
145 int_sta = stmpe_reg_read(ts->stmpe, STMPE_REG_INT_STA);
146 udelay(100);
147 }
148
149
150 __stmpe_reset_fifo(ts->stmpe);
151
152 input_report_abs(ts->idev, ABS_PRESSURE, 0);
153 input_report_key(ts->idev, BTN_TOUCH, 0);
154 input_sync(ts->idev);
155}
156
157static irqreturn_t stmpe_ts_handler(int irq, void *data)
158{
159 u8 data_set[4];
160 int x, y, z;
161 struct stmpe_touch *ts = data;
162
163
164
165
166
167 cancel_delayed_work_sync(&ts->work);
168
169
170
171
172
173
174
175 stmpe_set_bits(ts->stmpe, STMPE_REG_TSC_CTRL,
176 STMPE_TSC_CTRL_TSC_EN, 0);
177
178 stmpe_block_read(ts->stmpe, STMPE_REG_TSC_DATA_XYZ, 4, data_set);
179
180 x = (data_set[0] << 4) | (data_set[1] >> 4);
181 y = ((data_set[1] & 0xf) << 8) | data_set[2];
182 z = data_set[3];
183
184 input_report_abs(ts->idev, ABS_X, x);
185 input_report_abs(ts->idev, ABS_Y, y);
186 input_report_abs(ts->idev, ABS_PRESSURE, z);
187 input_report_key(ts->idev, BTN_TOUCH, 1);
188 input_sync(ts->idev);
189
190
191 __stmpe_reset_fifo(ts->stmpe);
192
193
194 stmpe_set_bits(ts->stmpe, STMPE_REG_TSC_CTRL,
195 STMPE_TSC_CTRL_TSC_EN, STMPE_TSC_CTRL_TSC_EN);
196
197
198 schedule_delayed_work(&ts->work, msecs_to_jiffies(50));
199
200 return IRQ_HANDLED;
201}
202
203static int stmpe_init_hw(struct stmpe_touch *ts)
204{
205 int ret;
206 u8 adc_ctrl1, adc_ctrl1_mask, tsc_cfg, tsc_cfg_mask;
207 struct stmpe *stmpe = ts->stmpe;
208 struct device *dev = ts->dev;
209
210 ret = stmpe_enable(stmpe, STMPE_BLOCK_TOUCHSCREEN | STMPE_BLOCK_ADC);
211 if (ret) {
212 dev_err(dev, "Could not enable clock for ADC and TS\n");
213 return ret;
214 }
215
216 adc_ctrl1 = SAMPLE_TIME(ts->sample_time) | MOD_12B(ts->mod_12b) |
217 REF_SEL(ts->ref_sel);
218 adc_ctrl1_mask = SAMPLE_TIME(0xff) | MOD_12B(0xff) | REF_SEL(0xff);
219
220 ret = stmpe_set_bits(stmpe, STMPE_REG_ADC_CTRL1,
221 adc_ctrl1_mask, adc_ctrl1);
222 if (ret) {
223 dev_err(dev, "Could not setup ADC\n");
224 return ret;
225 }
226
227 ret = stmpe_set_bits(stmpe, STMPE_REG_ADC_CTRL2,
228 ADC_FREQ(0xff), ADC_FREQ(ts->adc_freq));
229 if (ret) {
230 dev_err(dev, "Could not setup ADC\n");
231 return ret;
232 }
233
234 tsc_cfg = AVE_CTRL(ts->ave_ctrl) | DET_DELAY(ts->touch_det_delay) |
235 SETTLING(ts->settling);
236 tsc_cfg_mask = AVE_CTRL(0xff) | DET_DELAY(0xff) | SETTLING(0xff);
237
238 ret = stmpe_set_bits(stmpe, STMPE_REG_TSC_CFG, tsc_cfg_mask, tsc_cfg);
239 if (ret) {
240 dev_err(dev, "Could not config touch\n");
241 return ret;
242 }
243
244 ret = stmpe_set_bits(stmpe, STMPE_REG_TSC_FRACTION_Z,
245 FRACTION_Z(0xff), FRACTION_Z(ts->fraction_z));
246 if (ret) {
247 dev_err(dev, "Could not config touch\n");
248 return ret;
249 }
250
251 ret = stmpe_set_bits(stmpe, STMPE_REG_TSC_I_DRIVE,
252 I_DRIVE(0xff), I_DRIVE(ts->i_drive));
253 if (ret) {
254 dev_err(dev, "Could not config touch\n");
255 return ret;
256 }
257
258
259 ret = stmpe_reg_write(stmpe, STMPE_REG_FIFO_TH, 1);
260 if (ret) {
261 dev_err(dev, "Could not set FIFO\n");
262 return ret;
263 }
264
265 ret = stmpe_set_bits(stmpe, STMPE_REG_TSC_CTRL,
266 OP_MODE(0xff), OP_MODE(OP_MOD_XYZ));
267 if (ret) {
268 dev_err(dev, "Could not set mode\n");
269 return ret;
270 }
271
272 return 0;
273}
274
275static int stmpe_ts_open(struct input_dev *dev)
276{
277 struct stmpe_touch *ts = input_get_drvdata(dev);
278 int ret = 0;
279
280 ret = __stmpe_reset_fifo(ts->stmpe);
281 if (ret)
282 return ret;
283
284 return stmpe_set_bits(ts->stmpe, STMPE_REG_TSC_CTRL,
285 STMPE_TSC_CTRL_TSC_EN, STMPE_TSC_CTRL_TSC_EN);
286}
287
288static void stmpe_ts_close(struct input_dev *dev)
289{
290 struct stmpe_touch *ts = input_get_drvdata(dev);
291
292 cancel_delayed_work_sync(&ts->work);
293
294 stmpe_set_bits(ts->stmpe, STMPE_REG_TSC_CTRL,
295 STMPE_TSC_CTRL_TSC_EN, 0);
296}
297
298static void stmpe_ts_get_platform_info(struct platform_device *pdev,
299 struct stmpe_touch *ts)
300{
301 struct device_node *np = pdev->dev.of_node;
302 u32 val;
303
304 if (np) {
305 if (!of_property_read_u32(np, "st,sample-time", &val))
306 ts->sample_time = val;
307 if (!of_property_read_u32(np, "st,mod-12b", &val))
308 ts->mod_12b = val;
309 if (!of_property_read_u32(np, "st,ref-sel", &val))
310 ts->ref_sel = val;
311 if (!of_property_read_u32(np, "st,adc-freq", &val))
312 ts->adc_freq = val;
313 if (!of_property_read_u32(np, "st,ave-ctrl", &val))
314 ts->ave_ctrl = val;
315 if (!of_property_read_u32(np, "st,touch-det-delay", &val))
316 ts->touch_det_delay = val;
317 if (!of_property_read_u32(np, "st,settling", &val))
318 ts->settling = val;
319 if (!of_property_read_u32(np, "st,fraction-z", &val))
320 ts->fraction_z = val;
321 if (!of_property_read_u32(np, "st,i-drive", &val))
322 ts->i_drive = val;
323 }
324}
325
326static int stmpe_input_probe(struct platform_device *pdev)
327{
328 struct stmpe *stmpe = dev_get_drvdata(pdev->dev.parent);
329 struct stmpe_touch *ts;
330 struct input_dev *idev;
331 int error;
332 int ts_irq;
333
334 ts_irq = platform_get_irq_byname(pdev, "FIFO_TH");
335 if (ts_irq < 0)
336 return ts_irq;
337
338 ts = devm_kzalloc(&pdev->dev, sizeof(*ts), GFP_KERNEL);
339 if (!ts)
340 return -ENOMEM;
341
342 idev = devm_input_allocate_device(&pdev->dev);
343 if (!idev)
344 return -ENOMEM;
345
346 platform_set_drvdata(pdev, ts);
347 ts->stmpe = stmpe;
348 ts->idev = idev;
349 ts->dev = &pdev->dev;
350
351 stmpe_ts_get_platform_info(pdev, ts);
352
353 INIT_DELAYED_WORK(&ts->work, stmpe_work);
354
355 error = devm_request_threaded_irq(&pdev->dev, ts_irq,
356 NULL, stmpe_ts_handler,
357 IRQF_ONESHOT, STMPE_TS_NAME, ts);
358 if (error) {
359 dev_err(&pdev->dev, "Failed to request IRQ %d\n", ts_irq);
360 return error;
361 }
362
363 error = stmpe_init_hw(ts);
364 if (error)
365 return error;
366
367 idev->name = STMPE_TS_NAME;
368 idev->phys = STMPE_TS_NAME"/input0";
369 idev->id.bustype = BUS_I2C;
370
371 idev->open = stmpe_ts_open;
372 idev->close = stmpe_ts_close;
373
374 input_set_drvdata(idev, ts);
375
376 input_set_capability(idev, EV_KEY, BTN_TOUCH);
377 input_set_abs_params(idev, ABS_X, 0, XY_MASK, 0, 0);
378 input_set_abs_params(idev, ABS_Y, 0, XY_MASK, 0, 0);
379 input_set_abs_params(idev, ABS_PRESSURE, 0x0, 0xff, 0, 0);
380
381 error = input_register_device(idev);
382 if (error) {
383 dev_err(&pdev->dev, "Could not register input device\n");
384 return error;
385 }
386
387 return 0;
388}
389
390static int stmpe_ts_remove(struct platform_device *pdev)
391{
392 struct stmpe_touch *ts = platform_get_drvdata(pdev);
393
394 stmpe_disable(ts->stmpe, STMPE_BLOCK_TOUCHSCREEN);
395
396 return 0;
397}
398
399static struct platform_driver stmpe_ts_driver = {
400 .driver = {
401 .name = STMPE_TS_NAME,
402 },
403 .probe = stmpe_input_probe,
404 .remove = stmpe_ts_remove,
405};
406module_platform_driver(stmpe_ts_driver);
407
408static const struct of_device_id stmpe_ts_ids[] = {
409 { .compatible = "st,stmpe-ts", },
410 { },
411};
412MODULE_DEVICE_TABLE(of, stmpe_ts_ids);
413
414MODULE_AUTHOR("Luotao Fu <l.fu@pengutronix.de>");
415MODULE_DESCRIPTION("STMPEXXX touchscreen driver");
416MODULE_LICENSE("GPL");
417