diff options
| author | Takashi Iwai <tiwai@suse.de> | 2010-08-23 02:47:06 -0400 |
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2010-08-23 02:47:06 -0400 |
| commit | d2f927d42a87b712946dee72a0b96b6b6c6aff1d (patch) | |
| tree | 879a34767b24e65569d24cb19490a4bdcb1beace | |
| parent | 9c77b846ec8b4e0c7107dd7f820172462dc84a61 (diff) | |
| parent | 6f0ef6ea1d11ef242de584e345355b0de756fcb2 (diff) | |
Merge branch 'fix/hda' into for-linus
| -rw-r--r-- | sound/pci/hda/hda_codec.c | 33 | ||||
| -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/patch_conexant.c | 1 | ||||
| -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 | 8 | ||||
| -rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 15 |
8 files changed, 40 insertions, 52 deletions
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index dd8fb86c842b..3827092cc1d2 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 | ||
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/patch_conexant.c b/sound/pci/hda/patch_conexant.c index c424952a734e..5cdb80edbd7f 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
| @@ -3059,6 +3059,7 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = { | |||
| 3059 | SND_PCI_QUIRK(0x17aa, 0x21b4, "Thinkpad Edge", CXT5066_IDEAPAD), | 3059 | SND_PCI_QUIRK(0x17aa, 0x21b4, "Thinkpad Edge", CXT5066_IDEAPAD), |
| 3060 | SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo Thinkpad", CXT5066_THINKPAD), | 3060 | SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo Thinkpad", CXT5066_THINKPAD), |
| 3061 | SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo G series", CXT5066_IDEAPAD), | 3061 | SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo G series", CXT5066_IDEAPAD), |
| 3062 | SND_PCI_QUIRK(0x17aa, 0x390a, "Lenovo S10-3t", CXT5066_IDEAPAD), | ||
| 3062 | SND_PCI_QUIRK(0x17aa, 0x3938, "Lenovo G series (AMD)", CXT5066_IDEAPAD), | 3063 | SND_PCI_QUIRK(0x17aa, 0x3938, "Lenovo G series (AMD)", CXT5066_IDEAPAD), |
| 3063 | SND_PCI_QUIRK(0x17aa, 0x3a0d, "ideapad", CXT5066_IDEAPAD), | 3064 | SND_PCI_QUIRK(0x17aa, 0x3a0d, "ideapad", CXT5066_IDEAPAD), |
| 3064 | {} | 3065 | {} |
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..69b950d527c3 100644 --- a/sound/pci/hda/patch_nvhdmi.c +++ b/sound/pci/hda/patch_nvhdmi.c | |||
| @@ -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_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index f3f861bd1bf8..95148e58026c 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -6303,6 +6303,21 @@ static struct hda_codec_preset snd_hda_preset_sigmatel[] = { | |||
| 6303 | { .id = 0x111d76b5, .name = "92HD71B6X", .patch = patch_stac92hd71bxx }, | 6303 | { .id = 0x111d76b5, .name = "92HD71B6X", .patch = patch_stac92hd71bxx }, |
| 6304 | { .id = 0x111d76b6, .name = "92HD71B5X", .patch = patch_stac92hd71bxx }, | 6304 | { .id = 0x111d76b6, .name = "92HD71B5X", .patch = patch_stac92hd71bxx }, |
| 6305 | { .id = 0x111d76b7, .name = "92HD71B5X", .patch = patch_stac92hd71bxx }, | 6305 | { .id = 0x111d76b7, .name = "92HD71B5X", .patch = patch_stac92hd71bxx }, |
| 6306 | { .id = 0x111d76c0, .name = "92HD89C3", .patch = patch_stac92hd73xx }, | ||
| 6307 | { .id = 0x111d76c1, .name = "92HD89C2", .patch = patch_stac92hd73xx }, | ||
| 6308 | { .id = 0x111d76c2, .name = "92HD89C1", .patch = patch_stac92hd73xx }, | ||
| 6309 | { .id = 0x111d76c3, .name = "92HD89B3", .patch = patch_stac92hd73xx }, | ||
| 6310 | { .id = 0x111d76c4, .name = "92HD89B2", .patch = patch_stac92hd73xx }, | ||
| 6311 | { .id = 0x111d76c5, .name = "92HD89B1", .patch = patch_stac92hd73xx }, | ||
| 6312 | { .id = 0x111d76c6, .name = "92HD89E3", .patch = patch_stac92hd73xx }, | ||
| 6313 | { .id = 0x111d76c7, .name = "92HD89E2", .patch = patch_stac92hd73xx }, | ||
| 6314 | { .id = 0x111d76c8, .name = "92HD89E1", .patch = patch_stac92hd73xx }, | ||
| 6315 | { .id = 0x111d76c9, .name = "92HD89D3", .patch = patch_stac92hd73xx }, | ||
| 6316 | { .id = 0x111d76ca, .name = "92HD89D2", .patch = patch_stac92hd73xx }, | ||
| 6317 | { .id = 0x111d76cb, .name = "92HD89D1", .patch = patch_stac92hd73xx }, | ||
| 6318 | { .id = 0x111d76cc, .name = "92HD89F3", .patch = patch_stac92hd73xx }, | ||
| 6319 | { .id = 0x111d76cd, .name = "92HD89F2", .patch = patch_stac92hd73xx }, | ||
| 6320 | { .id = 0x111d76ce, .name = "92HD89F1", .patch = patch_stac92hd73xx }, | ||
| 6306 | {} /* terminator */ | 6321 | {} /* terminator */ |
| 6307 | }; | 6322 | }; |
| 6308 | 6323 | ||
