|
@@ -565,12 +565,26 @@ static int out_drv_event(struct snd_soc_dapm_widget *w,
|
|
|
switch (w->shift) {
|
|
|
case 2: /* Headset output driver */
|
|
|
out = &priv->headset;
|
|
|
+ work = &out->work;
|
|
|
+ /*
|
|
|
+ * Make sure, that we do not mess up variables for already
|
|
|
+ * executing work.
|
|
|
+ */
|
|
|
+ cancel_delayed_work_sync(work);
|
|
|
+
|
|
|
out->left_step = priv->hs_left_step;
|
|
|
out->right_step = priv->hs_right_step;
|
|
|
out->step_delay = 5; /* 5 ms between volume ramp steps */
|
|
|
break;
|
|
|
case 4: /* Handsfree output driver */
|
|
|
out = &priv->handsfree;
|
|
|
+ work = &out->work;
|
|
|
+ /*
|
|
|
+ * Make sure, that we do not mess up variables for already
|
|
|
+ * executing work.
|
|
|
+ */
|
|
|
+ cancel_delayed_work_sync(work);
|
|
|
+
|
|
|
out->left_step = priv->hf_left_step;
|
|
|
out->right_step = priv->hf_right_step;
|
|
|
out->step_delay = 5; /* 5 ms between volume ramp steps */
|
|
@@ -583,39 +597,31 @@ static int out_drv_event(struct snd_soc_dapm_widget *w,
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- work = &out->work;
|
|
|
-
|
|
|
switch (event) {
|
|
|
case SND_SOC_DAPM_POST_PMU:
|
|
|
if (out->active)
|
|
|
break;
|
|
|
|
|
|
/* don't use volume ramp for power-up */
|
|
|
+ out->ramp = TWL6040_RAMP_UP;
|
|
|
out->left_step = out->left_vol;
|
|
|
out->right_step = out->right_vol;
|
|
|
|
|
|
- if (!delayed_work_pending(work)) {
|
|
|
- out->ramp = TWL6040_RAMP_UP;
|
|
|
- queue_delayed_work(priv->workqueue, work,
|
|
|
- msecs_to_jiffies(1));
|
|
|
- }
|
|
|
+ queue_delayed_work(priv->workqueue, work, msecs_to_jiffies(1));
|
|
|
break;
|
|
|
|
|
|
case SND_SOC_DAPM_PRE_PMD:
|
|
|
if (!out->active)
|
|
|
break;
|
|
|
|
|
|
- if (!delayed_work_pending(work)) {
|
|
|
- /* use volume ramp for power-down */
|
|
|
- out->ramp = TWL6040_RAMP_DOWN;
|
|
|
- INIT_COMPLETION(out->ramp_done);
|
|
|
+ /* use volume ramp for power-down */
|
|
|
+ out->ramp = TWL6040_RAMP_DOWN;
|
|
|
+ INIT_COMPLETION(out->ramp_done);
|
|
|
|
|
|
- queue_delayed_work(priv->workqueue, work,
|
|
|
- msecs_to_jiffies(1));
|
|
|
+ queue_delayed_work(priv->workqueue, work, msecs_to_jiffies(1));
|
|
|
|
|
|
- wait_for_completion_timeout(&out->ramp_done,
|
|
|
- msecs_to_jiffies(2000));
|
|
|
- }
|
|
|
+ wait_for_completion_timeout(&out->ramp_done,
|
|
|
+ msecs_to_jiffies(2000));
|
|
|
break;
|
|
|
}
|
|
|
|