Merge branch 'topic/enum-info-cleanup' into for-next
authorTakashi Iwai <tiwai@suse.de>
Wed, 22 Oct 2014 10:19:57 +0000 (12:19 +0200)
committerTakashi Iwai <tiwai@suse.de>
Wed, 22 Oct 2014 10:19:57 +0000 (12:19 +0200)
this is a series of patches to just convert the plain info callback
for enum ctl elements to snd_ctl_elem_info().  Also, it includes the
extension of snd_ctl_elem_info(), for catching the unexpected string
cut-off and handling the zero items.

20 files changed:
Documentation/sound/alsa/ControlNames.txt
include/sound/seq_kernel.h
sound/core/pcm_native.c
sound/core/seq/seq.c
sound/core/seq/seq_device.c
sound/pci/au88x0/au88x0.c
sound/pci/au88x0/au88x0.h
sound/pci/au88x0/au88x0_a3d.c
sound/pci/au88x0/au88x0_core.c
sound/pci/au88x0/au88x0_eq.c
sound/pci/au88x0/au88x0_game.c
sound/pci/au88x0/au88x0_mpu401.c
sound/pci/au88x0/au88x0_pcm.c
sound/pci/au88x0/au88x0_synth.c
sound/pci/ctxfi/ctatc.c
sound/pci/hda/hda_generic.c
sound/pci/hda/patch_hdmi.c
sound/pci/hda/patch_realtek.c
sound/usb/mixer.c
sound/usb/quirks-table.h

index fea65bb6269ea47742f0c8453cdbd0a65d152b67..79a6127863ca8216294f9861d068e31b5a09bd16 100644 (file)
@@ -1,6 +1,6 @@
 This document describes standard names of mixer controls.
 
-Syntax: SOURCE [DIRECTION] FUNCTION
+Syntax: [LOCATION] SOURCE [CHANNEL] [DIRECTION] FUNCTION
 
 DIRECTION:
   <nothing>    (both directions)
@@ -14,12 +14,29 @@ FUNCTION:
   Volume
   Route                (route control, hardware specific)
 
+CHANNEL:
+  <nothing>     (channel independent, or applies to all channels)
+  Front
+  Surround      (rear left/right in 4.0/5.1 surround)
+  CLFE
+  Center
+  LFE
+  Side          (side left/right for 7.1 surround)
+
+LOCATION:       (physical location of source)
+  Front
+  Rear
+  Dock          (docking station)
+  Internal
+
 SOURCE:
   Master
   Master Mono
   Hardware Master
   Speaker      (internal speaker)
+  Bass Speaker (internal LFE speaker)
   Headphone
+  Line Out
   Beep         (beep generator)
   Phone
   Phone Input
@@ -27,14 +44,14 @@ SOURCE:
   Synth
   FM
   Mic
-  Line
+  Headset Mic  (mic part of combined headset jack - 4-pin headphone + mic)
+  Headphone Mic        (mic part of either/or - 3-pin headphone or mic)
+  Line         (input only, use "Line Out" for output)
   CD
   Video
   Zoom Video
   Aux
   PCM
-  PCM Front
-  PCM Rear
   PCM Pan
   Loopback
   Analog Loopback      (D/A -> A/D loopback)
@@ -47,8 +64,13 @@ SOURCE:
   Music
   I2S
   IEC958
+  HDMI
+  SPDIF                (output only)
+  SPDIF In
+  Digital In
+  HDMI/DP      (either HDMI or DisplayPort)
 
-Exceptions:
+Exceptions (deprecated):
   [Digital] Capture Source
   [Digital] Capture Switch     (aka input gain switch)
   [Digital] Capture Volume     (aka input gain volume)
index 2398521f0998e5ab0ecce6e87728d35e533d6a38..eea5400fe373862e55382f0ac0efadbd50d0cc08 100644 (file)
@@ -108,9 +108,13 @@ int snd_seq_event_port_detach(int client, int port);
 #ifdef CONFIG_MODULES
 void snd_seq_autoload_lock(void);
 void snd_seq_autoload_unlock(void);
+void snd_seq_autoload_init(void);
+#define snd_seq_autoload_exit()        snd_seq_autoload_lock()
 #else
 #define snd_seq_autoload_lock()
 #define snd_seq_autoload_unlock()
+#define snd_seq_autoload_init()
+#define snd_seq_autoload_exit()
 #endif
 
 #endif /* __SOUND_SEQ_KERNEL_H */
index bfe1cf6b492f08489a2f7a5dd7bc9e54ae61a4cc..815396d8427fe68c42d40e7cecf195a2a300180b 100644 (file)
@@ -3311,7 +3311,7 @@ static const struct vm_operations_struct snd_pcm_vm_ops_data_fault = {
 
 #ifndef ARCH_HAS_DMA_MMAP_COHERENT
 /* This should be defined / handled globally! */
-#ifdef CONFIG_ARM
+#if defined(CONFIG_ARM) || defined(CONFIG_ARM64)
 #define ARCH_HAS_DMA_MMAP_COHERENT
 #endif
 #endif
index 7121105610826eef0931426129788f6bb9696ffc..7e0aabb808a66007d3719be8ca7885a611164ed3 100644 (file)
@@ -86,7 +86,6 @@ static int __init alsa_seq_init(void)
 {
        int err;
 
-       snd_seq_autoload_lock();
        if ((err = client_init_data()) < 0)
                goto error;
 
@@ -110,8 +109,8 @@ static int __init alsa_seq_init(void)
        if ((err = snd_seq_system_client_init()) < 0)
                goto error;
 
+       snd_seq_autoload_init();
  error:
-       snd_seq_autoload_unlock();
        return err;
 }
 
@@ -131,6 +130,8 @@ static void __exit alsa_seq_exit(void)
 
        /* release event memory */
        snd_sequencer_memory_done();
+
+       snd_seq_autoload_exit();
 }
 
 module_init(alsa_seq_init)
index 91a786a783e1e7cd563f516df09b9c94e64214eb..0631bdadd12bd6ca884bf68578ac8fd7917a3f6b 100644 (file)
@@ -56,6 +56,7 @@ MODULE_LICENSE("GPL");
 #define DRIVER_LOADED          (1<<0)
 #define DRIVER_REQUESTED       (1<<1)
 #define DRIVER_LOCKED          (1<<2)
