ALSA: hwdep: Don't embed device
authorTakashi Iwai <tiwai@suse.de>
Wed, 16 Aug 2023 16:02:47 +0000 (18:02 +0200)
committerTakashi Iwai <tiwai@suse.de>
Thu, 17 Aug 2023 07:24:01 +0000 (09:24 +0200)
Like control and PCM devices, it's better to avoid the embedded struct
device for hwdep (although it's more or less well working), too.
Change it to allocate via snd_device_alloc(), and free the memory at
the common snd_hwdep_free().

Reviewed-by: Jaroslav Kysela <perex@perex.cz>
Signed-off-by: Curtis Malainey <cujomalainey@chromium.org>
Tested-by: Curtis Malainey <cujomalainey@chromium.org>
Link: https://lore.kernel.org/r/20230816160252.23396-5-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/sound/hwdep.h
sound/core/hwdep.c
sound/pci/hda/hda_hwdep.c

index 8d6cdb2..b0da633 100644 (file)
@@ -53,7 +53,7 @@ struct snd_hwdep {
        wait_queue_head_t open_wait;
        void *private_data;
        void (*private_free) (struct snd_hwdep *hwdep);
-       struct device dev;
+       struct device *dev;
 
        struct mutex open_mutex;
        int used;                       /* reference counter */
index e95fa27..de74760 100644 (file)
@@ -338,9 +338,14 @@ static const struct file_operations snd_hwdep_f_ops =
        .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);
 }
 
 /**
@@ -382,16 +387,20 @@ int snd_hwdep_new(struct snd_card *card, char *id, int device,
        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;
        }
 
@@ -403,12 +412,7 @@ EXPORT_SYMBOL(snd_hwdep_new);
 
 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;
 }
 
@@ -426,9 +430,9 @@ static int snd_hwdep_dev_register(struct snd_device *device)
        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(&register_mutex);
                return err;
@@ -439,12 +443,12 @@ static int snd_hwdep_dev_register(struct snd_device *device)
        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;
@@ -471,7 +475,7 @@ static int snd_hwdep_dev_disconnect(struct snd_device *device)
        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(&register_mutex);
index 125e97f..727f39a 100644 (file)
@@ -114,8 +114,8 @@ int snd_hda_create_hwdep(struct hda_codec *codec)
 #endif
 
        /* for sysfs */
-       hwdep->dev.groups = snd_hda_dev_attr_groups;
-       dev_set_drvdata(&hwdep->dev, codec);
+       hwdep->dev->groups = snd_hda_dev_attr_groups;
+       dev_set_drvdata(hwdep->dev, codec);
 
        return 0;
 }