Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5fa9b151 authored by Takashi Iwai's avatar Takashi Iwai
Browse files

Merge branch 'fix/hda' into topic/hda

Conflicts:
	sound/pci/hda/patch_realtek.c
parents 188cd2b5 1f015f5f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1073,10 +1073,10 @@ static int aoa_fabric_layout_probe(struct soundbus_dev *sdev)
	sdev->pcmid = -1;
	list_del(&ldev->list);
	layouts_list_items--;
	kfree(ldev);
 outnodev:
 	of_node_put(sound);
 	layout_device = NULL;
 	kfree(ldev);
	return -ENODEV;
}

+19 −12
Original line number Diff line number Diff line
@@ -144,25 +144,17 @@ static int cea_sampling_frequencies[8] = {
	SNDRV_PCM_RATE_192000,	/* 7: 192000Hz */
};

static unsigned char hdmi_get_eld_byte(struct hda_codec *codec, hda_nid_t nid,
static unsigned int hdmi_get_eld_data(struct hda_codec *codec, hda_nid_t nid,
					int byte_index)
{
	unsigned int val;

	val = snd_hda_codec_read(codec, nid, 0,
					AC_VERB_GET_HDMI_ELDD, byte_index);

#ifdef BE_PARANOID
	printk(KERN_INFO "HDMI: ELD data byte %d: 0x%x\n", byte_index, val);
#endif

	if ((val & AC_ELDD_ELD_VALID) == 0) {
		snd_printd(KERN_INFO "HDMI: invalid ELD data byte %d\n",
								byte_index);
		val = 0;
	}

	return val & AC_ELDD_ELD_DATA;
	return val;
}

#define GRAB_BITS(buf, byte, lowbit, bits) 		\
@@ -344,11 +336,26 @@ int snd_hdmi_get_eld(struct hdmi_eld *eld,
	if (!buf)
		return -ENOMEM;

	for (i = 0; i < size; i++)
		buf[i] = hdmi_get_eld_byte(codec, nid, i);
	for (i = 0; i < size; i++) {
		unsigned int val = hdmi_get_eld_data(codec, nid, i);
		if (!(val & AC_ELDD_ELD_VALID)) {
			if (!i) {
				snd_printd(KERN_INFO
					   "HDMI: invalid ELD data\n");
				ret = -EINVAL;
				goto error;
			}
			snd_printd(KERN_INFO
				  "HDMI: invalid ELD data byte %d\n", i);
			val = 0;
		} else
			val &= AC_ELDD_ELD_DATA;
		buf[i] = val;
	}

	ret = hdmi_update_eld(eld, buf, size);

error:
	kfree(buf);
	return ret;
}
+5 −3
Original line number Diff line number Diff line
@@ -375,7 +375,7 @@ static int is_ext_mic(struct hda_codec *codec, unsigned int idx)
static hda_nid_t get_adc(struct hda_codec *codec, hda_nid_t pin,
			 unsigned int *idxp)
{
	int i;
	int i, idx;
	hda_nid_t nid;

	nid = codec->start_nid;
@@ -384,10 +384,12 @@ static hda_nid_t get_adc(struct hda_codec *codec, hda_nid_t pin,
		type = get_wcaps_type(get_wcaps(codec, nid));
		if (type != AC_WID_AUD_IN)
			continue;
		*idxp = snd_hda_get_conn_index(codec, nid, pin, false);
		if (*idxp >= 0)
		idx = snd_hda_get_conn_index(codec, nid, pin, false);
		if (idx >= 0) {
			*idxp = idx;
			return nid;
		}
	}
	return 0;
}

+10 −3
Original line number Diff line number Diff line
@@ -3348,6 +3348,8 @@ static hda_nid_t get_unassigned_dac(struct hda_codec *codec, hda_nid_t pin,

#define MAX_AUTO_DACS	5

#define DAC_SLAVE_FLAG	0x8000	/* filled dac is a slave */

/* fill analog DAC list from the widget tree */
static int fill_cx_auto_dacs(struct hda_codec *codec, hda_nid_t *dacs)
{
@@ -3379,6 +3381,8 @@ static int fill_dacs_for_pins(struct hda_codec *codec, hda_nid_t *pins,
		filled[nums].pin = pins[i];
		filled[nums].type = type;
		filled[nums].dac = get_unassigned_dac(codec, pins[i], dacs, rest);
		if (!filled[nums].dac && i > 0 && filled[0].dac)
			filled[nums].dac = filled[0].dac | DAC_SLAVE_FLAG;
		nums++;
	}
	return nums;
@@ -3407,7 +3411,7 @@ static void cx_auto_parse_output(struct hda_codec *codec)
	/* fill multiout struct */
	for (i = 0; i < nums; i++) {
		hda_nid_t dac = spec->dac_info[i].dac;
		if (!dac)
		if (!dac || (dac & DAC_SLAVE_FLAG))
			continue;
		switch (spec->dac_info[i].type) {
		case AUTO_PIN_LINE_OUT:
@@ -4035,6 +4039,8 @@ static void cx_auto_init_output(struct hda_codec *codec)
		nid = spec->dac_info[i].dac;
		if (!nid)
			nid = spec->multiout.dac_nids[0];
		else if (nid & DAC_SLAVE_FLAG)
			nid &= ~DAC_SLAVE_FLAG;
		select_connection(codec, spec->dac_info[i].pin, nid);
	}
	if (spec->auto_mute) {
@@ -4191,7 +4197,8 @@ static int cx_auto_build_output_controls(struct hda_codec *codec)
	for (i = 0; i < spec->dac_info_filled; i++) {
		const char *label;
		int idx, type;
		if (!spec->dac_info[i].dac)
		hda_nid_t dac = spec->dac_info[i].dac;
		if (!dac || (dac & DAC_SLAVE_FLAG))
			continue;
		type = spec->dac_info[i].type;
		if (type == AUTO_PIN_LINE_OUT)
@@ -4211,7 +4218,7 @@ static int cx_auto_build_output_controls(struct hda_codec *codec)
			idx = num_spk++;
			break;
		}
		err = try_add_pb_volume(codec, spec->dac_info[i].dac,
		err = try_add_pb_volume(codec, dac,
					spec->dac_info[i].pin,
					label, idx);
		if (err < 0)
+19 −11
Original line number Diff line number Diff line
@@ -578,11 +578,11 @@ static void alc_hp_automute(struct hda_codec *codec)
{
	struct alc_spec *spec = codec->spec;

	if (!spec->automute)
		return;
	spec->jack_present =
		detect_jacks(codec, ARRAY_SIZE(spec->autocfg.hp_pins),
			     spec->autocfg.hp_pins);
	if (!spec->automute)
		return;
	call_update_speakers(codec);
}

@@ -591,11 +591,11 @@ static void alc_line_automute(struct hda_codec *codec)
{
	struct alc_spec *spec = codec->spec;

	if (!spec->automute || !spec->detect_line)
		return;
	spec->line_jack_present =
		detect_jacks(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),
			     spec->autocfg.line_out_pins);
	if (!spec->automute || !spec->detect_line)
		return;
	call_update_speakers(codec);
}

@@ -1797,6 +1797,7 @@ static const char * const alc_slave_vols[] = {
	"Speaker Playback Volume",
	"Mono Playback Volume",
	"Line-Out Playback Volume",
	"PCM Playback Volume",
	NULL,
};

@@ -1811,6 +1812,7 @@ static const char * const alc_slave_sws[] = {
	"Mono Playback Switch",
	"IEC958 Playback Switch",
	"Line-Out Playback Switch",
	"PCM Playback Switch",
	NULL,
};

@@ -3221,16 +3223,22 @@ static void alc_auto_init_multi_out(struct hda_codec *codec)
static void alc_auto_init_extra_out(struct hda_codec *codec)
{
	struct alc_spec *spec = codec->spec;
	hda_nid_t pin;
	hda_nid_t pin, dac;

	pin = spec->autocfg.hp_pins[0];
	if (pin)
		alc_auto_set_output_and_unmute(codec, pin, PIN_HP,
						  spec->multiout.hp_nid);
	if (pin) {
		dac = spec->multiout.hp_nid;
		if (!dac)
			dac = spec->multiout.dac_nids[0];
		alc_auto_set_output_and_unmute(codec, pin, PIN_HP, dac);
	}
	pin = spec->autocfg.speaker_pins[0];
	if (pin)
		alc_auto_set_output_and_unmute(codec, pin, PIN_OUT,
					spec->multiout.extra_out_nid[0]);
	if (pin) {
		dac = spec->multiout.extra_out_nid[0];
		if (!dac)
			dac = spec->multiout.dac_nids[0];
		alc_auto_set_output_and_unmute(codec, pin, PIN_OUT, dac);
	}
}

/*
Loading