+#define DRIVER_REQUESTING      (1<<3)
 
 struct ops_list {
        char id[ID_LEN];        /* driver id */
@@ -127,42 +128,82 @@ static void snd_seq_device_info(struct snd_info_entry *entry,
 
 #ifdef CONFIG_MODULES
 /* avoid auto-loading during module_init() */
-static int snd_seq_in_init;
+static atomic_t snd_seq_in_init = ATOMIC_INIT(1); /* blocked as default */
 void snd_seq_autoload_lock(void)
 {
-       snd_seq_in_init++;
+       atomic_inc(&snd_seq_in_init);
 }
 
 void snd_seq_autoload_unlock(void)
 {
-       snd_seq_in_init--;
+       atomic_dec(&snd_seq_in_init);
 }
-#endif
 
-void snd_seq_device_load_drivers(void)
+static void autoload_drivers(void)
 {
-#ifdef CONFIG_MODULES
-       struct ops_list *ops;
+       /* avoid reentrance */
+       if (atomic_inc_return(&snd_seq_in_init) == 1) {
+               struct ops_list *ops;
+
+               mutex_lock(&ops_mutex);
+               list_for_each_entry(ops, &opslist, list) {
+                       if ((ops->driver & DRIVER_REQUESTING) &&
+                           !(ops->driver & DRIVER_REQUESTED)) {
+                               ops->used++;
+                               mutex_unlock(&ops_mutex);
+                               ops->driver |= DRIVER_REQUESTED;
+                               request_module("snd-%s", ops->id);
+                               mutex_lock(&ops_mutex);
+                               ops->used--;
+                       }
+               }
+               mutex_unlock(&ops_mutex);
+       }
+       atomic_dec(&snd_seq_in_init);
+}
 
-       /* Calling request_module during module_init()
-        * may cause blocking.
-        */
-       if (snd_seq_in_init)
-               return;
+static void call_autoload(struct work_struct *work)
+{
+       autoload_drivers();
+}
 
-       mutex_lock(&ops_mutex);
-       list_for_each_entry(ops, &opslist, list) {
-               if (! (ops->driver & DRIVER_LOADED) &&
-                   ! (ops->driver & DRIVER_REQUESTED)) {
-                       ops->used++;
-                       mutex_unlock(&ops_mutex);
-                       ops->driver |= DRIVER_REQUESTED;
-                       request_module("snd-%s", ops->id);
-                       mutex_lock(&ops_mutex);
-                       ops->used--;
-               }
+static DECLARE_WORK(autoload_work, call_autoload);
+
+static void try_autoload(struct ops_list *ops)
+{
+       if (!ops->driver) {
+               ops->driver |= DRIVER_REQUESTING;
+               schedule_work(&autoload_work);
        }
+}
+
+static void queue_autoload_drivers(void)
+{
+       struct ops_list *ops;
+
+       mutex_lock(&ops_mutex);
+       list_for_each_entry(ops, &opslist, list)
+               try_autoload(ops);
        mutex_unlock(&ops_mutex);
+}
+
+void snd_seq_autoload_init(void)
+{
+       atomic_dec(&snd_seq_in_init);
+#ifdef CONFIG_SND_SEQUENCER_MODULE
+       /* initial autoload only when snd-seq is a module */
+       queue_autoload_drivers();
+#endif
+}
+#else
+#define try_autoload(ops) /* NOP */
+#endif
+
+void snd_seq_device_load_drivers(void)
+{
+#ifdef CONFIG_MODULES
+       queue_autoload_drivers();
+       flush_work(&autoload_work);
 #endif
 }
 
@@ -214,13 +255,14 @@ int snd_seq_device_new(struct snd_card *card, int device, char *id, int argsize,
        ops->num_devices++;
        mutex_unlock(&ops->reg_mutex);
 
-       unlock_driver(ops);
-       
        if ((err = snd_device_new(card, SNDRV_DEV_SEQUENCER, dev, &dops)) < 0) {
                snd_seq_device_free(dev);
                return err;
        }
        
+       try_autoload(ops);
+       unlock_driver(ops);
+
        if (result)
                *result = dev;
 
@@ -318,16 +360,12 @@ int snd_seq_device_register_driver(char *id, struct snd_seq_dev_ops *entry,
            entry->init_device == NULL || entry->free_device == NULL)
                return -EINVAL;
 
-       snd_seq_autoload_lock();
        ops = find_driver(id, 1);
-       if (ops == NULL) {
-               snd_seq_autoload_unlock();
+       if (ops == NULL)
                return -ENOMEM;
-       }
        if (ops->driver & DRIVER_LOADED) {
                pr_warn("ALSA: seq: driver_register: driver '%s' already exists\n", id);
                unlock_driver(ops);
-               snd_seq_autoload_unlock();
                return -EBUSY;
        }
 
@@ -344,7 +382,6 @@ int snd_seq_device_register_driver(char *id, struct snd_seq_dev_ops *entry,
        mutex_unlock(&ops->reg_mutex);
 
        unlock_driver(ops);
-       snd_seq_autoload_unlock();
 
        return 0;
 }
@@ -554,6 +591,9 @@ static int __init alsa_seq_device_init(void)
 
 static void __exit alsa_seq_device_exit(void)
 {
+#ifdef CONFIG_MODULES
+       cancel_work_sync(&autoload_work);
+#endif
        remove_drivers();
 #ifdef CONFIG_PROC_FS
        snd_info_free_entry(info_entry);
@@ -570,6 +610,7 @@ EXPORT_SYMBOL(snd_seq_device_new);
 EXPORT_SYMBOL(snd_seq_device_register_driver);
 EXPORT_SYMBOL(snd_seq_device_unregister_driver);
 #ifdef CONFIG_MODULES
+EXPORT_SYMBOL(snd_seq_autoload_init);
 EXPORT_SYMBOL(snd_seq_autoload_lock);
 EXPORT_SYMBOL(snd_seq_autoload_unlock);
 #endif
index 21ce31f636bc55c939970be2bcdbcc9953500680..e9c3833f6d4467d8cc2d5fda9328645624c52a05 100644 (file)
@@ -48,11 +48,10 @@ static void vortex_fix_latency(struct pci_dev *vortex)
 {
        int rc;
        if (!(rc = pci_write_config_byte(vortex, 0x40, 0xff))) {
-                       pr_info( CARD_NAME
-                              ": vortex latency is 0xff\n");
+                       dev_info(&vortex->dev, "vortex latency is 0xff\n");
        } else {
-               pr_warn( CARD_NAME
-                               ": could not set vortex latency: pci error 0x%x\n", rc);
+               dev_warn(&vortex->dev,
+                        "could not set vortex latency: pci error 0x%x\n", rc);
        }
 }
 
@@ -70,11 +69,10 @@ static void vortex_fix_agp_bridge(struct pci_dev *via)
        if (!(rc = pci_read_config_byte(via, 0x42, &value))
                        && ((value & 0x10)
                                || !(rc = pci_write_config_byte(via, 0x42, value | 0x10)))) {
-               pr_info( CARD_NAME
-                               ": bridge config is 0x%x\n", value | 0x10);
+               dev_info(&via->dev, "bridge config is 0x%x\n", value | 0x10);
        } else {
-               pr_warn( CARD_NAME
-                               ": could not set vortex latency: pci error 0x%x\n", rc);
+               dev_warn(&via->dev,
+                        "could not set vortex latency: pci error 0x%x\n", rc);
        }
 }
 
@@ -97,7 +95,8 @@ static void snd_vortex_workaround(struct pci_dev *vortex, int fix)
                                        PCI_DEVICE_ID_AMD_FE_GATE_7007, NULL);
                }
                if (via) {
-                       pr_info( CARD_NAME ": Activating latency workaround...\n");
+                       dev_info(&vortex->dev,
+                                "Activating latency workaround...\n");
                        vortex_fix_latency(vortex);
                        vortex_fix_agp_bridge(via);
                }
@@ -153,7 +152,7 @@ snd_vortex_create(struct snd_card *card, struct pci_dev *pci, vortex_t ** rchip)
                return err;
        if (pci_set_dma_mask(pci, DMA_BIT_MASK(32)) < 0 ||
            pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32)) < 0) {
-               pr_err( "error to set DMA mask\n");
+               dev_err(card->dev, "error to set DMA mask\n");
                pci_disable_device(pci);
                return -ENXIO;
        }
