|
@@ -343,14 +343,16 @@ static int hdmi_eld_ctl_info(struct snd_kcontrol *kcontrol,
|
|
|
struct snd_ctl_elem_info *uinfo)
|
|
|
{
|
|
|
struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
|
|
|
- struct hdmi_spec *spec;
|
|
|
+ struct hdmi_spec *spec = codec->spec;
|
|
|
+ struct hdmi_eld *eld;
|
|
|
int pin_idx;
|
|
|
|
|
|
- spec = codec->spec;
|
|
|
uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES;
|
|
|
|
|
|
pin_idx = kcontrol->private_value;
|
|
|
- uinfo->count = spec->pins[pin_idx].sink_eld.eld_size;
|
|
|
+ eld = &spec->pins[pin_idx].sink_eld;
|
|
|
+
|
|
|
+ uinfo->count = eld->eld_valid ? eld->eld_size : 0;
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -359,14 +361,23 @@ static int hdmi_eld_ctl_get(struct snd_kcontrol *kcontrol,
|
|
|
struct snd_ctl_elem_value *ucontrol)
|
|
|
{
|
|
|
struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
|
|
|
- struct hdmi_spec *spec;
|
|
|
+ struct hdmi_spec *spec = codec->spec;
|
|
|
+ struct hdmi_eld *eld;
|
|
|
int pin_idx;
|
|
|
|
|
|
- spec = codec->spec;
|
|
|
pin_idx = kcontrol->private_value;
|
|
|
+ eld = &spec->pins[pin_idx].sink_eld;
|
|
|
+
|
|
|
+ if (eld->eld_size > ARRAY_SIZE(ucontrol->value.bytes.data)) {
|
|
|
+ snd_BUG();
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
|
|
|
- memcpy(ucontrol->value.bytes.data,
|
|
|
- spec->pins[pin_idx].sink_eld.eld_buffer, ELD_MAX_SIZE);
|
|
|
+ memset(ucontrol->value.bytes.data, 0,
|
|
|
+ ARRAY_SIZE(ucontrol->value.bytes.data));
|
|
|
+ if (eld->eld_valid)
|
|
|
+ memcpy(ucontrol->value.bytes.data, eld->eld_buffer,
|
|
|
+ eld->eld_size);
|
|
|
|
|
|
return 0;
|
|
|
}
|