intel_sst: return correct output/input device id
authorLu Guanqun <guanqun.lu@intel.com>
Tue, 3 May 2011 16:34:40 +0000 (17:34 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 10 May 2011 19:58:28 +0000 (12:58 -0700)
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 <guanqun.lu@intel.com>
Acked-by: Wu Fengguang <fengguang.wu@intel.com>
Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/intel_sst/intelmid_ctrl.c

index 2c3ee94..af9e112 100644 (file)
@@ -504,8 +504,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;
@@ -517,6 +517,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;