[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