ALSA: rawmidi: Embed struct device
authorTakashi Iwai <tiwai@suse.de>
Thu, 29 Jan 2015 16:55:52 +0000 (17:55 +0100)
committerTakashi Iwai <tiwai@suse.de>
Mon, 2 Feb 2015 13:42:43 +0000 (14:42 +0100)
Like previous patches, this changes the device management for rawmidi,
embedding the struct device into struct snd_rawmidi.  The required
change is more or less same as hwdep device.

The currently unused dev field is reused as the new embedded struct
field now.

Reviewed-by: Jaroslav Kysela <perex@perex.cz>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/sound/rawmidi.h
sound/core/rawmidi.c

index 311dafe6cc4b508ecc372ba45d8f647d55b44f9c..f6cbef78db620f2ff85c02126f9a9518553cf2c1 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/wait.h>
 #include <linux/mutex.h>
 #include <linux/workqueue.h>
+#include <linux/device.h>
 
 #if defined(CONFIG_SND_SEQUENCER) || defined(CONFIG_SND_SEQUENCER_MODULE)
 #include <sound/seq_device.h>
@@ -139,7 +140,8 @@ struct snd_rawmidi {
        struct mutex open_mutex;
        wait_queue_head_t open_wait;
 
-       struct snd_info_entry *dev;
+       struct device dev;
+
        struct snd_info_entry *proc_entry;
 
 #if defined(CONFIG_SND_SEQUENCER) || defined(CONFIG_SND_SEQUENCER_MODULE)
index be18162c380f15257e6a1a6c77b7f7ae90e13559..932396c81035966bb552b2a4bdd7eb44bd42e78c 100644 (file)
@@ -1443,6 +1443,11 @@ static int snd_rawmidi_alloc_substreams(struct snd_rawmidi *rmidi,
        return 0;
 }
 
+static void release_rawmidi_device(struct device *dev)
+{
+       kfree(container_of(dev, struct snd_rawmidi, dev));
+}
+
 /**
  * snd_rawmidi_new - create a rawmidi instance
  * @card: the card instance
@@ -1487,6 +1492,11 @@ int snd_rawmidi_new(struct snd_card *card, char *id, int device,
 
        if (id != NULL)
                strlcpy(rmidi->id, id, sizeof(rmidi->id));
+
+       snd_device_initialize(&rmidi->dev, card);
+       rmidi->dev.release = release_rawmidi_device;
+       dev_set_name(&rmidi->dev, "midiC%iD%i", card->number, device);
+
        if ((err = snd_rawmidi_alloc_substreams(rmidi,
                                                &rmidi->streams[SNDRV_RAWMIDI_STREAM_INPUT],
                                                SNDRV_RAWMIDI_STREAM_INPUT,
@@ -1538,7 +1548,7 @@ static int snd_rawmidi_free(struct snd_rawmidi *rmidi)
        snd_rawmidi_free_substreams(&rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT]);
        if (rmidi->private_free)
                rmidi->private_free(rmidi);
-       kfree(rmidi);
+       put_device(&rmidi->dev);
        return 0;
 }
 
@@ -1571,12 +1581,12 @@ static int snd_rawmidi_dev_register(struct snd_device *device)
                return -EBUSY;
        }
        list_add_tail(&rmidi->list, &snd_rawmidi_devices);
-       sprintf(name, "midiC%iD%i", rmidi->card->number, rmidi->device);
-       if ((err = snd_register_device(SNDRV_DEVICE_TYPE_RAWMIDI,
-                                      rmidi->card, rmidi->device,
-                                      &snd_rawmidi_f_ops, rmidi, name)) < 0) {
-               rmidi_err(rmidi, "unable to register rawmidi device %i:%i\n",
-                         rmidi->card->number, rmidi->device);
+       err = snd_register_device_for_dev(SNDRV_DEVICE_TYPE_RAWMIDI,
+                                         rmidi->card, rmidi->device,
+                                         &snd_rawmidi_f_ops, rmidi,
+                                         &rmidi->dev, NULL, NULL);
+       if (err < 0) {
+               rmidi_err(rmidi, "unable to register\n");
                list_del(&rmidi->list);
                mutex_unlock(&register_mutex);
                return err;