Merge tag 'asoc-fix-v6.1-rc6' of https://git.kernel.org/pub/scm/linux/kernel/git...
authorTakashi Iwai <tiwai@suse.de>
Wed, 23 Nov 2022 16:14:10 +0000 (17:14 +0100)
committerTakashi Iwai <tiwai@suse.de>
Wed, 23 Nov 2022 16:14:10 +0000 (17:14 +0100)
ASoC: Fixes for v6.1

A clutch of small fixes that have come in in the past week, people seem
to have been unusually active for this late in the release cycle.  The
most critical one here is the fix to renumber the SOF DAI types in order
to restore ABI compatibility which was broken by the addition of AMD
support.

26 files changed:
include/sound/control.h
sound/aoa/soundbus/i2sbus/core.c
sound/arm/pxa2xx-ac97-lib.c
sound/core/control.c
sound/core/memalloc.c
sound/core/seq/seq_memory.c
sound/hda/hdac_sysfs.c
sound/pci/ac97/ac97_codec.c
sound/pci/au88x0/au88x0.h
sound/pci/au88x0/au88x0_core.c
sound/pci/ca0106/ca0106_mixer.c
sound/pci/emu10k1/emumixer.c
sound/pci/hda/hda_intel.c
sound/pci/hda/patch_ca0132.c
sound/pci/hda/patch_realtek.c
sound/pci/rme9652/hdsp.c
sound/pci/rme9652/rme9652.c
sound/synth/emux/emux.c
sound/usb/card.c
sound/usb/endpoint.c
sound/usb/implicit.c
sound/usb/midi.c
sound/usb/mixer.c
sound/usb/quirks-table.h
sound/usb/quirks.c
sound/usb/usbaudio.h

index eae443b..cc3dcc6 100644 (file)
@@ -138,6 +138,7 @@ int snd_ctl_remove(struct snd_card * card, struct snd_kcontrol * kcontrol);
 int snd_ctl_replace(struct snd_card *card, struct snd_kcontrol *kcontrol, bool add_on_replace);
 int snd_ctl_remove_id(struct snd_card * card, struct snd_ctl_elem_id *id);
 int snd_ctl_rename_id(struct snd_card * card, struct snd_ctl_elem_id *src_id, struct snd_ctl_elem_id *dst_id);
+void snd_ctl_rename(struct snd_card *card, struct snd_kcontrol *kctl, const char *name);
 int snd_ctl_activate_id(struct snd_card *card, struct snd_ctl_elem_id *id, int active);
 struct snd_kcontrol *snd_ctl_find_numid(struct snd_card * card, unsigned int numid);
 struct snd_kcontrol *snd_ctl_find_id(struct snd_card * card, struct snd_ctl_elem_id *id);
index faf6b03..51ed2f3 100644 (file)
@@ -147,6 +147,7 @@ static int i2sbus_get_and_fixup_rsrc(struct device_node *np, int index,
        return rc;
 }
 
