mxs-lradc-ts.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716
  1. /*
  2. * Freescale MXS LRADC touchscreen driver
  3. *
  4. * Copyright (c) 2012 DENX Software Engineering, GmbH.
  5. * Copyright (c) 2017 Ksenija Stanojevic <ksenija.stanojevic@gmail.com>
  6. *
  7. * Authors:
  8. * Marek Vasut <marex@denx.de>
  9. * Ksenija Stanojevic <ksenija.stanojevic@gmail.com>
  10. *
  11. * This program is free software; you can redistribute it and/or modify
  12. * it under the terms of the GNU General Public License as published by
  13. * the Free Software Foundation; either version 2 of the License, or
  14. * (at your option) any later version.
  15. *
  16. * This program is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU General Public License for more details.
  20. */
  21. #include <linux/device.h>
  22. #include <linux/err.h>
  23. #include <linux/input.h>
  24. #include <linux/interrupt.h>
  25. #include <linux/module.h>
  26. #include <linux/mfd/core.h>
  27. #include <linux/mfd/mxs-lradc.h>
  28. #include <linux/of.h>
  29. #include <linux/of_irq.h>
  30. #include <linux/platform_device.h>
  31. static const char * const mxs_lradc_ts_irq_names[] = {
  32. "mxs-lradc-touchscreen",
  33. "mxs-lradc-channel6",
  34. "mxs-lradc-channel7",
  35. };
  36. /*
  37. * Touchscreen handling
  38. */
  39. enum mxs_lradc_ts_plate {
  40. LRADC_TOUCH = 0,
  41. LRADC_SAMPLE_X,
  42. LRADC_SAMPLE_Y,
  43. LRADC_SAMPLE_PRESSURE,
  44. LRADC_SAMPLE_VALID,
  45. };
  46. struct mxs_lradc_ts {
  47. struct mxs_lradc *lradc;
  48. struct device *dev;
  49. void __iomem *base;
  50. /*
  51. * When the touchscreen is enabled, we give it two private virtual
  52. * channels: #6 and #7. This means that only 6 virtual channels (instead
  53. * of 8) will be available for buffered capture.
  54. */
  55. #define TOUCHSCREEN_VCHANNEL1 7
  56. #define TOUCHSCREEN_VCHANNEL2 6
  57. struct input_dev *ts_input;
  58. enum mxs_lradc_ts_plate cur_plate; /* state machine */
  59. bool ts_valid;
  60. unsigned int ts_x_pos;
  61. unsigned int ts_y_pos;
  62. unsigned int ts_pressure;
  63. /* handle touchscreen's physical behaviour */
  64. /* samples per coordinate */
  65. unsigned int over_sample_cnt;
  66. /* time clocks between samples */
  67. unsigned int over_sample_delay;
  68. /* time in clocks to wait after the plates where switched */
  69. unsigned int settling_delay;
  70. spinlock_t lock;
  71. };
  72. struct state_info {
  73. u32 mask;
  74. u32 bit;
  75. u32 x_plate;
  76. u32 y_plate;
  77. u32 pressure;
  78. };
  79. static struct state_info info[] = {
  80. {LRADC_CTRL0_MX23_PLATE_MASK, LRADC_CTRL0_MX23_TOUCH_DETECT_ENABLE,
  81. LRADC_CTRL0_MX23_XP | LRADC_CTRL0_MX23_XM,
  82. LRADC_CTRL0_MX23_YP | LRADC_CTRL0_MX23_YM,
  83. LRADC_CTRL0_MX23_YP | LRADC_CTRL0_MX23_XM},
  84. {LRADC_CTRL0_MX28_PLATE_MASK, LRADC_CTRL0_MX28_TOUCH_DETECT_ENABLE,
  85. LRADC_CTRL0_MX28_XPPSW | LRADC_CTRL0_MX28_XNNSW,
  86. LRADC_CTRL0_MX28_YPPSW | LRADC_CTRL0_MX28_YNNSW,
  87. LRADC_CTRL0_MX28_YPPSW | LRADC_CTRL0_MX28_XNNSW}
  88. };
  89. static bool mxs_lradc_check_touch_event(struct mxs_lradc_ts *ts)
  90. {
  91. return !!(readl(ts->base + LRADC_STATUS) &
  92. LRADC_STATUS_TOUCH_DETECT_RAW);
  93. }
  94. static void mxs_lradc_map_ts_channel(struct mxs_lradc_ts *ts, unsigned int vch,
  95. unsigned int ch)
  96. {
  97. writel(LRADC_CTRL4_LRADCSELECT_MASK(vch),
  98. ts->base + LRADC_CTRL4 + STMP_OFFSET_REG_CLR);
  99. writel(LRADC_CTRL4_LRADCSELECT(vch, ch),
  100. ts->base + LRADC_CTRL4 + STMP_OFFSET_REG_SET);
  101. }
  102. static void mxs_lradc_setup_ts_channel(struct mxs_lradc_ts *ts, unsigned int ch)
  103. {
  104. /*
  105. * prepare for oversampling conversion
  106. *
  107. * from the datasheet:
  108. * "The ACCUMULATE bit in the appropriate channel register
  109. * HW_LRADC_CHn must be set to 1 if NUM_SAMPLES is greater then 0;
  110. * otherwise, the IRQs will not fire."
  111. */
  112. writel(LRADC_CH_ACCUMULATE |
  113. LRADC_CH_NUM_SAMPLES(ts->over_sample_cnt - 1),
  114. ts->base + LRADC_CH(ch));
  115. /* from the datasheet:
  116. * "Software must clear this register in preparation for a
  117. * multi-cycle accumulation.
  118. */
  119. writel(LRADC_CH_VALUE_MASK,
  120. ts->base + LRADC_CH(ch) + STMP_OFFSET_REG_CLR);
  121. /*
  122. * prepare the delay/loop unit according to the oversampling count
  123. *
  124. * from the datasheet:
  125. * "The DELAY fields in HW_LRADC_DELAY0, HW_LRADC_DELAY1,
  126. * HW_LRADC_DELAY2, and HW_LRADC_DELAY3 must be non-zero; otherwise,
  127. * the LRADC will not trigger the delay group."
  128. */
  129. writel(LRADC_DELAY_TRIGGER(1 << ch) | LRADC_DELAY_TRIGGER_DELAYS(0) |
  130. LRADC_DELAY_LOOP(ts->over_sample_cnt - 1) |
  131. LRADC_DELAY_DELAY(ts->over_sample_delay - 1),
  132. ts->base + LRADC_DELAY(3));
  133. writel(LRADC_CTRL1_LRADC_IRQ(ch),
  134. ts->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR);
  135. /*
  136. * after changing the touchscreen plates setting
  137. * the signals need some initial time to settle. Start the
  138. * SoC's delay unit and start the conversion later
  139. * and automatically.
  140. */
  141. writel(LRADC_DELAY_TRIGGER(0) | LRADC_DELAY_TRIGGER_DELAYS(BIT(3)) |
  142. LRADC_DELAY_KICK | LRADC_DELAY_DELAY(ts->settling_delay),
  143. ts->base + LRADC_DELAY(2));
  144. }
  145. /*
  146. * Pressure detection is special:
  147. * We want to do both required measurements for the pressure detection in
  148. * one turn. Use the hardware features to chain both conversions and let the
  149. * hardware report one interrupt if both conversions are done
  150. */
  151. static void mxs_lradc_setup_ts_pressure(struct mxs_lradc_ts *ts,
  152. unsigned int ch1, unsigned int ch2)
  153. {
  154. u32 reg;
  155. /*
  156. * prepare for oversampling conversion
  157. *
  158. * from the datasheet:
  159. * "The ACCUMULATE bit in the appropriate channel register
  160. * HW_LRADC_CHn must be set to 1 if NUM_SAMPLES is greater then 0;
  161. * otherwise, the IRQs will not fire."
  162. */
  163. reg = LRADC_CH_ACCUMULATE |
  164. LRADC_CH_NUM_SAMPLES(ts->over_sample_cnt - 1);
  165. writel(reg, ts->base + LRADC_CH(ch1));
  166. writel(reg, ts->base + LRADC_CH(ch2));
  167. /* from the datasheet:
  168. * "Software must clear this register in preparation for a
  169. * multi-cycle accumulation.
  170. */
  171. writel(LRADC_CH_VALUE_MASK,
  172. ts->base + LRADC_CH(ch1) + STMP_OFFSET_REG_CLR);
  173. writel(LRADC_CH_VALUE_MASK,
  174. ts->base + LRADC_CH(ch2) + STMP_OFFSET_REG_CLR);
  175. /* prepare the delay/loop unit according to the oversampling count */
  176. writel(LRADC_DELAY_TRIGGER(1 << ch1) | LRADC_DELAY_TRIGGER(1 << ch2) |
  177. LRADC_DELAY_TRIGGER_DELAYS(0) |
  178. LRADC_DELAY_LOOP(ts->over_sample_cnt - 1) |
  179. LRADC_DELAY_DELAY(ts->over_sample_delay - 1),
  180. ts->base + LRADC_DELAY(3));
  181. writel(LRADC_CTRL1_LRADC_IRQ(ch2),
  182. ts->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR);
  183. /*
  184. * after changing the touchscreen plates setting
  185. * the signals need some initial time to settle. Start the
  186. * SoC's delay unit and start the conversion later
  187. * and automatically.
  188. */
  189. writel(LRADC_DELAY_TRIGGER(0) | LRADC_DELAY_TRIGGER_DELAYS(BIT(3)) |
  190. LRADC_DELAY_KICK | LRADC_DELAY_DELAY(ts->settling_delay),
  191. ts->base + LRADC_DELAY(2));
  192. }
  193. static unsigned int mxs_lradc_ts_read_raw_channel(struct mxs_lradc_ts *ts,
  194. unsigned int channel)
  195. {
  196. u32 reg;
  197. unsigned int num_samples, val;
  198. reg = readl(ts->base + LRADC_CH(channel));
  199. if (reg & LRADC_CH_ACCUMULATE)
  200. num_samples = ts->over_sample_cnt;
  201. else
  202. num_samples = 1;
  203. val = (reg & LRADC_CH_VALUE_MASK) >> LRADC_CH_VALUE_OFFSET;
  204. return val / num_samples;
  205. }
  206. static unsigned int mxs_lradc_read_ts_pressure(struct mxs_lradc_ts *ts,
  207. unsigned int ch1, unsigned int ch2)
  208. {
  209. u32 reg, mask;
  210. unsigned int pressure, m1, m2;
  211. mask = LRADC_CTRL1_LRADC_IRQ(ch1) | LRADC_CTRL1_LRADC_IRQ(ch2);
  212. reg = readl(ts->base + LRADC_CTRL1) & mask;
  213. while (reg != mask) {
  214. reg = readl(ts->base + LRADC_CTRL1) & mask;
  215. dev_dbg(ts->dev, "One channel is still busy: %X\n", reg);
  216. }
  217. m1 = mxs_lradc_ts_read_raw_channel(ts, ch1);
  218. m2 = mxs_lradc_ts_read_raw_channel(ts, ch2);
  219. if (m2 == 0) {
  220. dev_warn(ts->dev, "Cannot calculate pressure\n");
  221. return 1 << (LRADC_RESOLUTION - 1);
  222. }
  223. /* simply scale the value from 0 ... max ADC resolution */
  224. pressure = m1;
  225. pressure *= (1 << LRADC_RESOLUTION);
  226. pressure /= m2;
  227. dev_dbg(ts->dev, "Pressure = %u\n", pressure);
  228. return pressure;
  229. }
  230. #define TS_CH_XP 2
  231. #define TS_CH_YP 3
  232. #define TS_CH_XM 4
  233. #define TS_CH_YM 5
  234. /*
  235. * YP(open)--+-------------+
  236. * | |--+
  237. * | | |
  238. * YM(-)--+-------------+ |
  239. * +--------------+
  240. * | |
  241. * XP(weak+) XM(open)
  242. *
  243. * "weak+" means 200k Ohm VDDIO
  244. * (-) means GND
  245. */
  246. static void mxs_lradc_setup_touch_detection(struct mxs_lradc_ts *ts)
  247. {
  248. struct mxs_lradc *lradc = ts->lradc;
  249. /*
  250. * In order to detect a touch event the 'touch detect enable' bit
  251. * enables:
  252. * - a weak pullup to the X+ connector
  253. * - a strong ground at the Y- connector
  254. */
  255. writel(info[lradc->soc].mask,
  256. ts->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR);
  257. writel(info[lradc->soc].bit,
  258. ts->base + LRADC_CTRL0 + STMP_OFFSET_REG_SET);
  259. }
  260. /*
  261. * YP(meas)--+-------------+
  262. * | |--+
  263. * | | |
  264. * YM(open)--+-------------+ |
  265. * +--------------+
  266. * | |
  267. * XP(+) XM(-)
  268. *
  269. * (+) means here 1.85 V
  270. * (-) means here GND
  271. */
  272. static void mxs_lradc_prepare_x_pos(struct mxs_lradc_ts *ts)
  273. {
  274. struct mxs_lradc *lradc = ts->lradc;
  275. writel(info[lradc->soc].mask,
  276. ts->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR);
  277. writel(info[lradc->soc].x_plate,
  278. ts->base + LRADC_CTRL0 + STMP_OFFSET_REG_SET);
  279. ts->cur_plate = LRADC_SAMPLE_X;
  280. mxs_lradc_map_ts_channel(ts, TOUCHSCREEN_VCHANNEL1, TS_CH_YP);
  281. mxs_lradc_setup_ts_channel(ts, TOUCHSCREEN_VCHANNEL1);
  282. }
  283. /*
  284. * YP(+)--+-------------+
  285. * | |--+
  286. * | | |
  287. * YM(-)--+-------------+ |
  288. * +--------------+
  289. * | |
  290. * XP(open) XM(meas)
  291. *
  292. * (+) means here 1.85 V
  293. * (-) means here GND
  294. */
  295. static void mxs_lradc_prepare_y_pos(struct mxs_lradc_ts *ts)
  296. {
  297. struct mxs_lradc *lradc = ts->lradc;
  298. writel(info[lradc->soc].mask,
  299. ts->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR);
  300. writel(info[lradc->soc].y_plate,
  301. ts->base + LRADC_CTRL0 + STMP_OFFSET_REG_SET);
  302. ts->cur_plate = LRADC_SAMPLE_Y;
  303. mxs_lradc_map_ts_channel(ts, TOUCHSCREEN_VCHANNEL1, TS_CH_XM);
  304. mxs_lradc_setup_ts_channel(ts, TOUCHSCREEN_VCHANNEL1);
  305. }
  306. /*
  307. * YP(+)--+-------------+
  308. * | |--+
  309. * | | |
  310. * YM(meas)--+-------------+ |
  311. * +--------------+
  312. * | |
  313. * XP(meas) XM(-)
  314. *
  315. * (+) means here 1.85 V
  316. * (-) means here GND
  317. */
  318. static void mxs_lradc_prepare_pressure(struct mxs_lradc_ts *ts)
  319. {
  320. struct mxs_lradc *lradc = ts->lradc;
  321. writel(info[lradc->soc].mask,
  322. ts->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR);
  323. writel(info[lradc->soc].pressure,
  324. ts->base + LRADC_CTRL0 + STMP_OFFSET_REG_SET);
  325. ts->cur_plate = LRADC_SAMPLE_PRESSURE;
  326. mxs_lradc_map_ts_channel(ts, TOUCHSCREEN_VCHANNEL1, TS_CH_YM);
  327. mxs_lradc_map_ts_channel(ts, TOUCHSCREEN_VCHANNEL2, TS_CH_XP);
  328. mxs_lradc_setup_ts_pressure(ts, TOUCHSCREEN_VCHANNEL2,
  329. TOUCHSCREEN_VCHANNEL1);
  330. }
  331. static void mxs_lradc_enable_touch_detection(struct mxs_lradc_ts *ts)
  332. {
  333. mxs_lradc_setup_touch_detection(ts);
  334. ts->cur_plate = LRADC_TOUCH;
  335. writel(LRADC_CTRL1_TOUCH_DETECT_IRQ | LRADC_CTRL1_TOUCH_DETECT_IRQ_EN,
  336. ts->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR);
  337. writel(LRADC_CTRL1_TOUCH_DETECT_IRQ_EN,
  338. ts->base + LRADC_CTRL1 + STMP_OFFSET_REG_SET);
  339. }
  340. static void mxs_lradc_start_touch_event(struct mxs_lradc_ts *ts)
  341. {
  342. writel(LRADC_CTRL1_TOUCH_DETECT_IRQ_EN,
  343. ts->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR);
  344. writel(LRADC_CTRL1_LRADC_IRQ_EN(TOUCHSCREEN_VCHANNEL1),
  345. ts->base + LRADC_CTRL1 + STMP_OFFSET_REG_SET);
  346. /*
  347. * start with the Y-pos, because it uses nearly the same plate
  348. * settings like the touch detection
  349. */
  350. mxs_lradc_prepare_y_pos(ts);
  351. }
  352. static void mxs_lradc_report_ts_event(struct mxs_lradc_ts *ts)
  353. {
  354. input_report_abs(ts->ts_input, ABS_X, ts->ts_x_pos);
  355. input_report_abs(ts->ts_input, ABS_Y, ts->ts_y_pos);
  356. input_report_abs(ts->ts_input, ABS_PRESSURE, ts->ts_pressure);
  357. input_report_key(ts->ts_input, BTN_TOUCH, 1);
  358. input_sync(ts->ts_input);
  359. }
  360. static void mxs_lradc_complete_touch_event(struct mxs_lradc_ts *ts)
  361. {
  362. mxs_lradc_setup_touch_detection(ts);
  363. ts->cur_plate = LRADC_SAMPLE_VALID;
  364. /*
  365. * start a dummy conversion to burn time to settle the signals
  366. * note: we are not interested in the conversion's value
  367. */
  368. writel(0, ts->base + LRADC_CH(TOUCHSCREEN_VCHANNEL1));
  369. writel(LRADC_CTRL1_LRADC_IRQ(TOUCHSCREEN_VCHANNEL1) |
  370. LRADC_CTRL1_LRADC_IRQ(TOUCHSCREEN_VCHANNEL2),
  371. ts->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR);
  372. writel(LRADC_DELAY_TRIGGER(1 << TOUCHSCREEN_VCHANNEL1) |
  373. LRADC_DELAY_KICK | LRADC_DELAY_DELAY(10),
  374. ts->base + LRADC_DELAY(2));
  375. }
  376. /*
  377. * in order to avoid false measurements, report only samples where
  378. * the surface is still touched after the position measurement
  379. */
  380. static void mxs_lradc_finish_touch_event(struct mxs_lradc_ts *ts, bool valid)
  381. {
  382. /* if it is still touched, report the sample */
  383. if (valid && mxs_lradc_check_touch_event(ts)) {
  384. ts->ts_valid = true;
  385. mxs_lradc_report_ts_event(ts);
  386. }
  387. /* if it is even still touched, continue with the next measurement */
  388. if (mxs_lradc_check_touch_event(ts)) {
  389. mxs_lradc_prepare_y_pos(ts);
  390. return;
  391. }
  392. if (ts->ts_valid) {
  393. /* signal the release */
  394. ts->ts_valid = false;
  395. input_report_key(ts->ts_input, BTN_TOUCH, 0);
  396. input_sync(ts->ts_input);
  397. }
  398. /* if it is released, wait for the next touch via IRQ */
  399. ts->cur_plate = LRADC_TOUCH;
  400. writel(0, ts->base + LRADC_DELAY(2));
  401. writel(0, ts->base + LRADC_DELAY(3));
  402. writel(LRADC_CTRL1_TOUCH_DETECT_IRQ |
  403. LRADC_CTRL1_LRADC_IRQ_EN(TOUCHSCREEN_VCHANNEL1) |
  404. LRADC_CTRL1_LRADC_IRQ(TOUCHSCREEN_VCHANNEL1),
  405. ts->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR);
  406. writel(LRADC_CTRL1_TOUCH_DETECT_IRQ_EN,
  407. ts->base + LRADC_CTRL1 + STMP_OFFSET_REG_SET);
  408. }
  409. /* touchscreen's state machine */
  410. static void mxs_lradc_handle_touch(struct mxs_lradc_ts *ts)
  411. {
  412. switch (ts->cur_plate) {
  413. case LRADC_TOUCH:
  414. if (mxs_lradc_check_touch_event(ts))
  415. mxs_lradc_start_touch_event(ts);
  416. writel(LRADC_CTRL1_TOUCH_DETECT_IRQ,
  417. ts->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR);
  418. return;
  419. case LRADC_SAMPLE_Y:
  420. ts->ts_y_pos =
  421. mxs_lradc_ts_read_raw_channel(ts, TOUCHSCREEN_VCHANNEL1);
  422. mxs_lradc_prepare_x_pos(ts);
  423. return;
  424. case LRADC_SAMPLE_X:
  425. ts->ts_x_pos =
  426. mxs_lradc_ts_read_raw_channel(ts, TOUCHSCREEN_VCHANNEL1);
  427. mxs_lradc_prepare_pressure(ts);
  428. return;
  429. case LRADC_SAMPLE_PRESSURE:
  430. ts->ts_pressure =
  431. mxs_lradc_read_ts_pressure(ts,
  432. TOUCHSCREEN_VCHANNEL2,
  433. TOUCHSCREEN_VCHANNEL1);
  434. mxs_lradc_complete_touch_event(ts);
  435. return;
  436. case LRADC_SAMPLE_VALID:
  437. mxs_lradc_finish_touch_event(ts, 1);
  438. break;
  439. }
  440. }
  441. /* IRQ Handling */
  442. static irqreturn_t mxs_lradc_ts_handle_irq(int irq, void *data)
  443. {
  444. struct mxs_lradc_ts *ts = data;
  445. struct mxs_lradc *lradc = ts->lradc;
  446. unsigned long reg = readl(ts->base + LRADC_CTRL1);
  447. u32 clr_irq = mxs_lradc_irq_mask(lradc);
  448. const u32 ts_irq_mask =
  449. LRADC_CTRL1_TOUCH_DETECT_IRQ |
  450. LRADC_CTRL1_LRADC_IRQ(TOUCHSCREEN_VCHANNEL1) |
  451. LRADC_CTRL1_LRADC_IRQ(TOUCHSCREEN_VCHANNEL2);
  452. unsigned long flags;
  453. if (!(reg & mxs_lradc_irq_mask(lradc)))
  454. return IRQ_NONE;
  455. if (reg & ts_irq_mask) {
  456. spin_lock_irqsave(&ts->lock, flags);
  457. mxs_lradc_handle_touch(ts);
  458. spin_unlock_irqrestore(&ts->lock, flags);
  459. /* Make sure we don't clear the next conversion's interrupt. */
  460. clr_irq &= ~(LRADC_CTRL1_LRADC_IRQ(TOUCHSCREEN_VCHANNEL1) |
  461. LRADC_CTRL1_LRADC_IRQ(TOUCHSCREEN_VCHANNEL2));
  462. writel(reg & clr_irq,
  463. ts->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR);
  464. }
  465. return IRQ_HANDLED;
  466. }
  467. static int mxs_lradc_ts_open(struct input_dev *dev)
  468. {
  469. struct mxs_lradc_ts *ts = input_get_drvdata(dev);
  470. /* Enable the touch-detect circuitry. */
  471. mxs_lradc_enable_touch_detection(ts);
  472. return 0;
  473. }
  474. static void mxs_lradc_ts_stop(struct mxs_lradc_ts *ts)
  475. {
  476. int i;
  477. struct mxs_lradc *lradc = ts->lradc;
  478. /* stop all interrupts from firing */
  479. writel(LRADC_CTRL1_TOUCH_DETECT_IRQ_EN |
  480. LRADC_CTRL1_LRADC_IRQ_EN(TOUCHSCREEN_VCHANNEL1) |
  481. LRADC_CTRL1_LRADC_IRQ_EN(TOUCHSCREEN_VCHANNEL2),
  482. ts->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR);
  483. /* Power-down touchscreen touch-detect circuitry. */
  484. writel(info[lradc->soc].mask,
  485. ts->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR);
  486. writel(lradc->buffer_vchans << LRADC_CTRL1_LRADC_IRQ_EN_OFFSET,
  487. ts->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR);
  488. for (i = 1; i < LRADC_MAX_DELAY_CHANS; i++)
  489. writel(0, ts->base + LRADC_DELAY(i));
  490. }
  491. static void mxs_lradc_ts_close(struct input_dev *dev)
  492. {
  493. struct mxs_lradc_ts *ts = input_get_drvdata(dev);
  494. mxs_lradc_ts_stop(ts);
  495. }
  496. static void mxs_lradc_ts_hw_init(struct mxs_lradc_ts *ts)
  497. {
  498. struct mxs_lradc *lradc = ts->lradc;
  499. /* Configure the touchscreen type */
  500. if (lradc->soc == IMX28_LRADC) {
  501. writel(LRADC_CTRL0_MX28_TOUCH_SCREEN_TYPE,
  502. ts->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR);
  503. if (lradc->touchscreen_wire == MXS_LRADC_TOUCHSCREEN_5WIRE)
  504. writel(LRADC_CTRL0_MX28_TOUCH_SCREEN_TYPE,
  505. ts->base + LRADC_CTRL0 + STMP_OFFSET_REG_SET);
  506. }
  507. }
  508. static int mxs_lradc_ts_register(struct mxs_lradc_ts *ts)
  509. {
  510. struct input_dev *input;
  511. struct device *dev = ts->dev;
  512. input = devm_input_allocate_device(dev);
  513. if (!input)
  514. return -ENOMEM;
  515. input->name = "mxs-lradc-ts";
  516. input->id.bustype = BUS_HOST;
  517. input->open = mxs_lradc_ts_open;
  518. input->close = mxs_lradc_ts_close;
  519. __set_bit(INPUT_PROP_DIRECT, input->propbit);
  520. input_set_capability(input, EV_KEY, BTN_TOUCH);
  521. input_set_abs_params(input, ABS_X, 0, LRADC_SINGLE_SAMPLE_MASK, 0, 0);
  522. input_set_abs_params(input, ABS_Y, 0, LRADC_SINGLE_SAMPLE_MASK, 0, 0);
  523. input_set_abs_params(input, ABS_PRESSURE, 0, LRADC_SINGLE_SAMPLE_MASK,
  524. 0, 0);
  525. ts->ts_input = input;
  526. input_set_drvdata(input, ts);
  527. return input_register_device(input);
  528. }
  529. static int mxs_lradc_ts_probe(struct platform_device *pdev)
  530. {
  531. struct device *dev = &pdev->dev;
  532. struct device_node *node = dev->parent->of_node;
  533. struct mxs_lradc *lradc = dev_get_drvdata(dev->parent);
  534. struct mxs_lradc_ts *ts;
  535. struct resource *iores;
  536. int ret, irq, virq, i;
  537. u32 ts_wires = 0, adapt;
  538. ts = devm_kzalloc(dev, sizeof(*ts), GFP_KERNEL);
  539. if (!ts)
  540. return -ENOMEM;
  541. platform_set_drvdata(pdev, ts);
  542. ts->lradc = lradc;
  543. ts->dev = dev;
  544. spin_lock_init(&ts->lock);
  545. iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  546. if (!iores)
  547. return -EINVAL;
  548. ts->base = devm_ioremap(dev, iores->start, resource_size(iores));
  549. if (!ts->base)
  550. return -ENOMEM;
  551. ret = of_property_read_u32(node, "fsl,lradc-touchscreen-wires",
  552. &ts_wires);
  553. if (ret)
  554. return ret;
  555. if (of_property_read_u32(node, "fsl,ave-ctrl", &adapt)) {
  556. ts->over_sample_cnt = 4;
  557. } else {
  558. if (adapt >= 1 && adapt <= 32) {
  559. ts->over_sample_cnt = adapt;
  560. } else {
  561. dev_err(ts->dev, "Invalid sample count (%u)\n",
  562. adapt);
  563. return -EINVAL;
  564. }
  565. }
  566. if (of_property_read_u32(node, "fsl,ave-delay", &adapt)) {
  567. ts->over_sample_delay = 2;
  568. } else {
  569. if (adapt >= 2 && adapt <= LRADC_DELAY_DELAY_MASK + 1) {
  570. ts->over_sample_delay = adapt;
  571. } else {
  572. dev_err(ts->dev, "Invalid sample delay (%u)\n",
  573. adapt);
  574. return -EINVAL;
  575. }
  576. }
  577. if (of_property_read_u32(node, "fsl,settling", &adapt)) {
  578. ts->settling_delay = 10;
  579. } else {
  580. if (adapt >= 1 && adapt <= LRADC_DELAY_DELAY_MASK) {
  581. ts->settling_delay = adapt;
  582. } else {
  583. dev_err(ts->dev, "Invalid settling delay (%u)\n",
  584. adapt);
  585. return -EINVAL;
  586. }
  587. }
  588. ret = stmp_reset_block(ts->base);
  589. if (ret)
  590. return ret;
  591. mxs_lradc_ts_hw_init(ts);
  592. for (i = 0; i < 3; i++) {
  593. irq = platform_get_irq_byname(pdev, mxs_lradc_ts_irq_names[i]);
  594. if (irq < 0)
  595. return irq;
  596. virq = irq_of_parse_and_map(node, irq);
  597. mxs_lradc_ts_stop(ts);
  598. ret = devm_request_irq(dev, virq,
  599. mxs_lradc_ts_handle_irq,
  600. 0, mxs_lradc_ts_irq_names[i], ts);
  601. if (ret)
  602. return ret;
  603. }
  604. return mxs_lradc_ts_register(ts);
  605. }
  606. static struct platform_driver mxs_lradc_ts_driver = {
  607. .driver = {
  608. .name = "mxs-lradc-ts",
  609. },
  610. .probe = mxs_lradc_ts_probe,
  611. };
  612. module_platform_driver(mxs_lradc_ts_driver);
  613. MODULE_AUTHOR("Marek Vasut <marex@denx.de>");
  614. MODULE_DESCRIPTION("Freescale MXS LRADC touchscreen driver");
  615. MODULE_LICENSE("GPL");
  616. MODULE_ALIAS("platform:mxs-lradc-ts");