diff options
author | Peter Ujfalusi <peter.ujfalusi@ti.com> | 2011-09-29 08:22:34 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2011-09-30 08:55:08 -0400 |
commit | a46737aee59e4e001106e1d3777e0801843361db (patch) | |
tree | f6ee6ec24607fe32ce8ad3ac12246b532b783c64 /sound/soc/codecs/twl6040.c | |
parent | 91a18ae8ffc05ffd445c5b40e5ca266888b360ce (diff) |
ASoC: twl6040: One workqueue should be enough
It is a bit overkill to have three (3) separate
workqueue for a single driver.
We can manage things with one workqueue nicely.
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/codecs/twl6040.c')
-rw-r--r-- | sound/soc/codecs/twl6040.c | 33 |
1 files changed, 5 insertions, 28 deletions
diff --git a/sound/soc/codecs/twl6040.c b/sound/soc/codecs/twl6040.c index c973347d4f6b..1afc5966cbdb 100644 --- a/sound/soc/codecs/twl6040.c +++ b/sound/soc/codecs/twl6040.c | |||
@@ -103,8 +103,6 @@ struct twl6040_data { | |||
103 | struct mutex mutex; | 103 | struct mutex mutex; |
104 | struct twl6040_output headset; | 104 | struct twl6040_output headset; |
105 | struct twl6040_output handsfree; | 105 | struct twl6040_output handsfree; |
106 | struct workqueue_struct *hf_workqueue; | ||
107 | struct workqueue_struct *hs_workqueue; | ||
108 | }; | 106 | }; |
109 | 107 | ||
110 | /* | 108 | /* |
@@ -562,20 +560,17 @@ static int out_drv_event(struct snd_soc_dapm_widget *w, | |||
562 | struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); | 560 | struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); |
563 | struct twl6040_output *out; | 561 | struct twl6040_output *out; |
564 | struct delayed_work *work; | 562 | struct delayed_work *work; |
565 | struct workqueue_struct *queue; | ||
566 | 563 | ||
567 | switch (w->shift) { | 564 | switch (w->shift) { |
568 | case 2: | 565 | case 2: |
569 | case 3: | 566 | case 3: |
570 | out = &priv->headset; | 567 | out = &priv->headset; |
571 | queue = priv->hs_workqueue; | ||
572 | out->left_step = priv->hs_left_step; | 568 | out->left_step = priv->hs_left_step; |
573 | out->right_step = priv->hs_right_step; | 569 | out->right_step = priv->hs_right_step; |
574 | out->step_delay = 5; /* 5 ms between volume ramp steps */ | 570 | out->step_delay = 5; /* 5 ms between volume ramp steps */ |
575 | break; | 571 | break; |
576 | case 4: | 572 | case 4: |
577 | out = &priv->handsfree; | 573 | out = &priv->handsfree; |
578 | queue = priv->hf_workqueue; | ||
579 | out->left_step = priv->hf_left_step; | 574 | out->left_step = priv->hf_left_step; |
580 | out->right_step = priv->hf_right_step; | 575 | out->right_step = priv->hf_right_step; |
581 | out->step_delay = 5; /* 5 ms between volume ramp steps */ | 576 | out->step_delay = 5; /* 5 ms between volume ramp steps */ |
@@ -601,7 +596,7 @@ static int out_drv_event(struct snd_soc_dapm_widget *w, | |||
601 | 596 | ||
602 | if (!delayed_work_pending(work)) { | 597 | if (!delayed_work_pending(work)) { |
603 | out->ramp = TWL6040_RAMP_UP; | 598 | out->ramp = TWL6040_RAMP_UP; |
604 | queue_delayed_work(queue, work, | 599 | queue_delayed_work(priv->workqueue, work, |
605 | msecs_to_jiffies(1)); | 600 | msecs_to_jiffies(1)); |
606 | } | 601 | } |
607 | break; | 602 | break; |
@@ -615,7 +610,7 @@ static int out_drv_event(struct snd_soc_dapm_widget *w, | |||
615 | out->ramp = TWL6040_RAMP_DOWN; | 610 | out->ramp = TWL6040_RAMP_DOWN; |
616 | INIT_COMPLETION(out->ramp_done); | 611 | INIT_COMPLETION(out->ramp_done); |
617 | 612 | ||
618 | queue_delayed_work(queue, work, | 613 | queue_delayed_work(priv->workqueue, work, |
619 | msecs_to_jiffies(1)); | 614 | msecs_to_jiffies(1)); |
620 | 615 | ||
621 | wait_for_completion_timeout(&out->ramp_done, | 616 | wait_for_completion_timeout(&out->ramp_done, |
@@ -1512,33 +1507,21 @@ static int twl6040_probe(struct snd_soc_codec *codec) | |||
1512 | goto work_err; | 1507 | goto work_err; |
1513 | } | 1508 | } |
1514 | 1509 | ||
1515 | priv->workqueue = create_singlethread_workqueue("twl6040-codec"); | 1510 | priv->workqueue = alloc_workqueue("twl6040-codec", 0, 0); |
1516 | if (!priv->workqueue) { | 1511 | if (!priv->workqueue) { |
1517 | ret = -ENOMEM; | 1512 | ret = -ENOMEM; |
1518 | goto work_err; | 1513 | goto work_err; |
1519 | } | 1514 | } |
1520 | 1515 | ||
1521 | INIT_DELAYED_WORK(&priv->hs_jack.work, twl6040_accessory_work); | 1516 | INIT_DELAYED_WORK(&priv->hs_jack.work, twl6040_accessory_work); |
1517 | INIT_DELAYED_WORK(&priv->headset.work, twl6040_pga_hs_work); | ||
1518 | INIT_DELAYED_WORK(&priv->handsfree.work, twl6040_pga_hf_work); | ||
1522 | 1519 | ||
1523 | mutex_init(&priv->mutex); | 1520 | mutex_init(&priv->mutex); |
1524 | 1521 | ||
1525 | init_completion(&priv->headset.ramp_done); | 1522 | init_completion(&priv->headset.ramp_done); |
1526 | init_completion(&priv->handsfree.ramp_done); | 1523 | init_completion(&priv->handsfree.ramp_done); |
1527 | 1524 | ||
1528 | priv->hf_workqueue = create_singlethread_workqueue("twl6040-hf"); | ||
1529 | if (priv->hf_workqueue == NULL) { | ||
1530 | ret = -ENOMEM; | ||
1531 | goto hfwq_err; | ||
1532 | } | ||
1533 | priv->hs_workqueue = create_singlethread_workqueue("twl6040-hs"); | ||
1534 | if (priv->hs_workqueue == NULL) { | ||
1535 | ret = -ENOMEM; | ||
1536 | goto hswq_err; | ||
1537 | } | ||
1538 | |||
1539 | INIT_DELAYED_WORK(&priv->headset.work, twl6040_pga_hs_work); | ||
1540 | INIT_DELAYED_WORK(&priv->handsfree.work, twl6040_pga_hf_work); | ||
1541 | |||
1542 | ret = request_threaded_irq(priv->plug_irq, NULL, twl6040_audio_handler, | 1525 | ret = request_threaded_irq(priv->plug_irq, NULL, twl6040_audio_handler, |
1543 | 0, "twl6040_irq_plug", codec); | 1526 | 0, "twl6040_irq_plug", codec); |
1544 | if (ret) { | 1527 | if (ret) { |
@@ -1562,10 +1545,6 @@ static int twl6040_probe(struct snd_soc_codec *codec) | |||
1562 | bias_err: | 1545 | bias_err: |
1563 | free_irq(priv->plug_irq, codec); | 1546 | free_irq(priv->plug_irq, codec); |
1564 | plugirq_err: | 1547 | plugirq_err: |
1565 | destroy_workqueue(priv->hs_workqueue); | ||
1566 | hswq_err: | ||
1567 | destroy_workqueue(priv->hf_workqueue); | ||
1568 | hfwq_err: | ||
1569 | destroy_workqueue(priv->workqueue); | 1548 | destroy_workqueue(priv->workqueue); |
1570 | work_err: | 1549 | work_err: |
1571 | kfree(priv); | 1550 | kfree(priv); |
@@ -1579,8 +1558,6 @@ static int twl6040_remove(struct snd_soc_codec *codec) | |||
1579 | twl6040_set_bias_level(codec, SND_SOC_BIAS_OFF); | 1558 | twl6040_set_bias_level(codec, SND_SOC_BIAS_OFF); |
1580 | free_irq(priv->plug_irq, codec); | 1559 | free_irq(priv->plug_irq, codec); |
1581 | destroy_workqueue(priv->workqueue); | 1560 | destroy_workqueue(priv->workqueue); |
1582 | destroy_workqueue(priv->hf_workqueue); | ||
1583 | destroy_workqueue(priv->hs_workqueue); | ||
1584 | kfree(priv); | 1561 | kfree(priv); |
1585 | 1562 | ||
1586 | return 0; | 1563 | return 0; |