aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/touchscreen/ad7877.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input/touchscreen/ad7877.c')
-rw-r--r--drivers/input/touchscreen/ad7877.c144
1 files changed, 81 insertions, 63 deletions
diff --git a/drivers/input/touchscreen/ad7877.c b/drivers/input/touchscreen/ad7877.c
index 5f0221cffef9..a1952fcc083e 100644
--- a/drivers/input/touchscreen/ad7877.c
+++ b/drivers/input/touchscreen/ad7877.c
@@ -191,13 +191,12 @@ struct ad7877 {
191 struct spi_message msg; 191 struct spi_message msg;
192 192
193 struct mutex mutex; 193 struct mutex mutex;
194 unsigned disabled:1; /* P: mutex */ 194 bool disabled; /* P: mutex */
195 unsigned gpio3:1; /* P: mutex */ 195 bool gpio3; /* P: mutex */
196 unsigned gpio4:1; /* P: mutex */ 196 bool gpio4; /* P: mutex */
197 197
198 spinlock_t lock; 198 spinlock_t lock;
199 struct timer_list timer; /* P: lock */ 199 struct timer_list timer; /* P: lock */
200 unsigned pending:1; /* P: lock */
201 200
202 /* 201 /*
203 * DMA (thus cache coherency maintenance) requires the 202 * DMA (thus cache coherency maintenance) requires the
@@ -206,8 +205,8 @@ struct ad7877 {
206 u16 conversion_data[AD7877_NR_SENSE] ____cacheline_aligned; 205 u16 conversion_data[AD7877_NR_SENSE] ____cacheline_aligned;
207}; 206};
208 207
209static int gpio3; 208static bool gpio3;
210module_param(gpio3, int, 0); 209module_param(gpio3, bool, 0);
211MODULE_PARM_DESC(gpio3, "If gpio3 is set to 1 AUX3 acts as GPIO3"); 210MODULE_PARM_DESC(gpio3, "If gpio3 is set to 1 AUX3 acts as GPIO3");
212 211
213/* 212/*
@@ -230,6 +229,7 @@ static int ad7877_read(struct spi_device *spi, u16 reg)
230 AD7877_READADD(reg)); 229 AD7877_READADD(reg));
231 req->xfer[0].tx_buf = &req->command; 230 req->xfer[0].tx_buf = &req->command;
232 req->xfer[0].len = 2; 231 req->xfer[0].len = 2;
232 req->xfer[0].cs_change = 1;
233 233
234 req->xfer[1].rx_buf = &req->sample; 234 req->xfer[1].rx_buf = &req->sample;
235 req->xfer[1].len = 2; 235 req->xfer[1].len = 2;
@@ -295,20 +295,25 @@ static int ad7877_read_adc(struct spi_device *spi, unsigned command)
295 295
296 req->xfer[0].tx_buf = &req->reset; 296 req->xfer[0].tx_buf = &req->reset;
297 req->xfer[0].len = 2; 297 req->xfer[0].len = 2;
298 req->xfer[0].cs_change = 1;
298 299
299 req->xfer[1].tx_buf = &req->ref_on; 300 req->xfer[1].tx_buf = &req->ref_on;
300 req->xfer[1].len = 2; 301 req->xfer[1].len = 2;
301 req->xfer[1].delay_usecs = ts->vref_delay_usecs; 302 req->xfer[1].delay_usecs = ts->vref_delay_usecs;
303 req->xfer[1].cs_change = 1;
302 304
303 req->xfer[2].tx_buf = &req->command; 305 req->xfer[2].tx_buf = &req->command;
304 req->xfer[2].len = 2; 306 req->xfer[2].len = 2;
305 req->xfer[2].delay_usecs = ts->vref_delay_usecs; 307 req->xfer[2].delay_usecs = ts->vref_delay_usecs;
308 req->xfer[2].cs_change = 1;
306 309
307 req->xfer[3].rx_buf = &req->sample; 310 req->xfer[3].rx_buf = &req->sample;
308 req->xfer[3].len = 2; 311 req->xfer[3].len = 2;
312 req->xfer[3].cs_change = 1;
309 313
310 req->xfer[4].tx_buf = &ts->cmd_crtl2; /*REF OFF*/ 314 req->xfer[4].tx_buf = &ts->cmd_crtl2; /*REF OFF*/
311 req->xfer[4].len = 2; 315 req->xfer[4].len = 2;
316 req->xfer[4].cs_change = 1;
312 317
313 req->xfer[5].tx_buf = &ts->cmd_crtl1; /*DEFAULT*/ 318 req->xfer[5].tx_buf = &ts->cmd_crtl1; /*DEFAULT*/
314 req->xfer[5].len = 2; 319 req->xfer[5].len = 2;
@@ -327,7 +332,7 @@ static int ad7877_read_adc(struct spi_device *spi, unsigned command)
327 return status ? : sample; 332 return status ? : sample;
328} 333}
329 334
330static void ad7877_rx(struct ad7877 *ts) 335static int ad7877_process_data(struct ad7877 *ts)
331{ 336{
332 struct input_dev *input_dev = ts->input; 337 struct input_dev *input_dev = ts->input;
333 unsigned Rt; 338 unsigned Rt;
@@ -354,11 +359,25 @@ static void ad7877_rx(struct ad7877 *ts)
354 Rt /= z1; 359 Rt /= z1;
355 Rt = (Rt + 2047) >> 12; 360 Rt = (Rt + 2047) >> 12;
356 361
362 /*
363 * Sample found inconsistent, pressure is beyond
364 * the maximum. Don't report it to user space.
365 */
366 if (Rt > ts->pressure_max)
367 return -EINVAL;
368
369 if (!timer_pending(&ts->timer))
370 input_report_key(input_dev, BTN_TOUCH, 1);
371
357 input_report_abs(input_dev, ABS_X, x); 372 input_report_abs(input_dev, ABS_X, x);
358 input_report_abs(input_dev, ABS_Y, y); 373 input_report_abs(input_dev, ABS_Y, y);
359 input_report_abs(input_dev, ABS_PRESSURE, Rt); 374 input_report_abs(input_dev, ABS_PRESSURE, Rt);
360 input_sync(input_dev); 375 input_sync(input_dev);
376
377 return 0;
361 } 378 }
379
380 return -EINVAL;
362} 381}
363 382
364static inline void ad7877_ts_event_release(struct ad7877 *ts) 383static inline void ad7877_ts_event_release(struct ad7877 *ts)
@@ -366,72 +385,56 @@ static inline void ad7877_ts_event_release(struct ad7877 *ts)
366 struct input_dev *input_dev = ts->input; 385 struct input_dev *input_dev = ts->input;
367 386
368 input_report_abs(input_dev, ABS_PRESSURE, 0); 387 input_report_abs(input_dev, ABS_PRESSURE, 0);
388 input_report_key(input_dev, BTN_TOUCH, 0);
369 input_sync(input_dev); 389 input_sync(input_dev);
370} 390}
371 391
372static void ad7877_timer(unsigned long handle) 392static void ad7877_timer(unsigned long handle)
373{ 393{
374 struct ad7877 *ts = (void *)handle; 394 struct ad7877 *ts = (void *)handle;
395 unsigned long flags;
375 396
397 spin_lock_irqsave(&ts->lock, flags);
376 ad7877_ts_event_release(ts); 398 ad7877_ts_event_release(ts);
399 spin_unlock_irqrestore(&ts->lock, flags);
377} 400}
378 401
379static irqreturn_t ad7877_irq(int irq, void *handle) 402static irqreturn_t ad7877_irq(int irq, void *handle)
380{ 403{
381 struct ad7877 *ts = handle; 404 struct ad7877 *ts = handle;
382 unsigned long flags; 405 unsigned long flags;
383 int status; 406 int error;
384 407
385 /* 408 error = spi_sync(ts->spi, &ts->msg);
386 * The repeated conversion sequencer controlled by TMR kicked off 409 if (error) {
387 * too fast. We ignore the last and process the sample sequence 410 dev_err(&ts->spi->dev, "spi_sync --> %d\n", error);
388 * currently in the queue. It can't be older than 9.4ms, and we 411 goto out;
389 * need to avoid that ts->msg doesn't get issued twice while in work. 412 }
390 */
391 413
392 spin_lock_irqsave(&ts->lock, flags); 414 spin_lock_irqsave(&ts->lock, flags);
393 if (!ts->pending) { 415 error = ad7877_process_data(ts);
394 ts->pending = 1; 416 if (!error)
395 417 mod_timer(&ts->timer, jiffies + TS_PEN_UP_TIMEOUT);
396 status = spi_async(ts->spi, &ts->msg);
397 if (status)
398 dev_err(&ts->spi->dev, "spi_sync --> %d\n", status);
399 }
400 spin_unlock_irqrestore(&ts->lock, flags); 418 spin_unlock_irqrestore(&ts->lock, flags);
401 419
420out:
402 return IRQ_HANDLED; 421 return IRQ_HANDLED;
403} 422}
404 423
405static void ad7877_callback(void *_ts)
406{
407 struct ad7877 *ts = _ts;
408
409 spin_lock_irq(&ts->lock);
410
411 ad7877_rx(ts);
412 ts->pending = 0;
413 mod_timer(&ts->timer, jiffies + TS_PEN_UP_TIMEOUT);
414
415 spin_unlock_irq(&ts->lock);
416}
417
418static void ad7877_disable(struct ad7877 *ts) 424static void ad7877_disable(struct ad7877 *ts)
419{ 425{
420 mutex_lock(&ts->mutex); 426 mutex_lock(&ts->mutex);
421 427
422 if (!ts->disabled) { 428 if (!ts->disabled) {
423 ts->disabled = 1; 429 ts->disabled = true;
424 disable_irq(ts->spi->irq); 430 disable_irq(ts->spi->irq);
425 431
426 /* Wait for spi_async callback */
427 while (ts->pending)
428 msleep(1);
429
430 if (del_timer_sync(&ts->timer)) 432 if (del_timer_sync(&ts->timer))
431 ad7877_ts_event_release(ts); 433 ad7877_ts_event_release(ts);
432 } 434 }
433 435
434 /* we know the chip's in lowpower mode since we always 436 /*
437 * We know the chip's in lowpower mode since we always
435 * leave it that way after every request 438 * leave it that way after every request
436 */ 439 */
437 440
@@ -443,7 +446,7 @@ static void ad7877_enable(struct ad7877 *ts)
443 mutex_lock(&ts->mutex); 446 mutex_lock(&ts->mutex);
444 447
445 if (ts->disabled) { 448 if (ts->disabled) {
446 ts->disabled = 0; 449 ts->disabled = false;
447 enable_irq(ts->spi->irq); 450 enable_irq(ts->spi->irq);
448 } 451 }
449 452
@@ -453,7 +456,7 @@ static void ad7877_enable(struct ad7877 *ts)
453#define SHOW(name) static ssize_t \ 456#define SHOW(name) static ssize_t \
454name ## _show(struct device *dev, struct device_attribute *attr, char *buf) \ 457name ## _show(struct device *dev, struct device_attribute *attr, char *buf) \
455{ \ 458{ \
456 struct ad7877 *ts = dev_get_drvdata(dev); \ 459 struct ad7877 *ts = dev_get_drvdata(dev); \
457 ssize_t v = ad7877_read_adc(ts->spi, \ 460 ssize_t v = ad7877_read_adc(ts->spi, \
458 AD7877_READ_CHAN(name)); \ 461 AD7877_READ_CHAN(name)); \
459 if (v < 0) \ 462 if (v < 0) \
@@ -473,7 +476,7 @@ SHOW(temp2)
473static ssize_t ad7877_disable_show(struct device *dev, 476static ssize_t ad7877_disable_show(struct device *dev,
474 struct device_attribute *attr, char *buf) 477 struct device_attribute *attr, char *buf)
475{ 478{
476 struct ad7877 *ts = dev_get_drvdata(dev); 479 struct ad7877 *ts = dev_get_drvdata(dev);
477 480
478 return sprintf(buf, "%u\n", ts->disabled); 481 return sprintf(buf, "%u\n", ts->disabled);
479} 482}
@@ -503,7 +506,7 @@ static DEVICE_ATTR(disable, 0664, ad7877_disable_show, ad7877_disable_store);
503static ssize_t ad7877_dac_show(struct device *dev, 506static ssize_t ad7877_dac_show(struct device *dev,
504 struct device_attribute *attr, char *buf) 507 struct device_attribute *attr, char *buf)
505{ 508{
506 struct ad7877 *ts = dev_get_drvdata(dev); 509 struct ad7877 *ts = dev_get_drvdata(dev);
507 510
508 return sprintf(buf, "%u\n", ts->dac); 511 return sprintf(buf, "%u\n", ts->dac);
509} 512}
@@ -533,7 +536,7 @@ static DEVICE_ATTR(dac, 0664, ad7877_dac_show, ad7877_dac_store);
533static ssize_t ad7877_gpio3_show(struct device *dev, 536static ssize_t ad7877_gpio3_show(struct device *dev,
534 struct device_attribute *attr, char *buf) 537 struct device_attribute *attr, char *buf)
535{ 538{
536 struct ad7877 *ts = dev_get_drvdata(dev); 539 struct ad7877 *ts = dev_get_drvdata(dev);
537 540
538 return sprintf(buf, "%u\n", ts->gpio3); 541 return sprintf(buf, "%u\n", ts->gpio3);
539} 542}
@@ -564,7 +567,7 @@ static DEVICE_ATTR(gpio3, 0664, ad7877_gpio3_show, ad7877_gpio3_store);
564static ssize_t ad7877_gpio4_show(struct device *dev, 567static ssize_t ad7877_gpio4_show(struct device *dev,
565 struct device_attribute *attr, char *buf) 568 struct device_attribute *attr, char *buf)
566{ 569{
567 struct ad7877 *ts = dev_get_drvdata(dev); 570 struct ad7877 *ts = dev_get_drvdata(dev);
568 571
569 return sprintf(buf, "%u\n", ts->gpio4); 572 return sprintf(buf, "%u\n", ts->gpio4);
570} 573}
@@ -597,16 +600,35 @@ static struct attribute *ad7877_attributes[] = {
597 &dev_attr_temp2.attr, 600 &dev_attr_temp2.attr,
598 &dev_attr_aux1.attr, 601 &dev_attr_aux1.attr,
599 &dev_attr_aux2.attr, 602 &dev_attr_aux2.attr,
603 &dev_attr_aux3.attr,
600 &dev_attr_bat1.attr, 604 &dev_attr_bat1.attr,
601 &dev_attr_bat2.attr, 605 &dev_attr_bat2.attr,
602 &dev_attr_disable.attr, 606 &dev_attr_disable.attr,
603 &dev_attr_dac.attr, 607 &dev_attr_dac.attr,
608 &dev_attr_gpio3.attr,
604 &dev_attr_gpio4.attr, 609 &dev_attr_gpio4.attr,
605 NULL 610 NULL
606}; 611};
607 612
613static mode_t ad7877_attr_is_visible(struct kobject *kobj,
614 struct attribute *attr, int n)
615{
616 mode_t mode = attr->mode;
617
618 if (attr == &dev_attr_aux3.attr) {
619 if (gpio3)
620 mode = 0;
621 } else if (attr == &dev_attr_gpio3.attr) {
622 if (!gpio3)
623 mode = 0;
624 }
625
626 return mode;
627}
628
608static const struct attribute_group ad7877_attr_group = { 629static const struct attribute_group ad7877_attr_group = {
609 .attrs = ad7877_attributes, 630 .is_visible = ad7877_attr_is_visible,
631 .attrs = ad7877_attributes,
610}; 632};
611 633
612static void ad7877_setup_ts_def_msg(struct spi_device *spi, struct ad7877 *ts) 634static void ad7877_setup_ts_def_msg(struct spi_device *spi, struct ad7877 *ts)
@@ -635,22 +657,25 @@ static void ad7877_setup_ts_def_msg(struct spi_device *spi, struct ad7877 *ts)
635 657
636 spi_message_init(m); 658 spi_message_init(m);
637 659
638 m->complete = ad7877_callback;
639 m->context = ts; 660 m->context = ts;
640 661
641 ts->xfer[0].tx_buf = &ts->cmd_crtl1; 662 ts->xfer[0].tx_buf = &ts->cmd_crtl1;
642 ts->xfer[0].len = 2; 663 ts->xfer[0].len = 2;
664 ts->xfer[0].cs_change = 1;
643 665
644 spi_message_add_tail(&ts->xfer[0], m); 666 spi_message_add_tail(&ts->xfer[0], m);
645 667
646 ts->xfer[1].tx_buf = &ts->cmd_dummy; /* Send ZERO */ 668 ts->xfer[1].tx_buf = &ts->cmd_dummy; /* Send ZERO */
647 ts->xfer[1].len = 2; 669 ts->xfer[1].len = 2;
670 ts->xfer[1].cs_change = 1;
648 671
649 spi_message_add_tail(&ts->xfer[1], m); 672 spi_message_add_tail(&ts->xfer[1], m);
650 673
651 for (i = 0; i < 11; i++) { 674 for (i = 0; i < AD7877_NR_SENSE; i++) {
652 ts->xfer[i + 2].rx_buf = &ts->conversion_data[AD7877_SEQ_YPOS + i]; 675 ts->xfer[i + 2].rx_buf = &ts->conversion_data[AD7877_SEQ_YPOS + i];
653 ts->xfer[i + 2].len = 2; 676 ts->xfer[i + 2].len = 2;
677 if (i < (AD7877_NR_SENSE - 1))
678 ts->xfer[i + 2].cs_change = 1;
654 spi_message_add_tail(&ts->xfer[i + 2], m); 679 spi_message_add_tail(&ts->xfer[i + 2], m);
655 } 680 }
656} 681}
@@ -718,6 +743,8 @@ static int __devinit ad7877_probe(struct spi_device *spi)
718 input_dev->phys = ts->phys; 743 input_dev->phys = ts->phys;
719 input_dev->dev.parent = &spi->dev; 744 input_dev->dev.parent = &spi->dev;
720 745
746 __set_bit(EV_KEY, input_dev->evbit);
747 __set_bit(BTN_TOUCH, input_dev->keybit);
721 __set_bit(EV_ABS, input_dev->evbit); 748 __set_bit(EV_ABS, input_dev->evbit);
722 __set_bit(ABS_X, input_dev->absbit); 749 __set_bit(ABS_X, input_dev->absbit);
723 __set_bit(ABS_Y, input_dev->absbit); 750 __set_bit(ABS_Y, input_dev->absbit);
@@ -752,8 +779,9 @@ static int __devinit ad7877_probe(struct spi_device *spi)
752 779
753 /* Request AD7877 /DAV GPIO interrupt */ 780 /* Request AD7877 /DAV GPIO interrupt */
754 781
755 err = request_irq(spi->irq, ad7877_irq, IRQF_TRIGGER_FALLING, 782 err = request_threaded_irq(spi->irq, NULL, ad7877_irq,
756 spi->dev.driver->name, ts); 783 IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
784 spi->dev.driver->name, ts);
757 if (err) { 785 if (err) {
758 dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq); 786 dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq);
759 goto err_free_mem; 787 goto err_free_mem;
@@ -763,20 +791,12 @@ static int __devinit ad7877_probe(struct spi_device *spi)
763 if (err) 791 if (err)
764 goto err_free_irq; 792 goto err_free_irq;
765 793
766 err = device_create_file(&spi->dev,
767 gpio3 ? &dev_attr_gpio3 : &dev_attr_aux3);
768 if (err)
769 goto err_remove_attr_group;
770
771 err = input_register_device(input_dev); 794 err = input_register_device(input_dev);
772 if (err) 795 if (err)
773 goto err_remove_attr; 796 goto err_remove_attr_group;
774 797
775 return 0; 798 return 0;
776 799
777err_remove_attr:
778 device_remove_file(&spi->dev,
779 gpio3 ? &dev_attr_gpio3 : &dev_attr_aux3);
780err_remove_attr_group: 800err_remove_attr_group:
781 sysfs_remove_group(&spi->dev.kobj, &ad7877_attr_group); 801 sysfs_remove_group(&spi->dev.kobj, &ad7877_attr_group);
782err_free_irq: 802err_free_irq:
@@ -790,11 +810,9 @@ err_free_mem:
790 810
791static int __devexit ad7877_remove(struct spi_device *spi) 811static int __devexit ad7877_remove(struct spi_device *spi)
792{ 812{
793 struct ad7877 *ts = dev_get_drvdata(&spi->dev); 813 struct ad7877 *ts = dev_get_drvdata(&spi->dev);
794 814
795 sysfs_remove_group(&spi->dev.kobj, &ad7877_attr_group); 815 sysfs_remove_group(&spi->dev.kobj, &ad7877_attr_group);
796 device_remove_file(&spi->dev,
797 gpio3 ? &dev_attr_gpio3 : &dev_attr_aux3);
798 816
799 ad7877_disable(ts); 817 ad7877_disable(ts);
800 free_irq(ts->spi->irq, ts); 818 free_irq(ts->spi->irq, ts);