Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6: ALSA: hda - Fix invalid amp value for STAC925x ASoC: Fix the power update function for snd_soc_dapm_value_mux sound: virtuoso: do not overwrite EEPROM on Xonar D2/D2X ALSA: hda - Fix HP dv5 mic input ALSA: hda - Fix missing initialization of NID 0x0e for STAC925x ALSA: USB quirk for Logitech Quickcam Pro 9000 name ALSA: hda - Fix stac92hd83xxx_amp_nids[] ALSA: hda - Add automatic model setting for Samsung Q45 ALSA: hda - Don't reset HP pinctl in patch_sigmatel.c ALSA: hda: stac92hd8xxx amp mixers ALSA: hda - Fix silent headphone output on Panasonic CF-74 ALSA: hda - Update model descriptions in patch_sigmatel.c ALSA: hda - Use queue_delayed_work() ALSA: hda - Add quirk for another HP dv5 ALSA: hda - Add support of NVidia MCP78 HDMI ALSA: hda - Fix a typo ALSA: hda - More fixes on Gateway entries ALSA: patch_sigmatel: Add missing Gateway entries and autodetection ALSA: hda - Add a new function to seek for a codec ID
This commit is contained in:
commit
22deb791f3
|
@ -275,7 +275,8 @@ STAC9200
|
||||||
dell-m25 Dell Inspiron E1505n
|
dell-m25 Dell Inspiron E1505n
|
||||||
dell-m26 Dell Inspiron 1501
|
dell-m26 Dell Inspiron 1501
|
||||||
dell-m27 Dell Inspiron E1705/9400
|
dell-m27 Dell Inspiron E1705/9400
|
||||||
gateway Gateway laptops with EAPD control
|
gateway-m4 Gateway laptops with EAPD control
|
||||||
|
gateway-m4-2 Gateway laptops with EAPD control
|
||||||
panasonic Panasonic CF-74
|
panasonic Panasonic CF-74
|
||||||
|
|
||||||
STAC9205/9254
|
STAC9205/9254
|
||||||
|
@ -302,6 +303,7 @@ STAC9220/9221
|
||||||
macbook-pro Intel Mac Book Pro 2nd generation (eq. type 3)
|
macbook-pro Intel Mac Book Pro 2nd generation (eq. type 3)
|
||||||
imac-intel Intel iMac (eq. type 2)
|
imac-intel Intel iMac (eq. type 2)
|
||||||
imac-intel-20 Intel iMac (newer version) (eq. type 3)
|
imac-intel-20 Intel iMac (newer version) (eq. type 3)
|
||||||
|
ecs202 ECS/PC chips
|
||||||
dell-d81 Dell (unknown)
|
dell-d81 Dell (unknown)
|
||||||
dell-d82 Dell (unknown)
|
dell-d82 Dell (unknown)
|
||||||
dell-m81 Dell (unknown)
|
dell-m81 Dell (unknown)
|
||||||
|
@ -310,9 +312,13 @@ STAC9220/9221
|
||||||
STAC9202/9250/9251
|
STAC9202/9250/9251
|
||||||
==================
|
==================
|
||||||
ref Reference board, base config
|
ref Reference board, base config
|
||||||
|
m1 Some Gateway MX series laptops (NX560XL)
|
||||||
|
m1-2 Some Gateway MX series laptops (MX6453)
|
||||||
|
m2 Some Gateway MX series laptops (M255)
|
||||||
m2-2 Some Gateway MX series laptops
|
m2-2 Some Gateway MX series laptops
|
||||||
|
m3 Some Gateway MX series laptops
|
||||||
|
m5 Some Gateway MX series laptops (MP6954)
|
||||||
m6 Some Gateway NX series laptops
|
m6 Some Gateway NX series laptops
|
||||||
pa6 Gateway NX860 series
|
|
||||||
|
|
||||||
STAC9227/9228/9229/927x
|
STAC9227/9228/9229/927x
|
||||||
=======================
|
=======================
|
||||||
|
@ -329,6 +335,7 @@ STAC92HD71B*
|
||||||
dell-m4-1 Dell desktops
|
dell-m4-1 Dell desktops
|
||||||
dell-m4-2 Dell desktops
|
dell-m4-2 Dell desktops
|
||||||
dell-m4-3 Dell desktops
|
dell-m4-3 Dell desktops
|
||||||
|
hp-m4 HP dv laptops
|
||||||
|
|
||||||
STAC92HD73*
|
STAC92HD73*
|
||||||
===========
|
===========
|
||||||
|
@ -337,6 +344,7 @@ STAC92HD73*
|
||||||
dell-m6-amic Dell desktops/laptops with analog mics
|
dell-m6-amic Dell desktops/laptops with analog mics
|
||||||
dell-m6-dmic Dell desktops/laptops with digital mics
|
dell-m6-dmic Dell desktops/laptops with digital mics
|
||||||
dell-m6 Dell desktops/laptops with both type of mics
|
dell-m6 Dell desktops/laptops with both type of mics
|
||||||
|
dell-eq Dell desktops/laptops
|
||||||
|
|
||||||
STAC92HD83*
|
STAC92HD83*
|
||||||
===========
|
===========
|
||||||
|
|
|
@ -2723,6 +2723,67 @@ int snd_hda_check_board_config(struct hda_codec *codec,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_HDA(snd_hda_check_board_config);
|
EXPORT_SYMBOL_HDA(snd_hda_check_board_config);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* snd_hda_check_board_codec_sid_config - compare the current codec
|
||||||
|
subsystem ID with the
|
||||||
|
config table
|
||||||
|
|
||||||
|
This is important for Gateway notebooks with SB450 HDA Audio
|
||||||
|
where the vendor ID of the PCI device is:
|
||||||
|
ATI Technologies Inc SB450 HDA Audio [1002:437b]
|
||||||
|
and the vendor/subvendor are found only at the codec.
|
||||||
|
|
||||||
|
* @codec: the HDA codec
|
||||||
|
* @num_configs: number of config enums
|
||||||
|
* @models: array of model name strings
|
||||||
|
* @tbl: configuration table, terminated by null entries
|
||||||
|
*
|
||||||
|
* Compares the modelname or PCI subsystem id of the current codec with the
|
||||||
|
* given configuration table. If a matching entry is found, returns its
|
||||||
|
* config value (supposed to be 0 or positive).
|
||||||
|
*
|
||||||
|
* If no entries are matching, the function returns a negative value.
|
||||||
|
*/
|
||||||
|
int snd_hda_check_board_codec_sid_config(struct hda_codec *codec,
|
||||||
|
int num_configs, const char **models,
|
||||||
|
const struct snd_pci_quirk *tbl)
|
||||||
|
{
|
||||||
|
const struct snd_pci_quirk *q;
|
||||||
|
|
||||||
|
/* Search for codec ID */
|
||||||
|
for (q = tbl; q->subvendor; q++) {
|
||||||
|
unsigned long vendorid = (q->subdevice) | (q->subvendor << 16);
|
||||||
|
|
||||||
|
if (vendorid == codec->subsystem_id)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!q->subvendor)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
tbl = q;
|
||||||
|
|
||||||
|
if (tbl->value >= 0 && tbl->value < num_configs) {
|
||||||
|
#ifdef CONFIG_SND_DEBUG_DETECT
|
||||||
|
char tmp[10];
|
||||||
|
const char *model = NULL;
|
||||||
|
if (models)
|
||||||
|
model = models[tbl->value];
|
||||||
|
if (!model) {
|
||||||
|
sprintf(tmp, "#%d", tbl->value);
|
||||||
|
model = tmp;
|
||||||
|
}
|
||||||
|
snd_printdd(KERN_INFO "hda_codec: model '%s' is selected "
|
||||||
|
"for config %x:%x (%s)\n",
|
||||||
|
model, tbl->subvendor, tbl->subdevice,
|
||||||
|
(tbl->name ? tbl->name : "Unknown device"));
|
||||||
|
#endif
|
||||||
|
return tbl->value;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_HDA(snd_hda_check_board_codec_sid_config);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* snd_hda_add_new_ctls - create controls from the array
|
* snd_hda_add_new_ctls - create controls from the array
|
||||||
* @codec: the HDA codec
|
* @codec: the HDA codec
|
||||||
|
@ -2815,7 +2876,7 @@ void snd_hda_power_down(struct hda_codec *codec)
|
||||||
return;
|
return;
|
||||||
if (power_save(codec)) {
|
if (power_save(codec)) {
|
||||||
codec->power_transition = 1; /* avoid reentrance */
|
codec->power_transition = 1; /* avoid reentrance */
|
||||||
schedule_delayed_work(&codec->power_work,
|
queue_delayed_work(codec->bus->workq, &codec->power_work,
|
||||||
msecs_to_jiffies(power_save(codec) * 1000));
|
msecs_to_jiffies(power_save(codec) * 1000));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -296,6 +296,9 @@ void snd_print_pcm_bits(int pcm, char *buf, int buflen);
|
||||||
int snd_hda_check_board_config(struct hda_codec *codec, int num_configs,
|
int snd_hda_check_board_config(struct hda_codec *codec, int num_configs,
|
||||||
const char **modelnames,
|
const char **modelnames,
|
||||||
const struct snd_pci_quirk *pci_list);
|
const struct snd_pci_quirk *pci_list);
|
||||||
|
int snd_hda_check_board_codec_sid_config(struct hda_codec *codec,
|
||||||
|
int num_configs, const char **models,
|
||||||
|
const struct snd_pci_quirk *tbl);
|
||||||
int snd_hda_add_new_ctls(struct hda_codec *codec,
|
int snd_hda_add_new_ctls(struct hda_codec *codec,
|
||||||
struct snd_kcontrol_new *knew);
|
struct snd_kcontrol_new *knew);
|
||||||
|
|
||||||
|
|
|
@ -160,6 +160,7 @@ static int patch_nvhdmi(struct hda_codec *codec)
|
||||||
*/
|
*/
|
||||||
static struct hda_codec_preset snd_hda_preset_nvhdmi[] = {
|
static struct hda_codec_preset snd_hda_preset_nvhdmi[] = {
|
||||||
{ .id = 0x10de0002, .name = "MCP78 HDMI", .patch = patch_nvhdmi },
|
{ .id = 0x10de0002, .name = "MCP78 HDMI", .patch = patch_nvhdmi },
|
||||||
|
{ .id = 0x10de0006, .name = "MCP78 HDMI", .patch = patch_nvhdmi },
|
||||||
{ .id = 0x10de0007, .name = "MCP7A HDMI", .patch = patch_nvhdmi },
|
{ .id = 0x10de0007, .name = "MCP7A HDMI", .patch = patch_nvhdmi },
|
||||||
{ .id = 0x10de0067, .name = "MCP67 HDMI", .patch = patch_nvhdmi },
|
{ .id = 0x10de0067, .name = "MCP67 HDMI", .patch = patch_nvhdmi },
|
||||||
{ .id = 0x10de8001, .name = "MCP73 HDMI", .patch = patch_nvhdmi },
|
{ .id = 0x10de8001, .name = "MCP73 HDMI", .patch = patch_nvhdmi },
|
||||||
|
@ -167,6 +168,7 @@ static struct hda_codec_preset snd_hda_preset_nvhdmi[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
MODULE_ALIAS("snd-hda-codec-id:10de0002");
|
MODULE_ALIAS("snd-hda-codec-id:10de0002");
|
||||||
|
MODULE_ALIAS("snd-hda-codec-id:10de0006");
|
||||||
MODULE_ALIAS("snd-hda-codec-id:10de0007");
|
MODULE_ALIAS("snd-hda-codec-id:10de0007");
|
||||||
MODULE_ALIAS("snd-hda-codec-id:10de0067");
|
MODULE_ALIAS("snd-hda-codec-id:10de0067");
|
||||||
MODULE_ALIAS("snd-hda-codec-id:10de8001");
|
MODULE_ALIAS("snd-hda-codec-id:10de8001");
|
||||||
|
|
|
@ -10573,6 +10573,7 @@ static struct snd_pci_quirk alc262_cfg_tbl[] = {
|
||||||
SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
|
SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
|
||||||
SND_PCI_QUIRK(0x144d, 0xc032, "Samsung Q1 Ultra", ALC262_ULTRA),
|
SND_PCI_QUIRK(0x144d, 0xc032, "Samsung Q1 Ultra", ALC262_ULTRA),
|
||||||
SND_PCI_QUIRK(0x144d, 0xc039, "Samsung Q1U EL", ALC262_ULTRA),
|
SND_PCI_QUIRK(0x144d, 0xc039, "Samsung Q1U EL", ALC262_ULTRA),
|
||||||
|
SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
|
||||||
SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000),
|
SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000),
|
||||||
SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8),
|
SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8),
|
||||||
SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
|
SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
|
||||||
|
|
|
@ -55,7 +55,8 @@ enum {
|
||||||
STAC_9200_DELL_M25,
|
STAC_9200_DELL_M25,
|
||||||
STAC_9200_DELL_M26,
|
STAC_9200_DELL_M26,
|
||||||
STAC_9200_DELL_M27,
|
STAC_9200_DELL_M27,
|
||||||
STAC_9200_GATEWAY,
|
STAC_9200_M4,
|
||||||
|
STAC_9200_M4_2,
|
||||||
STAC_9200_PANASONIC,
|
STAC_9200_PANASONIC,
|
||||||
STAC_9200_MODELS
|
STAC_9200_MODELS
|
||||||
};
|
};
|
||||||
|
@ -89,14 +90,19 @@ enum {
|
||||||
STAC_DELL_M4_2,
|
STAC_DELL_M4_2,
|
||||||
STAC_DELL_M4_3,
|
STAC_DELL_M4_3,
|
||||||
STAC_HP_M4,
|
STAC_HP_M4,
|
||||||
|
STAC_HP_DV5,
|
||||||
STAC_92HD71BXX_MODELS
|
STAC_92HD71BXX_MODELS
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
STAC_925x_REF,
|
STAC_925x_REF,
|
||||||
|
STAC_M1,
|
||||||
|
STAC_M1_2,
|
||||||
|
STAC_M2,
|
||||||
STAC_M2_2,
|
STAC_M2_2,
|
||||||
STAC_MA6,
|
STAC_M3,
|
||||||
STAC_PA6,
|
STAC_M5,
|
||||||
|
STAC_M6,
|
||||||
STAC_925x_MODELS
|
STAC_925x_MODELS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -331,6 +337,10 @@ static unsigned int stac92hd83xxx_pwr_mapping[4] = {
|
||||||
0x03, 0x0c, 0x10, 0x40,
|
0x03, 0x0c, 0x10, 0x40,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static hda_nid_t stac92hd83xxx_amp_nids[1] = {
|
||||||
|
0xc,
|
||||||
|
};
|
||||||
|
|
||||||
static hda_nid_t stac92hd71bxx_pwr_nids[3] = {
|
static hda_nid_t stac92hd71bxx_pwr_nids[3] = {
|
||||||
0x0a, 0x0d, 0x0f
|
0x0a, 0x0d, 0x0f
|
||||||
};
|
};
|
||||||
|
@ -875,6 +885,8 @@ static struct hda_verb stac92hd71bxx_analog_core_init[] = {
|
||||||
static struct hda_verb stac925x_core_init[] = {
|
static struct hda_verb stac925x_core_init[] = {
|
||||||
/* set dac0mux for dac converter */
|
/* set dac0mux for dac converter */
|
||||||
{ 0x06, AC_VERB_SET_CONNECT_SEL, 0x00},
|
{ 0x06, AC_VERB_SET_CONNECT_SEL, 0x00},
|
||||||
|
/* unmute and set max the selector */
|
||||||
|
{ 0x0e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb01f },
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1334,7 +1346,16 @@ static unsigned int ref9200_pin_configs[8] = {
|
||||||
0x02a19020, 0x01a19021, 0x90100140, 0x01813122,
|
0x02a19020, 0x01a19021, 0x90100140, 0x01813122,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
static unsigned int gateway9200_m4_pin_configs[8] = {
|
||||||
|
0x400000fe, 0x404500f4, 0x400100f0, 0x90110010,
|
||||||
|
0x400100f1, 0x02a1902e, 0x500000f2, 0x500000f3,
|
||||||
|
};
|
||||||
|
static unsigned int gateway9200_m4_2_pin_configs[8] = {
|
||||||
|
0x400000fe, 0x404500f4, 0x400100f0, 0x90110010,
|
||||||
|
0x400100f1, 0x02a1902e, 0x500000f2, 0x500000f3,
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
STAC 9200 pin configs for
|
STAC 9200 pin configs for
|
||||||
102801A8
|
102801A8
|
||||||
102801DE
|
102801DE
|
||||||
|
@ -1464,6 +1485,8 @@ static unsigned int *stac9200_brd_tbl[STAC_9200_MODELS] = {
|
||||||
[STAC_9200_DELL_M25] = dell9200_m25_pin_configs,
|
[STAC_9200_DELL_M25] = dell9200_m25_pin_configs,
|
||||||
[STAC_9200_DELL_M26] = dell9200_m26_pin_configs,
|
[STAC_9200_DELL_M26] = dell9200_m26_pin_configs,
|
||||||
[STAC_9200_DELL_M27] = dell9200_m27_pin_configs,
|
[STAC_9200_DELL_M27] = dell9200_m27_pin_configs,
|
||||||
|
[STAC_9200_M4] = gateway9200_m4_pin_configs,
|
||||||
|
[STAC_9200_M4_2] = gateway9200_m4_2_pin_configs,
|
||||||
[STAC_9200_PANASONIC] = ref9200_pin_configs,
|
[STAC_9200_PANASONIC] = ref9200_pin_configs,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1480,7 +1503,8 @@ static const char *stac9200_models[STAC_9200_MODELS] = {
|
||||||
[STAC_9200_DELL_M25] = "dell-m25",
|
[STAC_9200_DELL_M25] = "dell-m25",
|
||||||
[STAC_9200_DELL_M26] = "dell-m26",
|
[STAC_9200_DELL_M26] = "dell-m26",
|
||||||
[STAC_9200_DELL_M27] = "dell-m27",
|
[STAC_9200_DELL_M27] = "dell-m27",
|
||||||
[STAC_9200_GATEWAY] = "gateway",
|
[STAC_9200_M4] = "gateway-m4",
|
||||||
|
[STAC_9200_M4_2] = "gateway-m4-2",
|
||||||
[STAC_9200_PANASONIC] = "panasonic",
|
[STAC_9200_PANASONIC] = "panasonic",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1550,11 +1574,9 @@ static struct snd_pci_quirk stac9200_cfg_tbl[] = {
|
||||||
/* Panasonic */
|
/* Panasonic */
|
||||||
SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-74", STAC_9200_PANASONIC),
|
SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-74", STAC_9200_PANASONIC),
|
||||||
/* Gateway machines needs EAPD to be set on resume */
|
/* Gateway machines needs EAPD to be set on resume */
|
||||||
SND_PCI_QUIRK(0x107b, 0x0205, "Gateway S-7110M", STAC_9200_GATEWAY),
|
SND_PCI_QUIRK(0x107b, 0x0205, "Gateway S-7110M", STAC_9200_M4),
|
||||||
SND_PCI_QUIRK(0x107b, 0x0317, "Gateway MT3423, MX341*",
|
SND_PCI_QUIRK(0x107b, 0x0317, "Gateway MT3423, MX341*", STAC_9200_M4_2),
|
||||||
STAC_9200_GATEWAY),
|
SND_PCI_QUIRK(0x107b, 0x0318, "Gateway ML3019, MT3707", STAC_9200_M4_2),
|
||||||
SND_PCI_QUIRK(0x107b, 0x0318, "Gateway ML3019, MT3707",
|
|
||||||
STAC_9200_GATEWAY),
|
|
||||||
/* OQO Mobile */
|
/* OQO Mobile */
|
||||||
SND_PCI_QUIRK(0x1106, 0x3288, "OQO Model 2", STAC_9200_OQO),
|
SND_PCI_QUIRK(0x1106, 0x3288, "OQO Model 2", STAC_9200_OQO),
|
||||||
{} /* terminator */
|
{} /* terminator */
|
||||||
|
@ -1565,44 +1587,85 @@ static unsigned int ref925x_pin_configs[8] = {
|
||||||
0x90a70320, 0x02214210, 0x01019020, 0x9033032e,
|
0x90a70320, 0x02214210, 0x01019020, 0x9033032e,
|
||||||
};
|
};
|
||||||
|
|
||||||
static unsigned int stac925x_MA6_pin_configs[8] = {
|
static unsigned int stac925xM1_pin_configs[8] = {
|
||||||
0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021,
|
0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
|
||||||
0x90a70320, 0x90100211, 0x400003f1, 0x9033032e,
|
0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
|
||||||
};
|
};
|
||||||
|
|
||||||
static unsigned int stac925x_PA6_pin_configs[8] = {
|
static unsigned int stac925xM1_2_pin_configs[8] = {
|
||||||
0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021,
|
0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
|
||||||
0x50a103f0, 0x90100211, 0x400003f1, 0x9033032e,
|
0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
|
||||||
|
};
|
||||||
|
|
||||||
|
static unsigned int stac925xM2_pin_configs[8] = {
|
||||||
|
0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
|
||||||
|
0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
|
||||||
};
|
};
|
||||||
|
|
||||||
static unsigned int stac925xM2_2_pin_configs[8] = {
|
static unsigned int stac925xM2_2_pin_configs[8] = {
|
||||||
0x40c003f3, 0x424503f2, 0x04180011, 0x02a19020,
|
0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
|
||||||
0x50a103f0, 0x90100212, 0x400003f1, 0x9033032e,
|
0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
|
||||||
|
};
|
||||||
|
|
||||||
|
static unsigned int stac925xM3_pin_configs[8] = {
|
||||||
|
0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
|
||||||
|
0x40a000f0, 0x90100210, 0x400003f1, 0x503303f3,
|
||||||
|
};
|
||||||
|
|
||||||
|
static unsigned int stac925xM5_pin_configs[8] = {
|
||||||
|
0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
|
||||||
|
0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
|
||||||
|
};
|
||||||
|
|
||||||
|
static unsigned int stac925xM6_pin_configs[8] = {
|
||||||
|
0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
|
||||||
|
0x40a000f0, 0x90100210, 0x400003f1, 0x90330320,
|
||||||
};
|
};
|
||||||
|
|
||||||
static unsigned int *stac925x_brd_tbl[STAC_925x_MODELS] = {
|
static unsigned int *stac925x_brd_tbl[STAC_925x_MODELS] = {
|
||||||
[STAC_REF] = ref925x_pin_configs,
|
[STAC_REF] = ref925x_pin_configs,
|
||||||
|
[STAC_M1] = stac925xM1_pin_configs,
|
||||||
|
[STAC_M1_2] = stac925xM1_2_pin_configs,
|
||||||
|
[STAC_M2] = stac925xM2_pin_configs,
|
||||||
[STAC_M2_2] = stac925xM2_2_pin_configs,
|
[STAC_M2_2] = stac925xM2_2_pin_configs,
|
||||||
[STAC_MA6] = stac925x_MA6_pin_configs,
|
[STAC_M3] = stac925xM3_pin_configs,
|
||||||
[STAC_PA6] = stac925x_PA6_pin_configs,
|
[STAC_M5] = stac925xM5_pin_configs,
|
||||||
|
[STAC_M6] = stac925xM6_pin_configs,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *stac925x_models[STAC_925x_MODELS] = {
|
static const char *stac925x_models[STAC_925x_MODELS] = {
|
||||||
[STAC_REF] = "ref",
|
[STAC_REF] = "ref",
|
||||||
|
[STAC_M1] = "m1",
|
||||||
|
[STAC_M1_2] = "m1-2",
|
||||||
|
[STAC_M2] = "m2",
|
||||||
[STAC_M2_2] = "m2-2",
|
[STAC_M2_2] = "m2-2",
|
||||||
[STAC_MA6] = "m6",
|
[STAC_M3] = "m3",
|
||||||
[STAC_PA6] = "pa6",
|
[STAC_M5] = "m5",
|
||||||
|
[STAC_M6] = "m6",
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct snd_pci_quirk stac925x_codec_id_cfg_tbl[] = {
|
||||||
|
SND_PCI_QUIRK(0x107b, 0x0316, "Gateway M255", STAC_M2),
|
||||||
|
SND_PCI_QUIRK(0x107b, 0x0366, "Gateway MP6954", STAC_M5),
|
||||||
|
SND_PCI_QUIRK(0x107b, 0x0461, "Gateway NX560XL", STAC_M1),
|
||||||
|
SND_PCI_QUIRK(0x107b, 0x0681, "Gateway NX860", STAC_M2),
|
||||||
|
SND_PCI_QUIRK(0x107b, 0x0367, "Gateway MX6453", STAC_M1_2),
|
||||||
|
/* Not sure about the brand name for those */
|
||||||
|
SND_PCI_QUIRK(0x107b, 0x0281, "Gateway mobile", STAC_M1),
|
||||||
|
SND_PCI_QUIRK(0x107b, 0x0507, "Gateway mobile", STAC_M3),
|
||||||
|
SND_PCI_QUIRK(0x107b, 0x0281, "Gateway mobile", STAC_M6),
|
||||||
|
SND_PCI_QUIRK(0x107b, 0x0685, "Gateway mobile", STAC_M2_2),
|
||||||
|
{} /* terminator */
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct snd_pci_quirk stac925x_cfg_tbl[] = {
|
static struct snd_pci_quirk stac925x_cfg_tbl[] = {
|
||||||
/* SigmaTel reference board */
|
/* SigmaTel reference board */
|
||||||
SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, "DFI LanParty", STAC_REF),
|
SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, "DFI LanParty", STAC_REF),
|
||||||
SND_PCI_QUIRK(0x8384, 0x7632, "Stac9202 Reference Board", STAC_REF),
|
SND_PCI_QUIRK(0x8384, 0x7632, "Stac9202 Reference Board", STAC_REF),
|
||||||
SND_PCI_QUIRK(0x107b, 0x0316, "Gateway M255", STAC_REF),
|
|
||||||
SND_PCI_QUIRK(0x107b, 0x0366, "Gateway MP6954", STAC_REF),
|
/* Default table for unknown ID */
|
||||||
SND_PCI_QUIRK(0x107b, 0x0461, "Gateway NX560XL", STAC_MA6),
|
SND_PCI_QUIRK(0x1002, 0x437b, "Gateway mobile", STAC_M2_2),
|
||||||
SND_PCI_QUIRK(0x107b, 0x0681, "Gateway NX860", STAC_PA6),
|
|
||||||
SND_PCI_QUIRK(0x1002, 0x437b, "Gateway MX6453", STAC_M2_2),
|
|
||||||
{} /* terminator */
|
{} /* terminator */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1682,7 +1745,7 @@ static const char *stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = {
|
||||||
static struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = {
|
static struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = {
|
||||||
/* SigmaTel reference board */
|
/* SigmaTel reference board */
|
||||||
SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
|
SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
|
||||||
"DFI LanParty", STAC_92HD71BXX_REF),
|
"DFI LanParty", STAC_92HD83XXX_REF),
|
||||||
{} /* terminator */
|
{} /* terminator */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1716,6 +1779,7 @@ static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = {
|
||||||
[STAC_DELL_M4_2] = dell_m4_2_pin_configs,
|
[STAC_DELL_M4_2] = dell_m4_2_pin_configs,
|
||||||
[STAC_DELL_M4_3] = dell_m4_3_pin_configs,
|
[STAC_DELL_M4_3] = dell_m4_3_pin_configs,
|
||||||
[STAC_HP_M4] = NULL,
|
[STAC_HP_M4] = NULL,
|
||||||
|
[STAC_HP_DV5] = NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = {
|
static const char *stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = {
|
||||||
|
@ -1724,6 +1788,7 @@ static const char *stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = {
|
||||||
[STAC_DELL_M4_2] = "dell-m4-2",
|
[STAC_DELL_M4_2] = "dell-m4-2",
|
||||||
[STAC_DELL_M4_3] = "dell-m4-3",
|
[STAC_DELL_M4_3] = "dell-m4-3",
|
||||||
[STAC_HP_M4] = "hp-m4",
|
[STAC_HP_M4] = "hp-m4",
|
||||||
|
[STAC_HP_DV5] = "hp-dv5",
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = {
|
static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = {
|
||||||
|
@ -1736,6 +1801,8 @@ static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = {
|
||||||
"HP dv7", STAC_HP_M4),
|
"HP dv7", STAC_HP_M4),
|
||||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30fc,
|
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30fc,
|
||||||
"HP dv7", STAC_HP_M4),
|
"HP dv7", STAC_HP_M4),
|
||||||
|
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3603,
|
||||||
|
"HP dv5", STAC_HP_DV5),
|
||||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a,
|
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a,
|
||||||
"unknown HP", STAC_HP_M4),
|
"unknown HP", STAC_HP_M4),
|
||||||
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233,
|
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233,
|
||||||
|
@ -4163,8 +4230,19 @@ static void stac92xx_hp_detect(struct hda_codec *codec)
|
||||||
continue;
|
continue;
|
||||||
if (presence)
|
if (presence)
|
||||||
stac92xx_set_pinctl(codec, cfg->hp_pins[i], val);
|
stac92xx_set_pinctl(codec, cfg->hp_pins[i], val);
|
||||||
|
#if 0 /* FIXME */
|
||||||
|
/* Resetting the pinctl like below may lead to (a sort of) regressions
|
||||||
|
* on some devices since they use the HP pin actually for line/speaker
|
||||||
|
* outs although the default pin config shows a different pin (that is
|
||||||
|
* wrong and useless).
|
||||||
|
*
|
||||||
|
* So, it's basically a problem of default pin configs, likely a BIOS issue.
|
||||||
|
* But, disabling the code below just works around it, and I'm too tired of
|
||||||
|
* bug reports with such devices...
|
||||||
|
*/
|
||||||
else
|
else
|
||||||
stac92xx_reset_pinctl(codec, cfg->hp_pins[i], val);
|
stac92xx_reset_pinctl(codec, cfg->hp_pins[i], val);
|
||||||
|
#endif /* FIXME */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4390,7 +4468,8 @@ static int patch_stac9200(struct hda_codec *codec)
|
||||||
spec->num_adcs = 1;
|
spec->num_adcs = 1;
|
||||||
spec->num_pwrs = 0;
|
spec->num_pwrs = 0;
|
||||||
|
|
||||||
if (spec->board_config == STAC_9200_GATEWAY ||
|
if (spec->board_config == STAC_9200_M4 ||
|
||||||
|
spec->board_config == STAC_9200_M4_2 ||
|
||||||
spec->board_config == STAC_9200_OQO)
|
spec->board_config == STAC_9200_OQO)
|
||||||
spec->init = stac9200_eapd_init;
|
spec->init = stac9200_eapd_init;
|
||||||
else
|
else
|
||||||
|
@ -4408,6 +4487,12 @@ static int patch_stac9200(struct hda_codec *codec)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* CF-74 has no headphone detection, and the driver should *NOT*
|
||||||
|
* do detection and HP/speaker toggle because the hardware does it.
|
||||||
|
*/
|
||||||
|
if (spec->board_config == STAC_9200_PANASONIC)
|
||||||
|
spec->hp_detect = 0;
|
||||||
|
|
||||||
codec->patch_ops = stac92xx_patch_ops;
|
codec->patch_ops = stac92xx_patch_ops;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -4425,12 +4510,22 @@ static int patch_stac925x(struct hda_codec *codec)
|
||||||
codec->spec = spec;
|
codec->spec = spec;
|
||||||
spec->num_pins = ARRAY_SIZE(stac925x_pin_nids);
|
spec->num_pins = ARRAY_SIZE(stac925x_pin_nids);
|
||||||
spec->pin_nids = stac925x_pin_nids;
|
spec->pin_nids = stac925x_pin_nids;
|
||||||
spec->board_config = snd_hda_check_board_config(codec, STAC_925x_MODELS,
|
|
||||||
|
/* Check first for codec ID */
|
||||||
|
spec->board_config = snd_hda_check_board_codec_sid_config(codec,
|
||||||
|
STAC_925x_MODELS,
|
||||||
|
stac925x_models,
|
||||||
|
stac925x_codec_id_cfg_tbl);
|
||||||
|
|
||||||
|
/* Now checks for PCI ID, if codec ID is not found */
|
||||||
|
if (spec->board_config < 0)
|
||||||
|
spec->board_config = snd_hda_check_board_config(codec,
|
||||||
|
STAC_925x_MODELS,
|
||||||
stac925x_models,
|
stac925x_models,
|
||||||
stac925x_cfg_tbl);
|
stac925x_cfg_tbl);
|
||||||
again:
|
again:
|
||||||
if (spec->board_config < 0) {
|
if (spec->board_config < 0) {
|
||||||
snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC925x,"
|
snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC925x,"
|
||||||
"using BIOS defaults\n");
|
"using BIOS defaults\n");
|
||||||
err = stac92xx_save_bios_config_regs(codec);
|
err = stac92xx_save_bios_config_regs(codec);
|
||||||
} else
|
} else
|
||||||
|
@ -4672,6 +4767,7 @@ static int patch_stac92hd83xxx(struct hda_codec *codec)
|
||||||
spec->dmux_nids = stac92hd83xxx_dmux_nids;
|
spec->dmux_nids = stac92hd83xxx_dmux_nids;
|
||||||
spec->adc_nids = stac92hd83xxx_adc_nids;
|
spec->adc_nids = stac92hd83xxx_adc_nids;
|
||||||
spec->pwr_nids = stac92hd83xxx_pwr_nids;
|
spec->pwr_nids = stac92hd83xxx_pwr_nids;
|
||||||
|
spec->amp_nids = stac92hd83xxx_amp_nids;
|
||||||
spec->pwr_mapping = stac92hd83xxx_pwr_mapping;
|
spec->pwr_mapping = stac92hd83xxx_pwr_mapping;
|
||||||
spec->num_pwrs = ARRAY_SIZE(stac92hd83xxx_pwr_nids);
|
spec->num_pwrs = ARRAY_SIZE(stac92hd83xxx_pwr_nids);
|
||||||
spec->multiout.dac_nids = spec->dac_nids;
|
spec->multiout.dac_nids = spec->dac_nids;
|
||||||
|
@ -4689,6 +4785,7 @@ static int patch_stac92hd83xxx(struct hda_codec *codec)
|
||||||
spec->num_pins = ARRAY_SIZE(stac92hd83xxx_pin_nids);
|
spec->num_pins = ARRAY_SIZE(stac92hd83xxx_pin_nids);
|
||||||
spec->num_dmuxes = ARRAY_SIZE(stac92hd83xxx_dmux_nids);
|
spec->num_dmuxes = ARRAY_SIZE(stac92hd83xxx_dmux_nids);
|
||||||
spec->num_adcs = ARRAY_SIZE(stac92hd83xxx_adc_nids);
|
spec->num_adcs = ARRAY_SIZE(stac92hd83xxx_adc_nids);
|
||||||
|
spec->num_amps = ARRAY_SIZE(stac92hd83xxx_amp_nids);
|
||||||
spec->num_dmics = STAC92HD83XXX_NUM_DMICS;
|
spec->num_dmics = STAC92HD83XXX_NUM_DMICS;
|
||||||
spec->dinput_mux = &stac92hd83xxx_dmux;
|
spec->dinput_mux = &stac92hd83xxx_dmux;
|
||||||
spec->pin_nids = stac92hd83xxx_pin_nids;
|
spec->pin_nids = stac92hd83xxx_pin_nids;
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
* SPI 0 -> 1st PCM1796 (front)
|
* SPI 0 -> 1st PCM1796 (front)
|
||||||
* SPI 1 -> 2nd PCM1796 (surround)
|
* SPI 1 -> 2nd PCM1796 (surround)
|
||||||
* SPI 2 -> 3rd PCM1796 (center/LFE)
|
* SPI 2 -> 3rd PCM1796 (center/LFE)
|
||||||
* SPI 4 -> 4th PCM1796 (back)
|
* SPI 4 -> 4th PCM1796 (back) and EEPROM self-destruct (do not use!)
|
||||||
*
|
*
|
||||||
* GPIO 2 -> M0 of CS5381
|
* GPIO 2 -> M0 of CS5381
|
||||||
* GPIO 3 -> M1 of CS5381
|
* GPIO 3 -> M1 of CS5381
|
||||||
|
@ -207,6 +207,12 @@ static void xonar_gpio_changed(struct oxygen *chip);
|
||||||
static inline void pcm1796_write_spi(struct oxygen *chip, unsigned int codec,
|
static inline void pcm1796_write_spi(struct oxygen *chip, unsigned int codec,
|
||||||
u8 reg, u8 value)
|
u8 reg, u8 value)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* We don't want to do writes on SPI 4 because the EEPROM, which shares
|
||||||
|
* the same pin, might get confused and broken. We'd better take care
|
||||||
|
* that the driver works with the default register values ...
|
||||||
|
*/
|
||||||
|
#if 0
|
||||||
/* maps ALSA channel pair number to SPI output */
|
/* maps ALSA channel pair number to SPI output */
|
||||||
static const u8 codec_map[4] = {
|
static const u8 codec_map[4] = {
|
||||||
0, 1, 2, 4
|
0, 1, 2, 4
|
||||||
|
@ -217,6 +223,7 @@ static inline void pcm1796_write_spi(struct oxygen *chip, unsigned int codec,
|
||||||
(codec_map[codec] << OXYGEN_SPI_CODEC_SHIFT) |
|
(codec_map[codec] << OXYGEN_SPI_CODEC_SHIFT) |
|
||||||
OXYGEN_SPI_CEN_LATCH_CLOCK_HI,
|
OXYGEN_SPI_CEN_LATCH_CLOCK_HI,
|
||||||
(reg << 8) | value);
|
(reg << 8) | value);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void pcm1796_write_i2c(struct oxygen *chip, unsigned int codec,
|
static inline void pcm1796_write_i2c(struct oxygen *chip, unsigned int codec,
|
||||||
|
@ -750,6 +757,9 @@ static const DECLARE_TLV_DB_SCALE(cs4362a_db_scale, -12700, 100, 0);
|
||||||
|
|
||||||
static int xonar_d2_control_filter(struct snd_kcontrol_new *template)
|
static int xonar_d2_control_filter(struct snd_kcontrol_new *template)
|
||||||
{
|
{
|
||||||
|
if (!strncmp(template->name, "Master Playback ", 16))
|
||||||
|
/* disable volume/mute because they would require SPI writes */
|
||||||
|
return 1;
|
||||||
if (!strncmp(template->name, "CD Capture ", 11))
|
if (!strncmp(template->name, "CD Capture ", 11))
|
||||||
/* CD in is actually connected to the video in pin */
|
/* CD in is actually connected to the video in pin */
|
||||||
template->private_value ^= AC97_CD ^ AC97_VIDEO;
|
template->private_value ^= AC97_CD ^ AC97_VIDEO;
|
||||||
|
@ -840,9 +850,8 @@ static const struct oxygen_model model_xonar_d2 = {
|
||||||
.dac_volume_min = 0x0f,
|
.dac_volume_min = 0x0f,
|
||||||
.dac_volume_max = 0xff,
|
.dac_volume_max = 0xff,
|
||||||
.misc_flags = OXYGEN_MISC_MIDI,
|
.misc_flags = OXYGEN_MISC_MIDI,
|
||||||
.function_flags = OXYGEN_FUNCTION_SPI |
|
.function_flags = OXYGEN_FUNCTION_SPI,
|
||||||
OXYGEN_FUNCTION_ENABLE_SPI_4_5,
|
.dac_i2s_format = OXYGEN_I2S_FORMAT_I2S,
|
||||||
.dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
|
|
||||||
.adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
|
.adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -720,7 +720,8 @@ static int dapm_mux_update_power(struct snd_soc_dapm_widget *widget,
|
||||||
struct snd_soc_dapm_path *path;
|
struct snd_soc_dapm_path *path;
|
||||||
int found = 0;
|
int found = 0;
|
||||||
|
|
||||||
if (widget->id != snd_soc_dapm_mux)
|
if (widget->id != snd_soc_dapm_mux &&
|
||||||
|
widget->id != snd_soc_dapm_value_mux)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
if (!snd_soc_test_bits(widget->codec, e->reg, mask, val))
|
if (!snd_soc_test_bits(widget->codec, e->reg, mask, val))
|
||||||
|
|
|
@ -128,6 +128,14 @@
|
||||||
.bInterfaceClass = USB_CLASS_AUDIO,
|
.bInterfaceClass = USB_CLASS_AUDIO,
|
||||||
.bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL
|
.bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
USB_DEVICE(0x046d, 0x0990),
|
||||||
|
.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
|
||||||
|
.vendor_name = "Logitech, Inc.",
|
||||||
|
.product_name = "QuickCam Pro 9000",
|
||||||
|
.ifnum = QUIRK_NO_INTERFACE
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Yamaha devices
|
* Yamaha devices
|
||||||
|
|
Loading…
Reference in New Issue