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

Commit 1aa924e2 authored by Takashi Iwai's avatar Takashi Iwai
Browse files

Merge branch 'fix/hda' into topic/hda

parents 786c51f9 ebbd224c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -141,6 +141,7 @@ int snd_jack_new(struct snd_card *card, const char *id, int type,

fail_input:
	input_free_device(jack->input_dev);
	kfree(jack->id);
	kfree(jack);
	return err;
}
+11 −3
Original line number Diff line number Diff line
@@ -1252,11 +1252,19 @@ static void vortex_adbdma_resetup(vortex_t *vortex, int adbdma) {
static int inline vortex_adbdma_getlinearpos(vortex_t * vortex, int adbdma)
{
	stream_t *dma = &vortex->dma_adb[adbdma];
	int temp;
	int temp, page, delta;

	temp = hwread(vortex->mmio, VORTEX_ADBDMA_STAT + (adbdma << 2));
	temp = (dma->period_virt * dma->period_bytes) + (temp & (dma->period_bytes - 1));
	return temp;
	page = (temp & ADB_SUBBUF_MASK) >> ADB_SUBBUF_SHIFT;
	if (dma->nr_periods >= 4)
		delta = (page - dma->period_real) & 3;
	else {
		delta = (page - dma->period_real);
		if (delta < 0)
			delta += dma->nr_periods;
	}
	return (dma->period_virt + delta) * dma->period_bytes
		+ (temp & (dma->period_bytes - 1));
}

static void vortex_adbdma_startfifo(vortex_t * vortex, int adbdma)
+1 −0
Original line number Diff line number Diff line
@@ -2308,6 +2308,7 @@ static struct snd_pci_quirk position_fix_list[] __devinitdata = {
	SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB),
	SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB),
	SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB),
	SND_PCI_QUIRK(0x1043, 0x8410, "ASUS", POS_FIX_LPIB),
	SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB),
	SND_PCI_QUIRK(0x1106, 0x3288, "ASUS M2V-MX SE", POS_FIX_LPIB),
	SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba A100-259", POS_FIX_LPIB),
+54 −14
Original line number Diff line number Diff line
@@ -3114,6 +3114,8 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = {
	SND_PCI_QUIRK(0x1028, 0x0401, "Dell Vostro 1014", CXT5066_DELL_VOSTRO),
	SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTRO),
	SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD),
	SND_PCI_QUIRK(0x1028, 0x050f, "Dell Inspiron", CXT5066_IDEAPAD),
	SND_PCI_QUIRK(0x1028, 0x0510, "Dell Vostro", CXT5066_IDEAPAD),
	SND_PCI_QUIRK(0x103c, 0x360b, "HP G60", CXT5066_HP_LAPTOP),
	SND_PCI_QUIRK(0x1043, 0x13f3, "Asus A52J", CXT5066_ASUS),
	SND_PCI_QUIRK(0x1043, 0x1643, "Asus K52JU", CXT5066_ASUS),
@@ -3410,7 +3412,7 @@ static void cx_auto_parse_output(struct hda_codec *codec)
		}
	}
	spec->multiout.dac_nids = spec->private_dac_nids;
	spec->multiout.max_channels = nums * 2;
	spec->multiout.max_channels = spec->multiout.num_dacs * 2;

	if (cfg->hp_outs > 0)
		spec->auto_mute = 1;
@@ -3729,9 +3731,9 @@ static int cx_auto_init(struct hda_codec *codec)
	return 0;
}

