123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 |
- From 32ecc6392654a0db34b310e8924b5b2c3b8bf503 Mon Sep 17 00:00:00 2001
- From: Guenter Roeck <linux@roeck-us.net>
- Date: Fri, 25 Dec 2015 16:01:40 -0800
- Subject: watchdog: Create watchdog device in watchdog_dev.c
- The watchdog character device is currently created in watchdog_dev.c,
- and the watchdog device in watchdog_core.c. This results in
- cross-dependencies, since device creation needs to know the watchdog
- character device number as well as the watchdog class, both of which
- reside in watchdog_dev.c.
- Create the watchdog device in watchdog_dev.c to simplify the code.
- Inspired by earlier patch set from Damien Riegel.
- Cc: Damien Riegel <damien.riegel@savoirfairelinux.com>
- Signed-off-by: Guenter Roeck <linux@roeck-us.net>
- Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
- ---
- drivers/watchdog/watchdog_core.c | 33 ++++--------------
- drivers/watchdog/watchdog_core.h | 4 +--
- drivers/watchdog/watchdog_dev.c | 73 +++++++++++++++++++++++++++++++++-------
- 3 files changed, 69 insertions(+), 41 deletions(-)
- --- a/drivers/watchdog/watchdog_core.c
- +++ b/drivers/watchdog/watchdog_core.c
- @@ -42,7 +42,6 @@
- #include "watchdog_core.h" /* For watchdog_dev_register/... */
-
- static DEFINE_IDA(watchdog_ida);
- -static struct class *watchdog_class;
-
- /*
- * Deferred Registration infrastructure.
- @@ -194,7 +193,7 @@ EXPORT_SYMBOL_GPL(watchdog_set_restart_p
-
- static int __watchdog_register_device(struct watchdog_device *wdd)
- {
- - int ret, id = -1, devno;
- + int ret, id = -1;
-
- if (wdd == NULL || wdd->info == NULL || wdd->ops == NULL)
- return -EINVAL;
- @@ -247,16 +246,6 @@ static int __watchdog_register_device(st
- }
- }
-
- - devno = wdd->cdev.dev;
- - wdd->dev = device_create(watchdog_class, wdd->parent, devno,
- - wdd, "watchdog%d", wdd->id);
- - if (IS_ERR(wdd->dev)) {
- - watchdog_dev_unregister(wdd);
- - ida_simple_remove(&watchdog_ida, id);
- - ret = PTR_ERR(wdd->dev);
- - return ret;
- - }
- -
- if (test_bit(WDOG_STOP_ON_REBOOT, &wdd->status)) {
- wdd->reboot_nb.notifier_call = watchdog_reboot_notifier;
-
- @@ -265,9 +254,7 @@ static int __watchdog_register_device(st
- dev_err(wdd->dev, "Cannot register reboot notifier (%d)\n",
- ret);
- watchdog_dev_unregister(wdd);
- - device_destroy(watchdog_class, devno);
- ida_simple_remove(&watchdog_ida, wdd->id);
- - wdd->dev = NULL;
- return ret;
- }
- }
- @@ -311,9 +298,6 @@ EXPORT_SYMBOL_GPL(watchdog_register_devi
-
- static void __watchdog_unregister_device(struct watchdog_device *wdd)
- {
- - int ret;
- - int devno;
- -
- if (wdd == NULL)
- return;
-
- @@ -323,13 +307,8 @@ static void __watchdog_unregister_device
- if (test_bit(WDOG_STOP_ON_REBOOT, &wdd->status))
- unregister_reboot_notifier(&wdd->reboot_nb);
-
- - devno = wdd->cdev.dev;
- - ret = watchdog_dev_unregister(wdd);
- - if (ret)
- - pr_err("error unregistering /dev/watchdog (err=%d)\n", ret);
- - device_destroy(watchdog_class, devno);
- + watchdog_dev_unregister(wdd);
- ida_simple_remove(&watchdog_ida, wdd->id);
- - wdd->dev = NULL;
- }
-
- /**
- @@ -370,9 +349,11 @@ static int __init watchdog_deferred_regi
-
- static int __init watchdog_init(void)
- {
- - watchdog_class = watchdog_dev_init();
- - if (IS_ERR(watchdog_class))
- - return PTR_ERR(watchdog_class);
- + int err;
- +
- + err = watchdog_dev_init();
- + if (err < 0)
- + return err;
-
- watchdog_deferred_registration();
- return 0;
- --- a/drivers/watchdog/watchdog_core.h
- +++ b/drivers/watchdog/watchdog_core.h
- @@ -32,6 +32,6 @@
- * Functions/procedures to be called by the core
- */
- extern int watchdog_dev_register(struct watchdog_device *);
- -extern int watchdog_dev_unregister(struct watchdog_device *);
- -extern struct class * __init watchdog_dev_init(void);
- +extern void watchdog_dev_unregister(struct watchdog_device *);
- +extern int __init watchdog_dev_init(void);
- extern void __exit watchdog_dev_exit(void);
- --- a/drivers/watchdog/watchdog_dev.c
- +++ b/drivers/watchdog/watchdog_dev.c
- @@ -628,17 +628,18 @@ static struct miscdevice watchdog_miscde
- };
-
- /*
- - * watchdog_dev_register: register a watchdog device
- + * watchdog_cdev_register: register watchdog character device
- * @wdd: watchdog device
- + * @devno: character device number
- *
- - * Register a watchdog device including handling the legacy
- + * Register a watchdog character device including handling the legacy
- * /dev/watchdog node. /dev/watchdog is actually a miscdevice and
- * thus we set it up like that.
- */
-
- -int watchdog_dev_register(struct watchdog_device *wdd)
- +static int watchdog_cdev_register(struct watchdog_device *wdd, dev_t devno)
- {
- - int err, devno;
- + int err;
-
- if (wdd->id == 0) {
- old_wdd = wdd;
- @@ -656,7 +657,6 @@ int watchdog_dev_register(struct watchdo
- }
-
- /* Fill in the data structures */
- - devno = MKDEV(MAJOR(watchdog_devt), wdd->id);
- cdev_init(&wdd->cdev, &watchdog_fops);
- wdd->cdev.owner = wdd->ops->owner;
-
- @@ -674,13 +674,14 @@ int watchdog_dev_register(struct watchdo
- }
-
- /*
- - * watchdog_dev_unregister: unregister a watchdog device
- + * watchdog_cdev_unregister: unregister watchdog character device
- * @watchdog: watchdog device
- *
- - * Unregister the watchdog and if needed the legacy /dev/watchdog device.
- + * Unregister watchdog character device and if needed the legacy
- + * /dev/watchdog device.
- */
-
- -int watchdog_dev_unregister(struct watchdog_device *wdd)
- +static void watchdog_cdev_unregister(struct watchdog_device *wdd)
- {
- mutex_lock(&wdd->lock);
- set_bit(WDOG_UNREGISTERED, &wdd->status);
- @@ -691,7 +692,6 @@ int watchdog_dev_unregister(struct watch
- misc_deregister(&watchdog_miscdev);
- old_wdd = NULL;
- }
- - return 0;
- }
-
- static struct class watchdog_class = {
- @@ -701,29 +701,76 @@ static struct class watchdog_class = {
- };
-
- /*
- + * watchdog_dev_register: register a watchdog device
- + * @wdd: watchdog device
- + *
- + * Register a watchdog device including handling the legacy
- + * /dev/watchdog node. /dev/watchdog is actually a miscdevice and
- + * thus we set it up like that.
- + */
- +
- +int watchdog_dev_register(struct watchdog_device *wdd)
- +{
- + struct device *dev;
- + dev_t devno;
- + int ret;
- +
- + devno = MKDEV(MAJOR(watchdog_devt), wdd->id);
- +
- + ret = watchdog_cdev_register(wdd, devno);
- + if (ret)
- + return ret;
- +
- + dev = device_create(&watchdog_class, wdd->parent, devno, wdd,
- + "watchdog%d", wdd->id);
- + if (IS_ERR(dev)) {
- + watchdog_cdev_unregister(wdd);
- + return PTR_ERR(dev);
- + }
- + wdd->dev = dev;
- +
- + return ret;
- +}
- +
- +/*
- + * watchdog_dev_unregister: unregister a watchdog device
- + * @watchdog: watchdog device
- + *
- + * Unregister watchdog device and if needed the legacy
- + * /dev/watchdog device.
- + */
- +
- +void watchdog_dev_unregister(struct watchdog_device *wdd)
- +{
- + watchdog_cdev_unregister(wdd);
- + device_destroy(&watchdog_class, wdd->dev->devt);
- + wdd->dev = NULL;
- +}
- +
- +/*
- * watchdog_dev_init: init dev part of watchdog core
- *
- * Allocate a range of chardev nodes to use for watchdog devices
- */
-
- -struct class * __init watchdog_dev_init(void)
- +int __init watchdog_dev_init(void)
- {
- int err;
-
- err = class_register(&watchdog_class);
- if (err < 0) {
- pr_err("couldn't register class\n");
- - return ERR_PTR(err);
- + return err;
- }
-
- err = alloc_chrdev_region(&watchdog_devt, 0, MAX_DOGS, "watchdog");
- if (err < 0) {
- pr_err("watchdog: unable to allocate char dev region\n");
- class_unregister(&watchdog_class);
- - return ERR_PTR(err);
- + return err;
- }
-
- - return &watchdog_class;
- + return 0;
- }
-
- /*
|