diff options
Diffstat (limited to 'drivers/input/touchscreen/ads7846.c')
| -rw-r--r-- | drivers/input/touchscreen/ads7846.c | 12 | 
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c index 056ac77e2cf..2b01e56568f 100644 --- a/drivers/input/touchscreen/ads7846.c +++ b/drivers/input/touchscreen/ads7846.c @@ -127,6 +127,8 @@ struct ads7846 {  	void			(*filter_cleanup)(void *data);  	int			(*get_pendown_state)(void);  	int			gpio_pendown; + +	void			(*wait_for_sync)(void);  };  /* leave chip selected when we're done, for quicker re-select? */ @@ -511,6 +513,10 @@ static int get_pendown_state(struct ads7846 *ts)  	return !gpio_get_value(ts->gpio_pendown);  } +static void null_wait_for_sync(void) +{ +} +  /*   * PENIRQ only kicks the timer.  The timer only reissues the SPI transfer,   * to retrieve touchscreen status. @@ -686,6 +692,7 @@ static void ads7846_rx_val(void *ads)  	default:  		BUG();  	} +	ts->wait_for_sync();  	status = spi_async(ts->spi, m);  	if (status)  		dev_err(&ts->spi->dev, "spi_async --> %d\n", @@ -723,6 +730,7 @@ static enum hrtimer_restart ads7846_timer(struct hrtimer *handle)  	} else {  		/* pen is still down, continue with the measurement */  		ts->msg_idx = 0; +		ts->wait_for_sync();  		status = spi_async(ts->spi, &ts->msg[0]);  		if (status)  			dev_err(&ts->spi->dev, "spi_async --> %d\n", status); @@ -746,7 +754,7 @@ static irqreturn_t ads7846_irq(int irq, void *handle)  			 * that here.  (The "generic irq" framework may help...)  			 */  			ts->irq_disabled = 1; -			disable_irq(ts->spi->irq); +			disable_irq_nosync(ts->spi->irq);  			ts->pending = 1;  			hrtimer_start(&ts->timer, ktime_set(0, TS_POLL_DELAY),  					HRTIMER_MODE_REL); @@ -947,6 +955,8 @@ static int __devinit ads7846_probe(struct spi_device *spi)  		ts->penirq_recheck_delay_usecs =  				pdata->penirq_recheck_delay_usecs; +	ts->wait_for_sync = pdata->wait_for_sync ? : null_wait_for_sync; +  	snprintf(ts->phys, sizeof(ts->phys), "%s/input0", dev_name(&spi->dev));  	input_dev->name = "ADS784x Touchscreen";  |