]> Pileus Git - ~andy/linux/blobdiff - drivers/rtc/class.c
arm64: barriers: allow dsb macro to take option parameter
[~andy/linux] / drivers / rtc / class.c
index 02426812bebc5c5cc74cba4db4395e2c67d78f25..589351ef75d03cd3c226389912e27316216df677 100644 (file)
@@ -14,6 +14,7 @@
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
 #include <linux/module.h>
+#include <linux/of.h>
 #include <linux/rtc.h>
 #include <linux/kdev_t.h>
 #include <linux/idr.h>
@@ -157,12 +158,27 @@ struct rtc_device *rtc_device_register(const char *name, struct device *dev,
 {
        struct rtc_device *rtc;
        struct rtc_wkalrm alrm;
-       int id, err;
+       int of_id = -1, id = -1, err;
+
+       if (dev->of_node)
+               of_id = of_alias_get_id(dev->of_node, "rtc");
+       else if (dev->parent && dev->parent->of_node)
+               of_id = of_alias_get_id(dev->parent->of_node, "rtc");
+
+       if (of_id >= 0) {
+               id = ida_simple_get(&rtc_ida, of_id, of_id + 1,
+                                   GFP_KERNEL);
+               if (id < 0)
+                       dev_warn(dev, "/aliases ID %d not available\n",
+                                   of_id);
+       }
 
-       id = ida_simple_get(&rtc_ida, 0, 0, GFP_KERNEL);
        if (id < 0) {
-               err = id;
-               goto exit;
+               id = ida_simple_get(&rtc_ida, 0, 0, GFP_KERNEL);
+               if (id < 0) {
+                       err = id;
+                       goto exit;
+               }
        }
 
        rtc = kzalloc(sizeof(struct rtc_device), GFP_KERNEL);