tristate "SA11xx UDA1341TS driver (iPaq H3600)"
        depends on ARCH_SA1100 && SND && L3
        select SND_PCM
+       select SND_GENERIC_DRIVER
        help
          Say Y here if you have a Compaq iPaq H3x00 handheld computer
          and want to use its Philips UDA 1341 audio chip.
 
  *                              merged HAL layer (patches from Brian)
  */
 
-/* $Id: sa11xx-uda1341.c,v 1.21 2005/01/28 19:34:04 tiwai Exp $ */
+/* $Id: sa11xx-uda1341.c,v 1.22 2005/09/05 16:17:58 tiwai Exp $ */
 
 /***************************************************************************************************
 *
        strcpy(card->shortname, "H3600 UDA1341TS");
        sprintf(card->longname, "Compaq iPAQ H3600 with Philips UDA1341TS");
         
+       if ((err = snd_card_set_generic_dev(card)) < 0)
+               goto nodev;
+
        if ((err = snd_card_register(card)) == 0) {
                printk( KERN_INFO "iPAQ audio support initialized\n" );
                return 0;
 
        tristate "Dummy (/dev/null) soundcard"
        depends on SND
        select SND_PCM
+       select SND_GENERIC_DRIVER
        help
          Say Y here to include the dummy driver.  This driver does
          nothing, but emulates various mixer controls and PCM devices.
        depends on SND_SEQUENCER
        select SND_TIMER
        select SND_RAWMIDI
+       select SND_GENERIC_DRIVER
        help
          Say Y here to include the virtual MIDI driver.  This driver
          allows to connect applications using raw MIDI devices to
        depends on SND
        select SND_TIMER
        select SND_RAWMIDI
+       select SND_GENERIC_DRIVER
        help
          To use a MOTU MidiTimePiece AV multiport MIDI adapter
          connected to the parallel port, say Y here and make sure that
        depends on SND
        select SND_TIMER
        select SND_RAWMIDI
+       select SND_GENERIC_DRIVER
        help
          To include support for MIDI serial port interfaces, say Y here
          and read <file:Documentation/sound/alsa/serial-u16550.txt>.
        tristate "Generic MPU-401 UART driver"
        depends on SND
        select SND_MPU401_UART
+       select SND_GENERIC_DRIVER
        help
          Say Y here to include support for MIDI ports compatible with
          the Roland MPU-401 interface in UART mode.
 
        strcpy(card->driver, "Dummy");
        strcpy(card->shortname, "Dummy");
        sprintf(card->longname, "Dummy %i", dev + 1);
+
+       if ((err = snd_card_set_generic_dev(card)) < 0)
+               goto __nodev;
+
        if ((err = snd_card_register(card)) == 0) {
                snd_dummy_cards[dev] = card;
                return 0;
 
                strcat(card->longname, "polled");
        }
 
-       if (snd_mpu401_uart_new(card, 0,
-                               MPU401_HW_MPU401,
-                               port[dev], 0,
-                               irq[dev], irq[dev] >= 0 ? SA_INTERRUPT : 0, NULL) < 0) {
+       if ((err = snd_mpu401_uart_new(card, 0,
+                                      MPU401_HW_MPU401,
+                                      port[dev], 0,
+                                      irq[dev], irq[dev] >= 0 ? SA_INTERRUPT : 0, NULL)) < 0) {
                printk(KERN_ERR "MPU401 not detected at 0x%lx\n", port[dev]);
-               snd_card_free(card);
-               return -ENODEV;
-       }
-       if ((err = snd_card_register(card)) < 0) {
-               snd_card_free(card);
-               return err;
+               goto _err;
        }
+
+       if ((err = snd_card_set_generic_dev(card)) < 0)
+               goto _err;
+
+       if ((err = snd_card_register(card)) < 0)
+               goto _err;
+
        *rcard = card;
        return 0;
+
+ _err:
+       snd_card_free(card);
+       return err;
 }
 
 static int __devinit snd_mpu401_probe(int dev)
 
        if (err < 0)
                goto __error;
 
+       if ((err = snd_card_set_generic_dev(mtp_card->card)) < 0)
+               goto __error;
+
        err = snd_card_register(mtp_card->card);        // don't snd_card_register until AFTER all cards reources done!
 
        //printk("snd_card_register returned %d\n", err);
 
                                        base[dev],
                                        adaptor[dev],
                                        droponfull[dev],
-                                       &uart)) < 0) {
-               snd_card_free(card);
-               return err;
-       }
+                                       &uart)) < 0)
+               goto _err;
 
-       if ((err = snd_uart16550_rmidi(uart, 0, outs[dev], ins[dev], &uart->rmidi)) < 0) {
-               snd_card_free(card);
-               return err;
-       }
+       if ((err = snd_uart16550_rmidi(uart, 0, outs[dev], ins[dev], &uart->rmidi)) < 0)
+               goto _err;
 
        sprintf(card->longname, "%s at 0x%lx, irq %d speed %d div %d outs %d ins %d adaptor %s droponfull %d",
                card->shortname,
                adaptor_names[uart->adaptor],
                uart->drop_on_full);
 
-       if ((err = snd_card_register(card)) < 0) {
-               snd_card_free(card);
-               return err;
-       }
+       if ((err = snd_card_set_generic_dev(card)) < 0)
+               goto _err;
+
+       if ((err = snd_card_register(card)) < 0)
+               goto _err;
+
        snd_serial_cards[dev] = card;
        return 0;
+
+ _err:
+       snd_card_free(card);
+       return err;
 }
 
 static int __init alsa_card_serial_init(void)
 
        strcpy(card->driver, "VirMIDI");
        strcpy(card->shortname, "VirMIDI");
        sprintf(card->longname, "Virtual MIDI Card %i", dev + 1);
+
+       if ((err = snd_card_set_generic_dev(card)) < 0)
+               goto __nodev;
+
        if ((err = snd_card_register(card)) == 0) {
                snd_virmidi_cards[dev] = card;
                return 0;
 
        depends on (SOC_AU1000 || SOC_AU1100 || SOC_AU1500) && SND
        select SND_PCM
        select SND_AC97_CODEC
+       select SND_GENERIC_DRIVER
        help
          ALSA Sound driver for the Au1x00's AC97 port.
 
 
        strcpy(au1000->card->shortname, "Au1000-AC97");
        sprintf(au1000->card->longname, "AMD Au1000--AC97 ALSA Driver");
 
+       if ((err = snd_card_set_generic_dev(au1000->card)) < 0) {
+               snd_card_free(au1000->card);
+               return err;
+       }
+
        if ((err = snd_card_register(au1000->card)) < 0) {
                snd_card_free(au1000->card);
                return err;
 
        tristate "PowerMac (AWACS, DACA, Burgundy, Tumbler, Keywest)"
        depends on SND && I2C && INPUT && PPC_PMAC
        select SND_PCM
+       select SND_GENERIC_DRIVER
        help
          Say Y here to include support for the integrated sound device.
 
 
        if (enable_beep)
                snd_pmac_attach_beep(chip);
 
+       if ((err = snd_card_set_generic_dev(card)) < 0)
+               goto __error;
+
        if ((err = snd_card_register(card)) < 0)
                goto __error;
 
 
        tristate "Sun AMD7930"
        depends on SBUS && SND
        select SND_PCM
+       select SND_GENERIC_DRIVER
        help
          Say Y here to include support for AMD7930 sound device on Sun.
 
        tristate "Sun CS4231"
        depends on SND
        select SND_PCM
+       select SND_GENERIC_DRIVER
        help
          Say Y here to include support for CS4231 sound device on Sun.
 
        tristate "Sun DBRI"
        depends on SND && SBUS
        select SND_PCM
+       select SND_GENERIC_DRIVER
        help
          Say Y here to include support for DBRI sound device on Sun.
 
 
        if ((err = snd_amd7930_mixer(amd)) < 0)
                goto out_err;
 
+       if ((err = snd_card_set_generic_dev(card)) < 0)
+               goto out_err;
+
        if ((err = snd_card_register(card)) < 0)
                goto out_err;
 
 
        if ((err = snd_cs4231_timer(chip)) < 0)
                goto out_err;
 
+       if ((err = snd_card_set_generic_dev(card)) < 0)
+               goto out_err;
+
        if ((err = snd_card_register(card)) < 0)
                goto out_err;
 
 
        }
 
        dbri = (snd_dbri_t *) card->private_data;
-       if ((err = snd_dbri_pcm(dbri)) < 0) {
-               snd_dbri_free(dbri);
-               snd_card_free(card);
-               return err;
-       }
+       if ((err = snd_dbri_pcm(dbri)) < 0)
+               goto _err;
 
-       if ((err = snd_dbri_mixer(dbri)) < 0) {
-               snd_dbri_free(dbri);
-               snd_card_free(card);
-               return err;
-       }
+       if ((err = snd_dbri_mixer(dbri)) < 0)
+               goto _err;
 
        /* /proc file handling */
        snd_dbri_proc(dbri);
 
-       if ((err = snd_card_register(card)) < 0) {
-               snd_dbri_free(dbri);
-               snd_card_free(card);
-               return err;
-       }
+       if ((err = snd_card_set_generic_dev(card)) < 0)
+               goto _err;
+
+       if ((err = snd_card_register(card)) < 0)
+               goto _err;
 
        printk(KERN_INFO "audio%d at %p (irq %d) is DBRI(%c)+CS4215(%d)\n",
               dev, dbri->regs,
        dev++;
 
        return 0;
+
+ _err:
+       snd_dbri_free(dbri);
+       snd_card_free(card);
+       return err;
 }
 
 /* Probe for the dbri chip and then attach the driver. */