diff options
author | Matt Porter <mporter@embeddedalley.com> | 2006-07-31 06:49:34 -0400 |
---|---|---|
committer | Jaroslav Kysela <perex@suse.cz> | 2006-09-23 04:39:41 -0400 |
commit | f3302a59cf6961712658db63b66ea5902c17d5e1 (patch) | |
tree | b32ae62fd508fba16a9096ba8f30e883eb164443 | |
parent | 7012b2dac71988f61b520b33c70c63be372b5994 (diff) |
[ALSA] hda: sigmatel 9205 family support
Adds support for the '9205 family' which includes some other
part numbers but 9205 is the first one. These are 4 channel
codecs, some have digital mic capability. Support for the digital
mic feature will come later.
Signed-off-by: Matt Porter <mporter@embeddedalley.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@suse.cz>
-rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index ac96336f3484..d572f030c3e9 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -136,6 +136,14 @@ static hda_nid_t stac927x_mux_nids[3] = { | |||
136 | 0x15, 0x16, 0x17 | 136 | 0x15, 0x16, 0x17 |
137 | }; | 137 | }; |
138 | 138 | ||
139 | static hda_nid_t stac9205_adc_nids[2] = { | ||
140 | 0x12, 0x13 | ||
141 | }; | ||
142 | |||
143 | static hda_nid_t stac9205_mux_nids[2] = { | ||
144 | 0x19, 0x1a | ||
145 | }; | ||
146 | |||
139 | static hda_nid_t stac9200_pin_nids[8] = { | 147 | static hda_nid_t stac9200_pin_nids[8] = { |
140 | 0x08, 0x09, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, | 148 | 0x08, 0x09, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, |
141 | }; | 149 | }; |
@@ -151,6 +159,13 @@ static hda_nid_t stac927x_pin_nids[14] = { | |||
151 | 0x14, 0x21, 0x22, 0x23, | 159 | 0x14, 0x21, 0x22, 0x23, |
152 | }; | 160 | }; |
153 | 161 | ||
162 | static hda_nid_t stac9205_pin_nids[12] = { | ||
163 | 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, | ||
164 | 0x0f, 0x14, 0x16, 0x17, 0x18, | ||
165 | 0x21, 0x22, | ||
166 | |||
167 | }; | ||
168 | |||
154 | static int stac92xx_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) | 169 | static int stac92xx_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) |
155 | { | 170 | { |
156 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | 171 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); |
@@ -214,6 +229,12 @@ static struct hda_verb stac927x_core_init[] = { | |||
214 | {} | 229 | {} |
215 | }; | 230 | }; |
216 | 231 | ||
232 | static struct hda_verb stac9205_core_init[] = { | ||
233 | /* set master volume and direct control */ | ||
234 | { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, | ||
235 | {} | ||
236 | }; | ||
237 | |||
217 | static struct snd_kcontrol_new stac9200_mixer[] = { | 238 | static struct snd_kcontrol_new stac9200_mixer[] = { |
218 | HDA_CODEC_VOLUME("Master Playback Volume", 0xb, 0, HDA_OUTPUT), | 239 | HDA_CODEC_VOLUME("Master Playback Volume", 0xb, 0, HDA_OUTPUT), |
219 | HDA_CODEC_MUTE("Master Playback Switch", 0xb, 0, HDA_OUTPUT), | 240 | HDA_CODEC_MUTE("Master Playback Switch", 0xb, 0, HDA_OUTPUT), |
@@ -277,6 +298,21 @@ static snd_kcontrol_new_t stac927x_mixer[] = { | |||
277 | { } /* end */ | 298 | { } /* end */ |
278 | }; | 299 | }; |
279 | 300 | ||
301 | static snd_kcontrol_new_t stac9205_mixer[] = { | ||
302 | { | ||
303 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
304 | .name = "Input Source", | ||
305 | .count = 1, | ||
306 | .info = stac92xx_mux_enum_info, | ||
307 | .get = stac92xx_mux_enum_get, | ||
308 | .put = stac92xx_mux_enum_put, | ||
309 | }, | ||
310 | HDA_CODEC_VOLUME("InMux Capture Volume", 0x19, 0x0, HDA_OUTPUT), | ||
311 | HDA_CODEC_VOLUME("InVol Capture Volume", 0x1b, 0x0, HDA_INPUT), | ||
312 | HDA_CODEC_MUTE("ADCMux Capture Switch", 0x1d, 0x0, HDA_OUTPUT), | ||
313 | { } /* end */ | ||
314 | }; | ||
315 | |||
280 | static int stac92xx_build_controls(struct hda_codec *codec) | 316 | static int stac92xx_build_controls(struct hda_codec *codec) |
281 | { | 317 | { |
282 | struct sigmatel_spec *spec = codec->spec; | 318 | struct sigmatel_spec *spec = codec->spec; |
@@ -415,6 +451,24 @@ static struct hda_board_config stac927x_cfg_tbl[] = { | |||
415 | {} /* terminator */ | 451 | {} /* terminator */ |
416 | }; | 452 | }; |
417 | 453 | ||
454 | static unsigned int ref9205_pin_configs[12] = { | ||
455 | 0x40000100, 0x40000100, 0x01016011, 0x01014010, | ||
456 | 0x01813122, 0x01a19021, 0x40000100, 0x40000100, | ||
457 | 0x40000100, 0x40000100, 0x01441030, 0x01c41030 | ||
458 | }; | ||
459 | |||
460 | static unsigned int *stac9205_brd_tbl[] = { | ||
461 | ref9205_pin_configs, | ||
462 | }; | ||
463 | |||
464 | static struct hda_board_config stac9205_cfg_tbl[] = { | ||
465 | { .modelname = "ref", | ||
466 | .pci_subvendor = PCI_VENDOR_ID_INTEL, | ||
467 | .pci_subdevice = 0x2668, /* DFI LanParty */ | ||
468 | .config = STAC_REF }, /* SigmaTel reference board */ | ||
469 | {} /* terminator */ | ||
470 | }; | ||
471 | |||
418 | static void stac92xx_set_config_regs(struct hda_codec *codec) | 472 | static void stac92xx_set_config_regs(struct hda_codec *codec) |
419 | { | 473 | { |
420 | int i; | 474 | int i; |
@@ -1354,6 +1408,46 @@ static int patch_stac927x(struct hda_codec *codec) | |||
1354 | return 0; | 1408 | return 0; |
1355 | } | 1409 | } |
1356 | 1410 | ||
1411 | static int patch_stac9205(struct hda_codec *codec) | ||
1412 | { | ||
1413 | struct sigmatel_spec *spec; | ||
1414 | int err; | ||
1415 | |||
1416 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | ||
1417 | if (spec == NULL) | ||
1418 | return -ENOMEM; | ||
1419 | |||
1420 | codec->spec = spec; | ||
1421 | spec->board_config = snd_hda_check_board_config(codec, stac9205_cfg_tbl); | ||
1422 | if (spec->board_config < 0) | ||
1423 | snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC9205, using BIOS defaults\n"); | ||
1424 | else { | ||
1425 | spec->num_pins = 14; | ||
1426 | spec->pin_nids = stac9205_pin_nids; | ||
1427 | spec->pin_configs = stac9205_brd_tbl[spec->board_config]; | ||
1428 | stac92xx_set_config_regs(codec); | ||
1429 | } | ||
1430 | |||
1431 | spec->adc_nids = stac9205_adc_nids; | ||
1432 | spec->mux_nids = stac9205_mux_nids; | ||
1433 | spec->num_muxes = 3; | ||
1434 | |||
1435 | spec->init = stac9205_core_init; | ||
1436 | spec->mixer = stac9205_mixer; | ||
1437 | |||
1438 | spec->multiout.dac_nids = spec->dac_nids; | ||
1439 | |||
1440 | err = stac92xx_parse_auto_config(codec, 0x1f, 0x20); | ||
1441 | if (err < 0) { | ||
1442 | stac92xx_free(codec); | ||
1443 | return err; | ||
1444 | } | ||
1445 | |||
1446 | codec->patch_ops = stac92xx_patch_ops; | ||
1447 | |||
1448 | return 0; | ||
1449 | } | ||
1450 | |||
1357 | /* | 1451 | /* |
1358 | * STAC 7661(?) hack | 1452 | * STAC 7661(?) hack |
1359 | */ | 1453 | */ |
@@ -1542,5 +1636,13 @@ struct hda_codec_preset snd_hda_preset_sigmatel[] = { | |||
1542 | { .id = 0x83847628, .name = "STAC9274X5NH", .patch = patch_stac927x }, | 1636 | { .id = 0x83847628, .name = "STAC9274X5NH", .patch = patch_stac927x }, |
1543 | { .id = 0x83847629, .name = "STAC9274D5NH", .patch = patch_stac927x }, | 1637 | { .id = 0x83847629, .name = "STAC9274D5NH", .patch = patch_stac927x }, |
1544 | { .id = 0x83847661, .name = "STAC7661", .patch = patch_stac7661 }, | 1638 | { .id = 0x83847661, .name = "STAC7661", .patch = patch_stac7661 }, |
1639 | { .id = 0x838476a0, .name = "STAC9205", .patch = patch_stac9205 }, | ||
1640 | { .id = 0x838476a1, .name = "STAC9205D", .patch = patch_stac9205 }, | ||
1641 | { .id = 0x838476a2, .name = "STAC9204", .patch = patch_stac9205 }, | ||
1642 | { .id = 0x838476a3, .name = "STAC9204D", .patch = patch_stac9205 }, | ||
1643 | { .id = 0x838476a4, .name = "STAC9255", .patch = patch_stac9205 }, | ||
1644 | { .id = 0x838476a5, .name = "STAC9255D", .patch = patch_stac9205 }, | ||
1645 | { .id = 0x838476a6, .name = "STAC9254", .patch = patch_stac9205 }, | ||
1646 | { .id = 0x838476a7, .name = "STAC9254D", .patch = patch_stac9205 }, | ||
1545 | {} /* terminator */ | 1647 | {} /* terminator */ |
1546 | }; | 1648 | }; |