Commit cc959489 authored by Michael Schwingen's avatar Michael Schwingen Committed by Takashi Iwai

ALSA: hda - add support for "Maxdata Favorit 100XS" (Intel HDA/ALC260)

Signed-off-by: default avatarMichael Schwingen <michael@schwingen.org>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent d2f57cd5
...@@ -78,6 +78,7 @@ enum { ...@@ -78,6 +78,7 @@ enum {
ALC260_ACER, ALC260_ACER,
ALC260_WILL, ALC260_WILL,
ALC260_REPLACER_672V, ALC260_REPLACER_672V,
ALC260_FAVORIT100,
#ifdef CONFIG_SND_DEBUG #ifdef CONFIG_SND_DEBUG
ALC260_TEST, ALC260_TEST,
#endif #endif
...@@ -4537,6 +4538,26 @@ static struct hda_input_mux alc260_acer_capture_sources[2] = { ...@@ -4537,6 +4538,26 @@ static struct hda_input_mux alc260_acer_capture_sources[2] = {
}, },
}, },
}; };
/* Maxdata Favorit 100XS */
static struct hda_input_mux alc260_favorit100_capture_sources[2] = {
{
.num_items = 2,
.items = {
{ "Line/Mic", 0x0 },
{ "CD", 0x4 },
},
},
{
.num_items = 3,
.items = {
{ "Line/Mic", 0x0 },
{ "CD", 0x4 },
{ "Mixer", 0x5 },
},
},
};
/* /*
* This is just place-holder, so there's something for alc_build_pcms to look * This is just place-holder, so there's something for alc_build_pcms to look
* at when it calculates the maximum number of channels. ALC260 has no mixer * at when it calculates the maximum number of channels. ALC260 has no mixer
...@@ -4817,6 +4838,18 @@ static struct snd_kcontrol_new alc260_acer_mixer[] = { ...@@ -4817,6 +4838,18 @@ static struct snd_kcontrol_new alc260_acer_mixer[] = {
{ } /* end */ { } /* end */
}; };
/* Maxdata Favorit 100XS: one output and one input (0x12) jack
*/
static struct snd_kcontrol_new alc260_favorit100_mixer[] = {
HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
HDA_CODEC_VOLUME("Line/Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
HDA_CODEC_MUTE("Line/Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
ALC_PIN_MODE("Line/Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
{ } /* end */
};
/* Packard bell V7900 ALC260 pin usage: HP = 0x0f, Mic jack = 0x12, /* Packard bell V7900 ALC260 pin usage: HP = 0x0f, Mic jack = 0x12,
* Line In jack = 0x14, CD audio = 0x16, pc beep = 0x17. * Line In jack = 0x14, CD audio = 0x16, pc beep = 0x17.
*/ */
...@@ -5188,6 +5221,89 @@ static struct hda_verb alc260_acer_init_verbs[] = { ...@@ -5188,6 +5221,89 @@ static struct hda_verb alc260_acer_init_verbs[] = {
{ } { }
}; };
/* Initialisation sequence for Maxdata Favorit 100XS
* (adapted from Acer init verbs).
*/
static struct hda_verb alc260_favorit100_init_verbs[] = {
/* GPIO 0 enables the output jack.
* Turn this on and rely on the standard mute
* methods whenever the user wants to turn these outputs off.
*/
{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
/* Line/Mic input jack is connected to Mic1 pin */
{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
/* Ensure all other unused pins are disabled and muted. */
{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
/* Disable digital (SPDIF) pins */
{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
/* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
* bus when acting as outputs.
*/
{0x0b, AC_VERB_SET_CONNECT_SEL, 0},
{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
/* Start with output sum widgets muted and their output gains at min */
{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
/* Unmute Line-out pin widget amp left and right
* (no equiv mixer ctrl)
*/
{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
/* Unmute Mic1 and Line1 pin widget input buffers since they start as
* inputs. If the pin mode is changed by the user the pin mode control
* will take care of enabling the pin's input/output buffers as needed.
* Therefore there's no need to enable the input buffer at this
* stage.
*/
{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
/* Mute capture amp left and right */
{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
/* Set ADC connection select to match default mixer setting - mic
* (on mic1 pin)
*/
{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
/* Do similar with the second ADC: mute capture input amp and
* set ADC connection to mic to match ALSA's default state.
*/
{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
/* Mute all inputs to mixer widget (even unconnected ones) */
{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
{ }
};
static struct hda_verb alc260_will_verbs[] = { static struct hda_verb alc260_will_verbs[] = {
{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
{0x0b, AC_VERB_SET_CONNECT_SEL, 0x00}, {0x0b, AC_VERB_SET_CONNECT_SEL, 0x00},
...@@ -5730,6 +5846,7 @@ static const char *alc260_models[ALC260_MODEL_LAST] = { ...@@ -5730,6 +5846,7 @@ static const char *alc260_models[ALC260_MODEL_LAST] = {
[ALC260_ACER] = "acer", [ALC260_ACER] = "acer",
[ALC260_WILL] = "will", [ALC260_WILL] = "will",
[ALC260_REPLACER_672V] = "replacer", [ALC260_REPLACER_672V] = "replacer",
[ALC260_FAVORIT100] = "favorit100",
#ifdef CONFIG_SND_DEBUG #ifdef CONFIG_SND_DEBUG
[ALC260_TEST] = "test", [ALC260_TEST] = "test",
#endif #endif
...@@ -5739,6 +5856,7 @@ static const char *alc260_models[ALC260_MODEL_LAST] = { ...@@ -5739,6 +5856,7 @@ static const char *alc260_models[ALC260_MODEL_LAST] = {
static struct snd_pci_quirk alc260_cfg_tbl[] = { static struct snd_pci_quirk alc260_cfg_tbl[] = {
SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER), SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER),
SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER), SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER),
SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FAVORIT100),
SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013), SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013),
SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_HP_3013), SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_HP_3013),
SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013), SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013),
...@@ -5840,6 +5958,18 @@ static struct alc_config_preset alc260_presets[] = { ...@@ -5840,6 +5958,18 @@ static struct alc_config_preset alc260_presets[] = {
.num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources), .num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources),
.input_mux = alc260_acer_capture_sources, .input_mux = alc260_acer_capture_sources,
}, },
[ALC260_FAVORIT100] = {
.mixers = { alc260_favorit100_mixer },
.init_verbs = { alc260_favorit100_init_verbs },
.num_dacs = ARRAY_SIZE(alc260_dac_nids),
.dac_nids = alc260_dac_nids,
.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
.adc_nids = alc260_dual_adc_nids,
.num_channel_mode = ARRAY_SIZE(alc260_modes),
.channel_mode = alc260_modes,
.num_mux_defs = ARRAY_SIZE(alc260_favorit100_capture_sources),
.input_mux = alc260_favorit100_capture_sources,
},
[ALC260_WILL] = { [ALC260_WILL] = {
.mixers = { alc260_will_mixer }, .mixers = { alc260_will_mixer },
.init_verbs = { alc260_init_verbs, alc260_will_verbs }, .init_verbs = { alc260_init_verbs, alc260_will_verbs },
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment