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

Commit 00bc0ce9 authored by Takashi Iwai's avatar Takashi Iwai
Browse files

Merge branch 'fix/hda' into topic/hda

The fix for bitmap-overflow in Realtek codec driver is needed for the
further development of the auto-parser with badness evaluation.
parents a7f3eedc c14c95f6
Loading
Loading
Loading
Loading
+31 −3
Original line number Original line Diff line number Diff line
@@ -80,6 +80,8 @@ enum {
	ALC_AUTOMUTE_MIXER,	/* mute/unmute mixer widget AMP */
	ALC_AUTOMUTE_MIXER,	/* mute/unmute mixer widget AMP */
};
};


#define MAX_VOL_NIDS	0x40

struct alc_spec {
struct alc_spec {
	/* codec parameterization */
	/* codec parameterization */
	const struct snd_kcontrol_new *mixers[5];	/* mixer arrays */
	const struct snd_kcontrol_new *mixers[5];	/* mixer arrays */
@@ -118,8 +120,8 @@ struct alc_spec {
	const hda_nid_t *capsrc_nids;
	const hda_nid_t *capsrc_nids;
	hda_nid_t dig_in_nid;		/* digital-in NID; optional */
	hda_nid_t dig_in_nid;		/* digital-in NID; optional */
	hda_nid_t mixer_nid;		/* analog-mixer NID */
	hda_nid_t mixer_nid;		/* analog-mixer NID */
	DECLARE_BITMAP(vol_ctls, 0x20 << 1);
	DECLARE_BITMAP(vol_ctls, MAX_VOL_NIDS << 1);
	DECLARE_BITMAP(sw_ctls, 0x20 << 1);
	DECLARE_BITMAP(sw_ctls, MAX_VOL_NIDS << 1);


	/* capture setup for dynamic dual-adc switch */
	/* capture setup for dynamic dual-adc switch */
	hda_nid_t cur_adc;
	hda_nid_t cur_adc;
@@ -3125,7 +3127,10 @@ static int alc_auto_fill_dac_nids(struct hda_codec *codec)
static inline unsigned int get_ctl_pos(unsigned int data)
static inline unsigned int get_ctl_pos(unsigned int data)
{
{
	hda_nid_t nid = get_amp_nid_(data);
	hda_nid_t nid = get_amp_nid_(data);
	unsigned int dir = get_amp_direction_(data);
	unsigned int dir;
	if (snd_BUG_ON(nid >= MAX_VOL_NIDS))
		return 0;
	dir = get_amp_direction_(data);
	return (nid << 1) | dir;
	return (nid << 1) | dir;
}
}


@@ -4399,6 +4404,7 @@ enum {
	ALC882_FIXUP_ACER_ASPIRE_8930G,
	ALC882_FIXUP_ACER_ASPIRE_8930G,
	ALC882_FIXUP_ASPIRE_8930G_VERBS,
	ALC882_FIXUP_ASPIRE_8930G_VERBS,
	ALC885_FIXUP_MACPRO_GPIO,
	ALC885_FIXUP_MACPRO_GPIO,
	ALC889_FIXUP_DAC_ROUTE,
};
};


static void alc889_fixup_coef(struct hda_codec *codec,
static void alc889_fixup_coef(struct hda_codec *codec,
@@ -4452,6 +4458,23 @@ static void alc885_fixup_macpro_gpio(struct hda_codec *codec,
	alc882_gpio_mute(codec, 1, 0);
	alc882_gpio_mute(codec, 1, 0);
}
}


/* Fix the connection of some pins for ALC889:
 * At least, Acer Aspire 5935 shows the connections to DAC3/4 don't
 * work correctly (bko#42740)
 */
static void alc889_fixup_dac_route(struct hda_codec *codec,
				   const struct alc_fixup *fix, int action)
{
	if (action == ALC_FIXUP_ACT_PRE_PROBE) {
		hda_nid_t conn1[2] = { 0x0c, 0x0d };
		hda_nid_t conn2[2] = { 0x0e, 0x0f };
		snd_hda_override_conn_list(codec, 0x14, 2, conn1);
		snd_hda_override_conn_list(codec, 0x15, 2, conn1);
		snd_hda_override_conn_list(codec, 0x18, 2, conn2);
		snd_hda_override_conn_list(codec, 0x1a, 2, conn2);
	}
}

static const struct alc_fixup alc882_fixups[] = {
static const struct alc_fixup alc882_fixups[] = {
	[ALC882_FIXUP_ABIT_AW9D_MAX] = {
	[ALC882_FIXUP_ABIT_AW9D_MAX] = {
		.type = ALC_FIXUP_PINS,
		.type = ALC_FIXUP_PINS,
@@ -4599,6 +4622,10 @@ static const struct alc_fixup alc882_fixups[] = {
		.type = ALC_FIXUP_FUNC,
		.type = ALC_FIXUP_FUNC,
		.v.func = alc885_fixup_macpro_gpio,
		.v.func = alc885_fixup_macpro_gpio,
	},
	},
	[ALC889_FIXUP_DAC_ROUTE] = {
		.type = ALC_FIXUP_FUNC,
		.v.func = alc889_fixup_dac_route,
	},
};
};


static const struct snd_pci_quirk alc882_fixup_tbl[] = {
static const struct snd_pci_quirk alc882_fixup_tbl[] = {
@@ -4623,6 +4650,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
	SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
	SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
		      ALC882_FIXUP_ACER_ASPIRE_4930G),
		      ALC882_FIXUP_ACER_ASPIRE_4930G),
	SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
	SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
	SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
	SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
	SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
	SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
	SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
	SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
	SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
+3 −0
Original line number Original line Diff line number Diff line
@@ -666,6 +666,9 @@ static void via_auto_init_analog_input(struct hda_codec *codec)
	/* init input-src */
	/* init input-src */
	for (i = 0; i < spec->num_adc_nids; i++) {
	for (i = 0; i < spec->num_adc_nids; i++) {
		int adc_idx = spec->inputs[spec->cur_mux[i]].adc_idx;
		int adc_idx = spec->inputs[spec->cur_mux[i]].adc_idx;
		/* secondary ADCs must have the unique MUX */
		if (i > 0 && !spec->mux_nids[i])
			break;
		if (spec->mux_nids[adc_idx]) {
		if (spec->mux_nids[adc_idx]) {
			int mux_idx = spec->inputs[spec->cur_mux[i]].mux_idx;
			int mux_idx = spec->inputs[spec->cur_mux[i]].mux_idx;
			snd_hda_codec_write(codec, spec->mux_nids[adc_idx], 0,
			snd_hda_codec_write(codec, spec->mux_nids[adc_idx], 0,
+6 −0
Original line number Original line Diff line number Diff line
@@ -2100,6 +2100,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {
		.name = "MSI P4 ATX 645 Ultra",
		.name = "MSI P4 ATX 645 Ultra",
		.type = AC97_TUNE_HP_ONLY
		.type = AC97_TUNE_HP_ONLY
	},
	},
	{
		.subvendor = 0x161f,
		.subdevice = 0x202f,
		.name = "Gateway M520",
		.type = AC97_TUNE_INV_EAPD
	},
	{
	{
		.subvendor = 0x161f,
		.subvendor = 0x161f,
		.subdevice = 0x203a,
		.subdevice = 0x203a,
+1 −5
Original line number Original line Diff line number Diff line
@@ -1152,12 +1152,8 @@ static snd_pcm_uframes_t fsi_pointer(struct snd_pcm_substream *substream)
{
{
	struct fsi_priv *fsi = fsi_get_priv(substream);
	struct fsi_priv *fsi = fsi_get_priv(substream);
	struct fsi_stream *io = fsi_get_stream(fsi, fsi_is_play(substream));
	struct fsi_stream *io = fsi_get_stream(fsi, fsi_is_play(substream));
	int samples_pos = io->buff_sample_pos - 1;


	if (samples_pos < 0)
	return fsi_sample2frame(fsi, io->buff_sample_pos);
		samples_pos = 0;

	return fsi_sample2frame(fsi, samples_pos);
}
}


static struct snd_pcm_ops fsi_pcm_ops = {
static struct snd_pcm_ops fsi_pcm_ops = {
+1 −0
Original line number Original line Diff line number Diff line
#ifndef __USBAUDIO_CARD_H
#ifndef __USBAUDIO_CARD_H
#define __USBAUDIO_CARD_H
#define __USBAUDIO_CARD_H


#define MAX_NR_RATES	1024
#define MAX_PACKS	20
#define MAX_PACKS	20
#define MAX_PACKS_HS	(MAX_PACKS * 8)	/* in high speed mode */
#define MAX_PACKS_HS	(MAX_PACKS * 8)	/* in high speed mode */
#define MAX_URBS	8
#define MAX_URBS	8
Loading