diff options
author | Shreshtha Kumar Sahu <shreshthakumar.sahu@stericsson.com> | 2011-08-30 13:37:33 +0530 |
---|---|---|
committer | Ulf Hansson <ulf.hansson@stericsson.com> | 2011-09-19 16:05:52 +0200 |
commit | 7639c38abe2c04bf3e75c13fea3e700ae896d029 (patch) | |
tree | 3babafc34fb6938783ff787efad79bcbeec5ab80 /drivers/staging | |
parent | 4c55298cc87caed02d7a847979eb113cc8de4eac (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.c | 12 |
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; } |