Commit e51a34f3 authored by Lu Guanqun's avatar Lu Guanqun Committed by Greg Kroah-Hartman
Browse files

intel_sst: return correct output/input device id



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: default avatarLu Guanqun <guanqun.lu@intel.com>
Acked-by: default avatarWu Fengguang <fengguang.wu@intel.com>
Signed-off-by: default avatarAlan Cox <alan@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 24298b0e
Loading
Loading
Loading
Loading
+20 −1
Original line number Diff line number Diff line
@@ -504,8 +504,8 @@ static int snd_intelmad_device_get(struct snd_kcontrol *kcontrol,
	WARN_ON(!kcontrol);

	intelmaddata = kcontrol->private_data;
	if (intelmaddata->cpu_id == CPU_CHIP_PENWELL) {
	scard_ops = intelmaddata->sstdrv_ops->scard_ops;
	if (intelmaddata->cpu_id == CPU_CHIP_PENWELL) {
		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;