Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

iio: mxs: Implement support for touchscreen

This patch implements support for sampling of a touchscreen into
the MXS LRADC driver. The LRADC block allows configuring some of
it's channels into special mode where they either output the drive
voltage or sample it, allowing it to operate a 4-wire or 5-wire
resistive touchscreen.

In case the touchscreen mode is enabled, the LRADC slot #7 is
reserved for touchscreen only, therefore it is not possible to
sample 8 LRADC channels at time, but only 7 channels.

The touchscreen controller is configured such that the PENDOWN event
disables touchscreen interrupts and triggers execution of worker
thread, which then polls the touchscreen controller for X, Y and
Pressure values. This reduces the overhead of interrupt-driven
operation. Upon the PENUP event, the worker thread re-enables the
PENDOWN detection interrupt and exits.

Signed-off-by: Marek Vasut <marex@denx.de>
Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>

authored by

Marek Vasut and committed by
Jonathan Cameron
06ddd353 2b4ff038

+450 -20
+6
Documentation/devicetree/bindings/staging/iio/adc/mxs-lradc.txt
··· 5 5 - reg: Address and length of the register set for the device 6 6 - interrupts: Should contain the LRADC interrupts 7 7 8 + Optional properties: 9 + - fsl,lradc-touchscreen-wires: Number of wires used to connect the touchscreen 10 + to LRADC. Valid value is either 4 or 5. If this 11 + property is not present, then the touchscreen is 12 + disabled. 13 + 8 14 Examples: 9 15 10 16 lradc@80050000 {
+444 -20
drivers/staging/iio/adc/mxs-lradc.c
··· 32 32 #include <linux/stmp_device.h> 33 33 #include <linux/bitops.h> 34 34 #include <linux/completion.h> 35 + #include <linux/delay.h> 36 + #include <linux/input.h> 35 37 36 38 #include <mach/mxs.h> 37 39 #include <mach/common.h> ··· 61 59 #define LRADC_DELAY_TIMER_PER 200 62 60 #define LRADC_DELAY_TIMER_LOOP 5 63 61 62 + /* 63 + * Once the pen touches the touchscreen, the touchscreen switches from 64 + * IRQ-driven mode to polling mode to prevent interrupt storm. The polling 65 + * is realized by worker thread, which is called every 20 or so milliseconds. 66 + * This gives the touchscreen enough fluence and does not strain the system 67 + * too much. 68 + */ 69 + #define LRADC_TS_SAMPLE_DELAY_MS 5 70 + 71 + /* 72 + * The LRADC reads the following amount of samples from each touchscreen 73 + * channel and the driver then computes avarage of these. 74 + */ 75 + #define LRADC_TS_SAMPLE_AMOUNT 4 76 + 64 77 static const char * const mxs_lradc_irq_name[] = { 65 78 "mxs-lradc-touchscreen", 66 79 "mxs-lradc-thresh0", ··· 92 75 "mxs-lradc-button1", 93 76 }; 94 77 78 + enum mxs_lradc_ts { 79 + MXS_LRADC_TOUCHSCREEN_NONE = 0, 80 + MXS_LRADC_TOUCHSCREEN_4WIRE, 81 + MXS_LRADC_TOUCHSCREEN_5WIRE, 82 + }; 83 + 95 84 struct mxs_lradc { 96 85 struct device *dev; 97 86 void __iomem *base; ··· 109 86 struct mutex lock; 110 87 111 88 struct completion completion; 89 + 90 + /* 91 + * Touchscreen LRADC channels receives a private slot in the CTRL4 92 + * register, the slot #7. Therefore only 7 slots instead of 8 in the 93 + * CTRL4 register can be mapped to LRADC channels when using the 94 + * touchscreen. 95 + * 96 + * Furthermore, certain LRADC channels are shared between touchscreen 97 + * and/or touch-buttons and generic LRADC block. Therefore when using 98 + * either of these, these channels are not available for the regular 99 + * sampling. The shared channels are as follows: 100 + * 101 + * CH0 -- Touch button #0 102 + * CH1 -- Touch button #1 103 + * CH2 -- Touch screen XPUL 104 + * CH3 -- Touch screen YPLL 105 + * CH4 -- Touch screen XNUL 106 + * CH5 -- Touch screen YNLR 107 + * CH6 -- Touch screen WIPER (5-wire only) 108 + * 109 + * The bitfields below represents which parts of the LRADC block are 110 + * switched into special mode of operation. These channels can not 111 + * be sampled as regular LRADC channels. The driver will refuse any 112 + * attempt to sample these channels. 113 + */ 114 + #define CHAN_MASK_TOUCHBUTTON (0x3 << 0) 115 + #define CHAN_MASK_TOUCHSCREEN_4WIRE (0xf << 2) 116 + #define CHAN_MASK_TOUCHSCREEN_5WIRE (0x1f << 2) 117 + enum mxs_lradc_ts use_touchscreen; 118 + bool stop_touchscreen; 119 + bool use_touchbutton; 120 + 121 + struct input_dev *ts_input; 122 + struct work_struct ts_work; 112 123 }; 113 124 114 125 #define LRADC_CTRL0 0x00 115 - #define LRADC_CTRL0_TOUCH_DETECT_ENABLE (1 << 23) 116 - #define LRADC_CTRL0_TOUCH_SCREEN_TYPE (1 << 22) 126 + #define LRADC_CTRL0_TOUCH_DETECT_ENABLE (1 << 23) 127 + #define LRADC_CTRL0_TOUCH_SCREEN_TYPE (1 << 22) 128 + #define LRADC_CTRL0_YNNSW /* YM */ (1 << 21) 129 + #define LRADC_CTRL0_YPNSW /* YP */ (1 << 20) 130 + #define LRADC_CTRL0_YPPSW /* YP */ (1 << 19) 131 + #define LRADC_CTRL0_XNNSW /* XM */ (1 << 18) 132 + #define LRADC_CTRL0_XNPSW /* XM */ (1 << 17) 133 + #define LRADC_CTRL0_XPPSW /* XP */ (1 << 16) 134 + #define LRADC_CTRL0_PLATE_MASK (0x3f << 16) 117 135 118 136 #define LRADC_CTRL1 0x10 119 - #define LRADC_CTRL1_LRADC_IRQ(n) (1 << (n)) 120 - #define LRADC_CTRL1_LRADC_IRQ_MASK 0x1fff 137 + #define LRADC_CTRL1_TOUCH_DETECT_IRQ_EN (1 << 24) 121 138 #define LRADC_CTRL1_LRADC_IRQ_EN(n) (1 << ((n) + 16)) 122 139 #define LRADC_CTRL1_LRADC_IRQ_EN_MASK (0x1fff << 16) 140 + #define LRADC_CTRL1_LRADC_IRQ_EN_OFFSET 16 141 + #define LRADC_CTRL1_TOUCH_DETECT_IRQ (1 << 8) 142 + #define LRADC_CTRL1_LRADC_IRQ(n) (1 << (n)) 143 + #define LRADC_CTRL1_LRADC_IRQ_MASK 0x1fff 144 + #define LRADC_CTRL1_LRADC_IRQ_OFFSET 0 123 145 124 146 #define LRADC_CTRL2 0x20 125 147 #define LRADC_CTRL2_TEMPSENSE_PWD (1 << 15) 148 + 149 + #define LRADC_STATUS 0x40 150 + #define LRADC_STATUS_TOUCH_DETECT_RAW (1 << 0) 126 151 127 152 #define LRADC_CH(n) (0x50 + (0x10 * (n))) 128 153 #define LRADC_CH_ACCUMULATE (1 << 29) ··· 203 132 { 204 133 struct mxs_lradc *lradc = iio_priv(iio_dev); 205 134 int ret; 135 + unsigned long mask; 206 136 207 137 if (m != IIO_CHAN_INFO_RAW) 208 138 return -EINVAL; 209 139 210 140 /* Check for invalid channel */ 211 141 if (chan->channel > LRADC_MAX_TOTAL_CHANS) 142 + return -EINVAL; 143 + 144 + /* Validate the channel if it doesn't intersect with reserved chans. */ 145 + bitmap_set(&mask, chan->channel, 1); 146 + ret = iio_validate_scan_mask_onehot(iio_dev, &mask); 147 + if (ret) 212 148 return -EINVAL; 213 149 214 150 /* ··· 239 161 lradc->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR); 240 162 writel(0xff, lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR); 241 163 242 - writel(chan->channel, lradc->base + LRADC_CTRL4); 164 + /* Clean the slot's previous content, then set new one. */ 165 + writel(LRADC_CTRL4_LRADCSELECT_MASK(0), 166 + lradc->base + LRADC_CTRL4 + STMP_OFFSET_REG_CLR); 167 + writel(chan->channel, lradc->base + LRADC_CTRL4 + STMP_OFFSET_REG_SET); 168 + 243 169 writel(0, lradc->base + LRADC_CH(0)); 244 170 245 171 /* Enable the IRQ and start sampling the channel. */ ··· 277 195 }; 278 196 279 197 /* 198 + * Touchscreen handling 199 + */ 200 + enum lradc_ts_plate { 201 + LRADC_SAMPLE_X, 202 + LRADC_SAMPLE_Y, 203 + LRADC_SAMPLE_PRESSURE, 204 + }; 205 + 206 + static int mxs_lradc_ts_touched(struct mxs_lradc *lradc) 207 + { 208 + uint32_t reg; 209 + 210 + /* Enable touch detection. */ 211 + writel(LRADC_CTRL0_PLATE_MASK, 212 + lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR); 213 + writel(LRADC_CTRL0_TOUCH_DETECT_ENABLE, 214 + lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_SET); 215 + 216 + msleep(LRADC_TS_SAMPLE_DELAY_MS); 217 + 218 + reg = readl(lradc->base + LRADC_STATUS); 219 + 220 + return reg & LRADC_STATUS_TOUCH_DETECT_RAW; 221 + } 222 + 223 + static int32_t mxs_lradc_ts_sample(struct mxs_lradc *lradc, 224 + enum lradc_ts_plate plate, int change) 225 + { 226 + unsigned long delay, jiff; 227 + uint32_t reg, ctrl0 = 0, chan = 0; 228 + /* The touchscreen always uses CTRL4 slot #7. */ 229 + const uint8_t slot = 7; 230 + uint32_t val; 231 + 232 + /* 233 + * There are three correct configurations of the controller sampling 234 + * the touchscreen, each of these configuration provides different 235 + * information from the touchscreen. 236 + * 237 + * The following table describes the sampling configurations: 238 + * +-------------+-------+-------+-------+ 239 + * | Wire \ Axis | X | Y | Z | 240 + * +---------------------+-------+-------+ 241 + * | X+ (CH2) | HI | TS | TS | 242 + * +-------------+-------+-------+-------+ 243 + * | X- (CH4) | LO | SH | HI | 244 + * +-------------+-------+-------+-------+ 245 + * | Y+ (CH3) | SH | HI | HI | 246 + * +-------------+-------+-------+-------+ 247 + * | Y- (CH5) | TS | LO | SH | 248 + * +-------------+-------+-------+-------+ 249 + * 250 + * HI ... strong '1' ; LO ... strong '0' 251 + * SH ... sample here ; TS ... tri-state 252 + * 253 + * There are a few other ways of obtaining the Z coordinate 254 + * (aka. pressure), but the one in the table seems to be the 255 + * most reliable one. 256 + */ 257 + switch (plate) { 258 + case LRADC_SAMPLE_X: 259 + ctrl0 = LRADC_CTRL0_XPPSW | LRADC_CTRL0_XNNSW; 260 + chan = 3; 261 + break; 262 + case LRADC_SAMPLE_Y: 263 + ctrl0 = LRADC_CTRL0_YPPSW | LRADC_CTRL0_YNNSW; 264 + chan = 4; 265 + break; 266 + case LRADC_SAMPLE_PRESSURE: 267 + ctrl0 = LRADC_CTRL0_YPPSW | LRADC_CTRL0_XNNSW; 268 + chan = 5; 269 + break; 270 + } 271 + 272 + if (change) { 273 + writel(LRADC_CTRL0_PLATE_MASK, 274 + lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR); 275 + writel(ctrl0, lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_SET); 276 + 277 + writel(LRADC_CTRL4_LRADCSELECT_MASK(slot), 278 + lradc->base + LRADC_CTRL4 + STMP_OFFSET_REG_CLR); 279 + writel(chan << LRADC_CTRL4_LRADCSELECT_OFFSET(slot), 280 + lradc->base + LRADC_CTRL4 + STMP_OFFSET_REG_SET); 281 + } 282 + 283 + writel(0xffffffff, lradc->base + LRADC_CH(slot) + STMP_OFFSET_REG_CLR); 284 + writel(1 << slot, lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_SET); 285 + 286 + delay = jiffies + msecs_to_jiffies(LRADC_TS_SAMPLE_DELAY_MS); 287 + do { 288 + jiff = jiffies; 289 + reg = readl_relaxed(lradc->base + LRADC_CTRL1); 290 + if (reg & LRADC_CTRL1_LRADC_IRQ(slot)) 291 + break; 292 + } while (time_before(jiff, delay)); 293 + 294 + writel(LRADC_CTRL1_LRADC_IRQ(slot), 295 + lradc->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR); 296 + 297 + if (time_after_eq(jiff, delay)) 298 + return -ETIMEDOUT; 299 + 300 + val = readl(lradc->base + LRADC_CH(slot)); 301 + val &= LRADC_CH_VALUE_MASK; 302 + 303 + return val; 304 + } 305 + 306 + static int32_t mxs_lradc_ts_sample_filter(struct mxs_lradc *lradc, 307 + enum lradc_ts_plate plate) 308 + { 309 + int32_t val, tot = 0; 310 + int i; 311 + 312 + val = mxs_lradc_ts_sample(lradc, plate, 1); 313 + 314 + /* Delay a bit so the touchscreen is stable. */ 315 + mdelay(2); 316 + 317 + for (i = 0; i < LRADC_TS_SAMPLE_AMOUNT; i++) { 318 + val = mxs_lradc_ts_sample(lradc, plate, 0); 319 + tot += val; 320 + } 321 + 322 + return tot / LRADC_TS_SAMPLE_AMOUNT; 323 + } 324 + 325 + static void mxs_lradc_ts_work(struct work_struct *ts_work) 326 + { 327 + struct mxs_lradc *lradc = container_of(ts_work, 328 + struct mxs_lradc, ts_work); 329 + int val_x, val_y, val_p; 330 + bool valid = false; 331 + 332 + while (mxs_lradc_ts_touched(lradc)) { 333 + /* Disable touch detector so we can sample the touchscreen. */ 334 + writel(LRADC_CTRL0_TOUCH_DETECT_ENABLE, 335 + lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR); 336 + 337 + if (likely(valid)) { 338 + input_report_abs(lradc->ts_input, ABS_X, val_x); 339 + input_report_abs(lradc->ts_input, ABS_Y, val_y); 340 + input_report_abs(lradc->ts_input, ABS_PRESSURE, val_p); 341 + input_report_key(lradc->ts_input, BTN_TOUCH, 1); 342 + input_sync(lradc->ts_input); 343 + } 344 + 345 + valid = false; 346 + 347 + val_x = mxs_lradc_ts_sample_filter(lradc, LRADC_SAMPLE_X); 348 + if (val_x < 0) 349 + continue; 350 + val_y = mxs_lradc_ts_sample_filter(lradc, LRADC_SAMPLE_Y); 351 + if (val_y < 0) 352 + continue; 353 + val_p = mxs_lradc_ts_sample_filter(lradc, LRADC_SAMPLE_PRESSURE); 354 + if (val_p < 0) 355 + continue; 356 + 357 + valid = true; 358 + } 359 + 360 + input_report_abs(lradc->ts_input, ABS_PRESSURE, 0); 361 + input_report_key(lradc->ts_input, BTN_TOUCH, 0); 362 + input_sync(lradc->ts_input); 363 + 364 + /* Do not restart the TS IRQ if the driver is shutting down. */ 365 + if (lradc->stop_touchscreen) 366 + return; 367 + 368 + /* Restart the touchscreen interrupts. */ 369 + writel(LRADC_CTRL1_TOUCH_DETECT_IRQ, 370 + lradc->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR); 371 + writel(LRADC_CTRL1_TOUCH_DETECT_IRQ_EN, 372 + lradc->base + LRADC_CTRL1 + STMP_OFFSET_REG_SET); 373 + } 374 + 375 + static int mxs_lradc_ts_open(struct input_dev *dev) 376 + { 377 + struct mxs_lradc *lradc = input_get_drvdata(dev); 378 + 379 + /* The touchscreen is starting. */ 380 + lradc->stop_touchscreen = false; 381 + 382 + /* Enable the touch-detect circuitry. */ 383 + writel(LRADC_CTRL0_TOUCH_DETECT_ENABLE, 384 + lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_SET); 385 + 386 + /* Enable the touch-detect IRQ. */ 387 + writel(LRADC_CTRL1_TOUCH_DETECT_IRQ_EN, 388 + lradc->base + LRADC_CTRL1 + STMP_OFFSET_REG_SET); 389 + 390 + return 0; 391 + } 392 + 393 + static void mxs_lradc_ts_close(struct input_dev *dev) 394 + { 395 + struct mxs_lradc *lradc = input_get_drvdata(dev); 396 + 397 + /* Indicate the touchscreen is stopping. */ 398 + lradc->stop_touchscreen = true; 399 + mb(); 400 + 401 + /* Wait until touchscreen thread finishes any possible remnants. */ 402 + cancel_work_sync(&lradc->ts_work); 403 + 404 + /* Disable touchscreen touch-detect IRQ. */ 405 + writel(LRADC_CTRL1_TOUCH_DETECT_IRQ_EN, 406 + lradc->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR); 407 + 408 + /* Power-down touchscreen touch-detect circuitry. */ 409 + writel(LRADC_CTRL0_TOUCH_DETECT_ENABLE, 410 + lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR); 411 + } 412 + 413 + static int mxs_lradc_ts_register(struct mxs_lradc *lradc) 414 + { 415 + struct input_dev *input; 416 + struct device *dev = lradc->dev; 417 + int ret; 418 + 419 + if (!lradc->use_touchscreen) 420 + return 0; 421 + 422 + input = input_allocate_device(); 423 + if (!input) { 424 + dev_err(dev, "Failed to allocate TS device!\n"); 425 + return -ENOMEM; 426 + } 427 + 428 + input->name = DRIVER_NAME; 429 + input->id.bustype = BUS_HOST; 430 + input->dev.parent = dev; 431 + input->open = mxs_lradc_ts_open; 432 + input->close = mxs_lradc_ts_close; 433 + 434 + __set_bit(EV_ABS, input->evbit); 435 + __set_bit(EV_KEY, input->evbit); 436 + __set_bit(BTN_TOUCH, input->keybit); 437 + input_set_abs_params(input, ABS_X, 0, LRADC_CH_VALUE_MASK, 0, 0); 438 + input_set_abs_params(input, ABS_Y, 0, LRADC_CH_VALUE_MASK, 0, 0); 439 + input_set_abs_params(input, ABS_PRESSURE, 0, LRADC_CH_VALUE_MASK, 0, 0); 440 + 441 + lradc->ts_input = input; 442 + input_set_drvdata(input, lradc); 443 + ret = input_register_device(input); 444 + if (ret) 445 + input_free_device(lradc->ts_input); 446 + 447 + return ret; 448 + } 449 + 450 + static void mxs_lradc_ts_unregister(struct mxs_lradc *lradc) 451 + { 452 + if (!lradc->use_touchscreen) 453 + return; 454 + 455 + cancel_work_sync(&lradc->ts_work); 456 + 457 + input_unregister_device(lradc->ts_input); 458 + } 459 + 460 + /* 280 461 * IRQ Handling 281 462 */ 282 463 static irqreturn_t mxs_lradc_handle_irq(int irq, void *data) ··· 547 202 struct iio_dev *iio = data; 548 203 struct mxs_lradc *lradc = iio_priv(iio); 549 204 unsigned long reg = readl(lradc->base + LRADC_CTRL1); 205 + const uint32_t ts_irq_mask = 206 + LRADC_CTRL1_TOUCH_DETECT_IRQ_EN | 207 + LRADC_CTRL1_TOUCH_DETECT_IRQ; 550 208 551 209 if (!(reg & LRADC_CTRL1_LRADC_IRQ_MASK)) 552 210 return IRQ_NONE; 553 211 554 212 /* 555 - * Touchscreen IRQ handling code shall probably have priority 556 - * and therefore shall be placed here. 213 + * Touchscreen IRQ handling code has priority and therefore 214 + * is placed here. In case touchscreen IRQ arrives, disable 215 + * it ASAP 557 216 */ 217 + if (reg & LRADC_CTRL1_TOUCH_DETECT_IRQ) { 218 + writel(ts_irq_mask, 219 + lradc->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR); 220 + if (!lradc->stop_touchscreen) 221 + schedule_work(&lradc->ts_work); 222 + } 558 223 559 224 if (iio_buffer_enabled(iio)) 560 225 iio_trigger_poll(iio->trig, iio_get_time_ns()); ··· 660 305 { 661 306 struct mxs_lradc *lradc = iio_priv(iio); 662 307 struct iio_buffer *buffer = iio->buffer; 663 - int ret = 0, chan, ofs = 0, enable = 0; 664 - uint32_t ctrl4 = 0; 308 + int ret = 0, chan, ofs = 0; 309 + unsigned long enable = 0; 310 + uint32_t ctrl4_set = 0; 311 + uint32_t ctrl4_clr = 0; 665 312 uint32_t ctrl1_irq = 0; 666 313 const uint32_t chan_value = LRADC_CH_ACCUMULATE | 667 314 ((LRADC_DELAY_TIMER_LOOP - 1) << LRADC_CH_NUM_SAMPLES_OFFSET); ··· 695 338 writel(0xff, lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR); 696 339 697 340 for_each_set_bit(chan, buffer->scan_mask, LRADC_MAX_TOTAL_CHANS) { 698 - ctrl4 |= chan << LRADC_CTRL4_LRADCSELECT_OFFSET(ofs); 341 + ctrl4_set |= chan << LRADC_CTRL4_LRADCSELECT_OFFSET(ofs); 342 + ctrl4_clr |= LRADC_CTRL4_LRADCSELECT_MASK(ofs); 699 343 ctrl1_irq |= LRADC_CTRL1_LRADC_IRQ_EN(ofs); 700 344 writel(chan_value, lradc->base + LRADC_CH(ofs)); 701 - enable |= 1 << ofs; 345 + bitmap_set(&enable, ofs, 1); 702 346 ofs++; 703 347 } 704 348 705 349 writel(LRADC_DELAY_TRIGGER_LRADCS_MASK | LRADC_DELAY_KICK, 706 350 lradc->base + LRADC_DELAY(0) + STMP_OFFSET_REG_CLR); 707 351 708 - writel(ctrl4, lradc->base + LRADC_CTRL4); 352 + writel(ctrl4_clr, lradc->base + LRADC_CTRL4 + STMP_OFFSET_REG_CLR); 353 + writel(ctrl4_set, lradc->base + LRADC_CTRL4 + STMP_OFFSET_REG_SET); 354 + 709 355 writel(ctrl1_irq, lradc->base + LRADC_CTRL1 + STMP_OFFSET_REG_SET); 710 356 711 357 writel(enable << LRADC_DELAY_TRIGGER_LRADCS_OFFSET, ··· 743 383 static bool mxs_lradc_validate_scan_mask(struct iio_dev *iio, 744 384 const unsigned long *mask) 745 385 { 746 - const int mw = bitmap_weight(mask, iio->masklength); 386 + struct mxs_lradc *lradc = iio_priv(iio); 387 + const int len = iio->masklength; 388 + const int map_chans = bitmap_weight(mask, len); 389 + int rsvd_chans = 0; 390 + unsigned long rsvd_mask = 0; 747 391 748 - return mw <= LRADC_MAX_MAPPED_CHANS; 392 + if (lradc->use_touchbutton) 393 + rsvd_mask |= CHAN_MASK_TOUCHBUTTON; 394 + if (lradc->use_touchscreen == MXS_LRADC_TOUCHSCREEN_4WIRE) 395 + rsvd_mask |= CHAN_MASK_TOUCHSCREEN_4WIRE; 396 + if (lradc->use_touchscreen == MXS_LRADC_TOUCHSCREEN_5WIRE) 397 + rsvd_mask |= CHAN_MASK_TOUCHSCREEN_5WIRE; 398 + 399 + if (lradc->use_touchbutton) 400 + rsvd_chans++; 401 + if (lradc->use_touchscreen) 402 + rsvd_chans++; 403 + 404 + /* Test for attempts to map channels with special mode of operation. */ 405 + if (bitmap_intersects(mask, &rsvd_mask, len)) 406 + return false; 407 + 408 + /* Test for attempts to map more channels then available slots. */ 409 + if (map_chans + rsvd_chans > LRADC_MAX_MAPPED_CHANS) 410 + return false; 411 + 412 + return true; 749 413 } 750 414 751 415 static const struct iio_buffer_setup_ops mxs_lradc_buffer_ops = { ··· 818 434 819 435 static void mxs_lradc_hw_init(struct mxs_lradc *lradc) 820 436 { 821 - int i; 822 - const uint32_t cfg = 437 + /* The ADC always uses DELAY CHANNEL 0. */ 438 + const uint32_t adc_cfg = 439 + (1 << (LRADC_DELAY_TRIGGER_DELAYS_OFFSET + 0)) | 823 440 (LRADC_DELAY_TIMER_PER << LRADC_DELAY_DELAY_OFFSET); 824 441 825 442 stmp_reset_block(lradc->base); 826 443 827 - for (i = 0; i < LRADC_MAX_DELAY_CHANS; i++) 828 - writel(cfg | (1 << (LRADC_DELAY_TRIGGER_DELAYS_OFFSET + i)), 829 - lradc->base + LRADC_DELAY(i)); 444 + /* Configure DELAY CHANNEL 0 for generic ADC sampling. */ 445 + writel(adc_cfg, lradc->base + LRADC_DELAY(0)); 446 + 447 + /* Disable remaining DELAY CHANNELs */ 448 + writel(0, lradc->base + LRADC_DELAY(1)); 449 + writel(0, lradc->base + LRADC_DELAY(2)); 450 + writel(0, lradc->base + LRADC_DELAY(3)); 451 + 452 + /* Configure the touchscreen type */ 453 + writel(LRADC_CTRL0_TOUCH_SCREEN_TYPE, 454 + lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR); 455 + 456 + if (lradc->use_touchscreen == MXS_LRADC_TOUCHSCREEN_5WIRE) { 457 + writel(LRADC_CTRL0_TOUCH_SCREEN_TYPE, 458 + lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_SET); 459 + } 830 460 831 461 /* Start internal temperature sensing. */ 832 462 writel(0, lradc->base + LRADC_CTRL2); ··· 860 462 static int mxs_lradc_probe(struct platform_device *pdev) 861 463 { 862 464 struct device *dev = &pdev->dev; 465 + struct device_node *node = dev->of_node; 863 466 struct mxs_lradc *lradc; 864 467 struct iio_dev *iio; 865 468 struct resource *iores; 469 + uint32_t ts_wires = 0; 866 470 int ret = 0; 867 471 int i; 868 472 ··· 885 485 ret = -EADDRNOTAVAIL; 886 486 goto err_addr; 887 487 } 488 + 489 + INIT_WORK(&lradc->ts_work, mxs_lradc_ts_work); 490 + 491 + /* Check if touchscreen is enabled in DT. */ 492 + ret = of_property_read_u32(node, "fsl,lradc-touchscreen-wires", 493 + &ts_wires); 494 + if (ret) 495 + dev_info(dev, "Touchscreen not enabled.\n"); 496 + else if (ts_wires == 4) 497 + lradc->use_touchscreen = MXS_LRADC_TOUCHSCREEN_4WIRE; 498 + else if (ts_wires == 5) 499 + lradc->use_touchscreen = MXS_LRADC_TOUCHSCREEN_5WIRE; 500 + else 501 + dev_warn(dev, "Unsupported number of touchscreen wires (%d)\n", 502 + ts_wires); 888 503 889 504 /* Grab all IRQ sources */ 890 505 for (i = 0; i < 13; i++) { ··· 938 523 if (ret) 939 524 goto err_trig; 940 525 526 + /* Register the touchscreen input device. */ 527 + ret = mxs_lradc_ts_register(lradc); 528 + if (ret) 529 + goto err_dev; 530 + 941 531 /* Register IIO device. */ 942 532 ret = iio_device_register(iio); 943 533 if (ret) { 944 534 dev_err(dev, "Failed to register IIO device\n"); 945 - goto err_dev; 535 + goto err_ts; 946 536 } 947 537 948 538 /* Configure the hardware. */ ··· 955 535 956 536 return 0; 957 537 538 + err_ts: 539 + mxs_lradc_ts_unregister(lradc); 958 540 err_dev: 959 541 mxs_lradc_trigger_remove(iio); 960 542 err_trig: ··· 970 548 { 971 549 struct iio_dev *iio = platform_get_drvdata(pdev); 972 550 struct mxs_lradc *lradc = iio_priv(iio); 551 + 552 + mxs_lradc_ts_unregister(lradc); 973 553 974 554 mxs_lradc_hw_stop(lradc); 975 555