diff options
Diffstat (limited to 'drivers/rtc/class.c')
| -rw-r--r-- | drivers/rtc/class.c | 24 | 
1 files changed, 20 insertions, 4 deletions
diff --git a/drivers/rtc/class.c b/drivers/rtc/class.c index 02426812beb..589351ef75d 100644 --- a/drivers/rtc/class.c +++ b/drivers/rtc/class.c @@ -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);  | 
