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 ---