diff options
Diffstat (limited to 'sound/pci/hda')
| -rw-r--r-- | sound/pci/hda/hda_codec.c | 35 | ||||
| -rw-r--r-- | sound/pci/hda/hda_codec.h | 2 | ||||
| -rw-r--r-- | sound/pci/hda/hda_eld.c | 4 | ||||
| -rw-r--r-- | sound/pci/hda/hda_intel.c | 3 | ||||
| -rw-r--r-- | sound/pci/hda/patch_analog.c | 1 | ||||
| -rw-r--r-- | sound/pci/hda/patch_cirrus.c | 50 | ||||
| -rw-r--r-- | sound/pci/hda/patch_conexant.c | 61 | ||||
| -rw-r--r-- | sound/pci/hda/patch_hdmi.c | 21 | ||||
| -rw-r--r-- | sound/pci/hda/patch_intelhdmi.c | 8 | ||||
| -rw-r--r-- | sound/pci/hda/patch_nvhdmi.c | 10 | ||||
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 210 | ||||
| -rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 17 |
12 files changed, 330 insertions, 92 deletions
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index dd8fb86c842b..14829210ef0b 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
| @@ -589,6 +589,7 @@ int /*__devinit*/ snd_hda_bus_new(struct snd_card *card, | |||
| 589 | bus->ops = temp->ops; | 589 | bus->ops = temp->ops; |
| 590 | 590 | ||
| 591 | mutex_init(&bus->cmd_mutex); | 591 | mutex_init(&bus->cmd_mutex); |
| 592 | mutex_init(&bus->prepare_mutex); | ||
| 592 | INIT_LIST_HEAD(&bus->codec_list); | 593 | INIT_LIST_HEAD(&bus->codec_list); |
| 593 | 594 | ||
| 594 | snprintf(bus->workq_name, sizeof(bus->workq_name), | 595 | snprintf(bus->workq_name, sizeof(bus->workq_name), |
| @@ -1068,7 +1069,6 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, | |||
| 1068 | codec->addr = codec_addr; | 1069 | codec->addr = codec_addr; |
| 1069 | mutex_init(&codec->spdif_mutex); | 1070 | mutex_init(&codec->spdif_mutex); |
| 1070 | mutex_init(&codec->control_mutex); | 1071 | mutex_init(&codec->control_mutex); |
| 1071 | mutex_init(&codec->prepare_mutex); | ||
| 1072 | init_hda_cache(&codec->amp_cache, sizeof(struct hda_amp_info)); | 1072 | init_hda_cache(&codec->amp_cache, sizeof(struct hda_amp_info)); |
| 1073 | init_hda_cache(&codec->cmd_cache, sizeof(struct hda_cache_head)); | 1073 | init_hda_cache(&codec->cmd_cache, sizeof(struct hda_cache_head)); |
| 1074 | snd_array_init(&codec->mixers, sizeof(struct hda_nid_item), 32); | 1074 | snd_array_init(&codec->mixers, sizeof(struct hda_nid_item), 32); |
| @@ -1213,6 +1213,7 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, | |||
| 1213 | u32 stream_tag, | 1213 | u32 stream_tag, |
| 1214 | int channel_id, int format) | 1214 | int channel_id, int format) |
| 1215 | { | 1215 | { |
| 1216 | struct hda_codec *c; | ||
| 1216 | struct hda_cvt_setup *p; | 1217 | struct hda_cvt_setup *p; |
| 1217 | unsigned int oldval, newval; | 1218 | unsigned int oldval, newval; |
| 1218 | int i; | 1219 | int i; |
| @@ -1253,10 +1254,12 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, | |||
| 1253 | p->dirty = 0; | 1254 | p->dirty = 0; |
| 1254 | 1255 | ||
| 1255 | /* make other inactive cvts with the same stream-tag dirty */ | 1256 | /* make other inactive cvts with the same stream-tag dirty */ |
| 1256 | for (i = 0; i < codec->cvt_setups.used; i++) { | 1257 | list_for_each_entry(c, &codec->bus->codec_list, list) { |
| 1257 | p = snd_array_elem(&codec->cvt_setups, i); | 1258 | for (i = 0; i < c->cvt_setups.used; i++) { |
| 1258 | if (!p->active && p->stream_tag == stream_tag) | 1259 | p = snd_array_elem(&c->cvt_setups, i); |
| 1259 | p->dirty = 1; | 1260 | if (!p->active && p->stream_tag == stream_tag) |
| 1261 | p->dirty = 1; | ||
| 1262 | } | ||
| 1260 | } | 1263 | } |
| 1261 | } | 1264 | } |
| 1262 | EXPORT_SYMBOL_HDA(snd_hda_codec_setup_stream); | 1265 | EXPORT_SYMBOL_HDA(snd_hda_codec_setup_stream); |
| @@ -1306,12 +1309,16 @@ static void really_cleanup_stream(struct hda_codec *codec, | |||
| 1306 | /* clean up the all conflicting obsolete streams */ | 1309 | /* clean up the all conflicting obsolete streams */ |
| 1307 | static void purify_inactive_streams(struct hda_codec *codec) | 1310 | static void purify_inactive_streams(struct hda_codec *codec) |
| 1308 | { | 1311 | { |
| 1312 | struct hda_codec *c; | ||
| 1309 | int i; | 1313 | int i; |
| 1310 | 1314 | ||
| 1311 | for (i = 0; i < codec->cvt_setups.used; i++) { | 1315 | list_for_each_entry(c, &codec->bus->codec_list, list) { |
| 1312 | struct hda_cvt_setup *p = snd_array_elem(&codec->cvt_setups, i); | 1316 | for (i = 0; i < c->cvt_setups.used; i++) { |
| 1313 | if (p->dirty) | 1317 | struct hda_cvt_setup *p; |
| 1314 | really_cleanup_stream(codec, p); | 1318 | p = snd_array_elem(&c->cvt_setups, i); |
| 1319 | if (p->dirty) | ||
| 1320 | really_cleanup_stream(c, p); | ||
| 1321 | } | ||
| 1315 | } | 1322 | } |
| 1316 | } | 1323 | } |
| 1317 | 1324 | ||
| @@ -3502,11 +3509,11 @@ int snd_hda_codec_prepare(struct hda_codec *codec, | |||
| 3502 | struct snd_pcm_substream *substream) | 3509 | struct snd_pcm_substream *substream) |
| 3503 | { | 3510 | { |
| 3504 | int ret; | 3511 | int ret; |
| 3505 | mutex_lock(&codec->prepare_mutex); | 3512 | mutex_lock(&codec->bus->prepare_mutex); |
| 3506 | ret = hinfo->ops.prepare(hinfo, codec, stream, format, substream); | 3513 | ret = hinfo->ops.prepare(hinfo, codec, stream, format, substream); |
| 3507 | if (ret >= 0) | 3514 | if (ret >= 0) |
| 3508 | purify_inactive_streams(codec); | 3515 | purify_inactive_streams(codec); |
| 3509 | mutex_unlock(&codec->prepare_mutex); | 3516 | mutex_unlock(&codec->bus->prepare_mutex); |
| 3510 | return ret; | 3517 | return ret; |
| 3511 | } | 3518 | } |
| 3512 | EXPORT_SYMBOL_HDA(snd_hda_codec_prepare); | 3519 | EXPORT_SYMBOL_HDA(snd_hda_codec_prepare); |
| @@ -3515,9 +3522,9 @@ void snd_hda_codec_cleanup(struct hda_codec *codec, | |||
| 3515 | struct hda_pcm_stream *hinfo, | 3522 | struct hda_pcm_stream *hinfo, |
| 3516 | struct snd_pcm_substream *substream) | 3523 | struct snd_pcm_substream *substream) |
| 3517 | { | 3524 | { |
| 3518 | mutex_lock(&codec->prepare_mutex); | 3525 | mutex_lock(&codec->bus->prepare_mutex); |
| 3519 | hinfo->ops.cleanup(hinfo, codec, substream); | 3526 | hinfo->ops.cleanup(hinfo, codec, substream); |
| 3520 | mutex_unlock(&codec->prepare_mutex); | 3527 | mutex_unlock(&codec->bus->prepare_mutex); |
| 3521 | } | 3528 | } |
| 3522 | EXPORT_SYMBOL_HDA(snd_hda_codec_cleanup); | 3529 | EXPORT_SYMBOL_HDA(snd_hda_codec_cleanup); |
| 3523 | 3530 | ||
| @@ -4529,7 +4536,7 @@ int snd_hda_parse_pin_def_config(struct hda_codec *codec, | |||
| 4529 | cfg->hp_outs--; | 4536 | cfg->hp_outs--; |
| 4530 | memmove(cfg->hp_pins + i, cfg->hp_pins + i + 1, | 4537 | memmove(cfg->hp_pins + i, cfg->hp_pins + i + 1, |
| 4531 | sizeof(cfg->hp_pins[0]) * (cfg->hp_outs - i)); | 4538 | sizeof(cfg->hp_pins[0]) * (cfg->hp_outs - i)); |
| 4532 | memmove(sequences_hp + i - 1, sequences_hp + i, | 4539 | memmove(sequences_hp + i, sequences_hp + i + 1, |
| 4533 | sizeof(sequences_hp[0]) * (cfg->hp_outs - i)); | 4540 | sizeof(sequences_hp[0]) * (cfg->hp_outs - i)); |
| 4534 | } | 4541 | } |
| 4535 | } | 4542 | } |
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 4303353feda9..62c702240108 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h | |||
| @@ -648,6 +648,7 @@ struct hda_bus { | |||
| 648 | struct hda_codec *caddr_tbl[HDA_MAX_CODEC_ADDRESS + 1]; | 648 | struct hda_codec *caddr_tbl[HDA_MAX_CODEC_ADDRESS + 1]; |
| 649 | 649 | ||
| 650 | struct mutex cmd_mutex; | 650 | struct mutex cmd_mutex; |
| 651 | struct mutex prepare_mutex; | ||
| 651 | 652 | ||
| 652 | /* unsolicited event queue */ | 653 | /* unsolicited event queue */ |
| 653 | struct hda_bus_unsolicited *unsol; | 654 | struct hda_bus_unsolicited *unsol; |
| @@ -826,7 +827,6 @@ struct hda_codec { | |||
| 826 | 827 | ||
| 827 | struct mutex spdif_mutex; | 828 | struct mutex spdif_mutex; |
| 828 | struct mutex control_mutex; | 829 | struct mutex control_mutex; |
| 829 | struct mutex prepare_mutex; | ||
| 830 | unsigned int spdif_status; /* IEC958 status bits */ | 830 | unsigned int spdif_status; /* IEC958 status bits */ |
| 831 | unsigned short spdif_ctls; /* SPDIF control bits */ | 831 | unsigned short spdif_ctls; /* SPDIF control bits */ |
| 832 | unsigned int spdif_in_enable; /* SPDIF input enable? */ | 832 | unsigned int spdif_in_enable; /* SPDIF input enable? */ |
diff --git a/sound/pci/hda/hda_eld.c b/sound/pci/hda/hda_eld.c index 803b298f7411..26c3ade73583 100644 --- a/sound/pci/hda/hda_eld.c +++ b/sound/pci/hda/hda_eld.c | |||
| @@ -596,6 +596,8 @@ void snd_hda_eld_proc_free(struct hda_codec *codec, struct hdmi_eld *eld) | |||
| 596 | } | 596 | } |
| 597 | EXPORT_SYMBOL_HDA(snd_hda_eld_proc_free); | 597 | EXPORT_SYMBOL_HDA(snd_hda_eld_proc_free); |
| 598 | 598 | ||
| 599 | #endif /* CONFIG_PROC_FS */ | ||
| 600 | |||
| 599 | /* update PCM info based on ELD */ | 601 | /* update PCM info based on ELD */ |
| 600 | void hdmi_eld_update_pcm_info(struct hdmi_eld *eld, struct hda_pcm_stream *pcm, | 602 | void hdmi_eld_update_pcm_info(struct hdmi_eld *eld, struct hda_pcm_stream *pcm, |
| 601 | struct hda_pcm_stream *codec_pars) | 603 | struct hda_pcm_stream *codec_pars) |
| @@ -644,5 +646,3 @@ void hdmi_eld_update_pcm_info(struct hdmi_eld *eld, struct hda_pcm_stream *pcm, | |||
| 644 | pcm->maxbps = min(pcm->maxbps, codec_pars->maxbps); | 646 | pcm->maxbps = min(pcm->maxbps, codec_pars->maxbps); |
| 645 | } | 647 | } |
| 646 | EXPORT_SYMBOL_HDA(hdmi_eld_update_pcm_info); | 648 | EXPORT_SYMBOL_HDA(hdmi_eld_update_pcm_info); |
| 647 | |||
| 648 | #endif /* CONFIG_PROC_FS */ | ||
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 1053fff4bd0a..34940a079051 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
| @@ -126,6 +126,7 @@ MODULE_SUPPORTED_DEVICE("{{Intel, ICH6}," | |||
| 126 | "{Intel, ICH10}," | 126 | "{Intel, ICH10}," |
| 127 | "{Intel, PCH}," | 127 | "{Intel, PCH}," |
| 128 | "{Intel, CPT}," | 128 | "{Intel, CPT}," |
| 129 | "{Intel, PBG}," | ||
| 129 | "{Intel, SCH}," | 130 | "{Intel, SCH}," |
| 130 | "{ATI, SB450}," | 131 | "{ATI, SB450}," |
| 131 | "{ATI, SB600}," | 132 | "{ATI, SB600}," |
| @@ -2749,6 +2750,8 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { | |||
| 2749 | { PCI_DEVICE(0x8086, 0x3b57), .driver_data = AZX_DRIVER_ICH }, | 2750 | { PCI_DEVICE(0x8086, 0x3b57), .driver_data = AZX_DRIVER_ICH }, |
| 2750 | /* CPT */ | 2751 | /* CPT */ |
| 2751 | { PCI_DEVICE(0x8086, 0x1c20), .driver_data = AZX_DRIVER_PCH }, | 2752 | { PCI_DEVICE(0x8086, 0x1c20), .driver_data = AZX_DRIVER_PCH }, |
| 2753 | /* PBG */ | ||
| 2754 | { PCI_DEVICE(0x8086, 0x1d20), .driver_data = AZX_DRIVER_PCH }, | ||
| 2752 | /* SCH */ | 2755 | /* SCH */ |
| 2753 | { PCI_DEVICE(0x8086, 0x811b), .driver_data = AZX_DRIVER_SCH }, | 2756 | { PCI_DEVICE(0x8086, 0x811b), .driver_data = AZX_DRIVER_SCH }, |
| 2754 | /* ATI SB 450/600 */ | 2757 | /* ATI SB 450/600 */ |
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index b697fd2a6f8b..10bbbaf6ebc3 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c | |||
| @@ -3641,6 +3641,7 @@ static struct snd_pci_quirk ad1984_cfg_tbl[] = { | |||
| 3641 | /* Lenovo Thinkpad T61/X61 */ | 3641 | /* Lenovo Thinkpad T61/X61 */ |
| 3642 | SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo Thinkpad", AD1984_THINKPAD), | 3642 | SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo Thinkpad", AD1984_THINKPAD), |
| 3643 | SND_PCI_QUIRK(0x1028, 0x0214, "Dell T3400", AD1984_DELL_DESKTOP), | 3643 | SND_PCI_QUIRK(0x1028, 0x0214, "Dell T3400", AD1984_DELL_DESKTOP), |
| 3644 | SND_PCI_QUIRK(0x1028, 0x0233, "Dell Latitude E6400", AD1984_DELL_DESKTOP), | ||
| 3644 | {} | 3645 | {} |
| 3645 | }; | 3646 | }; |
| 3646 | 3647 | ||
diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c index 4ef5efaaaef1..488fd9ade1ba 100644 --- a/sound/pci/hda/patch_cirrus.c +++ b/sound/pci/hda/patch_cirrus.c | |||
| @@ -972,6 +972,53 @@ static struct hda_verb cs_coef_init_verbs[] = { | |||
| 972 | {} /* terminator */ | 972 | {} /* terminator */ |
| 973 | }; | 973 | }; |
| 974 | 974 | ||
| 975 | /* Errata: CS4207 rev C0/C1/C2 Silicon | ||
| 976 | * | ||
| 977 | * http://www.cirrus.com/en/pubs/errata/ER880C3.pdf | ||
| 978 | * | ||
| 979 | * 6. At high temperature (TA > +85°C), the digital supply current (IVD) | ||
| 980 | * may be excessive (up to an additional 200 μA), which is most easily | ||
| 981 | * observed while the part is being held in reset (RESET# active low). | ||
| 982 | * | ||
| 983 | * Root Cause: At initial powerup of the device, the logic that drives | ||
| 984 | * the clock and write enable to the S/PDIF SRC RAMs is not properly | ||
| 985 | * initialized. | ||
| 986 | * Certain random patterns will cause a steady leakage current in those | ||
| 987 | * RAM cells. The issue will resolve once the SRCs are used (turned on). | ||
| 988 | * | ||
| 989 | * Workaround: The following verb sequence briefly turns on the S/PDIF SRC | ||
| 990 | * blocks, which will alleviate the issue. | ||
| 991 | */ | ||
| 992 | |||
| 993 | static struct hda_verb cs_errata_init_verbs[] = { | ||
| 994 | {0x01, AC_VERB_SET_POWER_STATE, 0x00}, /* AFG: D0 */ | ||
| 995 | {0x11, AC_VERB_SET_PROC_STATE, 0x01}, /* VPW: processing on */ | ||
| 996 | |||
| 997 | {0x11, AC_VERB_SET_COEF_INDEX, 0x0008}, | ||
| 998 | {0x11, AC_VERB_SET_PROC_COEF, 0x9999}, | ||
| 999 | {0x11, AC_VERB_SET_COEF_INDEX, 0x0017}, | ||
| 1000 | {0x11, AC_VERB_SET_PROC_COEF, 0xa412}, | ||
| 1001 | {0x11, AC_VERB_SET_COEF_INDEX, 0x0001}, | ||
| 1002 | {0x11, AC_VERB_SET_PROC_COEF, 0x0009}, | ||
| 1003 | |||
| 1004 | {0x07, AC_VERB_SET_POWER_STATE, 0x00}, /* S/PDIF Rx: D0 */ | ||
| 1005 | {0x08, AC_VERB_SET_POWER_STATE, 0x00}, /* S/PDIF Tx: D0 */ | ||
| 1006 | |||
| 1007 | {0x11, AC_VERB_SET_COEF_INDEX, 0x0017}, | ||
| 1008 | {0x11, AC_VERB_SET_PROC_COEF, 0x2412}, | ||
| 1009 | {0x11, AC_VERB_SET_COEF_INDEX, 0x0008}, | ||
| 1010 | {0x11, AC_VERB_SET_PROC_COEF, 0x0000}, | ||
| 1011 | {0x11, AC_VERB_SET_COEF_INDEX, 0x0001}, | ||
| 1012 | {0x11, AC_VERB_SET_PROC_COEF, 0x0008}, | ||
| 1013 | {0x11, AC_VERB_SET_PROC_STATE, 0x00}, | ||
| 1014 | |||
| 1015 | {0x07, AC_VERB_SET_POWER_STATE, 0x03}, /* S/PDIF Rx: D3 */ | ||
| 1016 | {0x08, AC_VERB_SET_POWER_STATE, 0x03}, /* S/PDIF Tx: D3 */ | ||
| 1017 | /*{0x01, AC_VERB_SET_POWER_STATE, 0x03},*/ /* AFG: D3 This is already handled */ | ||
| 1018 | |||
| 1019 | {} /* terminator */ | ||
| 1020 | }; | ||
| 1021 | |||
| 975 | /* SPDIF setup */ | 1022 | /* SPDIF setup */ |
| 976 | static void init_digital(struct hda_codec *codec) | 1023 | static void init_digital(struct hda_codec *codec) |
| 977 | { | 1024 | { |
| @@ -991,6 +1038,9 @@ static int cs_init(struct hda_codec *codec) | |||
| 991 | { | 1038 | { |
| 992 | struct cs_spec *spec = codec->spec; | 1039 | struct cs_spec *spec = codec->spec; |
| 993 | 1040 | ||
| 1041 | /* init_verb sequence for C0/C1/C2 errata*/ | ||
| 1042 | snd_hda_sequence_write(codec, cs_errata_init_verbs); | ||
| 1043 | |||
| 994 | snd_hda_sequence_write(codec, cs_coef_init_verbs); | 1044 | snd_hda_sequence_write(codec, cs_coef_init_verbs); |
| 995 | 1045 | ||
| 996 | if (spec->gpio_mask) { | 1046 | if (spec->gpio_mask) { |
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 31b5d9eeba68..972e7c453b3d 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
| @@ -116,6 +116,7 @@ struct conexant_spec { | |||
| 116 | unsigned int dell_vostro:1; | 116 | unsigned int dell_vostro:1; |
| 117 | unsigned int ideapad:1; | 117 | unsigned int ideapad:1; |
| 118 | unsigned int thinkpad:1; | 118 | unsigned int thinkpad:1; |
| 119 | unsigned int hp_laptop:1; | ||
| 119 | 120 | ||
| 120 | unsigned int ext_mic_present; | 121 | unsigned int ext_mic_present; |
| 121 | unsigned int recording; | 122 | unsigned int recording; |
| @@ -2299,6 +2300,18 @@ static void cxt5066_ideapad_automic(struct hda_codec *codec) | |||
| 2299 | } | 2300 | } |
| 2300 | } | 2301 | } |
| 2301 | 2302 | ||
| 2303 | /* toggle input of built-in digital mic and mic jack appropriately */ | ||
| 2304 | static void cxt5066_hp_laptop_automic(struct hda_codec *codec) | ||
| 2305 | { | ||
| 2306 | unsigned int present; | ||
| 2307 | |||
| 2308 | present = snd_hda_jack_detect(codec, 0x1b); | ||
| 2309 | snd_printdd("CXT5066: external microphone present=%d\n", present); | ||
| 2310 | snd_hda_codec_write(codec, 0x17, 0, AC_VERB_SET_CONNECT_SEL, | ||
| 2311 | present ? 1 : 3); | ||
| 2312 | } | ||
| 2313 | |||
| 2314 | |||
| 2302 | /* toggle input of built-in digital mic and mic jack appropriately | 2315 | /* toggle input of built-in digital mic and mic jack appropriately |
| 2303 | order is: external mic -> dock mic -> interal mic */ | 2316 | order is: external mic -> dock mic -> interal mic */ |
| 2304 | static void cxt5066_thinkpad_automic(struct hda_codec *codec) | 2317 | static void cxt5066_thinkpad_automic(struct hda_codec *codec) |
| @@ -2408,6 +2421,20 @@ static void cxt5066_ideapad_event(struct hda_codec *codec, unsigned int res) | |||
| 2408 | } | 2421 | } |
| 2409 | 2422 | ||
| 2410 | /* unsolicited event for jack sensing */ | 2423 | /* unsolicited event for jack sensing */ |
| 2424 | static void cxt5066_hp_laptop_event(struct hda_codec *codec, unsigned int res) | ||
| 2425 | { | ||
| 2426 | snd_printdd("CXT5066_hp_laptop: unsol event %x (%x)\n", res, res >> 26); | ||
| 2427 | switch (res >> 26) { | ||
| 2428 | case CONEXANT_HP_EVENT: | ||
| 2429 | cxt5066_hp_automute(codec); | ||
| 2430 | break; | ||
| 2431 | case CONEXANT_MIC_EVENT: | ||
| 2432 | cxt5066_hp_laptop_automic(codec); | ||
| 2433 | break; | ||
| 2434 | } | ||
| 2435 | } | ||
| 2436 | |||
| 2437 | /* unsolicited event for jack sensing */ | ||
| 2411 | static void cxt5066_thinkpad_event(struct hda_codec *codec, unsigned int res) | 2438 | static void cxt5066_thinkpad_event(struct hda_codec *codec, unsigned int res) |
| 2412 | { | 2439 | { |
| 2413 | snd_printdd("CXT5066_thinkpad: unsol event %x (%x)\n", res, res >> 26); | 2440 | snd_printdd("CXT5066_thinkpad: unsol event %x (%x)\n", res, res >> 26); |
| @@ -2989,6 +3016,14 @@ static struct hda_verb cxt5066_init_verbs_portd_lo[] = { | |||
| 2989 | { } /* end */ | 3016 | { } /* end */ |
| 2990 | }; | 3017 | }; |
| 2991 | 3018 | ||
| 3019 | |||
| 3020 | static struct hda_verb cxt5066_init_verbs_hp_laptop[] = { | ||
| 3021 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x0}, | ||
| 3022 | {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_HP_EVENT}, | ||
| 3023 | {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_MIC_EVENT}, | ||
| 3024 | { } /* end */ | ||
| 3025 | }; | ||
| 3026 | |||
| 2992 | /* initialize jack-sensing, too */ | 3027 | /* initialize jack-sensing, too */ |
| 2993 | static int cxt5066_init(struct hda_codec *codec) | 3028 | static int cxt5066_init(struct hda_codec *codec) |
| 2994 | { | 3029 | { |
| @@ -3004,6 +3039,8 @@ static int cxt5066_init(struct hda_codec *codec) | |||
| 3004 | cxt5066_ideapad_automic(codec); | 3039 | cxt5066_ideapad_automic(codec); |
| 3005 | else if (spec->thinkpad) | 3040 | else if (spec->thinkpad) |
| 3006 | cxt5066_thinkpad_automic(codec); | 3041 | cxt5066_thinkpad_automic(codec); |
| 3042 | else if (spec->hp_laptop) | ||
| 3043 | cxt5066_hp_laptop_automic(codec); | ||
| 3007 | } | 3044 | } |
| 3008 | cxt5066_set_mic_boost(codec); | 3045 | cxt5066_set_mic_boost(codec); |
| 3009 | return 0; | 3046 | return 0; |
| @@ -3031,6 +3068,7 @@ enum { | |||
| 3031 | CXT5066_DELL_VOSTO, /* Dell Vostro 1015i */ | 3068 | CXT5066_DELL_VOSTO, /* Dell Vostro 1015i */ |
| 3032 | CXT5066_IDEAPAD, /* Lenovo IdeaPad U150 */ | 3069 | CXT5066_IDEAPAD, /* Lenovo IdeaPad U150 */ |
| 3033 | CXT5066_THINKPAD, /* Lenovo ThinkPad T410s, others? */ | 3070 | CXT5066_THINKPAD, /* Lenovo ThinkPad T410s, others? */ |
| 3071 | CXT5066_HP_LAPTOP, /* HP Laptop */ | ||
| 3034 | CXT5066_MODELS | 3072 | CXT5066_MODELS |
| 3035 | }; | 3073 | }; |
| 3036 | 3074 | ||
| @@ -3041,6 +3079,7 @@ static const char *cxt5066_models[CXT5066_MODELS] = { | |||
| 3041 | [CXT5066_DELL_VOSTO] = "dell-vostro", | 3079 | [CXT5066_DELL_VOSTO] = "dell-vostro", |
| 3042 | [CXT5066_IDEAPAD] = "ideapad", | 3080 | [CXT5066_IDEAPAD] = "ideapad", |
| 3043 | [CXT5066_THINKPAD] = "thinkpad", | 3081 | [CXT5066_THINKPAD] = "thinkpad", |
| 3082 | [CXT5066_HP_LAPTOP] = "hp-laptop", | ||
| 3044 | }; | 3083 | }; |
| 3045 | 3084 | ||
| 3046 | static struct snd_pci_quirk cxt5066_cfg_tbl[] = { | 3085 | static struct snd_pci_quirk cxt5066_cfg_tbl[] = { |
| @@ -3049,15 +3088,20 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = { | |||
| 3049 | SND_PCI_QUIRK(0x1028, 0x02f5, "Dell", | 3088 | SND_PCI_QUIRK(0x1028, 0x02f5, "Dell", |
| 3050 | CXT5066_DELL_LAPTOP), | 3089 | CXT5066_DELL_LAPTOP), |
| 3051 | SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5), | 3090 | SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5), |
| 3091 | SND_PCI_QUIRK(0x1028, 0x02d8, "Dell Vostro", CXT5066_DELL_VOSTO), | ||
| 3052 | SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTO), | 3092 | SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTO), |
| 3053 | SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD), | 3093 | SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD), |
| 3094 | SND_PCI_QUIRK(0x103c, 0x360b, "HP G60", CXT5066_HP_LAPTOP), | ||
| 3095 | SND_PCI_QUIRK(0x1179, 0xff1e, "Toshiba Satellite C650D", CXT5066_IDEAPAD), | ||
| 3054 | SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5), | 3096 | SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5), |
| 3055 | SND_PCI_QUIRK(0x1179, 0xffe0, "Toshiba Satellite Pro T130-15F", CXT5066_OLPC_XO_1_5), | 3097 | SND_PCI_QUIRK(0x1179, 0xffe0, "Toshiba Satellite Pro T130-15F", CXT5066_OLPC_XO_1_5), |
| 3098 | SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo T400s", CXT5066_THINKPAD), | ||
| 3056 | SND_PCI_QUIRK(0x17aa, 0x21b2, "Thinkpad X100e", CXT5066_IDEAPAD), | 3099 | SND_PCI_QUIRK(0x17aa, 0x21b2, "Thinkpad X100e", CXT5066_IDEAPAD), |
| 3057 | SND_PCI_QUIRK(0x17aa, 0x21b3, "Thinkpad Edge 13 (197)", CXT5066_IDEAPAD), | 3100 | SND_PCI_QUIRK(0x17aa, 0x21b3, "Thinkpad Edge 13 (197)", CXT5066_IDEAPAD), |
| 3058 | SND_PCI_QUIRK(0x17aa, 0x21b4, "Thinkpad Edge", CXT5066_IDEAPAD), | 3101 | SND_PCI_QUIRK(0x17aa, 0x21b4, "Thinkpad Edge", CXT5066_IDEAPAD), |
| 3059 | SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo Thinkpad", CXT5066_THINKPAD), | 3102 | SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo Thinkpad", CXT5066_THINKPAD), |
| 3060 | SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo G series", CXT5066_IDEAPAD), | 3103 | SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo G series", CXT5066_IDEAPAD), |
| 3104 | SND_PCI_QUIRK(0x17aa, 0x390a, "Lenovo S10-3t", CXT5066_IDEAPAD), | ||
| 3061 | SND_PCI_QUIRK(0x17aa, 0x3938, "Lenovo G series (AMD)", CXT5066_IDEAPAD), | 3105 | SND_PCI_QUIRK(0x17aa, 0x3938, "Lenovo G series (AMD)", CXT5066_IDEAPAD), |
| 3062 | SND_PCI_QUIRK(0x17aa, 0x3a0d, "ideapad", CXT5066_IDEAPAD), | 3106 | SND_PCI_QUIRK(0x17aa, 0x3a0d, "ideapad", CXT5066_IDEAPAD), |
| 3063 | {} | 3107 | {} |
| @@ -3114,6 +3158,23 @@ static int patch_cxt5066(struct hda_codec *codec) | |||
| 3114 | spec->num_init_verbs++; | 3158 | spec->num_init_verbs++; |
| 3115 | spec->dell_automute = 1; | 3159 | spec->dell_automute = 1; |
| 3116 | break; | 3160 | break; |
| 3161 | case CXT5066_HP_LAPTOP: | ||
| 3162 | codec->patch_ops.init = cxt5066_init; | ||
| 3163 | codec->patch_ops.unsol_event = cxt5066_hp_laptop_event; | ||
| 3164 | spec->init_verbs[spec->num_init_verbs] = | ||
| 3165 | cxt5066_init_verbs_hp_laptop; | ||
| 3166 | spec->num_init_verbs++; | ||
| 3167 | spec->hp_laptop = 1; | ||
| 3168 | spec->mixers[spec->num_mixers++] = cxt5066_mixer_master; | ||
| 3169 | spec->mixers[spec->num_mixers++] = cxt5066_mixers; | ||
| 3170 | /* no S/PDIF out */ | ||
| 3171 | spec->multiout.dig_out_nid = 0; | ||
| 3172 | /* input source automatically selected */ | ||
| 3173 | spec->input_mux = NULL; | ||
| 3174 | spec->port_d_mode = 0; | ||
| 3175 | spec->mic_boost = 3; /* default 30dB gain */ | ||
| 3176 | break; | ||
| 3177 | |||
| 3117 | case CXT5066_OLPC_XO_1_5: | 3178 | case CXT5066_OLPC_XO_1_5: |
| 3118 | codec->patch_ops.init = cxt5066_olpc_init; | 3179 | codec->patch_ops.init = cxt5066_olpc_init; |
| 3119 | codec->patch_ops.unsol_event = cxt5066_olpc_unsol_event; | 3180 | codec->patch_ops.unsol_event = cxt5066_olpc_unsol_event; |
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index 2bc0f07cf33f..afd6022a96a7 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c | |||
| @@ -707,8 +707,6 @@ static int hdmi_setup_stream(struct hda_codec *codec, hda_nid_t nid, | |||
| 707 | u32 stream_tag, int format) | 707 | u32 stream_tag, int format) |
| 708 | { | 708 | { |
| 709 | struct hdmi_spec *spec = codec->spec; | 709 | struct hdmi_spec *spec = codec->spec; |
| 710 | int tag; | ||
| 711 | int fmt; | ||
| 712 | int pinctl; | 710 | int pinctl; |
| 713 | int new_pinctl = 0; | 711 | int new_pinctl = 0; |
| 714 | int i; | 712 | int i; |
| @@ -745,24 +743,7 @@ static int hdmi_setup_stream(struct hda_codec *codec, hda_nid_t nid, | |||
| 745 | return -EINVAL; | 743 | return -EINVAL; |
| 746 | } | 744 | } |
| 747 | 745 | ||
| 748 | tag = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONV, 0) >> 4; | 746 | snd_hda_codec_setup_stream(codec, nid, stream_tag, 0, format); |
| 749 | fmt = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_STREAM_FORMAT, 0); | ||
| 750 | |||
| 751 | snd_printdd("hdmi_setup_stream: " | ||
| 752 | "NID=0x%x, %sstream=0x%x, %sformat=0x%x\n", | ||
| 753 | nid, | ||
| 754 | tag == stream_tag ? "" : "new-", | ||
| 755 | stream_tag, | ||
| 756 | fmt == format ? "" : "new-", | ||
| 757 | format); | ||
| 758 | |||
| 759 | if (tag != stream_tag) | ||
| 760 | snd_hda_codec_write(codec, nid, 0, | ||
| 761 | AC_VERB_SET_CHANNEL_STREAMID, | ||
| 762 | stream_tag << 4); | ||
| 763 | if (fmt != format) | ||
| 764 | snd_hda_codec_write(codec, nid, 0, | ||
| 765 | AC_VERB_SET_STREAM_FORMAT, format); | ||
| 766 | return 0; | 747 | return 0; |
| 767 | } | 748 | } |
| 768 | 749 | ||
diff --git a/sound/pci/hda/patch_intelhdmi.c b/sound/pci/hda/patch_intelhdmi.c index d382d3c81c0f..36a9b83a6174 100644 --- a/sound/pci/hda/patch_intelhdmi.c +++ b/sound/pci/hda/patch_intelhdmi.c | |||
| @@ -69,20 +69,12 @@ static int intel_hdmi_playback_pcm_prepare(struct hda_pcm_stream *hinfo, | |||
| 69 | return hdmi_setup_stream(codec, hinfo->nid, stream_tag, format); | 69 | return hdmi_setup_stream(codec, hinfo->nid, stream_tag, format); |
| 70 | } | 70 | } |
| 71 | 71 | ||
| 72 | static int intel_hdmi_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, | ||
| 73 | struct hda_codec *codec, | ||
| 74 | struct snd_pcm_substream *substream) | ||
| 75 | { | ||
| 76 | return 0; | ||
| 77 | } | ||
| 78 | |||
| 79 | static struct hda_pcm_stream intel_hdmi_pcm_playback = { | 72 | static struct hda_pcm_stream intel_hdmi_pcm_playback = { |
| 80 | .substreams = 1, | 73 | .substreams = 1, |
| 81 | .channels_min = 2, | 74 | .channels_min = 2, |
| 82 | .ops = { | 75 | .ops = { |
| 83 | .open = hdmi_pcm_open, | 76 | .open = hdmi_pcm_open, |
| 84 | .prepare = intel_hdmi_playback_pcm_prepare, | 77 | .prepare = intel_hdmi_playback_pcm_prepare, |
| 85 | .cleanup = intel_hdmi_playback_pcm_cleanup, | ||
| 86 | }, | 78 | }, |
| 87 | }; | 79 | }; |
| 88 | 80 | ||
diff --git a/sound/pci/hda/patch_nvhdmi.c b/sound/pci/hda/patch_nvhdmi.c index f636870dc718..baa108b9d6aa 100644 --- a/sound/pci/hda/patch_nvhdmi.c +++ b/sound/pci/hda/patch_nvhdmi.c | |||
| @@ -84,7 +84,7 @@ static struct hda_verb nvhdmi_basic_init_7x[] = { | |||
| 84 | #else | 84 | #else |
| 85 | /* support all rates and formats */ | 85 | /* support all rates and formats */ |
| 86 | #define SUPPORTED_RATES \ | 86 | #define SUPPORTED_RATES \ |
| 87 | (SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |\ | 87 | (SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |\ |
| 88 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 |\ | 88 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 |\ |
| 89 | SNDRV_PCM_RATE_192000) | 89 | SNDRV_PCM_RATE_192000) |
| 90 | #define SUPPORTED_MAXBPS 24 | 90 | #define SUPPORTED_MAXBPS 24 |
| @@ -326,13 +326,6 @@ static int nvhdmi_dig_playback_pcm_prepare_8ch(struct hda_pcm_stream *hinfo, | |||
| 326 | return 0; | 326 | return 0; |
| 327 | } | 327 | } |
| 328 | 328 | ||
| 329 | static int nvhdmi_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, | ||
| 330 | struct hda_codec *codec, | ||
| 331 | struct snd_pcm_substream *substream) | ||
| 332 | { | ||
| 333 | return 0; | ||
| 334 | } | ||
| 335 | |||
| 336 | static int nvhdmi_dig_playback_pcm_prepare_2ch(struct hda_pcm_stream *hinfo, | 329 | static int nvhdmi_dig_playback_pcm_prepare_2ch(struct hda_pcm_stream *hinfo, |
| 337 | struct hda_codec *codec, | 330 | struct hda_codec *codec, |
| 338 | unsigned int stream_tag, | 331 | unsigned int stream_tag, |
| @@ -350,7 +343,6 @@ static struct hda_pcm_stream nvhdmi_pcm_digital_playback_8ch_89 = { | |||
| 350 | .ops = { | 343 | .ops = { |
| 351 | .open = hdmi_pcm_open, | 344 | .open = hdmi_pcm_open, |
| 352 | .prepare = nvhdmi_dig_playback_pcm_prepare_8ch_89, | 345 | .prepare = nvhdmi_dig_playback_pcm_prepare_8ch_89, |
| 353 | .cleanup = nvhdmi_playback_pcm_cleanup, | ||
| 354 | }, | 346 | }, |
| 355 | }; | 347 | }; |
| 356 | 348 | ||
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 2cd1ae809e46..a432e6efd19b 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -1594,12 +1594,22 @@ static void alc_auto_parse_digital(struct hda_codec *codec) | |||
| 1594 | } | 1594 | } |
| 1595 | 1595 | ||
| 1596 | if (spec->autocfg.dig_in_pin) { | 1596 | if (spec->autocfg.dig_in_pin) { |
| 1597 | hda_nid_t dig_nid; | 1597 | dig_nid = codec->start_nid; |
| 1598 | err = snd_hda_get_connections(codec, | 1598 | for (i = 0; i < codec->num_nodes; i++, dig_nid++) { |
| 1599 | spec->autocfg.dig_in_pin, | 1599 | unsigned int wcaps = get_wcaps(codec, dig_nid); |
| 1600 | &dig_nid, 1); | 1600 | if (get_wcaps_type(wcaps) != AC_WID_AUD_IN) |
| 1601 | if (err > 0) | 1601 | continue; |
| 1602 | spec->dig_in_nid = dig_nid; | 1602 | if (!(wcaps & AC_WCAP_DIGITAL)) |
| 1603 | continue; | ||
| 1604 | if (!(wcaps & AC_WCAP_CONN_LIST)) | ||
| 1605 | continue; | ||
| 1606 | err = get_connection_index(codec, dig_nid, | ||
| 1607 | spec->autocfg.dig_in_pin); | ||
| 1608 | if (err >= 0) { | ||
| 1609 | spec->dig_in_nid = dig_nid; | ||
| 1610 | break; | ||
| 1611 | } | ||
| 1612 | } | ||
| 1603 | } | 1613 | } |
| 1604 | } | 1614 | } |
| 1605 | 1615 | ||
| @@ -5334,6 +5344,7 @@ static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids, | |||
| 5334 | 5344 | ||
| 5335 | static struct snd_pci_quirk beep_white_list[] = { | 5345 | static struct snd_pci_quirk beep_white_list[] = { |
| 5336 | SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1), | 5346 | SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1), |
| 5347 | SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1), | ||
| 5337 | SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1), | 5348 | SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1), |
| 5338 | {} | 5349 | {} |
| 5339 | }; | 5350 | }; |
| @@ -14452,6 +14463,7 @@ static void alc269_auto_init(struct hda_codec *codec) | |||
| 14452 | 14463 | ||
| 14453 | enum { | 14464 | enum { |
| 14454 | ALC269_FIXUP_SONY_VAIO, | 14465 | ALC269_FIXUP_SONY_VAIO, |
| 14466 | ALC269_FIXUP_DELL_M101Z, | ||
| 14455 | }; | 14467 | }; |
| 14456 | 14468 | ||
| 14457 | static const struct hda_verb alc269_sony_vaio_fixup_verbs[] = { | 14469 | static const struct hda_verb alc269_sony_vaio_fixup_verbs[] = { |
| @@ -14463,10 +14475,20 @@ static const struct alc_fixup alc269_fixups[] = { | |||
| 14463 | [ALC269_FIXUP_SONY_VAIO] = { | 14475 | [ALC269_FIXUP_SONY_VAIO] = { |
| 14464 | .verbs = alc269_sony_vaio_fixup_verbs | 14476 | .verbs = alc269_sony_vaio_fixup_verbs |
| 14465 | }, | 14477 | }, |
| 14478 | [ALC269_FIXUP_DELL_M101Z] = { | ||
| 14479 | .verbs = (const struct hda_verb[]) { | ||
| 14480 | /* Enables internal speaker */ | ||
| 14481 | {0x20, AC_VERB_SET_COEF_INDEX, 13}, | ||
| 14482 | {0x20, AC_VERB_SET_PROC_COEF, 0x4040}, | ||
| 14483 | {} | ||
| 14484 | } | ||
| 14485 | }, | ||
| 14466 | }; | 14486 | }; |
| 14467 | 14487 | ||
| 14468 | static struct snd_pci_quirk alc269_fixup_tbl[] = { | 14488 | static struct snd_pci_quirk alc269_fixup_tbl[] = { |
| 14469 | SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_FIXUP_SONY_VAIO), | 14489 | SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_FIXUP_SONY_VAIO), |
| 14490 | SND_PCI_QUIRK(0x104d, 0x9077, "Sony VAIO", ALC269_FIXUP_SONY_VAIO), | ||
| 14491 | SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z), | ||
| 14470 | {} | 14492 | {} |
| 14471 | }; | 14493 | }; |
| 14472 | 14494 | ||
| @@ -19030,6 +19052,7 @@ static int patch_alc888(struct hda_codec *codec) | |||
| 19030 | /* | 19052 | /* |
| 19031 | * ALC680 support | 19053 | * ALC680 support |
| 19032 | */ | 19054 | */ |
| 19055 | #define ALC680_DIGIN_NID ALC880_DIGIN_NID | ||
| 19033 | #define ALC680_DIGOUT_NID ALC880_DIGOUT_NID | 19056 | #define ALC680_DIGOUT_NID ALC880_DIGOUT_NID |
| 19034 | #define alc680_modes alc260_modes | 19057 | #define alc680_modes alc260_modes |
| 19035 | 19058 | ||
| @@ -19044,23 +19067,93 @@ static hda_nid_t alc680_adc_nids[3] = { | |||
| 19044 | 0x07, 0x08, 0x09 | 19067 | 0x07, 0x08, 0x09 |
| 19045 | }; | 19068 | }; |
| 19046 | 19069 | ||
| 19070 | /* | ||
| 19071 | * Analog capture ADC cgange | ||
| 19072 | */ | ||
| 19073 | static int alc680_capture_pcm_prepare(struct hda_pcm_stream *hinfo, | ||
| 19074 | struct hda_codec *codec, | ||
| 19075 | unsigned int stream_tag, | ||
| 19076 | unsigned int format, | ||
| 19077 | struct snd_pcm_substream *substream) | ||
| 19078 | { | ||
| 19079 | struct alc_spec *spec = codec->spec; | ||
| 19080 | struct auto_pin_cfg *cfg = &spec->autocfg; | ||
| 19081 | unsigned int pre_mic, pre_line; | ||
| 19082 | |||
| 19083 | pre_mic = snd_hda_jack_detect(codec, cfg->input_pins[AUTO_PIN_MIC]); | ||
| 19084 | pre_line = snd_hda_jack_detect(codec, cfg->input_pins[AUTO_PIN_LINE]); | ||
| 19085 | |||
| 19086 | spec->cur_adc_stream_tag = stream_tag; | ||
| 19087 | spec->cur_adc_format = format; | ||
| 19088 | |||
| 19089 | if (pre_mic || pre_line) { | ||
| 19090 | if (pre_mic) | ||
| 19091 | snd_hda_codec_setup_stream(codec, 0x08, stream_tag, 0, | ||
| 19092 | format); | ||
| 19093 | else | ||
| 19094 | snd_hda_codec_setup_stream(codec, 0x09, stream_tag, 0, | ||
| 19095 | format); | ||
| 19096 | } else | ||
| 19097 | snd_hda_codec_setup_stream(codec, 0x07, stream_tag, 0, format); | ||
| 19098 | return 0; | ||
| 19099 | } | ||
| 19100 | |||
| 19101 | static int alc680_capture_pcm_cleanup(struct hda_pcm_stream *hinfo, | ||
| 19102 | struct hda_codec *codec, | ||
| 19103 | struct snd_pcm_substream *substream) | ||
| 19104 | { | ||
| 19105 | snd_hda_codec_cleanup_stream(codec, 0x07); | ||
| 19106 | snd_hda_codec_cleanup_stream(codec, 0x08); | ||
| 19107 | snd_hda_codec_cleanup_stream(codec, 0x09); | ||
| 19108 | return 0; | ||
| 19109 | } | ||
| 19110 | |||
| 19111 | static struct hda_pcm_stream alc680_pcm_analog_auto_capture = { | ||
| 19112 | .substreams = 1, /* can be overridden */ | ||
| 19113 | .channels_min = 2, | ||
| 19114 | .channels_max = 2, | ||
| 19115 | /* NID is set in alc_build_pcms */ | ||
| 19116 | .ops = { | ||
| 19117 | .prepare = alc680_capture_pcm_prepare, | ||
| 19118 | .cleanup = alc680_capture_pcm_cleanup | ||
| 19119 | }, | ||
| 19120 | }; | ||
| 19121 | |||
| 19047 | static struct snd_kcontrol_new alc680_base_mixer[] = { | 19122 | static struct snd_kcontrol_new alc680_base_mixer[] = { |
| 19048 | /* output mixer control */ | 19123 | /* output mixer control */ |
| 19049 | HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT), | 19124 | HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT), |
| 19050 | HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), | 19125 | HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), |
| 19051 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x4, 0x0, HDA_OUTPUT), | 19126 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x4, 0x0, HDA_OUTPUT), |
| 19052 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x16, 0x0, HDA_OUTPUT), | 19127 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x16, 0x0, HDA_OUTPUT), |
| 19128 | HDA_CODEC_VOLUME("Int Mic Boost", 0x12, 0, HDA_INPUT), | ||
| 19053 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), | 19129 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), |
| 19130 | HDA_CODEC_VOLUME("Line In Boost", 0x19, 0, HDA_INPUT), | ||
| 19054 | { } | 19131 | { } |
| 19055 | }; | 19132 | }; |
| 19056 | 19133 | ||
| 19057 | static struct snd_kcontrol_new alc680_capture_mixer[] = { | 19134 | static struct hda_bind_ctls alc680_bind_cap_vol = { |
| 19058 | HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT), | 19135 | .ops = &snd_hda_bind_vol, |
| 19059 | HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT), | 19136 | .values = { |
| 19060 | HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x08, 0x0, HDA_INPUT), | 19137 | HDA_COMPOSE_AMP_VAL(0x07, 3, 0, HDA_INPUT), |
| 19061 | HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x08, 0x0, HDA_INPUT), | 19138 | HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT), |
| 19062 | HDA_CODEC_VOLUME_IDX("Capture Volume", 2, 0x09, 0x0, HDA_INPUT), | 19139 | HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT), |
| 19063 | HDA_CODEC_MUTE_IDX("Capture Switch", 2, 0x09, 0x0, HDA_INPUT), | 19140 | 0 |
| 19141 | }, | ||
| 19142 | }; | ||
| 19143 | |||
| 19144 | static struct hda_bind_ctls alc680_bind_cap_switch = { | ||
| 19145 | .ops = &snd_hda_bind_sw, | ||
| 19146 | .values = { | ||
| 19147 | HDA_COMPOSE_AMP_VAL(0x07, 3, 0, HDA_INPUT), | ||
| 19148 | HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT), | ||
| 19149 | HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT), | ||
| 19150 | 0 | ||
| 19151 | }, | ||
| 19152 | }; | ||
| 19153 | |||
| 19154 | static struct snd_kcontrol_new alc680_master_capture_mixer[] = { | ||
| 19155 | HDA_BIND_VOL("Capture Volume", &alc680_bind_cap_vol), | ||
| 19156 | HDA_BIND_SW("Capture Switch", &alc680_bind_cap_switch), | ||
| 19064 | { } /* end */ | 19157 | { } /* end */ |
| 19065 | }; | 19158 | }; |
| 19066 | 19159 | ||
| @@ -19068,25 +19161,73 @@ static struct snd_kcontrol_new alc680_capture_mixer[] = { | |||
| 19068 | * generic initialization of ADC, input mixers and output mixers | 19161 | * generic initialization of ADC, input mixers and output mixers |
| 19069 | */ | 19162 | */ |
| 19070 | static struct hda_verb alc680_init_verbs[] = { | 19163 | static struct hda_verb alc680_init_verbs[] = { |
| 19071 | /* Unmute DAC0-1 and set vol = 0 */ | 19164 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
| 19072 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | 19165 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
| 19073 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | 19166 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
| 19074 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
| 19075 | 19167 | ||
| 19076 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, | 19168 | {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, |
| 19077 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, | 19169 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, |
| 19078 | {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, | 19170 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, |
| 19079 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, | 19171 | {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, |
| 19080 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, | 19172 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, |
| 19173 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
| 19081 | 19174 | ||
| 19082 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 19175 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
| 19083 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 19176 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
| 19084 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 19177 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
| 19085 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 19178 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
| 19086 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 19179 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
| 19180 | |||
| 19181 | {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, | ||
| 19182 | {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, | ||
| 19183 | |||
| 19087 | { } | 19184 | { } |
| 19088 | }; | 19185 | }; |
| 19089 | 19186 | ||
| 19187 | /* toggle speaker-output according to the hp-jack state */ | ||
| 19188 | static void alc680_base_setup(struct hda_codec *codec) | ||
| 19189 | { | ||
| 19190 | struct alc_spec *spec = codec->spec; | ||
| 19191 | |||
| 19192 | spec->autocfg.hp_pins[0] = 0x16; | ||
| 19193 | spec->autocfg.speaker_pins[0] = 0x14; | ||
| 19194 | spec->autocfg.speaker_pins[1] = 0x15; | ||
| 19195 | spec->autocfg.input_pins[AUTO_PIN_MIC] = 0x18; | ||
| 19196 | spec->autocfg.input_pins[AUTO_PIN_LINE] = 0x19; | ||
| 19197 | } | ||
| 19198 | |||
| 19199 | static void alc680_rec_autoswitch(struct hda_codec *codec) | ||
| 19200 | { | ||
| 19201 | struct alc_spec *spec = codec->spec; | ||
| 19202 | struct auto_pin_cfg *cfg = &spec->autocfg; | ||
| 19203 | unsigned int present; | ||
| 19204 | hda_nid_t new_adc; | ||
| 19205 | |||
| 19206 | present = snd_hda_jack_detect(codec, cfg->input_pins[AUTO_PIN_MIC]); | ||
| 19207 | |||
| 19208 | new_adc = present ? 0x8 : 0x7; | ||
| 19209 | __snd_hda_codec_cleanup_stream(codec, !present ? 0x8 : 0x7, 1); | ||
| 19210 | snd_hda_codec_setup_stream(codec, new_adc, | ||
| 19211 | spec->cur_adc_stream_tag, 0, | ||
| 19212 | spec->cur_adc_format); | ||
| 19213 | |||
| 19214 | } | ||
| 19215 | |||
| 19216 | static void alc680_unsol_event(struct hda_codec *codec, | ||
| 19217 | unsigned int res) | ||
| 19218 | { | ||
| 19219 | if ((res >> 26) == ALC880_HP_EVENT) | ||
| 19220 | alc_automute_amp(codec); | ||
| 19221 | if ((res >> 26) == ALC880_MIC_EVENT) | ||
| 19222 | alc680_rec_autoswitch(codec); | ||
| 19223 | } | ||
| 19224 | |||
| 19225 | static void alc680_inithook(struct hda_codec *codec) | ||
| 19226 | { | ||
| 19227 | alc_automute_amp(codec); | ||
| 19228 | alc680_rec_autoswitch(codec); | ||
| 19229 | } | ||
| 19230 | |||
| 19090 | /* create input playback/capture controls for the given pin */ | 19231 | /* create input playback/capture controls for the given pin */ |
| 19091 | static int alc680_new_analog_output(struct alc_spec *spec, hda_nid_t nid, | 19232 | static int alc680_new_analog_output(struct alc_spec *spec, hda_nid_t nid, |
| 19092 | const char *ctlname, int idx) | 19233 | const char *ctlname, int idx) |
| @@ -19197,13 +19338,7 @@ static void alc680_auto_init_hp_out(struct hda_codec *codec) | |||
| 19197 | #define alc680_pcm_analog_capture alc880_pcm_analog_capture | 19338 | #define alc680_pcm_analog_capture alc880_pcm_analog_capture |
| 19198 | #define alc680_pcm_analog_alt_capture alc880_pcm_analog_alt_capture | 19339 | #define alc680_pcm_analog_alt_capture alc880_pcm_analog_alt_capture |
| 19199 | #define alc680_pcm_digital_playback alc880_pcm_digital_playback | 19340 | #define alc680_pcm_digital_playback alc880_pcm_digital_playback |
| 19200 | 19341 | #define alc680_pcm_digital_capture alc880_pcm_digital_capture | |
| 19201 | static struct hda_input_mux alc680_capture_source = { | ||
| 19202 | .num_items = 1, | ||
| 19203 | .items = { | ||
| 19204 | { "Mic", 0x0 }, | ||
| 19205 | }, | ||
| 19206 | }; | ||
| 19207 | 19342 | ||
| 19208 | /* | 19343 | /* |
| 19209 | * BIOS auto configuration | 19344 | * BIOS auto configuration |
| @@ -19218,6 +19353,7 @@ static int alc680_parse_auto_config(struct hda_codec *codec) | |||
| 19218 | alc680_ignore); | 19353 | alc680_ignore); |
| 19219 | if (err < 0) | 19354 | if (err < 0) |
| 19220 | return err; | 19355 | return err; |
| 19356 | |||
| 19221 | if (!spec->autocfg.line_outs) { | 19357 | if (!spec->autocfg.line_outs) { |
| 19222 | if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) { | 19358 | if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) { |
| 19223 | spec->multiout.max_channels = 2; | 19359 | spec->multiout.max_channels = 2; |
| @@ -19239,8 +19375,6 @@ static int alc680_parse_auto_config(struct hda_codec *codec) | |||
| 19239 | add_mixer(spec, spec->kctls.list); | 19375 | add_mixer(spec, spec->kctls.list); |
| 19240 | 19376 | ||
| 19241 | add_verb(spec, alc680_init_verbs); | 19377 | add_verb(spec, alc680_init_verbs); |
| 19242 | spec->num_mux_defs = 1; | ||
| 19243 | spec->input_mux = &alc680_capture_source; | ||
| 19244 | 19378 | ||
| 19245 | err = alc_auto_add_mic_boost(codec); | 19379 | err = alc_auto_add_mic_boost(codec); |
| 19246 | if (err < 0) | 19380 | if (err < 0) |
| @@ -19279,17 +19413,17 @@ static struct snd_pci_quirk alc680_cfg_tbl[] = { | |||
| 19279 | static struct alc_config_preset alc680_presets[] = { | 19413 | static struct alc_config_preset alc680_presets[] = { |
| 19280 | [ALC680_BASE] = { | 19414 | [ALC680_BASE] = { |
| 19281 | .mixers = { alc680_base_mixer }, | 19415 | .mixers = { alc680_base_mixer }, |
| 19282 | .cap_mixer = alc680_capture_mixer, | 19416 | .cap_mixer = alc680_master_capture_mixer, |
| 19283 | .init_verbs = { alc680_init_verbs }, | 19417 | .init_verbs = { alc680_init_verbs }, |
| 19284 | .num_dacs = ARRAY_SIZE(alc680_dac_nids), | 19418 | .num_dacs = ARRAY_SIZE(alc680_dac_nids), |
| 19285 | .dac_nids = alc680_dac_nids, | 19419 | .dac_nids = alc680_dac_nids, |
| 19286 | .num_adc_nids = ARRAY_SIZE(alc680_adc_nids), | ||
| 19287 | .adc_nids = alc680_adc_nids, | ||
| 19288 | .hp_nid = 0x04, | ||
| 19289 | .dig_out_nid = ALC680_DIGOUT_NID, | 19420 | .dig_out_nid = ALC680_DIGOUT_NID, |
| 19290 | .num_channel_mode = ARRAY_SIZE(alc680_modes), | 19421 | .num_channel_mode = ARRAY_SIZE(alc680_modes), |
| 19291 | .channel_mode = alc680_modes, | 19422 | .channel_mode = alc680_modes, |
| 19292 | .input_mux = &alc680_capture_source, | 19423 | .unsol_event = alc680_unsol_event, |
| 19424 | .setup = alc680_base_setup, | ||
| 19425 | .init_hook = alc680_inithook, | ||
| 19426 | |||
| 19293 | }, | 19427 | }, |
| 19294 | }; | 19428 | }; |
| 19295 | 19429 | ||
| @@ -19333,9 +19467,9 @@ static int patch_alc680(struct hda_codec *codec) | |||
| 19333 | setup_preset(codec, &alc680_presets[board_config]); | 19467 | setup_preset(codec, &alc680_presets[board_config]); |
| 19334 | 19468 | ||
| 19335 | spec->stream_analog_playback = &alc680_pcm_analog_playback; | 19469 | spec->stream_analog_playback = &alc680_pcm_analog_playback; |
| 19336 | spec->stream_analog_capture = &alc680_pcm_analog_capture; | 19470 | spec->stream_analog_capture = &alc680_pcm_analog_auto_capture; |
| 19337 | spec->stream_analog_alt_capture = &alc680_pcm_analog_alt_capture; | ||
| 19338 | spec->stream_digital_playback = &alc680_pcm_digital_playback; | 19471 | spec->stream_digital_playback = &alc680_pcm_digital_playback; |
| 19472 | spec->stream_digital_capture = &alc680_pcm_digital_capture; | ||
| 19339 | 19473 | ||
| 19340 | if (!spec->adc_nids) { | 19474 | if (!spec->adc_nids) { |
| 19341 | spec->adc_nids = alc680_adc_nids; | 19475 | spec->adc_nids = alc680_adc_nids; |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index f3f861bd1bf8..c16c5ba0fda0 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -1747,6 +1747,8 @@ static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = { | |||
| 1747 | "HP dv6", STAC_HP_DV5), | 1747 | "HP dv6", STAC_HP_DV5), |
| 1748 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3061, | 1748 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3061, |
| 1749 | "HP dv6", STAC_HP_DV5), /* HP dv6-1110ax */ | 1749 | "HP dv6", STAC_HP_DV5), /* HP dv6-1110ax */ |
| 1750 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x363e, | ||
| 1751 | "HP DV6", STAC_HP_DV5), | ||
| 1750 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x7010, | 1752 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x7010, |
| 1751 | "HP", STAC_HP_DV5), | 1753 | "HP", STAC_HP_DV5), |
| 1752 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233, | 1754 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233, |
| @@ -6303,6 +6305,21 @@ static struct hda_codec_preset snd_hda_preset_sigmatel[] = { | |||
| 6303 | { .id = 0x111d76b5, .name = "92HD71B6X", .patch = patch_stac92hd71bxx }, | 6305 | { .id = 0x111d76b5, .name = "92HD71B6X", .patch = patch_stac92hd71bxx }, |
| 6304 | { .id = 0x111d76b6, .name = "92HD71B5X", .patch = patch_stac92hd71bxx }, | 6306 | { .id = 0x111d76b6, .name = "92HD71B5X", .patch = patch_stac92hd71bxx }, |
| 6305 | { .id = 0x111d76b7, .name = "92HD71B5X", .patch = patch_stac92hd71bxx }, | 6307 | { .id = 0x111d76b7, .name = "92HD71B5X", .patch = patch_stac92hd71bxx }, |
| 6308 | { .id = 0x111d76c0, .name = "92HD89C3", .patch = patch_stac92hd73xx }, | ||
| 6309 | { .id = 0x111d76c1, .name = "92HD89C2", .patch = patch_stac92hd73xx }, | ||
| 6310 | { .id = 0x111d76c2, .name = "92HD89C1", .patch = patch_stac92hd73xx }, | ||
| 6311 | { .id = 0x111d76c3, .name = "92HD89B3", .patch = patch_stac92hd73xx }, | ||
| 6312 | { .id = 0x111d76c4, .name = "92HD89B2", .patch = patch_stac92hd73xx }, | ||
| 6313 | { .id = 0x111d76c5, .name = "92HD89B1", .patch = patch_stac92hd73xx }, | ||
| 6314 | { .id = 0x111d76c6, .name = "92HD89E3", .patch = patch_stac92hd73xx }, | ||
| 6315 | { .id = 0x111d76c7, .name = "92HD89E2", .patch = patch_stac92hd73xx }, | ||
| 6316 | { .id = 0x111d76c8, .name = "92HD89E1", .patch = patch_stac92hd73xx }, | ||
| 6317 | { .id = 0x111d76c9, .name = "92HD89D3", .patch = patch_stac92hd73xx }, | ||
| 6318 | { .id = 0x111d76ca, .name = "92HD89D2", .patch = patch_stac92hd73xx }, | ||
| 6319 | { .id = 0x111d76cb, .name = "92HD89D1", .patch = patch_stac92hd73xx }, | ||
| 6320 | { .id = 0x111d76cc, .name = "92HD89F3", .patch = patch_stac92hd73xx }, | ||
| 6321 | { .id = 0x111d76cd, .name = "92HD89F2", .patch = patch_stac92hd73xx }, | ||
| 6322 | { .id = 0x111d76ce, .name = "92HD89F1", .patch = patch_stac92hd73xx }, | ||
| 6306 | {} /* terminator */ | 6323 | {} /* terminator */ |
| 6307 | }; | 6324 | }; |
| 6308 | 6325 | ||
