diff options
author | Takashi Iwai <tiwai@suse.de> | 2015-01-30 14:27:43 +0300 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2015-02-06 11:56:33 +0300 |
commit | 6bbc7fed849597ec35ffdcaf677910dd11d71d08 (patch) | |
tree | 570560b9981f146249c09fbcd8bde9cca8f3fc64 /sound/core/init.c | |
parent | 4227de2a7e5f0ff6a58e919a9c4f2bb06e882f48 (diff) | |
download | linux-6bbc7fed849597ec35ffdcaf677910dd11d71d08.tar.xz |
ALSA: Add a helper to add a new attribute group to card
For assigning sysfs entries for a card device from the driver,
introduce a new helper function, snd_card_add_dev_attr(). In this
way, we can avoid the possible race between the device registration
and the sysfs addition / removal.
The driver can pass a new attribute group to add freely. This has to
be called before snd_card_register().
Currently, up to two extra groups can be added. More than that, it'll
return an error.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/core/init.c')
-rw-r--r-- | sound/core/init.c | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/sound/core/init.c b/sound/core/init.c index 96194599e82e..35419054821c 100644 --- a/sound/core/init.c +++ b/sound/core/init.c @@ -181,7 +181,7 @@ void snd_device_initialize(struct device *dev, struct snd_card *card) 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) { @@ -269,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; @@ -700,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 |