aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/watchdog/mpc8xxx_wdt.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/watchdog/mpc8xxx_wdt.c')
-rw-r--r--drivers/watchdog/mpc8xxx_wdt.c44
1 files changed, 33 insertions, 11 deletions
diff --git a/drivers/watchdog/mpc8xxx_wdt.c b/drivers/watchdog/mpc8xxx_wdt.c
index 3c5ed9e26226..f2094960e662 100644
--- a/drivers/watchdog/mpc8xxx_wdt.c
+++ b/drivers/watchdog/mpc8xxx_wdt.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * mpc8xxx_wdt.c - MPC83xx/MPC86xx watchdog userspace interface 2 * mpc8xxx_wdt.c - MPC8xx/MPC83xx/MPC86xx watchdog userspace interface
3 * 3 *
4 * Authors: Dave Updegraff <dave@cray.org> 4 * Authors: Dave Updegraff <dave@cray.org>
5 * Kumar Gala <galak@kernel.crashing.org> 5 * Kumar Gala <galak@kernel.crashing.org>
@@ -207,13 +207,6 @@ static int __devinit mpc8xxx_wdt_probe(struct of_device *ofdev,
207 goto err_unmap; 207 goto err_unmap;
208 } 208 }
209 209
210 ret = misc_register(&mpc8xxx_wdt_miscdev);
211 if (ret) {
212 pr_err("cannot register miscdev on minor=%d (err=%d)\n",
213 WATCHDOG_MINOR, ret);
214 goto err_unmap;
215 }
216
217 /* Calculate the timeout in seconds */ 210 /* Calculate the timeout in seconds */
218 if (prescale) 211 if (prescale)
219 timeout_sec = (timeout * wdt_type->prescaler) / freq; 212 timeout_sec = (timeout * wdt_type->prescaler) / freq;
@@ -234,6 +227,7 @@ static int __devinit mpc8xxx_wdt_probe(struct of_device *ofdev,
234 return 0; 227 return 0;
235err_unmap: 228err_unmap:
236 iounmap(wd_base); 229 iounmap(wd_base);
230 wd_base = NULL;
237 return ret; 231 return ret;
238} 232}
239 233
@@ -261,6 +255,12 @@ static const struct of_device_id mpc8xxx_wdt_match[] = {
261 .hw_enabled = true, 255 .hw_enabled = true,
262 }, 256 },
263 }, 257 },
258 {
259 .compatible = "fsl,mpc823-wdt",
260 .data = &(struct mpc8xxx_wdt_type) {
261 .prescaler = 0x800,
262 },
263 },
264 {}, 264 {},
265}; 265};
266MODULE_DEVICE_TABLE(of, mpc8xxx_wdt_match); 266MODULE_DEVICE_TABLE(of, mpc8xxx_wdt_match);
@@ -275,20 +275,42 @@ static struct of_platform_driver mpc8xxx_wdt_driver = {
275 }, 275 },
276}; 276};
277 277
278/*
279 * We do wdt initialization in two steps: arch_initcall probes the wdt
280 * very early to start pinging the watchdog (misc devices are not yet
281 * available), and later module_init() just registers the misc device.
282 */
283static int __init mpc8xxx_wdt_init_late(void)
284{
285 int ret;
286
287 if (!wd_base)
288 return -ENODEV;
289
290 ret = misc_register(&mpc8xxx_wdt_miscdev);
291 if (ret) {
292 pr_err("cannot register miscdev on minor=%d (err=%d)\n",
293 WATCHDOG_MINOR, ret);
294 return ret;
295 }
296 return 0;
297}
298module_init(mpc8xxx_wdt_init_late);
299
278static int __init mpc8xxx_wdt_init(void) 300static int __init mpc8xxx_wdt_init(void)
279{ 301{
280 return of_register_platform_driver(&mpc8xxx_wdt_driver); 302 return of_register_platform_driver(&mpc8xxx_wdt_driver);
281} 303}
304arch_initcall(mpc8xxx_wdt_init);
282 305
283static void __exit mpc8xxx_wdt_exit(void) 306static void __exit mpc8xxx_wdt_exit(void)
284{ 307{
285 of_unregister_platform_driver(&mpc8xxx_wdt_driver); 308 of_unregister_platform_driver(&mpc8xxx_wdt_driver);
286} 309}
287
288subsys_initcall(mpc8xxx_wdt_init);
289module_exit(mpc8xxx_wdt_exit); 310module_exit(mpc8xxx_wdt_exit);
290 311
291MODULE_AUTHOR("Dave Updegraff, Kumar Gala"); 312MODULE_AUTHOR("Dave Updegraff, Kumar Gala");
292MODULE_DESCRIPTION("Driver for watchdog timer in MPC83xx/MPC86xx uProcessors"); 313MODULE_DESCRIPTION("Driver for watchdog timer in MPC8xx/MPC83xx/MPC86xx "
314 "uProcessors");
293MODULE_LICENSE("GPL"); 315MODULE_LICENSE("GPL");
294MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); 316MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);