ALSA: hda - hdmi: Add error-checking to some codec reads
authorAnssi Hannula <anssi.hannula@iki.fi>
Sun, 10 Nov 2013 18:56:10 +0000 (20:56 +0200)
committerTakashi Iwai <tiwai@suse.de>
Mon, 11 Nov 2013 16:07:49 +0000 (17:07 +0100)
Add error checks to HBR status reads (both generic and ATI/AMD) and
ATI/AMD codec reads for ELD generation.

Unchecked errors in these just caused more errors later on (invalid
codec writes for the HBR ones and ELD parsing errors for the ATI/AMD ELD
ones), but it is better to catch them earlier.

Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_eld.c
sound/pci/hda/patch_hdmi.c

index 32d3e3855a6eb99f298a97c3168e604a74ceae77..e8c55f5a34ff0afe9b6b897c0ab33a6e827a8eb5 100644 (file)
@@ -680,7 +680,7 @@ int snd_hdmi_get_eld_ati(struct hda_codec *codec, hda_nid_t nid,
 
        spkalloc = snd_hda_codec_read(codec, nid, 0, ATI_VERB_GET_SPEAKER_ALLOCATION, 0);
 
-       if (!spkalloc) {
+       if (spkalloc <= 0) {
                snd_printd(KERN_INFO "HDMI ATI/AMD: no speaker allocation for ELD\n");
                return -EINVAL;
        }
@@ -742,6 +742,9 @@ int snd_hdmi_get_eld_ati(struct hda_codec *codec, hda_nid_t nid,
                snd_hda_codec_write(codec, nid, 0, ATI_VERB_SET_AUDIO_DESCRIPTOR, i << 3);
                ati_sad = snd_hda_codec_read(codec, nid, 0, ATI_VERB_GET_AUDIO_DESCRIPTOR, 0);
 
+               if (ati_sad <= 0)
+                       continue;
+
                if (ati_sad & ATI_AUDIODESC_RATES) {
                        /* format is supported, copy SAD as-is */
                        buf[pos++] = (ati_sad & 0x0000ff) >> 0;
index 8aa104cba2418276205999a177ef8a063497ab4b..08407bed093e5a64d4b659f90bf236dead9ec002 100644 (file)
@@ -1247,6 +1247,9 @@ static int hdmi_pin_hbr_setup(struct hda_codec *codec, hda_nid_t pin_nid,
                pinctl = snd_hda_codec_read(codec, pin_nid, 0,
                                            AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
 
+               if (pinctl < 0)
+                       return hbr ? -EINVAL : 0;
+
                new_pinctl = pinctl & ~AC_PINCTL_EPT;
                if (hbr)
                        new_pinctl |= AC_PINCTL_EPT_HBR;
@@ -3091,7 +3094,7 @@ static int atihdmi_pin_hbr_setup(struct hda_codec *codec, hda_nid_t pin_nid,
        int hbr_ctl, hbr_ctl_new;
 
        hbr_ctl = snd_hda_codec_read(codec, pin_nid, 0, ATI_VERB_GET_HBR_CONTROL, 0);
-       if (hbr_ctl & ATI_HBR_CAPABLE) {
+       if (hbr_ctl >= 0 && (hbr_ctl & ATI_HBR_CAPABLE)) {
                if (hbr)
                        hbr_ctl_new = hbr_ctl | ATI_HBR_ENABLE;
                else