static int cx_auto_add_volume(struct hda_codec *codec, const char *basename,
static int cx_auto_add_volume_idx(struct hda_codec *codec, const char *basename,
			      const char *dir, int cidx,
			      hda_nid_t nid, int hda_dir)
			      hda_nid_t nid, int hda_dir, int amp_idx)
{
	static char name[32];
	static struct snd_kcontrol_new knew[] = {
@@ -3743,7 +3745,8 @@ static int cx_auto_add_volume(struct hda_codec *codec, const char *basename,

	for (i = 0; i < 2; i++) {
		struct snd_kcontrol *kctl;
		knew[i].private_value = HDA_COMPOSE_AMP_VAL(nid, 3, 0, hda_dir);
		knew[i].private_value = HDA_COMPOSE_AMP_VAL(nid, 3, amp_idx,
							    hda_dir);
		knew[i].subdevice = HDA_SUBDEV_AMP_FLAG;
		knew[i].index = cidx;
		snprintf(name, sizeof(name), "%s%s %s", basename, dir, sfx[i]);
@@ -3759,6 +3762,9 @@ static int cx_auto_add_volume(struct hda_codec *codec, const char *basename,
	return 0;
}

#define cx_auto_add_volume(codec, str, dir, cidx, nid, hda_dir)		\
	cx_auto_add_volume_idx(codec, str, dir, cidx, nid, hda_dir, 0)

#define cx_auto_add_pb_volume(codec, nid, str, idx)			\
	cx_auto_add_volume(codec, str, " Playback", idx, nid, HDA_OUTPUT)

@@ -3808,30 +3814,61 @@ static int cx_auto_build_input_controls(struct hda_codec *codec)
	struct conexant_spec *spec = codec->spec;
	struct auto_pin_cfg *cfg = &spec->autocfg;
	static const char *prev_label;
	int i, err, cidx;
	int i, err, cidx, conn_len;
	hda_nid_t conn[HDA_MAX_CONNECTIONS];

	int multi_adc_volume = 0; /* If the ADC nid has several input volumes */
	int adc_nid = spec->adc_nids[0];

	err = cx_auto_add_volume(codec, "Capture", "", 0, spec->adc_nids[0],
	conn_len = snd_hda_get_connections(codec, adc_nid, conn,
					   HDA_MAX_CONNECTIONS);
	if (conn_len < 0)
		return conn_len;

	multi_adc_volume = cfg->num_inputs > 1 && conn_len > 1;
	if (!multi_adc_volume) {
		err = cx_auto_add_volume(codec, "Capture", "", 0, adc_nid,
					 HDA_INPUT);
		if (err < 0)
			return err;
	}

	prev_label = NULL;
	cidx = 0;
	for (i = 0; i < cfg->num_inputs; i++) {
		hda_nid_t nid = cfg->inputs[i].pin;
		const char *label;
		if (!(get_wcaps(codec, nid) & AC_WCAP_IN_AMP))
		int j;
		int pin_amp = get_wcaps(codec, nid) & AC_WCAP_IN_AMP;
		if (!pin_amp && !multi_adc_volume)
			continue;

		label = hda_get_autocfg_input_label(codec, cfg, i);
		if (label == prev_label)
			cidx++;
		else
			cidx = 0;
		prev_label = label;
		err = cx_auto_add_volume(codec, label, " Capture", cidx,

		if (pin_amp) {
			err = cx_auto_add_volume(codec, label, " Boost", cidx,
						 nid, HDA_INPUT);
			if (err < 0)
				return err;
		}

		if (!multi_adc_volume)
			continue;
		for (j = 0; j < conn_len; j++) {
			if (conn[j] == nid) {
				err = cx_auto_add_volume_idx(codec, label,
				    " Capture", cidx, adc_nid, HDA_INPUT, j);
				if (err < 0)
					return err;
				break;
			}
		}
	}
	return 0;
}

@@ -3902,6 +3939,8 @@ static struct hda_codec_preset snd_hda_preset_conexant[] = {
	  .patch = patch_cxt5066 },
	{ .id = 0x14f15069, .name = "CX20585",
	  .patch = patch_cxt5066 },
	{ .id = 0x14f1506e, .name = "CX20590",
	  .patch = patch_cxt5066 },
	{ .id = 0x14f15097, .name = "CX20631",
	  .patch = patch_conexant_auto },
	{ .id = 0x14f15098, .name = "CX20632",
@@ -3928,6 +3967,7 @@ MODULE_ALIAS("snd-hda-codec-id:14f15066");
MODULE_ALIAS("snd-hda-codec-id:14f15067");
MODULE_ALIAS("snd-hda-codec-id:14f15068");
MODULE_ALIAS("snd-hda-codec-id:14f15069");
MODULE_ALIAS("snd-hda-codec-id:14f1506e");
MODULE_ALIAS("snd-hda-codec-id:14f15097");
MODULE_ALIAS("snd-hda-codec-id:14f15098");
MODULE_ALIAS("snd-hda-codec-id:14f150a1");
+1 −1
Original line number Diff line number Diff line
@@ -567,7 +567,7 @@ static void via_auto_init_analog_input(struct hda_codec *codec)
		hda_nid_t nid = cfg->inputs[i].pin;
		if (spec->smart51_enabled && is_smart51_pins(spec, nid))
			ctl = PIN_OUT;
		else if (i == AUTO_PIN_MIC)
		else if (cfg->inputs[i].type == AUTO_PIN_MIC)
			ctl = PIN_VREF50;
		else
			ctl = PIN_IN;
Loading