rtc: class: make rtc_class constant
authorRicardo B. Marliere <ricardo@marliere.net>
Tue, 5 Mar 2024 18:22:28 +0000 (15:22 -0300)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Fri, 8 Mar 2024 11:05:10 +0000 (12:05 +0100)
Since commit 43a7206b0963 ("driver core: class: make class_register() take
a const *"), the driver core allows for struct class to be in read-only
memory, so move the rtc_class structure to be declared at build time
placing it into read-only memory, instead of having to be dynamically
allocated at boot time.

Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Suggested-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Ricardo B. Marliere <ricardo@marliere.net>
Link: https://lore.kernel.org/r/20240305-class_cleanup-abelloni-v1-1-944c026137c8@marliere.net
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
drivers/rtc/class.c
drivers/rtc/interface.c
include/linux/rtc.h
kernel/power/suspend_test.c
kernel/time/alarmtimer.c

index 921ee182797439b1496239c93b5d9e8ed76a0b45..e31fa0ad127e9545afac745a621d4ccbcd5fca28 100644 (file)
@@ -21,7 +21,6 @@
 #include "rtc-core.h"
 
 static DEFINE_IDA(rtc_ida);
-struct class *rtc_class;
 
 static void rtc_device_release(struct device *dev)
 {
@@ -199,6 +198,11 @@ static SIMPLE_DEV_PM_OPS(rtc_class_dev_pm_ops, rtc_suspend, rtc_resume);
 #define RTC_CLASS_DEV_PM_OPS   NULL
 #endif
 
+const struct class rtc_class = {
+       .name = "rtc",
+       .pm = RTC_CLASS_DEV_PM_OPS,
+};
+
 /* Ensure the caller will set the id before releasing the device */
 static struct rtc_device *rtc_allocate_device(void)
 {
@@ -220,7 +224,7 @@ static struct rtc_device *rtc_allocate_device(void)
 
        rtc->irq_freq = 1;
        rtc->max_user_freq = 64;
-       rtc->dev.class = rtc_class;
+       rtc->dev.class = &rtc_class;
        rtc->dev.groups = rtc_get_dev_attribute_groups();
        rtc->dev.release = rtc_device_release;
 
@@ -475,13 +479,14 @@ EXPORT_SYMBOL_GPL(devm_rtc_device_register);
 
 static int __init rtc_init(void)
 {
-       rtc_class = class_create("rtc");
-       if (IS_ERR(rtc_class)) {
-               pr_err("couldn't create class\n");
-               return PTR_ERR(rtc_class);
-       }
-       rtc_class->pm = RTC_CLASS_DEV_PM_OPS;
+       int err;
+
+       err = class_register(&rtc_class);
+       if (err)
+               return err;
+
        rtc_dev_init();
+
        return 0;
 }
 subsys_initcall(rtc_init);
index 1b63111cdda2e91b880c5270dbde42c79f1a3b92..5faafb4aa55cc3c1bdc104df389e7ceb5f3063a3 100644 (file)
@@ -696,7 +696,7 @@ struct rtc_device *rtc_class_open(const char *name)
        struct device *dev;
        struct rtc_device *rtc = NULL;
 
-       dev = class_find_device_by_name(rtc_class, name);
+       dev = class_find_device_by_name(&rtc_class, name);
        if (dev)
                rtc = to_rtc_device(dev);
 
index 5f8e438a0312bd579d6d78b159c796c5394649bc..3f4d315aaec9e641e35c1c86a522f2879bec19ba 100644 (file)
@@ -42,7 +42,7 @@ static inline time64_t rtc_tm_sub(struct rtc_time *lhs, struct rtc_time *rhs)
 #include <linux/timerqueue.h>
 #include <linux/workqueue.h>
 
-extern struct class *rtc_class;
+extern const struct class rtc_class;
 
 /*
  * For these RTC methods the device parameter is the physical device
index b663a97f5867a17e558c028f351b5aad28fa256a..d4856ec61570617648c0d07ebabb9f385d24ba77 100644 (file)
@@ -201,7 +201,7 @@ static int __init test_suspend(void)
        }
 
        /* RTCs have initialized by now too ... can we use one? */
-       dev = class_find_device(rtc_class, NULL, NULL, has_wakealarm);
+       dev = class_find_device(&rtc_class, NULL, NULL, has_wakealarm);
        if (dev) {
                rtc = rtc_class_open(dev_name(dev));
                put_device(dev);
index 4657cb8e8b1f9482b9e20109335b168720eabe77..5abfa43906732b7868585b3c48ccadde47bc8c03 100644 (file)
@@ -134,7 +134,7 @@ static struct class_interface alarmtimer_rtc_interface = {
 
 static int alarmtimer_rtc_interface_setup(void)
 {
-       alarmtimer_rtc_interface.class = rtc_class;
+       alarmtimer_rtc_interface.class = &rtc_class;
        return class_interface_register(&alarmtimer_rtc_interface);
 }
 static void alarmtimer_rtc_interface_remove(void)