summaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
Diffstat (limited to 'sound')
-rw-r--r--sound/pci/hda/hda_codec.c16
-rw-r--r--sound/pci/hda/hda_codec.h2
-rw-r--r--sound/pci/hda/hda_eld.c14
3 files changed, 23 insertions, 9 deletions
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
index 6e171eef07ee..91b2e4689175 100644
--- a/sound/pci/hda/hda_codec.c
+++ b/sound/pci/hda/hda_codec.c
@@ -2840,12 +2840,22 @@ static int snd_hda_spdif_out_switch_put(struct snd_kcontrol *kcontrol,
return change;
}
+int snd_hda_hdmi_decode_info(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_info *uinfo)
+{
+ uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
+ uinfo->count = 1;
+ uinfo->value.integer.min = 0;
+ uinfo->value.integer.max = 0xFFFFFFFF;
+ return 0;
+}
+
static int snd_hda_hdmi_decode_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
- ucontrol->value.integer.value[0] = codec->ac3dec_capable;
+ ucontrol->value.integer.value[0] = codec->recv_dec_cap;
return 0;
}
@@ -2880,8 +2890,8 @@ static struct snd_kcontrol_new dig_mixes[] = {
},
{
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
- .name = "AC3 Decode Capability",
- .info = snd_ctl_boolean_mono_info,
+ .name = "HDA Decode Capability",
+ .info = snd_hda_hdmi_decode_info,
.get = snd_hda_hdmi_decode_get,
},
{ } /* end */
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h
index 59d4cbe7e06a..1c5dc6d73d6b 100644
--- a/sound/pci/hda/hda_codec.h
+++ b/sound/pci/hda/hda_codec.h
@@ -867,7 +867,7 @@ struct hda_codec {
unsigned long power_jiffies;
#endif
- bool ac3dec_capable;
+ unsigned int recv_dec_cap;
/* codec-specific additional proc output */
void (*proc_widget_hook)(struct snd_info_buffer *buffer,
struct hda_codec *codec, hda_nid_t nid);
diff --git a/sound/pci/hda/hda_eld.c b/sound/pci/hda/hda_eld.c
index f3d204f01ab2..ad760f90053d 100644
--- a/sound/pci/hda/hda_eld.c
+++ b/sound/pci/hda/hda_eld.c
@@ -421,6 +421,15 @@ int snd_hdmi_get_eld(struct hdmi_eld *eld,
if (!eld->lpcm_sad_ready)
hdmi_update_lpcm_sad_eld(codec, nid, eld, size);
+ codec->recv_dec_cap = 0;
+ for (i = 0; i < eld->sad_count; i++) {
+ if (eld->sad[i].format == AUDIO_CODING_TYPE_AC3) {
+ codec->recv_dec_cap |= (1 << AUDIO_CODING_TYPE_AC3);
+ } else if (eld->sad[i].format == AUDIO_CODING_TYPE_DTS) {
+ codec->recv_dec_cap |= (1 << AUDIO_CODING_TYPE_DTS);
+ }
+ }
+
buf = kmalloc(size, GFP_KERNEL);
if (!buf)
return -ENOMEM;
@@ -443,11 +452,6 @@ int snd_hdmi_get_eld(struct hdmi_eld *eld,
}
ret = hdmi_update_eld(eld, buf, size);
- codec->ac3dec_capable = false;
- for (i = 0; i < eld->sad_count; i++) {
- if (eld->sad[i].format == AUDIO_CODING_TYPE_AC3)
- codec->ac3dec_capable = true;
- }
error:
kfree(buf);