aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/pci/hda/patch_hdmi.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
index 32adaa6c5627..6bcdd667f514 100644
--- a/sound/pci/hda/patch_hdmi.c
+++ b/sound/pci/hda/patch_hdmi.c
@@ -343,14 +343,16 @@ static int hdmi_eld_ctl_info(struct snd_kcontrol *kcontrol,
343 struct snd_ctl_elem_info *uinfo) 343 struct snd_ctl_elem_info *uinfo)
344{ 344{
345 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 345 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
346 struct hdmi_spec *spec; 346 struct hdmi_spec *spec = codec->spec;
347 struct hdmi_eld *eld;
347 int pin_idx; 348 int pin_idx;
348 349
349 spec = codec->spec;
350 uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; 350 uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES;
351 351
352 pin_idx = kcontrol->private_value; 352 pin_idx = kcontrol->private_value;
353 uinfo->count = spec->pins[pin_idx].sink_eld.eld_size; 353 eld = &spec->pins[pin_idx].sink_eld;
354
355 uinfo->count = eld->eld_valid ? eld->eld_size : 0;
354 356
355 return 0; 357 return 0;
356} 358}
@@ -359,14 +361,23 @@ static int hdmi_eld_ctl_get(struct snd_kcontrol *kcontrol,
359 struct snd_ctl_elem_value *ucontrol) 361 struct snd_ctl_elem_value *ucontrol)
360{ 362{
361 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 363 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
362 struct hdmi_spec *spec; 364 struct hdmi_spec *spec = codec->spec;
365 struct hdmi_eld *eld;
363 int pin_idx; 366 int pin_idx;
364 367
365 spec = codec->spec;
366 pin_idx = kcontrol->private_value; 368 pin_idx = kcontrol->private_value;
369 eld = &spec->pins[pin_idx].sink_eld;
370
371 if (eld->eld_size > ARRAY_SIZE(ucontrol->value.bytes.data)) {
372 snd_BUG();
373 return -EINVAL;
374 }
367 375
368 memcpy(ucontrol->value.bytes.data, 376 memset(ucontrol->value.bytes.data, 0,
369 spec->pins[pin_idx].sink_eld.eld_buffer, ELD_MAX_SIZE); 377 ARRAY_SIZE(ucontrol->value.bytes.data));
378 if (eld->eld_valid)
379 memcpy(ucontrol->value.bytes.data, eld->eld_buffer,
380 eld->eld_size);
370 381
371 return 0; 382 return 0;
372} 383}