From: Ivan Orlov <[email protected]>
Now that the driver core allows for struct class to be in read-only
memory, making all 'class' structures to be declared at build time
placing them into read-only memory, instead of having to be dynamically
allocated at load time.
Cc: Jaroslav Kysela <[email protected]>
Cc: Takashi Iwai <[email protected]>
Cc: Ivan Orlov <[email protected]>
Cc: Greg Kroah-Hartman <[email protected]>
Cc: Geoff Levand <[email protected]>
Cc: Thierry Reding <[email protected]>
Cc: "Uwe Kleine-König" <[email protected]>
Cc: [email protected]
Suggested-by: Greg Kroah-Hartman <[email protected]>
Signed-off-by: Ivan Orlov <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
---
include/sound/core.h | 2 +-
sound/core/control_led.c | 2 +-
sound/core/init.c | 4 ++--
sound/sound_core.c | 23 ++++++++++++-----------
4 files changed, 16 insertions(+), 15 deletions(-)
diff --git a/include/sound/core.h b/include/sound/core.h
index 3edc4ab08774..bbcecfff723d 100644
--- a/include/sound/core.h
+++ b/include/sound/core.h
@@ -232,7 +232,7 @@ static inline struct device *snd_card_get_device_link(struct snd_card *card)
extern int snd_major;
extern int snd_ecards_limit;
-extern struct class *sound_class;
+extern const struct class sound_class;
#ifdef CONFIG_SND_DEBUG
extern struct dentry *sound_debugfs_root;
#endif
diff --git a/sound/core/control_led.c b/sound/core/control_led.c
index 3cadd40100f3..ee77547bf8dc 100644
--- a/sound/core/control_led.c
+++ b/sound/core/control_led.c
@@ -737,7 +737,7 @@ static int __init snd_ctl_led_init(void)
unsigned int group;
device_initialize(&snd_ctl_led_dev);
- snd_ctl_led_dev.class = sound_class;
+ snd_ctl_led_dev.class = &sound_class;
snd_ctl_led_dev.release = snd_ctl_led_dev_release;
dev_set_name(&snd_ctl_led_dev, "ctl-led");
if (device_add(&snd_ctl_led_dev)) {
diff --git a/sound/core/init.c b/sound/core/init.c
index df0c22480375..baef2688d0cf 100644
--- a/sound/core/init.c
+++ b/sound/core/init.c
@@ -129,7 +129,7 @@ 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->class = &sound_class;
dev->release = default_release;
}
EXPORT_SYMBOL_GPL(snd_device_initialize);
@@ -331,7 +331,7 @@ static int snd_card_init(struct snd_card *card, struct device *parent,
device_initialize(&card->card_dev);
card->card_dev.parent = parent;
- card->card_dev.class = sound_class;
+ card->card_dev.class = &sound_class;
card->card_dev.release = release_card_device;
card->card_dev.groups = card->dev_groups;
card->dev_groups[0] = &card_dev_attr_group;
diff --git a/sound/sound_core.c b/sound/sound_core.c
index 4f6911274d56..d81fed1c1226 100644
--- a/sound/sound_core.c
+++ b/sound/sound_core.c
@@ -23,9 +23,6 @@ static inline int init_oss_soundcore(void) { return 0; }
static inline void cleanup_oss_soundcore(void) { }
#endif
-struct class *sound_class;
-EXPORT_SYMBOL(sound_class);
-
MODULE_DESCRIPTION("Core sound module");
MODULE_AUTHOR("Alan Cox");
MODULE_LICENSE("GPL");
@@ -37,6 +34,12 @@ static char *sound_devnode(const struct device *dev, umode_t *mode)
return kasprintf(GFP_KERNEL, "snd/%s", dev_name(dev));
}
+const struct class sound_class = {
+ .name = "sound",
+ .devnode = sound_devnode,
+};
+EXPORT_SYMBOL(sound_class);
+
static int __init init_soundcore(void)
{
int rc;
@@ -45,21 +48,19 @@ static int __init init_soundcore(void)
if (rc)
return rc;
- sound_class = class_create("sound");
- if (IS_ERR(sound_class)) {
+ rc = class_register(&sound_class);
+ if (rc) {
cleanup_oss_soundcore();
- return PTR_ERR(sound_class);
+ return rc;
}
- sound_class->devnode = sound_devnode;
-
return 0;
}
static void __exit cleanup_soundcore(void)
{
cleanup_oss_soundcore();
- class_destroy(sound_class);
+ class_unregister(&sound_class);
}
subsys_initcall(init_soundcore);
@@ -276,7 +277,7 @@ static int sound_insert_unit(struct sound_unit **list, const struct file_operati
}
}
- device_create(sound_class, dev, MKDEV(SOUND_MAJOR, s->unit_minor),
+ device_create(&sound_class, dev, MKDEV(SOUND_MAJOR, s->unit_minor),
NULL, "%s", s->name+6);
return s->unit_minor;
@@ -302,7 +303,7 @@ static void sound_remove_unit(struct sound_unit **list, int unit)
if (!preclaim_oss)
__unregister_chrdev(SOUND_MAJOR, p->unit_minor, 1,
p->name);
- device_destroy(sound_class, MKDEV(SOUND_MAJOR, p->unit_minor));
+ device_destroy(&sound_class, MKDEV(SOUND_MAJOR, p->unit_minor));
kfree(p);
}
}
--
2.41.0
On Tue, 20 Jun 2023 19:56:34 +0200,
Greg Kroah-Hartman wrote:
>
> From: Ivan Orlov <[email protected]>
>
> Now that the driver core allows for struct class to be in read-only
> memory, making all 'class' structures to be declared at build time
> placing them into read-only memory, instead of having to be dynamically
> allocated at load time.
>
> Cc: Jaroslav Kysela <[email protected]>
> Cc: Takashi Iwai <[email protected]>
> Cc: Ivan Orlov <[email protected]>
> Cc: Greg Kroah-Hartman <[email protected]>
> Cc: Geoff Levand <[email protected]>
> Cc: Thierry Reding <[email protected]>
> Cc: "Uwe Kleine-K?nig" <[email protected]>
> Cc: [email protected]
> Suggested-by: Greg Kroah-Hartman <[email protected]>
> Signed-off-by: Ivan Orlov <[email protected]>
> Signed-off-by: Greg Kroah-Hartman <[email protected]>
Applied to for-next branch now. Thanks.
Takashi