@@ -130,6 +130,7 @@ struct ads7846 {
unsigned irq_disabled:1; /* P: lock */
unsigned disabled:1;
unsigned is_suspended:1;
+ struct mutex mutex;
int (*filter)(void *data, int data_idx, int *val);
void *filter_data;
@@ -531,14 +532,14 @@ static ssize_t ads7846_disable_store(struct device *dev,
if (strict_strtoul(buf, 10, &i))
return -EINVAL;
- spin_lock_irq(&ts->lock);
+ mutex_lock(&ts->mutex);
if (i)
ads7846_disable(ts);
else
ads7846_enable(ts);
- spin_unlock_irq(&ts->lock);
+ mutex_unlock(&ts->mutex);
return count;
}
@@ -848,11 +849,8 @@ static void ads7846_disable(struct ads7846 *ts)
/* the timer will run at least once more, and
* leave everything in a clean state, IRQ disabled
*/
- while (ts->pending) {
- spin_unlock_irq(&ts->lock);
+ while (ts->pending)
msleep(1);
- spin_lock_irq(&ts->lock);
- }
}
regulator_disable(ts->reg);
@@ -879,12 +877,12 @@ static int ads7846_suspend(struct spi_device *spi, pm_message_t message)
{
struct ads7846 *ts = dev_get_drvdata(&spi->dev);
- spin_lock_irq(&ts->lock);
+ mutex_lock(&ts->mutex);
ts->is_suspended = 1;
ads7846_disable(ts);
- spin_unlock_irq(&ts->lock);
+ mutex_unlock(&ts->mutex);
if (device_may_wakeup(&ts->spi->dev))
enable_irq_wake(ts->spi->irq);
@@ -900,12 +898,12 @@ static int ads7846_resume(struct spi_device *spi)
if (device_may_wakeup(&ts->spi->dev))
disable_irq_wake(ts->spi->irq);
- spin_lock_irq(&ts->lock);
+ mutex_lock(&ts->mutex);
ts->is_suspended = 0;
ads7846_enable(ts);
- spin_unlock_irq(&ts->lock);
+ mutex_unlock(&ts->mutex);
return 0;
}
@@ -999,6 +997,7 @@ static int __devinit ads7846_probe(struct spi_device *spi)
ts->timer.function = ads7846_timer;
spin_lock_init(&ts->lock);
+ mutex_init(&ts->mutex);
ts->model = pdata->model ? : 7846;
ts->vref_delay_usecs = pdata->vref_delay_usecs ? : 100;