Merge tag 'riscv-for-linus-4.19-rc3' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / sound / core / vmaster.c
index 9e96186..fd99d8a 100644 (file)
@@ -259,8 +259,8 @@ int _snd_ctl_add_slave(struct snd_kcontrol *master, struct snd_kcontrol *slave,
        struct link_master *master_link = snd_kcontrol_chip(master);
        struct link_slave *srec;
 
-       srec = kzalloc(sizeof(*srec) +
-                      slave->count * sizeof(*slave->vd), GFP_KERNEL);
+       srec = kzalloc(struct_size(srec, slave.vd, slave->count),
+                      GFP_KERNEL);
        if (!srec)
                return -ENOMEM;
        srec->kctl = slave;
@@ -421,13 +421,15 @@ struct snd_kcontrol *snd_ctl_make_virtual_master(char *name,
        kctl->private_free = master_free;
 
        /* additional (constant) TLV read */
-       if (tlv &&
-           (tlv[0] == SNDRV_CTL_TLVT_DB_SCALE ||
-            tlv[0] == SNDRV_CTL_TLVT_DB_MINMAX ||
-            tlv[0] == SNDRV_CTL_TLVT_DB_MINMAX_MUTE)) {
-               kctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_TLV_READ;
-               memcpy(master->tlv, tlv, sizeof(master->tlv));
-               kctl->tlv.p = master->tlv;
+       if (tlv) {
+               unsigned int type = tlv[SNDRV_CTL_TLVO_TYPE];
+               if (type == SNDRV_CTL_TLVT_DB_SCALE ||
+                   type == SNDRV_CTL_TLVT_DB_MINMAX ||
+                   type == SNDRV_CTL_TLVT_DB_MINMAX_MUTE) {
+                       kctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_TLV_READ;
+                       memcpy(master->tlv, tlv, sizeof(master->tlv));
+                       kctl->tlv.p = master->tlv;
+               }
        }
 
        return kctl;