#ifdef CONFIG_PM_SLEEP
 static int do_pcm_suspend(struct device *dev)
 {
-       struct snd_pcm_str *pstr = container_of(dev, struct snd_pcm_str, dev);
+       struct snd_pcm_str *pstr = dev_get_drvdata(dev);
 
        if (!pstr->pcm->no_device_suspend)
                snd_pcm_suspend_all(pstr->pcm);
        if (!substream_count)
                return 0;
 
-       snd_device_initialize(&pstr->dev, pcm->card);
-       pstr->dev.groups = pcm_dev_attr_groups;
-       pstr->dev.type = &pcm_dev_type;
-       dev_set_name(&pstr->dev, "pcmC%iD%i%c", pcm->card->number, pcm->device,
+       err = snd_device_alloc(&pstr->dev, pcm->card);
+       if (err < 0)
+               return err;
+       dev_set_name(pstr->dev, "pcmC%iD%i%c", pcm->card->number, pcm->device,
                     stream == SNDRV_PCM_STREAM_PLAYBACK ? 'p' : 'c');
+       pstr->dev->groups = pcm_dev_attr_groups;
+       pstr->dev->type = &pcm_dev_type;
+       dev_set_drvdata(pstr->dev, pstr);
 
        if (!pcm->internal) {
                err = snd_pcm_stream_proc_init(pstr);
 #endif
        free_chmap(pstr);
        if (pstr->substream_count)
-               put_device(&pstr->dev);
+               put_device(pstr->dev);
 }
 
 #if IS_ENABLED(CONFIG_SND_PCM_OSS)
 static ssize_t pcm_class_show(struct device *dev,
                              struct device_attribute *attr, char *buf)
 {
-       struct snd_pcm_str *pstr = container_of(dev, struct snd_pcm_str, dev);
+       struct snd_pcm_str *pstr = dev_get_drvdata(dev);
        struct snd_pcm *pcm = pstr->pcm;
        const char *str;
        static const char *strs[SNDRV_PCM_CLASS_LAST + 1] = {
                /* register pcm */
                err = snd_register_device(devtype, pcm->card, pcm->device,
                                          &snd_pcm_f_ops[cidx], pcm,
-                                         &pcm->streams[cidx].dev);
+                                         pcm->streams[cidx].dev);
                if (err < 0) {
                        list_del_init(&pcm->list);
                        goto unlock;
 
        pcm_call_notify(pcm, n_disconnect);
        for (cidx = 0; cidx < 2; cidx++) {
-               snd_unregister_device(&pcm->streams[cidx].dev);
+               if (pcm->streams[cidx].dev)
+                       snd_unregister_device(pcm->streams[cidx].dev);
                free_chmap(&pcm->streams[cidx]);
        }
        mutex_unlock(&pcm->open_mutex);