diff options
Diffstat (limited to 'sound/pci')
-rw-r--r-- | sound/pci/hda/hda_codec.c | 43 | ||||
-rw-r--r-- | sound/pci/hda/hda_codec.h | 3 |
2 files changed, 23 insertions, 23 deletions
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index e80f83568291..04b57383e8cb 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
@@ -2332,11 +2332,12 @@ struct snd_kcontrol *snd_hda_find_mixer_ctl(struct hda_codec *codec, | |||
2332 | EXPORT_SYMBOL_HDA(snd_hda_find_mixer_ctl); | 2332 | EXPORT_SYMBOL_HDA(snd_hda_find_mixer_ctl); |
2333 | 2333 | ||
2334 | static int find_empty_mixer_ctl_idx(struct hda_codec *codec, const char *name, | 2334 | static int find_empty_mixer_ctl_idx(struct hda_codec *codec, const char *name, |
2335 | int dev) | 2335 | int start_idx) |
2336 | { | 2336 | { |
2337 | int idx; | 2337 | int i, idx; |
2338 | for (idx = 0; idx < 16; idx++) { /* 16 ctlrs should be large enough */ | 2338 | /* 16 ctlrs should be large enough */ |
2339 | if (!find_mixer_ctl(codec, name, dev, idx)) | 2339 | for (i = 0, idx = start_idx; i < 16; i++, idx++) { |
2340 | if (!find_mixer_ctl(codec, name, 0, idx)) | ||
2340 | return idx; | 2341 | return idx; |
2341 | } | 2342 | } |
2342 | return -EBUSY; | 2343 | return -EBUSY; |
@@ -3305,30 +3306,29 @@ int snd_hda_create_dig_out_ctls(struct hda_codec *codec, | |||
3305 | int err; | 3306 | int err; |
3306 | struct snd_kcontrol *kctl; | 3307 | struct snd_kcontrol *kctl; |
3307 | struct snd_kcontrol_new *dig_mix; | 3308 | struct snd_kcontrol_new *dig_mix; |
3308 | int idx, dev = 0; | 3309 | int idx = 0; |
3309 | const int spdif_pcm_dev = 1; | 3310 | const int spdif_index = 16; |
3310 | struct hda_spdif_out *spdif; | 3311 | struct hda_spdif_out *spdif; |
3312 | struct hda_bus *bus = codec->bus; | ||
3311 | 3313 | ||
3312 | if (codec->primary_dig_out_type == HDA_PCM_TYPE_HDMI && | 3314 | if (bus->primary_dig_out_type == HDA_PCM_TYPE_HDMI && |
3313 | type == HDA_PCM_TYPE_SPDIF) { | 3315 | type == HDA_PCM_TYPE_SPDIF) { |
3314 | dev = spdif_pcm_dev; | 3316 | idx = spdif_index; |
3315 | } else if (codec->primary_dig_out_type == HDA_PCM_TYPE_SPDIF && | 3317 | } else if (bus->primary_dig_out_type == HDA_PCM_TYPE_SPDIF && |
3316 | type == HDA_PCM_TYPE_HDMI) { | 3318 | type == HDA_PCM_TYPE_HDMI) { |
3317 | for (idx = 0; idx < codec->spdif_out.used; idx++) { | 3319 | /* suppose a single SPDIF device */ |
3318 | spdif = snd_array_elem(&codec->spdif_out, idx); | 3320 | for (dig_mix = dig_mixes; dig_mix->name; dig_mix++) { |
3319 | for (dig_mix = dig_mixes; dig_mix->name; dig_mix++) { | 3321 | kctl = find_mixer_ctl(codec, dig_mix->name, 0, 0); |
3320 | kctl = find_mixer_ctl(codec, dig_mix->name, 0, idx); | 3322 | if (!kctl) |
3321 | if (!kctl) | 3323 | break; |
3322 | break; | 3324 | kctl->id.index = spdif_index; |
3323 | kctl->id.device = spdif_pcm_dev; | ||
3324 | } | ||
3325 | } | 3325 | } |
3326 | codec->primary_dig_out_type = HDA_PCM_TYPE_HDMI; | 3326 | bus->primary_dig_out_type = HDA_PCM_TYPE_HDMI; |
3327 | } | 3327 | } |
3328 | if (!codec->primary_dig_out_type) | 3328 | if (!bus->primary_dig_out_type) |
3329 | codec->primary_dig_out_type = type; | 3329 | bus->primary_dig_out_type = type; |
3330 | 3330 | ||
3331 | idx = find_empty_mixer_ctl_idx(codec, "IEC958 Playback Switch", dev); | 3331 | idx = find_empty_mixer_ctl_idx(codec, "IEC958 Playback Switch", idx); |
3332 | if (idx < 0) { | 3332 | if (idx < 0) { |
3333 | printk(KERN_ERR "hda_codec: too many IEC958 outputs\n"); | 3333 | printk(KERN_ERR "hda_codec: too many IEC958 outputs\n"); |
3334 | return -EBUSY; | 3334 | return -EBUSY; |
@@ -3338,7 +3338,6 @@ int snd_hda_create_dig_out_ctls(struct hda_codec *codec, | |||
3338 | kctl = snd_ctl_new1(dig_mix, codec); | 3338 | kctl = snd_ctl_new1(dig_mix, codec); |
3339 | if (!kctl) | 3339 | if (!kctl) |
3340 | return -ENOMEM; | 3340 | return -ENOMEM; |
3341 | kctl->id.device = dev; | ||
3342 | kctl->id.index = idx; | 3341 | kctl->id.index = idx; |
3343 | kctl->private_value = codec->spdif_out.used - 1; | 3342 | kctl->private_value = codec->spdif_out.used - 1; |
3344 | err = snd_hda_ctl_add(codec, associated_nid, kctl); | 3343 | err = snd_hda_ctl_add(codec, associated_nid, kctl); |
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index e8c9442d27ad..23ca1722aff1 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h | |||
@@ -679,6 +679,8 @@ struct hda_bus { | |||
679 | unsigned int response_reset:1; /* controller was reset */ | 679 | unsigned int response_reset:1; /* controller was reset */ |
680 | unsigned int in_reset:1; /* during reset operation */ | 680 | unsigned int in_reset:1; /* during reset operation */ |
681 | unsigned int power_keep_link_on:1; /* don't power off HDA link */ | 681 | unsigned int power_keep_link_on:1; /* don't power off HDA link */ |
682 | |||
683 | int primary_dig_out_type; /* primary digital out PCM type */ | ||
682 | }; | 684 | }; |
683 | 685 | ||
684 | /* | 686 | /* |
@@ -846,7 +848,6 @@ struct hda_codec { | |||
846 | struct mutex hash_mutex; | 848 | struct mutex hash_mutex; |
847 | struct snd_array spdif_out; | 849 | struct snd_array spdif_out; |
848 | unsigned int spdif_in_enable; /* SPDIF input enable? */ | 850 | unsigned int spdif_in_enable; /* SPDIF input enable? */ |
849 | int primary_dig_out_type; /* primary digital out PCM type */ | ||
850 | const hda_nid_t *slave_dig_outs; /* optional digital out slave widgets */ | 851 | const hda_nid_t *slave_dig_outs; /* optional digital out slave widgets */ |
851 | struct snd_array init_pins; /* initial (BIOS) pin configurations */ | 852 | struct snd_array init_pins; /* initial (BIOS) pin configurations */ |
852 | struct snd_array driver_pins; /* pin configs set by codec parser */ | 853 | struct snd_array driver_pins; /* pin configs set by codec parser */ |