.mmap =         snd_hwdep_mmap,
 };
 
-static void release_hwdep_device(struct device *dev)
+static void snd_hwdep_free(struct snd_hwdep *hwdep)
 {
-       kfree(container_of(dev, struct snd_hwdep, dev));
+       if (!hwdep)
+               return;
+       if (hwdep->private_free)
+               hwdep->private_free(hwdep);
+       put_device(hwdep->dev);
+       kfree(hwdep);
 }
 
 /**
        if (id)
                strscpy(hwdep->id, id, sizeof(hwdep->id));
 
-       snd_device_initialize(&hwdep->dev, card);
-       hwdep->dev.release = release_hwdep_device;
-       dev_set_name(&hwdep->dev, "hwC%iD%i", card->number, device);
+       err = snd_device_alloc(&hwdep->dev, card);
+       if (err < 0) {
+               snd_hwdep_free(hwdep);
+               return err;
+       }
+
+       dev_set_name(hwdep->dev, "hwC%iD%i", card->number, device);
 #ifdef CONFIG_SND_OSSEMUL
        hwdep->oss_type = -1;
 #endif
 
        err = snd_device_new(card, SNDRV_DEV_HWDEP, hwdep, &ops);
        if (err < 0) {
-               put_device(&hwdep->dev);
+               snd_hwdep_free(hwdep);
                return err;
        }
 
 
 static int snd_hwdep_dev_free(struct snd_device *device)
 {
-       struct snd_hwdep *hwdep = device->device_data;
-       if (!hwdep)
-               return 0;
-       if (hwdep->private_free)
-               hwdep->private_free(hwdep);
-       put_device(&hwdep->dev);
+       snd_hwdep_free(device->device_data);
        return 0;
 }
 
        list_add_tail(&hwdep->list, &snd_hwdep_devices);
        err = snd_register_device(SNDRV_DEVICE_TYPE_HWDEP,
                                  hwdep->card, hwdep->device,
-                                 &snd_hwdep_f_ops, hwdep, &hwdep->dev);
+                                 &snd_hwdep_f_ops, hwdep, hwdep->dev);
        if (err < 0) {
-               dev_err(&hwdep->dev, "unable to register\n");
+               dev_err(hwdep->dev, "unable to register\n");
                list_del(&hwdep->list);
                mutex_unlock(®ister_mutex);
                return err;
        if (hwdep->oss_type >= 0) {
                if (hwdep->oss_type == SNDRV_OSS_DEVICE_TYPE_DMFM &&
                    hwdep->device)
-                       dev_warn(&hwdep->dev,
+                       dev_warn(hwdep->dev,
                                 "only hwdep device 0 can be registered as OSS direct FM device!\n");
                else if (snd_register_oss_device(hwdep->oss_type,
                                                 card, hwdep->device,
                                                 &snd_hwdep_f_ops, hwdep) < 0)
-                       dev_warn(&hwdep->dev,
+                       dev_warn(hwdep->dev,
                                 "unable to register OSS compatibility device\n");
                else
                        hwdep->ossreg = 1;
        if (hwdep->ossreg)
                snd_unregister_oss_device(hwdep->oss_type, hwdep->card, hwdep->device);
 #endif
-       snd_unregister_device(&hwdep->dev);
+       snd_unregister_device(hwdep->dev);
        list_del_init(&hwdep->list);
        mutex_unlock(&hwdep->open_mutex);
        mutex_unlock(®ister_mutex);