[linux-yocto] [PATCH] ALSA: hda: Fix regression of hdmi eld control created based on invalid pcm

Liwei Song liwei.song at windriver.com
Tue Oct 24 18:01:59 PDT 2017



On 10/24/2017 11:01 PM, Bruce Ashfield wrote:
> Thanks for the patch, but for which version is this targeted ?
> 4.12 ?

Yes, for 4.12

Liwei.


> 
> Bruce
> 
> On 10/24/2017 03:44 AM, Liwei Song wrote:
>> From: Wang YanQing <udknight at gmail.com>
>>
>> commit 1f7f51a63114bab3a05920f4b1343154e95e2cb6 upstream.
>>
>> Commit fb087eaaef72 ("ALSA: hda - hdmi eld control created based on pcm")
>> forget to filter out invalid pcm numbers, if there is only one invalid pcm
>> number, then this issue causes we create eld control for invalid pcm silently,
>> but when there are more than one invalid pcm numbers, then this issue bring
>> probe error looks like below dmesg:
>> "
>> kernel: [    1.647283] snd_hda_intel 0000:00:03.0: bound 0000:00:02.0 (ops 0xc2967540)
>> kernel: [    1.651192] snd_hda_intel 0000:00:03.0: Too many HDMI devices
>> kernel: [    1.651195] snd_hda_intel 0000:00:03.0: Consider building the kernel with CONFIG_SND_DYNAMIC_MINORS=y
>> kernel: [    1.651197] snd_hda_intel 0000:00:03.0: Too many HDMI devices
>> kernel: [    1.651199] snd_hda_intel 0000:00:03.0: Consider building the kernel with CONFIG_SND_DYNAMIC_MINORS=y
>> kernel: [    1.651201] snd_hda_intel 0000:00:03.0: Too many HDMI devices
>> kernel: [    1.651203] snd_hda_intel 0000:00:03.0: Consider building the kernel with CONFIG_SND_DYNAMIC_MINORS=y
>> kernel: [    1.651676] snd_hda_intel 0000:00:03.0: control 3:0:0:ELD:0 is already present
>> kernel: [    1.651787] snd_hda_codec_hdmi: probe of hdaudioC0D0 failed with error -16
>> "
>>
>> This patch add invalid pcm number filter before calling hdmi_create_eld_ctl.
>>
>> Fixes: fb087eaaef72 ("ALSA: hda - hdmi eld control created based on pcm")
>> Signed-off-by: Wang YanQing <udknight at gmail.com>
>> Signed-off-by: Takashi Iwai <tiwai at suse.de>
>> Signed-off-by: Liwei Song <liwei.song at windriver.com>
>> ---
>>   sound/pci/hda/hda_codec.c  |  4 +++-
>>   sound/pci/hda/hda_codec.h  |  1 +
>>   sound/pci/hda/patch_hdmi.c | 14 ++++++++------
>>   3 files changed, 12 insertions(+), 7 deletions(-)
>>
>> diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
>> index 70bb365a08d2..9b044b2c573f 100644
>> --- a/sound/pci/hda/hda_codec.c
>> +++ b/sound/pci/hda/hda_codec.c
>> @@ -3402,8 +3402,10 @@ int snd_hda_codec_build_pcms(struct hda_codec *codec)
>>               continue; /* no substreams assigned */
>>             dev = get_empty_pcm_device(bus, cpcm->pcm_type);
>> -        if (dev < 0)
>> +        if (dev < 0) {
>> +            cpcm->device = SNDRV_PCM_INVALID_DEVICE;
>>               continue; /* no fatal error */
>> +        }
>>           cpcm->device = dev;
>>           err =  snd_hda_attach_pcm_stream(bus, codec, cpcm);
>>           if (err < 0) {
>> diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h
>> index 60ce1cfc300f..681c360f29f9 100644
>> --- a/sound/pci/hda/hda_codec.h
>> +++ b/sound/pci/hda/hda_codec.h
>> @@ -164,6 +164,7 @@ enum {
>>       HDA_PCM_NTYPES
>>   };
>>   +#define SNDRV_PCM_INVALID_DEVICE    (-1)
>>   /* for PCM creation */
>>   struct hda_pcm {
>>       char *name;
>> diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
>> index c87ff8e5d1d5..a2d81a77572b 100644
>> --- a/sound/pci/hda/patch_hdmi.c
>> +++ b/sound/pci/hda/patch_hdmi.c
>> @@ -2125,7 +2125,7 @@ static int generic_hdmi_build_jack(struct hda_codec *codec, int pcm_idx)
>>   static int generic_hdmi_build_controls(struct hda_codec *codec)
>>   {
>>       struct hdmi_spec *spec = codec->spec;
>> -    int err;
>> +    int dev, err;
>>       int pin_idx, pcm_idx;
>>     @@ -2153,11 +2153,13 @@ static int generic_hdmi_build_controls(struct hda_codec *codec)
>>               return err;
>>           snd_hda_spdif_ctls_unassign(codec, pcm_idx);
>>   -        /* add control for ELD Bytes */
>> -        err = hdmi_create_eld_ctl(codec, pcm_idx,
>> -                    get_pcm_rec(spec, pcm_idx)->device);
>> -        if (err < 0)
>> -            return err;
>> +        dev = get_pcm_rec(spec, pcm_idx)->device;
>> +        if (dev != SNDRV_PCM_INVALID_DEVICE) {
>> +            /* add control for ELD Bytes */
>> +            err = hdmi_create_eld_ctl(codec, pcm_idx, dev);
>> +            if (err < 0)
>> +                return err;
>> +        }
>>       }
>>         for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) {
>>
> 
> 
> 


More information about the linux-yocto mailing list