]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - sound/core/init.c
Bluetooth: btusb: Use matching names for Broadcom firmware files
[mirror_ubuntu-zesty-kernel.git] / sound / core / init.c
index 074875d68c156745519987f24d22058ca4c398b4..35419054821c3deab7e590b6a586f05d1282d055 100644 (file)
@@ -157,8 +157,31 @@ static int get_slot_from_bitmask(int mask, int (*check)(struct module *, int),
        return mask; /* unchanged */
 }
 
+/* the default release callback set in snd_device_initialize() below;
+ * this is just NOP for now, as almost all jobs are already done in
+ * dev_free callback of snd_device chain instead.
+ */
+static void default_release(struct device *dev)
+{
+}
+
+/**
+ * snd_device_initialize - Initialize struct device for sound devices
+ * @dev: device to initialize
+ * @card: card to assign, optional
+ */
+void snd_device_initialize(struct device *dev, struct snd_card *card)
+{
+       device_initialize(dev);
+       if (card)
+               dev->parent = &card->card_dev;
+       dev->class = sound_class;
+       dev->release = default_release;
+}
+EXPORT_SYMBOL_GPL(snd_device_initialize);
+
 static int snd_card_do_free(struct snd_card *card);
-static const struct attribute_group *card_dev_attr_groups[];
+static const struct attribute_group card_dev_attr_group;
 
 static void release_card_device(struct device *dev)
 {
@@ -246,7 +269,8 @@ int snd_card_new(struct device *parent, int idx, const char *xid,
        card->card_dev.parent = parent;
        card->card_dev.class = sound_class;
        card->card_dev.release = release_card_device;
-       card->card_dev.groups = card_dev_attr_groups;
+       card->card_dev.groups = card->dev_groups;
+       card->dev_groups[0] = &card_dev_attr_group;
        err = kobject_set_name(&card->card_dev.kobj, "card%d", idx);
        if (err < 0)
                goto __error;
@@ -677,14 +701,32 @@ static struct attribute *card_dev_attrs[] = {
        NULL
 };
 
-static struct attribute_group card_dev_attr_group = {
+static const struct attribute_group card_dev_attr_group = {
        .attrs  = card_dev_attrs,
 };
 
-static const struct attribute_group *card_dev_attr_groups[] = {
-       &card_dev_attr_group,
-       NULL
+/**
+ * snd_card_add_dev_attr - Append a new sysfs attribute group to card
+ * @card: card instance
+ * @group: attribute group to append
+ */
+int snd_card_add_dev_attr(struct snd_card *card,
+                         const struct attribute_group *group)
+{
+       int i;
+
+       /* loop for (arraysize-1) here to keep NULL at the last entry */
+       for (i = 0; i < ARRAY_SIZE(card->dev_groups) - 1; i++) {
+               if (!card->dev_groups[i]) {
+                       card->dev_groups[i] = group;
+                       return 0;
+               }
+       }
+
+       dev_err(card->dev, "Too many groups assigned\n");
+       return -ENOSPC;
 };
+EXPORT_SYMBOL_GPL(snd_card_add_dev_attr);
 
 /**
  *  snd_card_register - register the soundcard