watchdog: watchdog_dev: Use device tree alias for naming watchdogs
authorJustin Chen <justinpopo6@gmail.com>
Wed, 2 Sep 2015 18:00:17 +0000 (11:00 -0700)
committerWim Van Sebroeck <wim@iguana.be>
Tue, 27 Oct 2015 15:49:57 +0000 (16:49 +0100)
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>
drivers/watchdog/watchdog_core.c

index 1a80594554133a4f7bbe03b965070342ca01f2de..873f13972cf44fb5f02634b4e75a6d52e19289fe 100644 (file)
@@ -139,7 +139,7 @@ EXPORT_SYMBOL_GPL(watchdog_init_timeout);
 
 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;
@@ -157,7 +157,18 @@ static int __watchdog_register_device(struct watchdog_device *wdd)
         */
 
        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;