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]);