@@ -182,7 +181,7 @@ snd_vortex_create(struct snd_card *card, struct pci_dev *pci, vortex_t ** rchip)
 
        chip->mmio = pci_ioremap_bar(pci, 0);
        if (!chip->mmio) {
-               pr_err( "MMIO area remap failed.\n");
+               dev_err(card->dev, "MMIO area remap failed.\n");
                err = -ENOMEM;
                goto ioremap_out;
        }
@@ -191,14 +190,14 @@ snd_vortex_create(struct snd_card *card, struct pci_dev *pci, vortex_t ** rchip)
         * This must be done before we do request_irq otherwise we can get spurious
         * interrupts that we do not handle properly and make a mess of things */
        if ((err = vortex_core_init(chip)) != 0) {
-               pr_err( "hw core init failed\n");
+               dev_err(card->dev, "hw core init failed\n");
                goto core_out;
        }
 
        if ((err = request_irq(pci->irq, vortex_interrupt,
                               IRQF_SHARED, KBUILD_MODNAME,
                               chip)) != 0) {
-               pr_err( "cannot grab irq\n");
+               dev_err(card->dev, "cannot grab irq\n");
                goto irq_out;
        }
        chip->irq = pci->irq;
@@ -342,11 +341,11 @@ snd_vortex_probe(struct pci_dev *pci, const struct pci_device_id *pci_id)
        chip->rev = pci->revision;
 #ifdef CHIP_AU8830
        if ((chip->rev) != 0xfe && (chip->rev) != 0xfa) {
-               pr_alert(
-                      "vortex: The revision (%x) of your card has not been seen before.\n",
+               dev_alert(card->dev,
+                         "The revision (%x) of your card has not been seen before.\n",
                       chip->rev);
-               pr_alert(
-                      "vortex: Please email the results of 'lspci -vv' to openvortex-dev@nongnu.org.\n");
+               dev_alert(card->dev,
+                         "Please email the results of 'lspci -vv' to openvortex-dev@nongnu.org.\n");
                snd_card_free(card);
                err = -ENODEV;
                return err;
index 466a5c8e8354f2c7eb3b08cda3130405968db759..3a8fefefea77cc6b5a73aebcd9d9d89a2000d235 100644 (file)
@@ -243,7 +243,7 @@ static int vortex_core_init(vortex_t * card);
 static int vortex_core_shutdown(vortex_t * card);
 static void vortex_enable_int(vortex_t * card);
 static irqreturn_t vortex_interrupt(int irq, void *dev_id);
-static int vortex_alsafmt_aspfmt(int alsafmt);
+static int vortex_alsafmt_aspfmt(int alsafmt, vortex_t *v);
 
 /* Connection  stuff. */
 static void vortex_connect_default(vortex_t * vortex, int en);
@@ -278,7 +278,7 @@ static void vortex_mix_setvolumebyte(vortex_t * vortex, unsigned char mix,
 static void vortex_Vort3D_enable(vortex_t * v);
 static void vortex_Vort3D_disable(vortex_t * v);
 static void vortex_Vort3D_connect(vortex_t * vortex, int en);
-static void vortex_Vort3D_InitializeSource(a3dsrc_t * a, int en);
+static void vortex_Vort3D_InitializeSource(a3dsrc_t *a, int en, vortex_t *v);
 #endif
 
 /* Driver stuff. */
index 30f760e3d2c0100df9a04341d531d4b3c29b3b68..ab0f873129117b23461489309bc9f4cd883483d9 100644 (file)
@@ -484,12 +484,13 @@ static void a3dsrc_ZeroState(a3dsrc_t * a)
 }
 
 /* Reset entire A3D engine */
-static void a3dsrc_ZeroStateA3D(a3dsrc_t * a)
+static void a3dsrc_ZeroStateA3D(a3dsrc_t *a, vortex_t *v)
 {
        int i, var, var2;
 
        if ((a->vortex) == NULL) {
-               pr_err( "vortex: ZeroStateA3D: ERROR: a->vortex is NULL\n");
+               dev_err(v->card->dev,
+                       "ZeroStateA3D: ERROR: a->vortex is NULL\n");
                return;
        }
 
@@ -601,7 +602,7 @@ static void vortex_Vort3D_enable(vortex_t *v)
        Vort3DRend_Initialize(v, XT_HEADPHONE);
        for (i = 0; i < NR_A3D; i++) {
                vortex_A3dSourceHw_Initialize(v, i % 4, i >> 2);
-               a3dsrc_ZeroStateA3D(&(v->a3d[0]));
+               a3dsrc_ZeroStateA3D(&v->a3d[0], v);
        }
        /* Register ALSA controls */
        vortex_a3d_register_controls(v);
@@ -628,15 +629,15 @@ static void vortex_Vort3D_connect(vortex_t * v, int en)
        v->mixxtlk[0] =
            vortex_adb_checkinout(v, v->fixed_res, en, VORTEX_RESOURCE_MIXIN);
        if (v->mixxtlk[0] < 0) {
-               pr_warn
-                   ("vortex: vortex_Vort3D: ERROR: not enough free mixer resources.\n");
+               dev_warn(v->card->dev,
+                        "vortex_Vort3D: ERROR: not enough free mixer resources.\n");
                return;
        }
        v->mixxtlk[1] =
            vortex_adb_checkinout(v, v->fixed_res, en, VORTEX_RESOURCE_MIXIN);
        if (v->mixxtlk[1] < 0) {
-               pr_warn
-                   ("vortex: vortex_Vort3D: ERROR: not enough free mixer resources.\n");
+               dev_warn(v->card->dev,
+                        "vortex_Vort3D: ERROR: not enough free mixer resources.\n");
                return;
        }
 #endif
@@ -676,11 +677,11 @@ static void vortex_Vort3D_connect(vortex_t * v, int en)
 }
 
 /* Initialize one single A3D source. */
-static void vortex_Vort3D_InitializeSource(a3dsrc_t * a, int en)
+static void vortex_Vort3D_InitializeSource(a3dsrc_t *a, int en, vortex_t *v)
 {
        if (a->vortex == NULL) {
-               pr_warn
-                   ("vortex: Vort3D_InitializeSource: A3D source not initialized\n");
+               dev_warn(v->card->dev,
+                        "Vort3D_InitializeSource: A3D source not initialized\n");
                return;
        }
        if (en) {
index 72e81286b70eefcce14f05aaf1ae4fdb83658c74..4667c3232b7f1d48d15d637bb73019ba40675958 100644 (file)
@@ -285,8 +285,8 @@ vortex_mixer_addWTD(vortex_t * vortex, unsigned char mix, unsigned char ch)
                temp = hwread(vortex->mmio, prev);
                //printk(KERN_INFO "vortex: mixAddWTD: while addr=%x, val=%x\n", prev, temp);
                if ((++lifeboat) > 0xf) {
-                       pr_err(
-                              "vortex_mixer_addWTD: lifeboat overflow\n");
+                       dev_err(vortex->card->dev,
+                               "vortex_mixer_addWTD: lifeboat overflow\n");
                        return 0;
                }
        }
@@ -303,7 +303,7 @@ vortex_mixer_delWTD(vortex_t * vortex, unsigned char mix, unsigned char ch)
 
        eax = hwread(vortex->mmio, VORTEX_MIXER_SR);
        if (((1 << ch) & eax) == 0) {
-               pr_err( "mix ALARM %x\n", eax);
+               dev_err(vortex->card->dev, "mix ALARM %x\n", eax);
                return 0;
        }
        ebp = VORTEX_MIXER_CHNBASE + (ch << 2);
@@ -324,8 +324,8 @@ vortex_mixer_delWTD(vortex_t * vortex, unsigned char mix, unsigned char ch)
                        //printk(KERN_INFO "vortex: mixdelWTD: 1 addr=%x, val=%x, src=%x\n", ebx, edx, src);
                        while ((edx & 0xf) != mix) {
                                if ((esi) > 0xf) {
-                                       pr_err(
-                                              "vortex: mixdelWTD: error lifeboat overflow\n");
+                                       dev_err(vortex->card->dev,
+                                               "mixdelWTD: error lifeboat overflow\n");
                                        return 0;
                                }
                                esp14 = ebx;
@@ -492,7 +492,7 @@ vortex_src_persist_convratio(vortex_t * vortex, unsigned char src, int ratio)
                hwwrite(vortex->mmio, VORTEX_SRC_CONVRATIO + (src << 2), ratio);
                temp = hwread(vortex->mmio, VORTEX_SRC_CONVRATIO + (src << 2));
                if ((++lifeboat) > 0x9) {
-                       pr_err( "Vortex: Src cvr fail\n");
+                       dev_err(vortex->card->dev, "Src cvr fail\n");
                        break;
                }
        }
@@ -684,8 +684,8 @@ vortex_src_addWTD(vortex_t * vortex, unsigned char src, unsigned char ch)
                temp = hwread(vortex->mmio, prev);
                //printk(KERN_INFO "vortex: srcAddWTD: while addr=%x, val=%x\n", prev, temp);
                if ((++lifeboat) > 0xf) {
-                       pr_err(
-                              "vortex_src_addWTD: lifeboat overflow\n");
+                       dev_err(vortex->card->dev,
+                               "vortex_src_addWTD: lifeboat overflow\n");
                        return 0;
                }
        }
@@ -703,7 +703,7 @@ vortex_src_delWTD(vortex_t * vortex, unsigned char src, unsigned char ch)
 
        eax = hwread(vortex->mmio, VORTEX_SRCBLOCK_SR);
        if (((1 << ch) & eax) == 0) {
-               pr_err( "src alarm\n");
+               dev_err(vortex->card->dev, "src alarm\n");
                return 0;
        }
        ebp = VORTEX_SRC_CHNBASE + (ch << 2);
@@ -724,8 +724,8 @@ vortex_src_delWTD(vortex_t * vortex, unsigned char src, unsigned char ch)
                        //printk(KERN_INFO "vortex: srcdelWTD: 1 addr=%x, val=%x, src=%x\n", ebx, edx, src);
                        while ((edx & 0xf) != src) {
                                if ((esi) > 0xf) {
-                                       pr_warn
-                                           ("vortex: srcdelWTD: error, lifeboat overflow\n");
+                                       dev_warn(vortex->card->dev,
+                                                "srcdelWTD: error, lifeboat overflow\n");
                                        return 0;
                                }
                                esp14 = ebx;
@@ -819,8 +819,8 @@ vortex_fifo_setadbctrl(vortex_t * vortex, int fifo, int stereo, int priority,
        do {
                temp = hwread(vortex->mmio, VORTEX_FIFO_ADBCTRL + (fifo << 2));
                if (lifeboat++ > 0xbb8) {
-                       pr_err(
-                              "Vortex: vortex_fifo_setadbctrl fail\n");
+                       dev_err(vortex->card->dev,
+                               "vortex_fifo_setadbctrl fail\n");
                        break;
                }
        }
@@ -915,7 +915,8 @@ vortex_fifo_setwtctrl(vortex_t * vortex, int fifo, int ctrl, int priority,
        do {
                temp = hwread(vortex->mmio, VORTEX_FIFO_WTCTRL + (fifo << 2));
                if (lifeboat++ > 0xbb8) {
-                       pr_err( "Vortex: vortex_fifo_setwtctrl fail\n");
+                       dev_err(vortex->card->dev,
+                               "vortex_fifo_setwtctrl fail\n");
                        break;
                }
        }
@@ -1042,7 +1043,7 @@ static void vortex_fifo_init(vortex_t * vortex)
        for (x = NR_ADB - 1; x >= 0; x--) {
                hwwrite(vortex->mmio, addr, (FIFO_U0 | FIFO_U1));
                if (hwread(vortex->mmio, addr) != (FIFO_U0 | FIFO_U1))
-                       pr_err( "bad adb fifo reset!");
+                       dev_err(vortex->card->dev, "bad adb fifo reset!");
                vortex_fifo_clearadbdata(vortex, x, FIFO_SIZE);
                addr -= 4;
        }
@@ -1053,9 +1054,9 @@ static void vortex_fifo_init(vortex_t * vortex)
        for (x = NR_WT - 1; x >= 0; x--) {
                hwwrite(vortex->mmio, addr, FIFO_U0);
                if (hwread(vortex->mmio, addr) != FIFO_U0)
-                       pr_err(
-                              "bad wt fifo reset (0x%08x, 0x%08x)!\n",
-                              addr, hwread(vortex->mmio, addr));
+                       dev_err(vortex->card->dev,
+                               "bad wt fifo reset (0x%08x, 0x%08x)!\n",
+                               addr, hwread(vortex->mmio, addr));
                vortex_fifo_clearwtdata(vortex, x, FIFO_SIZE);
                addr -= 4;
        }
@@ -1213,8 +1214,9 @@ static int vortex_adbdma_bufshift(vortex_t * vortex, int adbdma)
        if (dma->period_virt >= dma->nr_periods)
                dma->period_virt -= dma->nr_periods;
        if (delta != 1)
-               pr_info( "vortex: %d virt=%d, real=%d, delta=%d\n",
-                      adbdma, dma->period_virt, dma->period_real, delta);
+               dev_info(vortex->card->dev,
+                        "%d virt=%d, real=%d, delta=%d\n",
+                        adbdma, dma->period_virt, dma->period_real, delta);
 
        return delta;
 }
@@ -1482,8 +1484,8 @@ static int vortex_wtdma_bufshift(vortex_t * vortex, int wtdma)
        dma->period_real = page;
 
        if (delta != 1)
-               pr_warn( "vortex: wt virt = %d, delta = %d\n",
-                      dma->period_virt, delta);
+               dev_warn(vortex->card->dev, "wt virt = %d, delta = %d\n",
+                        dma->period_virt, delta);
 
        return delta;
 }
@@ -1667,9 +1669,9 @@ vortex_adb_addroutes(vortex_t * vortex, unsigned char channel,
                    hwread(vortex->mmio,
                           VORTEX_ADB_RTBASE + (temp << 2)) & ADB_MASK;
                if ((lifeboat++) > ADB_MASK) {
-                       pr_err(
-                              "vortex_adb_addroutes: unending route! 0x%x\n",
-                              *route);
+                       dev_err(vortex->card->dev,
+                               "vortex_adb_addroutes: unending route! 0x%x\n",
+                               *route);
                        return;
                }
        }
@@ -1703,9 +1705,9 @@ vortex_adb_delroutes(vortex_t * vortex, unsigned char channel,
                    hwread(vortex->mmio,
                           VORTEX_ADB_RTBASE + (prev << 2)) & ADB_MASK;
                if (((lifeboat++) > ADB_MASK) || (temp == ADB_MASK)) {
-                       pr_err(
-                              "vortex_adb_delroutes: route not found! 0x%x\n",
-                              route0);
+                       dev_err(vortex->card->dev,
+                               "vortex_adb_delroutes: route not found! 0x%x\n",
+                               route0);
                        return;
                }
        }
@@ -2045,7 +2047,9 @@ vortex_adb_checkinout(vortex_t * vortex, int resmap[], int out, int restype)
                        }
                }
        }
