android_vibrator: improve the vibration response.

Vibration on should be always set. So even if there is pending workqueue,
it should be run. And using mutex is minimu for quick response.

Change-Id: I859fde428d2a0e8619e3f5a140bb5a33a0b05041
diff --git a/drivers/misc/android_vibrator.c b/drivers/misc/android_vibrator.c
index 0b423c2..ce3f7c3 100644
--- a/drivers/misc/android_vibrator.c
+++ b/drivers/misc/android_vibrator.c
@@ -54,22 +54,29 @@
 };
 
 #ifdef ANDROID_VIBRATOR_USE_WORKQUEUE
-static inline void vibrator_work(struct work_struct *work)
+static inline void vibrator_work_on(struct work_struct *work)
+{
+	queue_work(vibrator_workqueue, work);
+}
+
+static inline void vibrator_work_off(struct work_struct *work)
 {
 	if (!work_pending(work))
 		queue_work(vibrator_workqueue, work);
 }
-
 #else
-static inline void vibrator_work(struct work_struct *work)
+static inline void vibrator_work_on(struct work_struct *work)
+{
+	schedule_work(work);
+}
+
+static inline void vibrator_work_off(struct work_struct *work)
 {
 	if (!work_pending(work))
 		schedule_work(work);
 }
 #endif
 
-static DEFINE_MUTEX(vib_lock);
-
 static int android_vibrator_force_set(struct timed_vibrator_data *vib,
 		int intensity, int pwm)
 {
@@ -84,8 +91,6 @@
 	if (intensity < -127)
 		intensity = -127;
 
-	mutex_lock(&vib_lock);
-
 	if (pdata->vibe_warmup_delay > 0) {
 		if (atomic_read(&vib->vib_status))
 			msleep(pdata->vibe_warmup_delay);
@@ -115,8 +120,6 @@
 				HRTIMER_MODE_REL);
 	}
 
-	mutex_unlock(&vib_lock);
-
 	return 0;
 }
 
@@ -148,7 +151,7 @@
 {
 	struct timed_vibrator_data *vib =
 		container_of(timer, struct timed_vibrator_data, timer);
-	vibrator_work(&vib->work_vibrator_off);
+	vibrator_work_off(&vib->work_vibrator_off);
 	return HRTIMER_NORESTART;
 }
 
@@ -180,9 +183,9 @@
 
 		atomic_set(&vib->ms_time, ms_time);
 
-		vibrator_work(&vib->work_vibrator_on);
+		vibrator_work_on(&vib->work_vibrator_on);
 	} else {
-		vibrator_work(&vib->work_vibrator_off);
+		vibrator_work_off(&vib->work_vibrator_off);
 	}
 	spin_unlock_irqrestore(&vib->lock, flags);
 }
@@ -329,7 +332,7 @@
 		(struct timed_vibrator_data *)platform_get_drvdata(pdev);
 	int i;
 
-	vibrator_work(&vib->work_vibrator_off);
+	vibrator_work_off(&vib->work_vibrator_off);
 	for (i = ARRAY_SIZE(android_vibrator_device_attrs); i >= 0; i--) {
 		device_remove_file(vib->dev.dev,
 				&android_vibrator_device_attrs[i]);