Without this patch, the change of output/input device can't be reflected 
correctly.
The mismatch reflects insane design, and should be fixed when switching to the 
ASoC framework.

Signed-off-by: Lu Guanqun <[email protected]>
Acked-by: Wu Fengguang <[email protected]>
---
 drivers/staging/intel_sst/intelmid_ctrl.c |   21 ++++++++++++++++++++-
 1 files changed, 20 insertions(+), 1 deletions(-)

diff --git a/drivers/staging/intel_sst/intelmid_ctrl.c 
b/drivers/staging/intel_sst/intelmid_ctrl.c
index 5c8f6ba..51d3ddf 100644
--- a/drivers/staging/intel_sst/intelmid_ctrl.c
+++ b/drivers/staging/intel_sst/intelmid_ctrl.c
@@ -501,8 +501,8 @@ static int snd_intelmad_device_get(struct snd_kcontrol 
*kcontrol,
        WARN_ON(!kcontrol);
 
        intelmaddata = kcontrol->private_data;
+       scard_ops = intelmaddata->sstdrv_ops->scard_ops;
        if (intelmaddata->cpu_id == CPU_CHIP_PENWELL) {
-               scard_ops = intelmaddata->sstdrv_ops->scard_ops;
                if (kcontrol->id.numid == OUTPUT_SEL)
                        uval->value.enumerated.item[0] =
                                        scard_ops->output_dev_id;
@@ -514,6 +514,25 @@ static int snd_intelmad_device_get(struct snd_kcontrol 
*kcontrol,
                                        scard_ops->lineout_dev_id;
                else
                        return -EINVAL;
+       } else if (intelmaddata->cpu_id == CPU_CHIP_LINCROFT) {
+               if (kcontrol->id.numid == OUTPUT_SEL)
+                       /* There is a mismatch here.
+                        * ALSA expects 1 for internal speaker.
+                        * But internally, we may give 2 for internal speaker.
+                        */
+                       if (scard_ops->output_dev_id == MONO_EARPIECE ||
+                           scard_ops->output_dev_id == INTERNAL_SPKR)
+                               uval->value.enumerated.item[0] = MONO_EARPIECE;
+                       else if (scard_ops->output_dev_id == STEREO_HEADPHONE)
+                               uval->value.enumerated.item[0] =
+                                       STEREO_HEADPHONE;
+                       else
+                               return -EINVAL;
+               else if (kcontrol->id.numid == INPUT_SEL)
+                       uval->value.enumerated.item[0] =
+                                       scard_ops->input_dev_id;
+               else
+                       return -EINVAL;
        } else
        uval->value.enumerated.item[0] = kcontrol->private_value;
        return 0;
-- 
1.7.2.3

_______________________________________________
MeeGo-kernel mailing list
[email protected]
http://lists.meego.com/listinfo/meego-kernel

Reply via email to