-       pr_err( "vortex: FATAL: ResManager: resource type %d exhausted.\n", restype);
+       dev_err(vortex->card->dev,
+               "FATAL: ResManager: resource type %d exhausted.\n",
+               restype);
        return -ENOMEM;
 }
 
@@ -2173,11 +2177,13 @@ vortex_adb_allocroute(vortex_t *vortex, int dma, int nr_ch, int dir,
                                memset(stream->resources, 0,
                                       sizeof(unsigned char) *
                                       VORTEX_RESOURCE_LAST);
-                               pr_err( "vortex: out of A3D sources. Sorry\n");
+                               dev_err(vortex->card->dev,
+                                       "out of A3D sources. Sorry\n");
                                return -EBUSY;
                        }
                        /* (De)Initialize A3D hardware source. */
-                       vortex_Vort3D_InitializeSource(&(vortex->a3d[a3d]), en);
+                       vortex_Vort3D_InitializeSource(&vortex->a3d[a3d], en,
+                                                      vortex);
                }
                /* Make SPDIF out exclusive to "spdif" device when in use. */
                if ((stream->type == VORTEX_PCM_SPDIF) && (en)) {
@@ -2421,7 +2427,7 @@ static irqreturn_t vortex_interrupt(int irq, void *dev_id)
        hwread(vortex->mmio, VORTEX_IRQ_SOURCE);
        // Is at least one IRQ flag set?
        if (source == 0) {
-               pr_err( "vortex: missing irq source\n");
+               dev_err(vortex->card->dev, "missing irq source\n");
                return IRQ_NONE;
        }
 
@@ -2429,19 +2435,19 @@ static irqreturn_t vortex_interrupt(int irq, void *dev_id)
        // Attend every interrupt source.
        if (unlikely(source & IRQ_ERR_MASK)) {
                if (source & IRQ_FATAL) {
-                       pr_err( "vortex: IRQ fatal error\n");
+                       dev_err(vortex->card->dev, "IRQ fatal error\n");
                }
                if (source & IRQ_PARITY) {
-                       pr_err( "vortex: IRQ parity error\n");
+                       dev_err(vortex->card->dev, "IRQ parity error\n");
                }
                if (source & IRQ_REG) {
-                       pr_err( "vortex: IRQ reg error\n");
+                       dev_err(vortex->card->dev, "IRQ reg error\n");
                }
                if (source & IRQ_FIFO) {
-                       pr_err( "vortex: IRQ fifo error\n");
+                       dev_err(vortex->card->dev, "IRQ fifo error\n");
                }
                if (source & IRQ_DMA) {
-                       pr_err( "vortex: IRQ dma error\n");
+                       dev_err(vortex->card->dev, "IRQ dma error\n");
                }
                handled = 1;
        }
@@ -2489,7 +2495,7 @@ static irqreturn_t vortex_interrupt(int irq, void *dev_id)
        }
 
        if (!handled) {
-               pr_err( "vortex: unknown irq source %x\n", source);
+               dev_err(vortex->card->dev, "unknown irq source %x\n", source);
        }
        return IRQ_RETVAL(handled);
 }
