#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>
 {
        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);