diff mbox

[v2] Input: ads7846 - Replace spinlock by mutex to wrap disable()/enable()

Message ID 1282370340-3157-1-git-send-email-jason77.wang@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jason Wang Aug. 21, 2010, 5:59 a.m. UTC
None
diff mbox

Patch

diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c
index 1603193..0b875fa 100644
--- a/drivers/input/touchscreen/ads7846.c
+++ b/drivers/input/touchscreen/ads7846.c
@@ -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;