+/* Returns 1 if added, 0 for otherwise; don't return a negative value! */
 /* FIXME: look at device node refcounting */
 static int i2sbus_add_dev(struct macio_dev *macio,
                          struct i2sbus_control *control,
@@ -213,7 +214,7 @@ static int i2sbus_add_dev(struct macio_dev *macio,
         * either as the second one in that case is just a modem. */
        if (!ok) {
                kfree(dev);
-               return -ENODEV;
+               return 0;
        }
 
        mutex_init(&dev->lock);
@@ -302,6 +303,10 @@ static int i2sbus_add_dev(struct macio_dev *macio,
 
        if (soundbus_add_one(&dev->sound)) {
                printk(KERN_DEBUG "i2sbus: device registration error!\n");
+               if (dev->sound.ofdev.dev.kobj.state_initialized) {
+                       soundbus_dev_put(&dev->sound);
+                       return 0;
+               }
                goto err;
        }
 
index e55c042..2ca33fd 100644 (file)
@@ -402,8 +402,10 @@ int pxa2xx_ac97_hw_probe(struct platform_device *dev)
                goto err_clk2;
 
        irq = platform_get_irq(dev, 0);
-       if (!irq)
+       if (irq < 0) {
+               ret = irq;
                goto err_irq;
+       }
 
        ret = request_irq(irq, pxa2xx_ac97_irq, 0, "AC97", NULL);
        if (ret < 0)
index a727192..50e7ba6 100644 (file)
@@ -753,6 +753,29 @@ int snd_ctl_rename_id(struct snd_card *card, struct snd_ctl_elem_id *src_id,
 }
 EXPORT_SYMBOL(snd_ctl_rename_id);
 
+/**
+ * snd_ctl_rename - rename the control on the card
+ * @card: the card instance
+ * @kctl: the control to rename
+ * @name: the new name
+ *
+ * Renames the specified control on the card to the new name.
+ *
+ * Make sure to take the control write lock - down_write(&card->controls_rwsem).
+ */
+void snd_ctl_rename(struct snd_card *card, struct snd_kcontrol *kctl,
+                   const char *name)
+{
+       remove_hash_entries(card, kctl);
+
+       if (strscpy(kctl->id.name, name, sizeof(kctl->id.name)) < 0)
+               pr_warn("ALSA: Renamed control new name '%s' truncated to '%s'\n",
+                       name, kctl->id.name);
+
+       add_hash_entries(card, kctl);
+}
+EXPORT_SYMBOL(snd_ctl_rename);
+
 #ifndef CONFIG_SND_CTL_FAST_LOOKUP
 static struct snd_kcontrol *
 snd_ctl_find_numid_slow(struct snd_card *card, unsigned int numid)
index 03cffe7..ba09555 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/slab.h>
 #include <linux/mm.h>
 #include <linux/dma-mapping.h>
+#include <linux/dma-map-ops.h>
 #include <linux/genalloc.h>
 #include <linux/highmem.h>
 #include <linux/vmalloc.h>
@@ -543,17 +544,17 @@ static void *snd_dma_noncontig_alloc(struct snd_dma_buffer *dmab, size_t size)
 
        sgt = dma_alloc_noncontiguous(dmab->dev.dev, size, dmab->dev.dir,
                                      DEFAULT_GFP, 0);
-       if (!sgt) {
 #ifdef CONFIG_SND_DMA_SGBUF
+       if (!sgt && !get_dma_ops(dmab->dev.dev)) {
                if (dmab->dev.type == SNDRV_DMA_TYPE_DEV_WC_SG)
                        dmab->dev.type = SNDRV_DMA_TYPE_DEV_WC_SG_FALLBACK;
                else
                        dmab->dev.type = SNDRV_DMA_TYPE_DEV_SG_FALLBACK;
                return snd_dma_sg_fallback_alloc(dmab, size);
-#else
-               return NULL;
-#endif
        }
+#endif
+       if (!sgt)
+               return NULL;
 
        dmab->dev.need_sync = dma_need_sync(dmab->dev.dev,
                                            sg_dma_address(sgt->sgl));
@@ -857,7 +858,7 @@ static const struct snd_malloc_ops snd_dma_noncoherent_ops = {
 /*
  * Entry points
  */
-static const struct snd_malloc_ops *dma_ops[] = {
+static const struct snd_malloc_ops *snd_dma_ops[] = {
        [SNDRV_DMA_TYPE_CONTINUOUS] = &snd_dma_continuous_ops,
        [SNDRV_DMA_TYPE_VMALLOC] = &snd_dma_vmalloc_ops,
 #ifdef CONFIG_HAS_DMA
@@ -883,7 +884,7 @@ static const struct snd_malloc_ops *snd_dma_get_ops(struct snd_dma_buffer *dmab)
        if (WARN_ON_ONCE(!dmab))
                return NULL;
        if (WARN_ON_ONCE(dmab->dev.type <= SNDRV_DMA_TYPE_UNKNOWN ||
-                        dmab->dev.type >= ARRAY_SIZE(dma_ops)))
+                        dmab->dev.type >= ARRAY_SIZE(snd_dma_ops)))
                return NULL;
-       return dma_ops[dmab->dev.type];
+       return snd_dma_ops[dmab->dev.type];
 }
index b7aee23..47ef6bc 100644 (file)
@@ -113,15 +113,19 @@ EXPORT_SYMBOL(snd_seq_dump_var_event);
  * expand the variable length event to linear buffer space.
  */
 
-static int seq_copy_in_kernel(char **bufptr, const void *src, int size)
+static int seq_copy_in_kernel(void *ptr, void *src, int size)
 {
+       char **bufptr = ptr;
+
        memcpy(*bufptr, src, size);
        *bufptr += size;
        return 0;
 }
 
-static int seq_copy_in_user(char __user **bufptr, const void *src, int size)
+static int seq_copy_in_user(void *ptr, void *src, int size)
 {
+       char __user **bufptr = ptr;
+
        if (copy_to_user(*bufptr, src, size))
                return -EFAULT;
        *bufptr += size;
@@ -151,8 +155,7 @@ int snd_seq_expand_var_event(const struct snd_seq_event *event, int count, char
                return newlen;
        }
        err = snd_seq_dump_var_event(event,
-                                    in_kernel ? (snd_seq_dump_func_t)seq_copy_in_kernel :
-                                    (snd_seq_dump_func_t)seq_copy_in_user,
+                                    in_kernel ? seq_copy_in_kernel : seq_copy_in_user,
                                     &buf);
        return err < 0 ? err : newlen;
 }
index e47de49..62a9615 100644 (file)
@@ -346,8 +346,10 @@ static int add_widget_node(struct kobject *parent, hda_nid_t nid,
                return -ENOMEM;
        kobject_init(kobj, &widget_ktype);
        err = kobject_add(kobj, parent, "%02x", nid);
-       if (err < 0)
+       if (err < 0) {
+               kobject_put(kobj);
                return err;
+       }
        err = sysfs_create_group(kobj, group);
        if (err < 0) {
                kobject_put(kobj);
index cb60a07..ff68532 100644 (file)
@@ -2009,6 +2009,7 @@ static int snd_ac97_dev_register(struct snd_device *device)
        err = device_register(&ac97->dev);
        if (err < 0) {
                ac97_err(ac97, "Can't register ac97 bus\n");
+               put_device(&ac97->dev);
                ac97->dev.bus = NULL;
                return err;
        }
@@ -2655,11 +2656,18 @@ EXPORT_SYMBOL(snd_ac97_resume);
  */
 static void set_ctl_name(char *dst, const char *src, const char *suffix)
 {
-       if (suffix)
-               sprintf(dst, "%s %s", src, suffix);
-       else
-               strcpy(dst, src);
-}      
+       const size_t msize = SNDRV_CTL_ELEM_ID_NAME_MAXLEN;
+
+       if (suffix) {
+               if (snprintf(dst, msize, "%s %s", src, suffix) >= msize)
+                       pr_warn("ALSA: AC97 control name '%s %s' truncated to '%s'\n",
+                               src, suffix, dst);
+       } else {
+               if (strscpy(dst, src, msize) < 0)
+                       pr_warn("ALSA: AC97 control name '%s' truncated to '%s'\n",
+                               src, dst);
+       }
+}
 
 /* remove the control with the given name and optional suffix */
 static int snd_ac97_remove_ctl(struct snd_ac97 *ac97, const char *name,
@@ -2686,8 +2694,11 @@ static int snd_ac97_rename_ctl(struct snd_ac97 *ac97, const char *src,
                               const char *dst, const char *suffix)
 {
        struct snd_kcontrol *kctl = ctl_find(ac97, src, suffix);
+       char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+
        if (kctl) {
-               set_ctl_name(kctl->id.name, dst, suffix);
+               set_ctl_name(name, dst, suffix);
+               snd_ctl_rename(ac97->bus->card, kctl, name);
                return 0;
        }
        return -ENOENT;
@@ -2706,11 +2717,17 @@ static int snd_ac97_swap_ctl(struct snd_ac97 *ac97, const char *s1,
                             const char *s2, const char *suffix)
 {
        struct snd_kcontrol *kctl1, *kctl2;
+       char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+
        kctl1 = ctl_find(ac97, s1, suffix);
        kctl2 = ctl_find(ac97, s2, suffix);
        if (kctl1 && kctl2) {
-               set_ctl_name(kctl1->id.name, s2, suffix);
-               set_ctl_name(kctl2->id.name, s1, suffix);
+               set_ctl_name(name, s2, suffix);
+               snd_ctl_rename(ac97->bus->card, kctl1, name);
+
+               set_ctl_name(name, s1, suffix);
+               snd_ctl_rename(ac97->bus->card, kctl2, name);
+
                return 0;
        }
        return -ENOENT;
index 0aa7af0..6cbb2bc 100644 (file)
@@ -141,7 +141,7 @@ struct snd_vortex {
 #ifndef CHIP_AU8810
        stream_t dma_wt[NR_WT];
        wt_voice_t wt_voice[NR_WT];     /* WT register cache. */
-       char mixwt[(NR_WT / NR_WTPB) * 6];      /* WT mixin objects */
+       s8 mixwt[(NR_WT / NR_WTPB) * 6];        /* WT mixin objects */
 #endif
 
        /* Global resources */
@@ -235,8 +235,8 @@ static int vortex_alsafmt_aspfmt(snd_pcm_format_t alsafmt, vortex_t *v);
 static void vortex_connect_default(vortex_t * vortex, int en);
 static int vortex_adb_allocroute(vortex_t * vortex, int dma, int nr_ch,
                                 int dir, int type, int subdev);
-static char vortex_adb_checkinout(vortex_t * vortex, int resmap[], int out,
-                                 int restype);
+static int vortex_adb_checkinout(vortex_t * vortex, int resmap[], int out,
+                                int restype);
 #ifndef CHIP_AU8810
 static int vortex_wt_allocroute(vortex_t * vortex, int dma, int nr_ch);
 static void vortex_wt_connect(vortex_t * vortex, int en);
index 2ed5100..f217c02 100644 (file)
@@ -1998,7 +1998,7 @@ static const int resnum[VORTEX_RESOURCE_LAST] =
  out: Mean checkout if != 0. Else mean Checkin resource.
  restype: Indicates type of resource to be checked in or out.
 */
-static char
+static int
 vortex_adb_checkinout(vortex_t * vortex, int resmap[], int out, int restype)
 {
        int i, qty = resnum[restype], resinuse = 0;
index 05f5601..f6381c0 100644 (file)
@@ -720,7 +720,7 @@ static int rename_ctl(struct snd_card *card, const char *src, const char *dst)
 {
        struct snd_kcontrol *kctl = ctl_find(card, src);
        if (kctl) {
-               strcpy(kctl->id.name, dst);
+               snd_ctl_rename(card, kctl, dst);
                return 0;
        }
        return -ENOENT;
index e9c0fe3..3c115f8 100644 (file)
@@ -1767,7 +1767,7 @@ static int rename_ctl(struct snd_card *card, const char *src, const char *dst)
 {
        struct snd_kcontrol *kctl = ctl_find(card, src);
        if (kctl) {
-               strcpy(kctl->id.name, dst);
+               snd_ctl_rename(card, kctl, dst);
                return 0;
        }
        return -ENOENT;
index 6ff19dd..8700267 100644 (file)
@@ -485,8 +485,8 @@ static int intel_ml_lctl_set_power(struct azx *chip, int state)
        int timeout;
 
        /*
-        * the codecs are sharing the first link setting by default
-        * If other links are enabled for stream, they need similar fix
+        * Changes to LCTL.SCF are only needed for the first multi-link dealing
+        * with external codecs
         */
        val = readl(bus->mlcap + AZX_ML_BASE + AZX_REG_ML_LCTL);
        val &= ~AZX_ML_LCTL_SPA;
@@ -513,7 +513,7 @@ static void intel_init_lctl(struct azx *chip)
 
        /* 0. check lctl register value is correct or not */
        val = readl(bus->mlcap + AZX_ML_BASE + AZX_REG_ML_LCTL);
-       /* if SCF is already set, let's use it */
+       /* only perform additional configurations if the SCF is initially based on 6MHz */
        if ((val & AZX_ML_LCTL_SCF) != 0)
                return;
 
@@ -531,7 +531,7 @@ static void intel_init_lctl(struct azx *chip)
        if (ret)
                goto set_spa;
 
-       /* 2. update SCF to select a properly audio clock*/
+       /* 2. update SCF to select an audio clock different from 6MHz */
        val &= ~AZX_ML_LCTL_SCF;
        val |= intel_get_lctl_scf(chip);
        writel(val, bus->mlcap + AZX_ML_BASE + AZX_REG_ML_LCTL);
@@ -2711,6 +2711,9 @@ static const struct pci_device_id azx_ids[] = {
        { PCI_DEVICE(0x1002, 0xab28),
          .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS |
          AZX_DCAPS_PM_RUNTIME },
+       { PCI_DEVICE(0x1002, 0xab30),
+         .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS |
+         AZX_DCAPS_PM_RUNTIME },
        { PCI_DEVICE(0x1002, 0xab38),
          .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS |
          AZX_DCAPS_PM_RUNTIME },
index 9580fe0..0a292bf 100644 (file)
@@ -1306,6 +1306,7 @@ static const struct snd_pci_quirk ca0132_quirks[] = {
        SND_PCI_QUIRK(0x1458, 0xA026, "Gigabyte G1.Sniper Z97", QUIRK_R3DI),
        SND_PCI_QUIRK(0x1458, 0xA036, "Gigabyte GA-Z170X-Gaming 7", QUIRK_R3DI),
        SND_PCI_QUIRK(0x3842, 0x1038, "EVGA X99 Classified", QUIRK_R3DI),
+       SND_PCI_QUIRK(0x3842, 0x1055, "EVGA Z390 DARK", QUIRK_R3DI),
        SND_PCI_QUIRK(0x1102, 0x0013, "Recon3D", QUIRK_R3D),
        SND_PCI_QUIRK(0x1102, 0x0018, "Recon3D", QUIRK_R3D),
        SND_PCI_QUIRK(0x1102, 0x0051, "Sound Blaster AE-5", QUIRK_AE5),
index e6c4bb5..e5c0363 100644 (file)
@@ -2142,7 +2142,7 @@ static void rename_ctl(struct hda_codec *codec, const char *oldname,
 
        kctl = snd_hda_find_mixer_ctl(codec, oldname);
        if (kctl)
-               strcpy(kctl->id.name, newname);
+               snd_ctl_rename(codec->card, kctl, newname);
 }
 
 static void alc1220_fixup_gb_dual_codecs(struct hda_codec *codec,
@@ -6654,13 +6654,8 @@ static int comp_bind(struct device *dev)
 {
        struct hda_codec *cdc = dev_to_hda_codec(dev);
        struct alc_spec *spec = cdc->spec;
-       int ret;
 
-       ret = component_bind_all(dev, spec->comps);
-       if (ret)
-               return ret;
-
-       return 0;
+       return component_bind_all(dev, spec->comps);
 }
 
 static void comp_unbind(struct device *dev)
@@ -9328,6 +9323,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
        SND_PCI_QUIRK(0x103c, 0x8898, "HP EliteBook 845 G8 Notebook PC", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
        SND_PCI_QUIRK(0x103c, 0x88d0, "HP Pavilion 15-eh1xxx (mainboard 88D0)", ALC287_FIXUP_HP_GPIO_LED),
        SND_PCI_QUIRK(0x103c, 0x8902, "HP OMEN 16", ALC285_FIXUP_HP_MUTE_LED),
+       SND_PCI_QUIRK(0x103c, 0x896d, "HP ZBook Firefly 16 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
        SND_PCI_QUIRK(0x103c, 0x896e, "HP EliteBook x360 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
        SND_PCI_QUIRK(0x103c, 0x8971, "HP EliteBook 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
        SND_PCI_QUIRK(0x103c, 0x8972, "HP EliteBook 840 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
@@ -9346,6 +9342,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
        SND_PCI_QUIRK(0x103c, 0x89aa, "HP EliteBook 630 G9", ALC236_FIXUP_HP_GPIO_LED),
        SND_PCI_QUIRK(0x103c, 0x89ac, "HP EliteBook 640 G9", ALC236_FIXUP_HP_GPIO_LED),
        SND_PCI_QUIRK(0x103c, 0x89ae, "HP EliteBook 650 G9", ALC236_FIXUP_HP_GPIO_LED),
+       SND_PCI_QUIRK(0x103c, 0x89c0, "HP ZBook Power 15.6 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
        SND_PCI_QUIRK(0x103c, 0x89c3, "Zbook Studio G9", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
        SND_PCI_QUIRK(0x103c, 0x89c6, "Zbook Fury 17 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
        SND_PCI_QUIRK(0x103c, 0x89ca, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
@@ -9400,12 +9397,14 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
        SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
        SND_PCI_QUIRK(0x1043, 0x1d42, "ASUS Zephyrus G14 2022", ALC289_FIXUP_ASUS_GA401),
        SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),
+       SND_PCI_QUIRK(0x1043, 0x1e02, "ASUS UX3402", ALC245_FIXUP_CS35L41_SPI_2),
        SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502),
        SND_PCI_QUIRK(0x1043, 0x1e51, "ASUS Zephyrus M15", ALC294_FIXUP_ASUS_GU502_PINS),
        SND_PCI_QUIRK(0x1043, 0x1e5e, "ASUS ROG Strix G513", ALC294_FIXUP_ASUS_G513_PINS),
        SND_PCI_QUIRK(0x1043, 0x1e8e, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA401),
        SND_PCI_QUIRK(0x1043, 0x1c52, "ASUS Zephyrus G15 2022", ALC289_FIXUP_ASUS_GA401),
        SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),
+       SND_PCI_QUIRK(0x1043, 0x1f12, "ASUS UM5302", ALC287_FIXUP_CS35L41_I2C_2),
        SND_PCI_QUIRK(0x1043, 0x1f92, "ASUS ROG Flow X16", ALC289_FIXUP_ASUS_GA401),
        SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
        SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
@@ -9437,6 +9436,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
        SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_AMP),
        SND_PCI_QUIRK(0x144d, 0xc189, "Samsung Galaxy Flex Book (NT950QCG-X716)", ALC298_FIXUP_SAMSUNG_AMP),
        SND_PCI_QUIRK(0x144d, 0xc18a, "Samsung Galaxy Book Ion (NP930XCJ-K01US)", ALC298_FIXUP_SAMSUNG_AMP),
+       SND_PCI_QUIRK(0x144d, 0xc1a3, "Samsung Galaxy Book Pro (NP935XDB-KC1SE)", ALC298_FIXUP_SAMSUNG_AMP),
+       SND_PCI_QUIRK(0x144d, 0xc1a6, "Samsung Galaxy Book Pro 360 (NP930QBD)", ALC298_FIXUP_SAMSUNG_AMP),
        SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
        SND_PCI_QUIRK(0x144d, 0xc812, "Samsung Notebook Pen S (NT950SBE-X58)", ALC298_FIXUP_SAMSUNG_AMP),
        SND_PCI_QUIRK(0x144d, 0xc830, "Samsung Galaxy Book Ion (NT950XCJ-X716A)", ALC298_FIXUP_SAMSUNG_AMP),
@@ -9610,6 +9611,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
        SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
        SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
        SND_PCI_QUIRK(0x1849, 0x1233, "ASRock NUC Box 1100", ALC233_FIXUP_NO_AUDIO_JACK),
+       SND_PCI_QUIRK(0x1849, 0xa233, "Positivo Master C6300", ALC269_FIXUP_HEADSET_MIC),
        SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
        SND_PCI_QUIRK(0x19e5, 0x320f, "Huawei WRT-WX9 ", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1b35, 0x1235, "CZC B20", ALC269_FIXUP_CZC_B20),
index dcc43a8..65add92 100644 (file)
@@ -433,7 +433,7 @@ struct hdsp_midi {
     struct snd_rawmidi           *rmidi;
     struct snd_rawmidi_substream *input;
     struct snd_rawmidi_substream *output;
-    char                     istimer; /* timer in use */
+    signed char                     istimer; /* timer in use */
     struct timer_list       timer;
     spinlock_t               lock;
     int                             pending;
@@ -480,7 +480,7 @@ struct hdsp {
        pid_t                 playback_pid;
        int                   running;
        int                   system_sample_rate;
-       const char           *channel_map;
+       const signed char    *channel_map;
        int                   dev;
        int                   irq;
        unsigned long         port;
@@ -502,7 +502,7 @@ struct hdsp {
    where the data for that channel can be read/written from/to.
 */
 
-static const char channel_map_df_ss[HDSP_MAX_CHANNELS] = {
+static const signed char channel_map_df_ss[HDSP_MAX_CHANNELS] = {
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
        18, 19, 20, 21, 22, 23, 24, 25
 };
@@ -517,7 +517,7 @@ static const char channel_map_mf_ss[HDSP_MAX_CHANNELS] = { /* Multiface */
        -1, -1, -1, -1, -1, -1, -1, -1
 };
 
-static const char channel_map_ds[HDSP_MAX_CHANNELS] = {
+static const signed char channel_map_ds[HDSP_MAX_CHANNELS] = {
        /* ADAT channels are remapped */
        1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23,
        /* channels 12 and 13 are S/PDIF */
@@ -526,7 +526,7 @@ static const char channel_map_ds[HDSP_MAX_CHANNELS] = {
        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
 };
 
-static const char channel_map_H9632_ss[HDSP_MAX_CHANNELS] = {
+static const signed char channel_map_H9632_ss[HDSP_MAX_CHANNELS] = {
        /* ADAT channels */
        0, 1, 2, 3, 4, 5, 6, 7,
        /* SPDIF */
@@ -540,7 +540,7 @@ static const char channel_map_H9632_ss[HDSP_MAX_CHANNELS] = {
        -1, -1
 };
 
-static const char channel_map_H9632_ds[HDSP_MAX_CHANNELS] = {
+static const signed char channel_map_H9632_ds[HDSP_MAX_CHANNELS] = {
        /* ADAT */
        1, 3, 5, 7,
        /* SPDIF */
@@ -554,7 +554,7 @@ static const char channel_map_H9632_ds[HDSP_MAX_CHANNELS] = {
        -1, -1, -1, -1, -1, -1
 };
 
-static const char channel_map_H9632_qs[HDSP_MAX_CHANNELS] = {
+static const signed char channel_map_H9632_qs[HDSP_MAX_CHANNELS] = {
        /* ADAT is disabled in this mode */
        /* SPDIF */
        8, 9,
@@ -3939,7 +3939,7 @@ static snd_pcm_uframes_t snd_hdsp_hw_pointer(struct snd_pcm_substream *substream
        return hdsp_hw_pointer(hdsp);
 }
 
-static char *hdsp_channel_buffer_location(struct hdsp *hdsp,
+static signed char *hdsp_channel_buffer_location(struct hdsp *hdsp,
                                             int stream,
                                             int channel)
 
@@ -3964,7 +3964,7 @@ static int snd_hdsp_playback_copy(struct snd_pcm_substream *substream,
                                  void __user *src, unsigned long count)
 {
        struct hdsp *hdsp = snd_pcm_substream_chip(substream);
-       char *channel_buf;
+       signed char *channel_buf;
 
        if (snd_BUG_ON(pos + count > HDSP_CHANNEL_BUFFER_BYTES))
                return -EINVAL;
@@ -3982,7 +3982,7 @@ static int snd_hdsp_playback_copy_kernel(struct snd_pcm_substream *substream,
                                         void *src, unsigned long count)
 {
        struct hdsp *hdsp = snd_pcm_substream_chip(substream);
-       char *channel_buf;
+       signed char *channel_buf;
 
        channel_buf = hdsp_channel_buffer_location(hdsp, substream->pstr->stream, channel);
        if (snd_BUG_ON(!channel_buf))
@@ -3996,7 +3996,7 @@ static int snd_hdsp_capture_copy(struct snd_pcm_substream *substream,
                                 void __user *dst, unsigned long count)
 {
        struct hdsp *hdsp = snd_pcm_substream_chip(substream);
-       char *channel_buf;
+       signed char *channel_buf;
 
        if (snd_BUG_ON(pos + count > HDSP_CHANNEL_BUFFER_BYTES))
                return -EINVAL;
@@ -4014,7 +4014,7 @@ static int snd_hdsp_capture_copy_kernel(struct snd_pcm_substream *substream,
                                        void *dst, unsigned long count)
 {
        struct hdsp *hdsp = snd_pcm_substream_chip(substream);
-       char *channel_buf;
+       signed char *channel_buf;
 
        channel_buf = hdsp_channel_buffer_location(hdsp, substream->pstr->stream, channel);
        if (snd_BUG_ON(!channel_buf))
@@ -4028,7 +4028,7 @@ static int snd_hdsp_hw_silence(struct snd_pcm_substream *substream,
                               unsigned long count)
 {
        struct hdsp *hdsp = snd_pcm_substream_chip(substream);
-       char *channel_buf;
+       signed char *channel_buf;
 
        channel_buf = hdsp_channel_buffer_location (hdsp, substream->pstr->stream, channel);
        if (snd_BUG_ON(!channel_buf))
index 1d614fe..e7c320a 100644 (file)
@@ -230,7 +230,7 @@ struct snd_rme9652 {
        int last_spdif_sample_rate;     /* so that we can catch externally ... */
        int last_adat_sample_rate;      /* ... induced rate changes            */
 
-       const char *channel_map;
+       const signed char *channel_map;
 
        struct snd_card *card;
        struct snd_pcm *pcm;
@@ -247,12 +247,12 @@ struct snd_rme9652 {
    where the data for that channel can be read/written from/to.
 */
 
-static const char channel_map_9652_ss[26] = {
+static const signed char channel_map_9652_ss[26] = {
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
        18, 19, 20, 21, 22, 23, 24, 25
 };
 
-static const char channel_map_9636_ss[26] = {
+static const signed char channel_map_9636_ss[26] = {
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 
        /* channels 16 and 17 are S/PDIF */
        24, 25,
@@ -260,7 +260,7 @@ static const char channel_map_9636_ss[26] = {
        -1, -1, -1, -1, -1, -1, -1, -1
 };
 
-static const char channel_map_9652_ds[26] = {
+static const signed char channel_map_9652_ds[26] = {
        /* ADAT channels are remapped */
        1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23,
        /* channels 12 and 13 are S/PDIF */
@@ -269,7 +269,7 @@ static const char channel_map_9652_ds[26] = {
        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
 };
 
-static const char channel_map_9636_ds[26] = {
+static const signed char channel_map_9636_ds[26] = {
        /* ADAT channels are remapped */
        1, 3, 5, 7, 9, 11, 13, 15,
        /* channels 8 and 9 are S/PDIF */
@@ -1819,7 +1819,7 @@ static snd_pcm_uframes_t snd_rme9652_hw_pointer(struct snd_pcm_substream *substr
        return rme9652_hw_pointer(rme9652);
 }
 
-static char *rme9652_channel_buffer_location(struct snd_rme9652 *rme9652,
+static signed char *rme9652_channel_buffer_location(struct snd_rme9652 *rme9652,
                                             int stream,
                                             int channel)
 
@@ -1847,7 +1847,7 @@ static int snd_rme9652_playback_copy(struct snd_pcm_substream *substream,
                                     void __user *src, unsigned long count)
 {
        struct snd_rme9652 *rme9652 = snd_pcm_substream_chip(substream);
-       char *channel_buf;
+       signed char *channel_buf;
 
        if (snd_BUG_ON(pos + count > RME9652_CHANNEL_BUFFER_BYTES))
                return -EINVAL;
@@ -1867,7 +1867,7 @@ static int snd_rme9652_playback_copy_kernel(struct snd_pcm_substream *substream,
                                            void *src, unsigned long count)
 {
        struct snd_rme9652 *rme9652 = snd_pcm_substream_chip(substream);
-       char *channel_buf;
+       signed char *channel_buf;
 
        channel_buf = rme9652_channel_buffer_location(rme9652,
                                                      substream->pstr->stream,
@@ -1883,7 +1883,7 @@ static int snd_rme9652_capture_copy(struct snd_pcm_substream *substream,
                                    void __user *dst, unsigned long count)
 {
        struct snd_rme9652 *rme9652 = snd_pcm_substream_chip(substream);
-       char *channel_buf;
+       signed char *channel_buf;
 
        if (snd_BUG_ON(pos + count > RME9652_CHANNEL_BUFFER_BYTES))
                return -EINVAL;
@@ -1903,7 +1903,7 @@ static int snd_rme9652_capture_copy_kernel(struct snd_pcm_substream *substream,
                                           void *dst, unsigned long count)
 {
        struct snd_rme9652 *rme9652 = snd_pcm_substream_chip(substream);
-       char *channel_buf;
+       signed char *channel_buf;
 
        channel_buf = rme9652_channel_buffer_location(rme9652,
                                                      substream->pstr->stream,
@@ -1919,7 +1919,7 @@ static int snd_rme9652_hw_silence(struct snd_pcm_substream *substream,
                                  unsigned long count)
 {
        struct snd_rme9652 *rme9652 = snd_pcm_substream_chip(substream);
-       char *channel_buf;
+       signed char *channel_buf;
 
        channel_buf = rme9652_channel_buffer_location (rme9652,
                                                       substream->pstr->stream,
index 5ed8e36..a870759 100644 (file)
@@ -126,15 +126,10 @@ EXPORT_SYMBOL(snd_emux_register);
  */
 int snd_emux_free(struct snd_emux *emu)
 {
-       unsigned long flags;
-
        if (! emu)
                return -EINVAL;
 
-       spin_lock_irqsave(&emu->voice_lock, flags);
-       if (emu->timer_active)
-               del_timer(&emu->tlist);
-       spin_unlock_irqrestore(&emu->voice_lock, flags);
+       del_timer_sync(&emu->tlist);
 
        snd_emux_proc_free(emu);
        snd_emux_delete_virmidi(emu);
index a5ed11e..26268ff 100644 (file)
@@ -742,6 +742,18 @@ get_alias_quirk(struct usb_device *dev, unsigned int id)
        return NULL;
 }
 
+/* register card if we reach to the last interface or to the specified
+ * one given via option
+ */
+static int try_to_register_card(struct snd_usb_audio *chip, int ifnum)
+{
+       if (check_delayed_register_option(chip) == ifnum ||
+           chip->last_iface == ifnum ||
+           usb_interface_claimed(usb_ifnum_to_if(chip->dev, chip->last_iface)))
+               return snd_card_register(chip->card);
+       return 0;
+}
+
 /*
  * probe the active usb device
  *
@@ -880,15 +892,9 @@ static int usb_audio_probe(struct usb_interface *intf,
                chip->need_delayed_register = false; /* clear again */
        }
 
-       /* register card if we reach to the last interface or to the specified
-        * one given via option
-        */
-       if (check_delayed_register_option(chip) == ifnum ||
-           usb_interface_claimed(usb_ifnum_to_if(dev, chip->last_iface))) {
-               err = snd_card_register(chip->card);
-               if (err < 0)
-                       goto __error;
-       }
+       err = try_to_register_card(chip, ifnum);
+       if (err < 0)
+               goto __error_no_register;
 
        if (chip->quirk_flags & QUIRK_FLAG_SHARE_MEDIA_DEVICE) {
                /* don't want to fail when snd_media_device_create() fails */
@@ -907,6 +913,11 @@ static int usb_audio_probe(struct usb_interface *intf,
        return 0;
 
  __error:
+       /* in the case of error in secondary interface, still try to register */
+       if (chip)
+               try_to_register_card(chip, ifnum);
+
+ __error_no_register:
        if (chip) {
                /* chip->active is inside the chip->card object,
                 * decrement before memory is possibly returned.
index d0b8d61..310cd6f 100644 (file)
@@ -931,7 +931,8 @@ void snd_usb_endpoint_close(struct snd_usb_audio *chip,
        usb_audio_dbg(chip, "Closing EP 0x%x (count %d)\n",
                      ep->ep_num, ep->opened);
 
-       if (!--ep->iface_ref->opened)
+       if (!--ep->iface_ref->opened &&
+               !(chip->quirk_flags & QUIRK_FLAG_IFACE_SKIP_CLOSE))
                endpoint_set_interface(chip, ep, false);
 
        if (!--ep->opened) {
index e1bf1b5..f3e8484 100644 (file)
@@ -47,6 +47,8 @@ struct snd_usb_implicit_fb_match {
 static const struct snd_usb_implicit_fb_match playback_implicit_fb_quirks[] = {
        /* Fixed EP */
        /* FIXME: check the availability of generic matching */
+       IMPLICIT_FB_FIXED_DEV(0x0763, 0x2030, 0x81, 3), /* M-Audio Fast Track C400 */
+       IMPLICIT_FB_FIXED_DEV(0x0763, 0x2031, 0x81, 3), /* M-Audio Fast Track C600 */
        IMPLICIT_FB_FIXED_DEV(0x0763, 0x2080, 0x81, 2), /* M-Audio FastTrack Ultra */
        IMPLICIT_FB_FIXED_DEV(0x0763, 0x2081, 0x81, 2), /* M-Audio FastTrack Ultra */
        IMPLICIT_FB_FIXED_DEV(0x2466, 0x8010, 0x81, 2), /* Fractal Audio Axe-Fx III */
index bbff092..2839f6b 100644 (file)
@@ -1133,10 +1133,8 @@ static int snd_usbmidi_output_open(struct snd_rawmidi_substream *substream)
                                        port = &umidi->endpoints[i].out->ports[j];
                                        break;
                                }
-       if (!port) {
-               snd_BUG();
+       if (!port)
                return -ENXIO;
-       }
 
        substream->runtime->private_data = port;
        port->state = STATE_UNKNOWN;
index a564195..9105ec6 100644 (file)
@@ -1631,7 +1631,7 @@ static void check_no_speaker_on_headset(struct snd_kcontrol *kctl,
        if (!found)
                return;
 
-       strscpy(kctl->id.name, "Headphone", sizeof(kctl->id.name));
+       snd_ctl_rename(card, kctl, "Headphone");
 }
 
 static const struct usb_feature_control_info *get_feature_control_info(int control)
index 06dfdd4..874fcf2 100644 (file)
@@ -2050,6 +2050,10 @@ YAMAHA_DEVICE(0x7010, "UB99"),
        }
 },
 {
+       /* M-Audio Micro */
+       USB_DEVICE_VENDOR_SPEC(0x0763, 0x201a),
+},
+{
        USB_DEVICE_VENDOR_SPEC(0x0763, 0x2030),
        .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
                /* .vendor_name = "M-Audio", */
index eadac58..0f4dd35 100644 (file)
@@ -376,7 +376,8 @@ static int create_auto_midi_quirk(struct snd_usb_audio *chip,
 
 static int create_autodetect_quirk(struct snd_usb_audio *chip,
                                   struct usb_interface *iface,
-                                  struct usb_driver *driver)
+                                  struct usb_driver *driver,
+                                  const struct snd_usb_audio_quirk *quirk)
 {
        int err;
 
@@ -386,45 +387,6 @@ static int create_autodetect_quirk(struct snd_usb_audio *chip,
        return err;
 }
 
-static int create_autodetect_quirks(struct snd_usb_audio *chip,
-                                   struct usb_interface *iface,
-                                   struct usb_driver *driver,
-                                   const struct snd_usb_audio_quirk *quirk)
-{
-       int probed_ifnum = get_iface_desc(iface->altsetting)->bInterfaceNumber;
-       int ifcount, ifnum, err;
-
-       err = create_autodetect_quirk(chip, iface, driver);
-       if (err < 0)
-               return err;
-
-       /*
-        * ALSA PCM playback/capture devices cannot be registered in two steps,
-        * so we have to claim the other corresponding interface here.
-        */
-       ifcount = chip->dev->actconfig->desc.bNumInterfaces;
-       for (ifnum = 0; ifnum < ifcount; ifnum++) {
-               if (ifnum == probed_ifnum || quirk->ifnum >= 0)
-                       continue;
-               iface = usb_ifnum_to_if(chip->dev, ifnum);
-               if (!iface ||
-                   usb_interface_claimed(iface) ||
-                   get_iface_desc(iface->altsetting)->bInterfaceClass !=
-                                                       USB_CLASS_VENDOR_SPEC)
-                       continue;
-
-               err = create_autodetect_quirk(chip, iface, driver);
-               if (err >= 0) {
-                       err = usb_driver_claim_interface(driver, iface,
-                                                        USB_AUDIO_IFACE_UNUSED);
-                       if (err < 0)
-                               return err;
-               }
-       }
-
-       return 0;
-}
-
 /*
  * Create a stream for an Edirol UA-700/UA-25/UA-4FX interface.  
  * The only way to detect the sample rate is by looking at wMaxPacketSize.
@@ -554,7 +516,7 @@ int snd_usb_create_quirk(struct snd_usb_audio *chip,
        static const quirk_func_t quirk_funcs[] = {
                [QUIRK_IGNORE_INTERFACE] = ignore_interface_quirk,
                [QUIRK_COMPOSITE] = create_composite_quirk,
-               [QUIRK_AUTODETECT] = create_autodetect_quirks,
+               [QUIRK_AUTODETECT] = create_autodetect_quirk,
                [QUIRK_MIDI_STANDARD_INTERFACE] = create_any_midi_quirk,
                [QUIRK_MIDI_FIXED_ENDPOINT] = create_any_midi_quirk,
                [QUIRK_MIDI_YAMAHA] = create_any_midi_quirk,
@@ -1913,6 +1875,7 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip,
        /* XMOS based USB DACs */
        switch (chip->usb_id) {
        case USB_ID(0x1511, 0x0037): /* AURALiC VEGA */
+       case USB_ID(0x21ed, 0xd75a): /* Accuphase DAC-60 option card */
        case USB_ID(0x2522, 0x0012): /* LH Labs VI DAC Infinity */
        case USB_ID(0x2772, 0x0230): /* Pro-Ject Pre Box S2 Digital */
                if (fp->altsetting == 2)
@@ -2185,6 +2148,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
                   QUIRK_FLAG_GENERIC_IMPLICIT_FB),
        DEVICE_FLG(0x2b53, 0x0031, /* Fiero SC-01 (firmware v1.1.0) */
                   QUIRK_FLAG_GENERIC_IMPLICIT_FB),
+       DEVICE_FLG(0x0525, 0xa4ad, /* Hamedal C20 usb camero */
+                  QUIRK_FLAG_IFACE_SKIP_CLOSE),
 
        /* Vendor matches */
        VENDOR_FLG(0x045e, /* MS Lifecam */
index 2c65750..e97141e 100644 (file)
@@ -170,6 +170,8 @@ extern bool snd_usb_skip_validation;
  *  Apply the generic implicit feedback sync mode (same as implicit_fb=1 option)
  * QUIRK_FLAG_SKIP_IMPLICIT_FB
  *  Don't apply implicit feedback sync mode
+ * QUIRK_FLAG_IFACE_SKIP_CLOSE
+ *  Don't closed interface during setting sample rate
  */
 
 #define QUIRK_FLAG_GET_SAMPLE_RATE     (1U << 0)
@@ -191,5 +193,6 @@ extern bool snd_usb_skip_validation;
 #define QUIRK_FLAG_SET_IFACE_FIRST     (1U << 16)
 #define QUIRK_FLAG_GENERIC_IMPLICIT_FB (1U << 17)
 #define QUIRK_FLAG_SKIP_IMPLICIT_FB    (1U << 18)
+#define QUIRK_FLAG_IFACE_SKIP_CLOSE    (1U << 19)
 
 #endif /* __USBAUDIO_H */