ASoC: hdac_hdmi: parse eld for channel map capability
authorSubhransu S. Prusty <subhransu.s.prusty@intel.com>
Thu, 14 Apr 2016 04:37:28 +0000 (10:07 +0530)
committerMark Brown <broonie@kernel.org>
Thu, 28 Apr 2016 17:49:24 +0000 (18:49 +0100)
This patch parses ELD speaker allocation data block to find
sink's chmap capability.

Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty@intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/hdac_hdmi.c

index 26f9459cb3bc8e6bb60aa2b71ddeaf427cb869ab..64ffe93b0f7b2c2ffacbe5123cb476ed08c262e5 100644 (file)
@@ -60,11 +60,17 @@ struct hdac_hdmi_cvt {
        struct hdac_hdmi_cvt_params params;
 };
 
+/* Currently only spk_alloc, more to be added */
+struct hdac_hdmi_parsed_eld {
+       u8 spk_alloc;
+};
+
 struct hdac_hdmi_eld {
        bool    monitor_present;
        bool    eld_valid;
        int     eld_size;
        char    eld_buffer[ELD_MAX_SIZE];
+       struct  hdac_hdmi_parsed_eld info;
 };
 
 struct hdac_hdmi_pin {
@@ -1008,6 +1014,12 @@ static int hdac_hdmi_add_cvt(struct hdac_ext_device *edev, hda_nid_t nid)
        return hdac_hdmi_query_cvt_params(&edev->hdac, cvt);
 }
 
+static void hdac_hdmi_parse_eld(struct hdac_ext_device *edev,
+                       struct hdac_hdmi_pin *pin)
+{
+       pin->eld.info.spk_alloc = pin->eld.eld_buffer[DRM_ELD_SPEAKER];
+}
+
 static void hdac_hdmi_present_sense(struct hdac_hdmi_pin *pin, int repoll)
 {
        struct hdac_ext_device *edev = pin->edev;
@@ -1065,6 +1077,7 @@ static void hdac_hdmi_present_sense(struct hdac_hdmi_pin *pin, int repoll)
 
                                snd_jack_report(pcm->jack, SND_JACK_AVOUT);
                        }
+                       hdac_hdmi_parse_eld(edev, pin);
 
                        print_hex_dump_bytes("ELD: ", DUMP_PREFIX_OFFSET,
                                        pin->eld.eld_buffer, pin->eld.eld_size);