@@ -2546,7 +2552,7 @@ vortex_codec_write(struct snd_ac97 * codec, unsigned short addr, unsigned short
        while (!(hwread(card->mmio, VORTEX_CODEC_CTRL) & 0x100)) {
                udelay(100);
                if (lifeboat++ > POLL_COUNT) {
-                       pr_err( "vortex: ac97 codec stuck busy\n");
+                       dev_err(card->card->dev, "ac97 codec stuck busy\n");
                        return;
                }
        }
@@ -2572,7 +2578,7 @@ static unsigned short vortex_codec_read(struct snd_ac97 * codec, unsigned short
        while (!(hwread(card->mmio, VORTEX_CODEC_CTRL) & 0x100)) {
                udelay(100);
                if (lifeboat++ > POLL_COUNT) {
-                       pr_err( "vortex: ac97 codec stuck busy\n");
+                       dev_err(card->card->dev, "ac97 codec stuck busy\n");
                        return 0xffff;
                }
        }
@@ -2586,7 +2592,8 @@ static unsigned short vortex_codec_read(struct snd_ac97 * codec, unsigned short
                udelay(100);
                data = hwread(card->mmio, VORTEX_CODEC_IO);
                if (lifeboat++ > POLL_COUNT) {
-                       pr_err( "vortex: ac97 address never arrived\n");
+                       dev_err(card->card->dev,
+                               "ac97 address never arrived\n");
                        return 0xffff;
                }
        } while ((data & VORTEX_CODEC_ADDMASK) !=
@@ -2683,7 +2690,7 @@ static void vortex_spdif_init(vortex_t * vortex, int spdif_sr, int spdif_mode)
 static int vortex_core_init(vortex_t *vortex)
 {
 
-       pr_info( "Vortex: init.... ");
+       dev_info(vortex->card->dev, "init started\n");
        /* Hardware Init. */
        hwwrite(vortex->mmio, VORTEX_CTRL, 0xffffffff);
        msleep(5);
@@ -2728,7 +2735,7 @@ static int vortex_core_init(vortex_t *vortex)
        //vortex_enable_timer_int(vortex);
        //vortex_disable_timer_int(vortex);
 
-       pr_info( "done.\n");
+       dev_info(vortex->card->dev, "init.... done.\n");
        spin_lock_init(&vortex->lock);
 
        return 0;
@@ -2737,7 +2744,7 @@ static int vortex_core_init(vortex_t *vortex)
 static int vortex_core_shutdown(vortex_t * vortex)
 {
 
-       pr_info( "Vortex: shutdown...");
+       dev_info(vortex->card->dev, "shutdown started\n");
 #ifndef CHIP_AU8820
        vortex_eq_free(vortex);
        vortex_Vort3D_disable(vortex);
@@ -2759,13 +2766,13 @@ static int vortex_core_shutdown(vortex_t * vortex)
        msleep(5);
        hwwrite(vortex->mmio, VORTEX_IRQ_SOURCE, 0xffff);
 
-       pr_info( "done.\n");
+       dev_info(vortex->card->dev, "shutdown.... done.\n");
        return 0;
 }
 
 /* Alsa support. */
 
-static int vortex_alsafmt_aspfmt(int alsafmt)
+static int vortex_alsafmt_aspfmt(int alsafmt, vortex_t *v)
 {
        int fmt;
 
@@ -2793,7 +2800,8 @@ static int vortex_alsafmt_aspfmt(int alsafmt)
                break;
        default:
                fmt = 0x8;
-               pr_err( "vortex: format unsupported %d\n", alsafmt);
+               dev_err(v->card->dev,
+                       "format unsupported %d\n", alsafmt);
                break;
        }
        return fmt;
index 9404ba73eaf6140ccdabf0576ab04f096fde94f9..9585c5c63b9636809fa04e591ea8b3a4eff0fb55 100644 (file)
@@ -845,7 +845,8 @@ snd_vortex_peaks_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *u
 
        vortex_Eqlzr_GetAllPeaks(vortex, peaks, &count);
        if (count != 20) {
-               pr_err( "vortex: peak count error 20 != %d \n", count);
+               dev_err(vortex->card->dev,
+                       "peak count error 20 != %d\n", count);
                return -1;
        }
        for (i = 0; i < 20; i++)
index 72daf6cf81695602ce77efd7f7e7aeeab9069af2..151815b857a0d5cb339adc5976b96aa5e573b059 100644 (file)
@@ -98,7 +98,8 @@ static int vortex_gameport_register(vortex_t *vortex)
 
        vortex->gameport = gp = gameport_allocate_port();
        if (!gp) {
-               pr_err( "vortex: cannot allocate memory for gameport\n");
+               dev_err(vortex->card->dev,
+                       "cannot allocate memory for gameport\n");
                return -ENOMEM;
        }
 
index 328c1943c0c341725a55c926229c40c23cad1668..1025e55ca854dddc8b0f0fc19f0bea403b4c9217 100644 (file)
@@ -73,7 +73,7 @@ static int snd_vortex_midi(vortex_t *vortex)
        /* Check if anything is OK. */
        temp = hwread(vortex->mmio, VORTEX_MIDI_DATA);
        if (temp != MPU401_ACK /*0xfe */ ) {
-               pr_err( "midi port doesn't acknowledge!\n");
+               dev_err(vortex->card->dev, "midi port doesn't acknowledge!\n");
                return -ENODEV;
        }
        /* Enable MPU401 interrupts. */
index 5adc6b92ffabc9f893cc4b7f4c0b29f8428d5f96..a6d6d8d0867add5446fd6a0126cca7b7041d8d3b 100644 (file)
@@ -227,7 +227,7 @@ snd_vortex_pcm_hw_params(struct snd_pcm_substream *substream,
        err =
            snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
        if (err < 0) {
-               pr_err( "Vortex: pcm page alloc failed!\n");
+               dev_err(chip->card->dev, "Vortex: pcm page alloc failed!\n");
                return err;
        }
        /*
@@ -332,7 +332,7 @@ static int snd_vortex_pcm_prepare(struct snd_pcm_substream *substream)
                dir = 1;
        else
                dir = 0;
-       fmt = vortex_alsafmt_aspfmt(runtime->format);
+       fmt = vortex_alsafmt_aspfmt(runtime->format, chip);
        spin_lock_irq(&chip->lock);
        if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_WT) {
                vortex_adbdma_setmode(chip, dma, 1, dir, fmt,
@@ -371,7 +371,7 @@ static int snd_vortex_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
                }
 #ifndef CHIP_AU8810
                else {
-                       pr_info( "vortex: wt start %d\n", dma);
+                       dev_info(chip->card->dev, "wt start %d\n", dma);
                        vortex_wtdma_startfifo(chip, dma);
                }
 #endif
@@ -384,7 +384,7 @@ static int snd_vortex_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
                        vortex_adbdma_stopfifo(chip, dma);
 #ifndef CHIP_AU8810
                else {
-                       pr_info( "vortex: wt stop %d\n", dma);
+                       dev_info(chip->card->dev, "wt stop %d\n", dma);
                        vortex_wtdma_stopfifo(chip, dma);
                }
 #endif
index f094bac24291297e2d82441247733a9e2d7f5f6b..78e12f4796f32d1252ab0961cfa409c30d08bffb 100644 (file)
@@ -90,7 +90,7 @@ static int vortex_wt_allocroute(vortex_t * vortex, int wt, int nr_ch)
        hwwrite(vortex->mmio, WT_PARM(wt, 2), 0);
 
        temp = hwread(vortex->mmio, WT_PARM(wt, 3));
-       pr_debug( "vortex: WT PARM3: %x\n", temp);
+       dev_dbg(vortex->card->dev, "WT PARM3: %x\n", temp);
        //hwwrite(vortex->mmio, WT_PARM(wt, 3), temp);
 
        hwwrite(vortex->mmio, WT_DELAY(wt, 0), 0);
@@ -98,7 +98,8 @@ static int vortex_wt_allocroute(vortex_t * vortex, int wt, int nr_ch)
        hwwrite(vortex->mmio, WT_DELAY(wt, 2), 0);
        hwwrite(vortex->mmio, WT_DELAY(wt, 3), 0);
 
-       pr_debug( "vortex: WT GMODE: %x\n", hwread(vortex->mmio, WT_GMODE(wt)));
+       dev_dbg(vortex->card->dev, "WT GMODE: %x\n",
+               hwread(vortex->mmio, WT_GMODE(wt)));
 
        hwwrite(vortex->mmio, WT_PARM(wt, 2), 0xffffffff);
        hwwrite(vortex->mmio, WT_PARM(wt, 3), 0xcff1c810);
@@ -106,7 +107,8 @@ static int vortex_wt_allocroute(vortex_t * vortex, int wt, int nr_ch)
        voice->parm0 = voice->parm1 = 0xcfb23e2f;
        hwwrite(vortex->mmio, WT_PARM(wt, 0), voice->parm0);
        hwwrite(vortex->mmio, WT_PARM(wt, 1), voice->parm1);
-       pr_debug( "vortex: WT GMODE 2 : %x\n", hwread(vortex->mmio, WT_GMODE(wt)));
+       dev_dbg(vortex->card->dev, "WT GMODE 2 : %x\n",
+               hwread(vortex->mmio, WT_GMODE(wt)));
        return 0;
 }
 
@@ -196,14 +198,15 @@ vortex_wt_SetReg(vortex_t * vortex, unsigned char reg, int wt,
 
        if ((reg == 5) || ((reg >= 7) && (reg <= 10)) || (reg == 0xc)) {
                if (wt >= (NR_WT / NR_WT_PB)) {
-                       pr_warn
-                           ("vortex: WT SetReg: bank out of range. reg=0x%x, wt=%d\n",
-                            reg, wt);
+                       dev_warn(vortex->card->dev,
+                                "WT SetReg: bank out of range. reg=0x%x, wt=%d\n",
+                                reg, wt);
                        return 0;
                }
        } else {
                if (wt >= NR_WT) {
-                       pr_err( "vortex: WT SetReg: voice out of range\n");
+                       dev_err(vortex->card->dev,
+                               "WT SetReg: voice out of range\n");
                        return 0;
                }
        }
index 45465907439002b4bf879462f4c6f97955dc9255..632e843fa95e3baf32737a938cf2c9db91bc2873 100644 (file)
@@ -1145,7 +1145,6 @@ static int atc_release_resources(struct ct_atc *atc)
        int i;
        struct daio_mgr *daio_mgr = NULL;
        struct dao *dao = NULL;
-       struct dai *dai = NULL;
        struct daio *daio = NULL;
        struct sum_mgr *sum_mgr = NULL;
        struct src_mgr *src_mgr = NULL;
@@ -1172,9 +1171,6 @@ static int atc_release_resources(struct ct_atc *atc)
                                dao = container_of(daio, struct dao, daio);
                                dao->ops->clear_left_input(dao);
                                dao->ops->clear_right_input(dao);
-                       } else {
-                               dai = container_of(daio, struct dai, daio);
-                               /* some thing to do for dai ... */
                        }
                        daio_mgr->put_daio(daio_mgr, daio);
                }
index 64220c08bd982b01851ab13b70660104d2d6e2d2..06d721085e722d25584de3132c85841d3b69cdc2 100644 (file)
@@ -1038,11 +1038,24 @@ static const char *get_line_out_pfx(struct hda_codec *codec, int ch,
                        break;
                *index = ch;
                return "Headphone";
+       case AUTO_PIN_LINE_OUT:
+               /* This deals with the case where we have two DACs and
+                * one LO, one HP and one Speaker */
+               if (!ch && cfg->speaker_outs && cfg->hp_outs) {
+                       bool hp_lo_shared = !path_has_mixer(codec, spec->hp_paths[0], ctl_type);
+                       bool spk_lo_shared = !path_has_mixer(codec, spec->speaker_paths[0], ctl_type);
+                       if (hp_lo_shared && spk_lo_shared)
+                               return spec->vmaster_mute.hook ? "PCM" : "Master";
+                       if (hp_lo_shared)
+                               return "Headphone+LO";
+                       if (spk_lo_shared)
+                               return "Speaker+LO";
+               }
        }
 
        /* for a single channel output, we don't have to name the channel */
        if (cfg->line_outs == 1 && !spec->multi_ios)
-               return "PCM";
+               return "Line Out";
 
        if (ch >= ARRAY_SIZE(channel_name)) {
                snd_BUG();
@@ -4524,7 +4537,7 @@ static const char * const slave_pfxs[] = {
        "CLFE", "Bass Speaker", "PCM",
        "Speaker Front", "Speaker Surround", "Speaker CLFE", "Speaker Side",
        "Headphone Front", "Headphone Surround", "Headphone CLFE",
-       "Headphone Side",
+       "Headphone Side", "Headphone+LO", "Speaker+LO",
        NULL,
 };
 
index 39862e98551c41466505ee7b1764496e04799880..9dc9cf8c90e97bd5d0faa08bedae29139e43d3bc 100644 (file)
@@ -1583,19 +1583,22 @@ static bool hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll)
                }
        }
 
-       if (pin_eld->eld_valid && !eld->eld_valid) {
-               update_eld = true;
+       if (pin_eld->eld_valid != eld->eld_valid)
                eld_changed = true;
-       }
+
+       if (pin_eld->eld_valid && !eld->eld_valid)
+               update_eld = true;
+
        if (update_eld) {
                bool old_eld_valid = pin_eld->eld_valid;
                pin_eld->eld_valid = eld->eld_valid;
-               eld_changed = pin_eld->eld_size != eld->eld_size ||
+               if (pin_eld->eld_size != eld->eld_size ||
                              memcmp(pin_eld->eld_buffer, eld->eld_buffer,
-                                    eld->eld_size) != 0;
-               if (eld_changed)
+                                    eld->eld_size) != 0) {
                        memcpy(pin_eld->eld_buffer, eld->eld_buffer,
                               eld->eld_size);
+                       eld_changed = true;
+               }
                pin_eld->eld_size = eld->eld_size;
                pin_eld->info = eld->info;
 
index bc86c36b4bfa39b383f113b5dbd377b0c8ffd22d..4c35490cf1198642778307156183728fbf28f814 100644 (file)
@@ -2884,6 +2884,9 @@ static void alc283_shutup(struct hda_codec *codec)
 
        alc_write_coef_idx(codec, 0x43, 0x9004);
 
+       /*depop hp during suspend*/
+       alc_write_coef_idx(codec, 0x06, 0x2100);
+
        snd_hda_codec_write(codec, hp_pin, 0,
                            AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
 
index 2e4a9dbc51faeca29529da8d231d779a10b92aed..63a8adb1705ea06a0a038ea5bf6601f98341deec 100644 (file)
@@ -1290,9 +1290,8 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc,
                                                    kctl->id.name,
                                                    sizeof(kctl->id.name), 1);
                        if (!len)
-                               len = snprintf(kctl->id.name,
-                                              sizeof(kctl->id.name),
-                                              "Feature %d", unitid);
+                               snprintf(kctl->id.name, sizeof(kctl->id.name),
+                                        "Feature %d", unitid);
                }
 
                if (!mapped_name)
