ad7877.c (2fd18abad179b11cbd881f2bd271b193ababfb65) | ad7877.c (b534422b2d1189740c6144c3c7a296be89f581c7) |
---|---|
1/* 2 * Copyright (C) 2006-2008 Michael Hennerich, Analog Devices Inc. 3 * 4 * Description: AD7877 based touchscreen, sensor (ADCs), DAC and GPIO driver 5 * Based on: ads7846.c 6 * 7 * Bugs: Enter bugs at http://blackfin.uclinux.org/ 8 * --- 177 unchanged lines hidden (view full) --- 186 u8 acquisition_time; 187 u8 averaging; 188 u8 pen_down_acc_interval; 189 190 struct spi_transfer xfer[AD7877_NR_SENSE + 2]; 191 struct spi_message msg; 192 193 struct mutex mutex; | 1/* 2 * Copyright (C) 2006-2008 Michael Hennerich, Analog Devices Inc. 3 * 4 * Description: AD7877 based touchscreen, sensor (ADCs), DAC and GPIO driver 5 * Based on: ads7846.c 6 * 7 * Bugs: Enter bugs at http://blackfin.uclinux.org/ 8 * --- 177 unchanged lines hidden (view full) --- 186 u8 acquisition_time; 187 u8 averaging; 188 u8 pen_down_acc_interval; 189 190 struct spi_transfer xfer[AD7877_NR_SENSE + 2]; 191 struct spi_message msg; 192 193 struct mutex mutex; |
194 unsigned disabled:1; /* P: mutex */ 195 unsigned gpio3:1; /* P: mutex */ 196 unsigned gpio4:1; /* P: mutex */ | 194 bool disabled; /* P: mutex */ 195 bool gpio3; /* P: mutex */ 196 bool gpio4; /* P: mutex */ |
197 198 spinlock_t lock; 199 struct timer_list timer; /* P: lock */ | 197 198 spinlock_t lock; 199 struct timer_list timer; /* P: lock */ |
200 unsigned pending:1; /* P: lock */ | |
201 202 /* 203 * DMA (thus cache coherency maintenance) requires the 204 * transfer buffers to live in their own cache lines. 205 */ 206 u16 conversion_data[AD7877_NR_SENSE] ____cacheline_aligned; 207}; 208 --- 119 unchanged lines hidden (view full) --- 328 status = spi_sync(spi, &req->msg); 329 sample = req->sample; 330 331 kfree(req); 332 333 return status ? : sample; 334} 335 | 200 201 /* 202 * DMA (thus cache coherency maintenance) requires the 203 * transfer buffers to live in their own cache lines. 204 */ 205 u16 conversion_data[AD7877_NR_SENSE] ____cacheline_aligned; 206}; 207 --- 119 unchanged lines hidden (view full) --- 327 status = spi_sync(spi, &req->msg); 328 sample = req->sample; 329 330 kfree(req); 331 332 return status ? : sample; 333} 334 |
336static int ad7877_rx(struct ad7877 *ts) | 335static int ad7877_process_data(struct ad7877 *ts) |
337{ 338 struct input_dev *input_dev = ts->input; 339 unsigned Rt; 340 u16 x, y, z1, z2; 341 342 x = ts->conversion_data[AD7877_SEQ_XPOS] & MAX_12BIT; 343 y = ts->conversion_data[AD7877_SEQ_YPOS] & MAX_12BIT; 344 z1 = ts->conversion_data[AD7877_SEQ_Z1] & MAX_12BIT; --- 24 unchanged lines hidden (view full) --- 369 370 if (!timer_pending(&ts->timer)) 371 input_report_key(input_dev, BTN_TOUCH, 1); 372 373 input_report_abs(input_dev, ABS_X, x); 374 input_report_abs(input_dev, ABS_Y, y); 375 input_report_abs(input_dev, ABS_PRESSURE, Rt); 376 input_sync(input_dev); | 336{ 337 struct input_dev *input_dev = ts->input; 338 unsigned Rt; 339 u16 x, y, z1, z2; 340 341 x = ts->conversion_data[AD7877_SEQ_XPOS] & MAX_12BIT; 342 y = ts->conversion_data[AD7877_SEQ_YPOS] & MAX_12BIT; 343 z1 = ts->conversion_data[AD7877_SEQ_Z1] & MAX_12BIT; --- 24 unchanged lines hidden (view full) --- 368 369 if (!timer_pending(&ts->timer)) 370 input_report_key(input_dev, BTN_TOUCH, 1); 371 372 input_report_abs(input_dev, ABS_X, x); 373 input_report_abs(input_dev, ABS_Y, y); 374 input_report_abs(input_dev, ABS_PRESSURE, Rt); 375 input_sync(input_dev); |
376 |
|
377 return 0; 378 } 379 380 return -EINVAL; 381} 382 383static inline void ad7877_ts_event_release(struct ad7877 *ts) 384{ 385 struct input_dev *input_dev = ts->input; 386 387 input_report_abs(input_dev, ABS_PRESSURE, 0); 388 input_report_key(input_dev, BTN_TOUCH, 0); 389 input_sync(input_dev); 390} 391 392static void ad7877_timer(unsigned long handle) 393{ 394 struct ad7877 *ts = (void *)handle; | 377 return 0; 378 } 379 380 return -EINVAL; 381} 382 383static inline void ad7877_ts_event_release(struct ad7877 *ts) 384{ 385 struct input_dev *input_dev = ts->input; 386 387 input_report_abs(input_dev, ABS_PRESSURE, 0); 388 input_report_key(input_dev, BTN_TOUCH, 0); 389 input_sync(input_dev); 390} 391 392static void ad7877_timer(unsigned long handle) 393{ 394 struct ad7877 *ts = (void *)handle; |
395 unsigned long flags; |
|
395 | 396 |
397 spin_lock_irqsave(&ts->lock, flags); |
|
396 ad7877_ts_event_release(ts); | 398 ad7877_ts_event_release(ts); |
399 spin_unlock_irqrestore(&ts->lock, flags); |
|
397} 398 399static irqreturn_t ad7877_irq(int irq, void *handle) 400{ 401 struct ad7877 *ts = handle; 402 unsigned long flags; | 400} 401 402static irqreturn_t ad7877_irq(int irq, void *handle) 403{ 404 struct ad7877 *ts = handle; 405 unsigned long flags; |
403 int status; | 406 int error; |
404 | 407 |
405 /* 406 * The repeated conversion sequencer controlled by TMR kicked off 407 * too fast. We ignore the last and process the sample sequence 408 * currently in the queue. It can't be older than 9.4ms, and we 409 * need to avoid that ts->msg doesn't get issued twice while in work. 410 */ | 408 error = spi_sync(ts->spi, &ts->msg); 409 if (error) { 410 dev_err(&ts->spi->dev, "spi_sync --> %d\n", error); 411 goto out; 412 } |
411 412 spin_lock_irqsave(&ts->lock, flags); | 413 414 spin_lock_irqsave(&ts->lock, flags); |
413 if (!ts->pending) { 414 ts->pending = 1; 415 416 status = spi_async(ts->spi, &ts->msg); 417 if (status) 418 dev_err(&ts->spi->dev, "spi_sync --> %d\n", status); 419 } | 415 error = ad7877_process_data(ts); 416 if (!error) 417 mod_timer(&ts->timer, jiffies + TS_PEN_UP_TIMEOUT); |
420 spin_unlock_irqrestore(&ts->lock, flags); 421 | 418 spin_unlock_irqrestore(&ts->lock, flags); 419 |
420out: |
|
422 return IRQ_HANDLED; 423} 424 | 421 return IRQ_HANDLED; 422} 423 |
425static void ad7877_callback(void *_ts) 426{ 427 struct ad7877 *ts = _ts; 428 429 spin_lock_irq(&ts->lock); 430 if (!ad7877_rx(ts)) 431 mod_timer(&ts->timer, jiffies + TS_PEN_UP_TIMEOUT); 432 ts->pending = 0; 433 spin_unlock_irq(&ts->lock); 434} 435 | |
436static void ad7877_disable(struct ad7877 *ts) 437{ 438 mutex_lock(&ts->mutex); 439 440 if (!ts->disabled) { | 424static void ad7877_disable(struct ad7877 *ts) 425{ 426 mutex_lock(&ts->mutex); 427 428 if (!ts->disabled) { |
441 ts->disabled = 1; | 429 ts->disabled = true; |
442 disable_irq(ts->spi->irq); 443 | 430 disable_irq(ts->spi->irq); 431 |
444 /* Wait for spi_async callback */ 445 while (ts->pending) 446 msleep(1); 447 | |
448 if (del_timer_sync(&ts->timer)) 449 ad7877_ts_event_release(ts); 450 } 451 | 432 if (del_timer_sync(&ts->timer)) 433 ad7877_ts_event_release(ts); 434 } 435 |
452 /* we know the chip's in lowpower mode since we always | 436 /* 437 * We know the chip's in lowpower mode since we always |
453 * leave it that way after every request 454 */ 455 456 mutex_unlock(&ts->mutex); 457} 458 459static void ad7877_enable(struct ad7877 *ts) 460{ 461 mutex_lock(&ts->mutex); 462 463 if (ts->disabled) { | 438 * leave it that way after every request 439 */ 440 441 mutex_unlock(&ts->mutex); 442} 443 444static void ad7877_enable(struct ad7877 *ts) 445{ 446 mutex_lock(&ts->mutex); 447 448 if (ts->disabled) { |
464 ts->disabled = 0; | 449 ts->disabled = false; |
465 enable_irq(ts->spi->irq); 466 } 467 468 mutex_unlock(&ts->mutex); 469} 470 471#define SHOW(name) static ssize_t \ 472name ## _show(struct device *dev, struct device_attribute *attr, char *buf) \ --- 194 unchanged lines hidden (view full) --- 667 ad7877_write(spi, AD7877_REG_CTRL1, ts->cmd_crtl1); 668 669 ts->cmd_dummy = 0; 670 671 m = &ts->msg; 672 673 spi_message_init(m); 674 | 450 enable_irq(ts->spi->irq); 451 } 452 453 mutex_unlock(&ts->mutex); 454} 455 456#define SHOW(name) static ssize_t \ 457name ## _show(struct device *dev, struct device_attribute *attr, char *buf) \ --- 194 unchanged lines hidden (view full) --- 652 ad7877_write(spi, AD7877_REG_CTRL1, ts->cmd_crtl1); 653 654 ts->cmd_dummy = 0; 655 656 m = &ts->msg; 657 658 spi_message_init(m); 659 |
675 m->complete = ad7877_callback; | |
676 m->context = ts; 677 678 ts->xfer[0].tx_buf = &ts->cmd_crtl1; 679 ts->xfer[0].len = 2; 680 ts->xfer[0].cs_change = 1; 681 682 spi_message_add_tail(&ts->xfer[0], m); 683 --- 106 unchanged lines hidden (view full) --- 790 791 if (gpio3) 792 ad7877_write(spi, AD7877_REG_EXTWRITE, AD7877_EXTW_GPIO_3_CONF); 793 794 ad7877_setup_ts_def_msg(spi, ts); 795 796 /* Request AD7877 /DAV GPIO interrupt */ 797 | 660 m->context = ts; 661 662 ts->xfer[0].tx_buf = &ts->cmd_crtl1; 663 ts->xfer[0].len = 2; 664 ts->xfer[0].cs_change = 1; 665 666 spi_message_add_tail(&ts->xfer[0], m); 667 --- 106 unchanged lines hidden (view full) --- 774 775 if (gpio3) 776 ad7877_write(spi, AD7877_REG_EXTWRITE, AD7877_EXTW_GPIO_3_CONF); 777 778 ad7877_setup_ts_def_msg(spi, ts); 779 780 /* Request AD7877 /DAV GPIO interrupt */ 781 |
798 err = request_irq(spi->irq, ad7877_irq, IRQF_TRIGGER_FALLING, 799 spi->dev.driver->name, ts); | 782 err = request_threaded_irq(spi->irq, NULL, ad7877_irq, 783 IRQF_TRIGGER_FALLING | IRQF_ONESHOT, 784 spi->dev.driver->name, ts); |
800 if (err) { 801 dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq); 802 goto err_free_mem; 803 } 804 805 err = sysfs_create_group(&spi->dev.kobj, &ad7877_attr_group); 806 if (err) 807 goto err_free_irq; --- 87 unchanged lines hidden --- | 785 if (err) { 786 dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq); 787 goto err_free_mem; 788 } 789 790 err = sysfs_create_group(&spi->dev.kobj, &ad7877_attr_group); 791 if (err) 792 goto err_free_irq; --- 87 unchanged lines hidden --- |