summaryrefslogtreecommitdiff
path: root/drivers/staging
diff options
context:
space:
mode:
authorShreshtha Kumar Sahu <shreshthakumar.sahu@stericsson.com>2011-08-30 13:37:33 +0530
committerUlf Hansson <ulf.hansson@stericsson.com>2011-09-19 16:05:52 +0200
commit7639c38abe2c04bf3e75c13fea3e700ae896d029 (patch)
tree3babafc34fb6938783ff787efad79bcbeec5ab80 /drivers/staging
parent4c55298cc87caed02d7a847979eb113cc8de4eac (diff)
u8500: vibra: fix sleeping fn. in atomic context
sleepable call - flush_workqueue called from atomic context of vibra_enable. ST-Ericsson Linux next: 332221 ST-Ericsson ID: ER 351276 ST-Ericsson FOSS-OUT ID: Trivial Ref: Commit-id: Ie61cd94bb43edd0e6f71b34d00e5f81d1ddeccb6 Signed-off-by: Avinash A <Avinash.a@stericsson.com> Change-Id: I32debc738d1cec9de0ddf5ae64a98e83db5d7ec8 Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/29707 Reviewed-by: Avinash A <avinash.a@stericsson.com> Tested-by: Avinash A <avinash.a@stericsson.com>
Diffstat (limited to 'drivers/staging')
-rw-r--r--drivers/staging/android/ste_timed_vibra.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/staging/android/ste_timed_vibra.c b/drivers/staging/android/ste_timed_vibra.c
index 4ad79c68623..ba9c946d6ba 100644
--- a/drivers/staging/android/ste_timed_vibra.c
+++ b/drivers/staging/android/ste_timed_vibra.c
@@ -85,7 +85,8 @@ static void linear_vibra_work(struct work_struct *work)
vinfo->pdata->timed_vibra_control(speed_pos, speed_neg,
speed_pos, speed_neg);
- if (vinfo->vibra_state != STE_VIBRA_IDLE) {
+ if ((vinfo->vibra_state != STE_VIBRA_IDLE) &&
+ (vinfo->vibra_state != STE_VIBRA_OFF)) {
ktime = ktime_set((LINEAR_RESONANCE / USEC_PER_SEC),
(LINEAR_RESONANCE % USEC_PER_SEC) * NSEC_PER_USEC);
hrtimer_start(&vinfo->linear_tick, ktime, HRTIMER_MODE_REL);
@@ -191,10 +192,8 @@ static void vibra_enable(struct timed_output_dev *tdev, int timeout)
case STE_VIBRA_ON:
/* If user requested OFF */
if (!timeout) {
- if (vinfo->pdata->is_linear_vibra) {
+ if (vinfo->pdata->is_linear_vibra)
hrtimer_cancel(&vinfo->linear_tick);
- flush_workqueue(vinfo->linear_workqueue);
- }
hrtimer_cancel(&vinfo->vibra_timer);
vinfo->vibra_state = STE_VIBRA_OFF;
queue_work(vinfo->vibra_workqueue, &vinfo->vibra_work);
@@ -226,7 +225,10 @@ static enum hrtimer_restart linear_vibra_tick(struct hrtimer *hrtimer)
struct vibra_info *vinfo =
container_of(hrtimer, struct vibra_info, linear_tick);
- queue_work(vinfo->linear_workqueue, &vinfo->linear_work);
+ if ((vinfo->vibra_state != STE_VIBRA_IDLE) &&
+ (vinfo->vibra_state != STE_VIBRA_OFF)) {
+ queue_work(vinfo->linear_workqueue, &vinfo->linear_work);
+ }
return HRTIMER_NORESTART;
}