Currently there is no way to easily differentiate multiple
watchdog devices. The watchdogs are named by the order they
are probed.
1st probed watchdog: /dev/watchdog0
2nd probed watchdog: /dev/watchdog1
...
This change uses the alias of the watchdog device node for
the name of the watchdog.
aliases {
    watchdog0 = "/...../...."
    watchdog3 = "/..../....."
    watchdog2 = "/..../....."
    ...
}
This will translate to...
/dev/watchdog0
/dev/watchdog3
/dev/watchdog2
v2
Assign alias number to id in watchdog_core instead of watchdog_dev.
If failed to get id, fallback to original ida_simple_get call.
Signed-off-by: Justin Chen <justinpopo6@gmail.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
 
 static int __watchdog_register_device(struct watchdog_device *wdd)
 {
-       int ret, id, devno;
+       int ret, id = -1, devno;
 
        if (wdd == NULL || wdd->info == NULL || wdd->ops == NULL)
                return -EINVAL;
         */
 
        mutex_init(&wdd->lock);
-       id = ida_simple_get(&watchdog_ida, 0, MAX_DOGS, GFP_KERNEL);
+
+       /* Use alias for watchdog id if possible */
+       if (wdd->parent) {
+               ret = of_alias_get_id(wdd->parent->of_node, "watchdog");
+               if (ret >= 0)
+                       id = ida_simple_get(&watchdog_ida, ret,
+                                           ret + 1, GFP_KERNEL);
+       }
+
+       if (id < 0)
+               id = ida_simple_get(&watchdog_ida, 0, MAX_DOGS, GFP_KERNEL);
+
        if (id < 0)
                return id;
        wdd->id = id;