@@ -1305,9 +1304,9 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc,
                 */
                if (!mapped_name && !(state->oterm.type >> 16)) {
                        if ((state->oterm.type & 0xff00) == 0x0100)
-                               len = append_ctl_name(kctl, " Capture");
+                               append_ctl_name(kctl, " Capture");
                        else
-                               len = append_ctl_name(kctl, " Playback");
+                               append_ctl_name(kctl, " Playback");
                }
                append_ctl_name(kctl, control == UAC_FU_MUTE ?
                                " Switch" : " Volume");
index 223c47b33ba30e767c7af227c974a57471d02b90..c657752a420c024aba8c61fa8ced9b8971434fcf 100644 (file)
@@ -384,6 +384,36 @@ YAMAHA_DEVICE(0x105d, NULL),
                }
        }
 },
+{
+       USB_DEVICE(0x0499, 0x1509),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               /* .vendor_name = "Yamaha", */
+               /* .product_name = "Steinberg UR22", */
+               .ifnum = QUIRK_ANY_INTERFACE,
+               .type = QUIRK_COMPOSITE,
+               .data = (const struct snd_usb_audio_quirk[]) {
+                       {
+                               .ifnum = 1,
+                               .type = QUIRK_AUDIO_STANDARD_INTERFACE
+                       },
+                       {
+                               .ifnum = 2,
+                               .type = QUIRK_AUDIO_STANDARD_INTERFACE
+                       },
+                       {
+                               .ifnum = 3,
+                               .type = QUIRK_MIDI_YAMAHA
+                       },
+                       {
+                               .ifnum = 4,
+                               .type = QUIRK_IGNORE_INTERFACE
+                       },
+                       {
+                               .ifnum = -1
+                       }
+               }
+       }
+},
 {
        USB_DEVICE(0x0499, 0x150a),
        .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {