aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc/class.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/rtc/class.c')
-rw-r--r--drivers/rtc/class.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/drivers/rtc/class.c b/drivers/rtc/class.c
index 02426812bebc..589351ef75d0 100644
--- a/drivers/rtc/class.c
+++ b/drivers/rtc/class.c
@@ -14,6 +14,7 @@
14#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 14#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
15 15
16#include <linux/module.h> 16#include <linux/module.h>
17#include <linux/of.h>
17#include <linux/rtc.h> 18#include <linux/rtc.h>
18#include <linux/kdev_t.h> 19#include <linux/kdev_t.h>
19#include <linux/idr.h> 20#include <linux/idr.h>
@@ -157,12 +158,27 @@ struct rtc_device *rtc_device_register(const char *name, struct device *dev,
157{ 158{
158 struct rtc_device *rtc; 159 struct rtc_device *rtc;
159 struct rtc_wkalrm alrm; 160 struct rtc_wkalrm alrm;
160 int id, err; 161 int of_id = -1, id = -1, err;
162
163 if (dev->of_node)
164 of_id = of_alias_get_id(dev->of_node, "rtc");
165 else if (dev->parent && dev->parent->of_node)
166 of_id = of_alias_get_id(dev->parent->of_node, "rtc");
167
168 if (of_id >= 0) {
169 id = ida_simple_get(&rtc_ida, of_id, of_id + 1,
170 GFP_KERNEL);
171 if (id < 0)
172 dev_warn(dev, "/aliases ID %d not available\n",
173 of_id);
174 }
161 175
162 id = ida_simple_get(&rtc_ida, 0, 0, GFP_KERNEL);
163 if (id < 0) { 176 if (id < 0) {
164 err = id; 177 id = ida_simple_get(&rtc_ida, 0, 0, GFP_KERNEL);
165 goto exit; 178 if (id < 0) {
179 err = id;
180 goto exit;
181 }
166 } 182 }
167 183
168 rtc = kzalloc(sizeof(struct rtc_device), GFP_KERNEL); 184 rtc = kzalloc(sizeof(struct rtc_device), GFP_KERNEL);