summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikesh Oswal <noswal@nvidia.com>2012-07-26 15:58:46 +0530
committerSimone Willett <swillett@nvidia.com>2012-08-02 09:37:28 -0700
commit93fa2d495c82c5b63572e62e8bba6a6acf3269f9 (patch)
tree44dba35d2495d83e11e5360df6ef537226d53887
parentece74a0888415460a005d52bcf2d5f6cf535597d (diff)
alsa: hda: add alsa ctl to query max channels
add alsa ctl to query maximum supported channels Bug: 998697 Signed-off-by: Nikesh Oswal <noswal@nvidia.com> Change-Id: Id2f0e6a62d2413615f13a0c18757c05610ef0c2c Reviewed-on: http://git-master/r/118602 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Scott Peterson <speterson@nvidia.com>
-rw-r--r--sound/pci/hda/hda_codec.c25
-rw-r--r--sound/pci/hda/hda_codec.h1
-rw-r--r--sound/pci/hda/hda_eld.c4
3 files changed, 30 insertions, 0 deletions
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
index 91b2e4689175..ff10a630da92 100644
--- a/sound/pci/hda/hda_codec.c
+++ b/sound/pci/hda/hda_codec.c
@@ -2840,6 +2840,16 @@ static int snd_hda_spdif_out_switch_put(struct snd_kcontrol *kcontrol,
return change;
}
+int snd_hda_max_pcm_ch_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;
+}
+
int snd_hda_hdmi_decode_info(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo)
{
@@ -2850,6 +2860,15 @@ int snd_hda_hdmi_decode_info(struct snd_kcontrol *kcontrol,
return 0;
}
+static int snd_hda_max_pcm_ch_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->max_pcm_channels;
+ return 0;
+}
+
static int snd_hda_hdmi_decode_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
@@ -2894,6 +2913,12 @@ static struct snd_kcontrol_new dig_mixes[] = {
.info = snd_hda_hdmi_decode_info,
.get = snd_hda_hdmi_decode_get,
},
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .name = "HDA Maximum PCM Channels",
+ .info = snd_hda_max_pcm_ch_info,
+ .get = snd_hda_max_pcm_ch_get,
+ },
{ } /* end */
};
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h
index 1c5dc6d73d6b..6cba73ce1997 100644
--- a/sound/pci/hda/hda_codec.h
+++ b/sound/pci/hda/hda_codec.h
@@ -868,6 +868,7 @@ struct hda_codec {
#endif
unsigned int recv_dec_cap;
+ unsigned int max_pcm_channels;
/* 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 a8042e14f5de..862dd35260d0 100644
--- a/sound/pci/hda/hda_eld.c
+++ b/sound/pci/hda/hda_eld.c
@@ -427,6 +427,10 @@ int snd_hdmi_get_eld(struct hdmi_eld *eld,
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);
+ } else if (eld->sad[i].format == AUDIO_CODING_TYPE_LPCM) {
+ codec->max_pcm_channels =
+ eld->sad[i].channels > codec->max_pcm_channels ?
+ eld->sad[i].channels : codec->max_pcm_channels;
}
}