diff options
| -rw-r--r-- | drivers/watchdog/mpc83xx_wdt.c | 61 |
1 files changed, 30 insertions, 31 deletions
diff --git a/drivers/watchdog/mpc83xx_wdt.c b/drivers/watchdog/mpc83xx_wdt.c index 109eea0df2d0..5f1b7bff8f12 100644 --- a/drivers/watchdog/mpc83xx_wdt.c +++ b/drivers/watchdog/mpc83xx_wdt.c | |||
| @@ -19,11 +19,12 @@ | |||
| 19 | #include <linux/init.h> | 19 | #include <linux/init.h> |
| 20 | #include <linux/kernel.h> | 20 | #include <linux/kernel.h> |
| 21 | #include <linux/miscdevice.h> | 21 | #include <linux/miscdevice.h> |
| 22 | #include <linux/platform_device.h> | 22 | #include <linux/of_platform.h> |
| 23 | #include <linux/module.h> | 23 | #include <linux/module.h> |
| 24 | #include <linux/watchdog.h> | 24 | #include <linux/watchdog.h> |
| 25 | #include <linux/io.h> | 25 | #include <linux/io.h> |
| 26 | #include <linux/uaccess.h> | 26 | #include <linux/uaccess.h> |
| 27 | #include <sysdev/fsl_soc.h> | ||
| 27 | 28 | ||
| 28 | struct mpc83xx_wdt { | 29 | struct mpc83xx_wdt { |
| 29 | __be32 res0; | 30 | __be32 res0; |
| @@ -149,52 +150,42 @@ static struct miscdevice mpc83xx_wdt_miscdev = { | |||
| 149 | .fops = &mpc83xx_wdt_fops, | 150 | .fops = &mpc83xx_wdt_fops, |
| 150 | }; | 151 | }; |
| 151 | 152 | ||
| 152 | static int __devinit mpc83xx_wdt_probe(struct platform_device *dev) | 153 | static int __devinit mpc83xx_wdt_probe(struct of_device *ofdev, |
| 154 | const struct of_device_id *match) | ||
| 153 | { | 155 | { |
| 154 | struct resource *r; | ||
| 155 | int ret; | 156 | int ret; |
| 156 | unsigned int *freq = dev->dev.platform_data; | 157 | u32 freq = fsl_get_sys_freq(); |
| 157 | 158 | ||
| 158 | /* get a pointer to the register memory */ | 159 | if (!freq || freq == -1) |
| 159 | r = platform_get_resource(dev, IORESOURCE_MEM, 0); | 160 | return -EINVAL; |
| 160 | 161 | ||
| 161 | if (!r) { | 162 | wd_base = of_iomap(ofdev->node, 0); |
| 162 | ret = -ENODEV; | 163 | if (!wd_base) |
| 163 | goto err_out; | 164 | return -ENOMEM; |
| 164 | } | ||
| 165 | |||
| 166 | wd_base = ioremap(r->start, sizeof(struct mpc83xx_wdt)); | ||
| 167 | if (wd_base == NULL) { | ||
| 168 | ret = -ENOMEM; | ||
| 169 | goto err_out; | ||
| 170 | } | ||
| 171 | 165 | ||
| 172 | ret = misc_register(&mpc83xx_wdt_miscdev); | 166 | ret = misc_register(&mpc83xx_wdt_miscdev); |
| 173 | if (ret) { | 167 | if (ret) { |
| 174 | printk(KERN_ERR "cannot register miscdev on minor=%d " | 168 | pr_err("cannot register miscdev on minor=%d (err=%d)\n", |
| 175 | "(err=%d)\n", | 169 | WATCHDOG_MINOR, ret); |
| 176 | WATCHDOG_MINOR, ret); | ||
| 177 | goto err_unmap; | 170 | goto err_unmap; |
| 178 | } | 171 | } |
| 179 | 172 | ||
| 180 | /* Calculate the timeout in seconds */ | 173 | /* Calculate the timeout in seconds */ |
| 181 | if (prescale) | 174 | if (prescale) |
| 182 | timeout_sec = (timeout * 0x10000) / (*freq); | 175 | timeout_sec = (timeout * 0x10000) / freq; |
| 183 | else | 176 | else |
| 184 | timeout_sec = timeout / (*freq); | 177 | timeout_sec = timeout / freq; |
| 185 | 178 | ||
| 186 | printk(KERN_INFO "WDT driver for MPC83xx initialized. " | 179 | pr_info("WDT driver for MPC83xx initialized. mode:%s timeout=%d " |
| 187 | "mode:%s timeout=%d (%d seconds)\n", | 180 | "(%d seconds)\n", reset ? "reset" : "interrupt", timeout, |
| 188 | reset ? "reset":"interrupt", timeout, timeout_sec); | 181 | timeout_sec); |
| 189 | return 0; | 182 | return 0; |
| 190 | |||
| 191 | err_unmap: | 183 | err_unmap: |
| 192 | iounmap(wd_base); | 184 | iounmap(wd_base); |
| 193 | err_out: | ||
| 194 | return ret; | 185 | return ret; |
| 195 | } | 186 | } |
| 196 | 187 | ||
| 197 | static int __devexit mpc83xx_wdt_remove(struct platform_device *dev) | 188 | static int __devexit mpc83xx_wdt_remove(struct of_device *ofdev) |
| 198 | { | 189 | { |
| 199 | misc_deregister(&mpc83xx_wdt_miscdev); | 190 | misc_deregister(&mpc83xx_wdt_miscdev); |
| 200 | iounmap(wd_base); | 191 | iounmap(wd_base); |
| @@ -202,7 +193,16 @@ static int __devexit mpc83xx_wdt_remove(struct platform_device *dev) | |||
| 202 | return 0; | 193 | return 0; |
| 203 | } | 194 | } |
| 204 | 195 | ||
| 205 | static struct platform_driver mpc83xx_wdt_driver = { | 196 | static const struct of_device_id mpc83xx_wdt_match[] = { |
| 197 | { | ||
| 198 | .compatible = "mpc83xx_wdt", | ||
| 199 | }, | ||
| 200 | {}, | ||
| 201 | }; | ||
| 202 | MODULE_DEVICE_TABLE(of, mpc83xx_wdt_match); | ||
| 203 | |||
| 204 | static struct of_platform_driver mpc83xx_wdt_driver = { | ||
| 205 | .match_table = mpc83xx_wdt_match, | ||
| 206 | .probe = mpc83xx_wdt_probe, | 206 | .probe = mpc83xx_wdt_probe, |
| 207 | .remove = __devexit_p(mpc83xx_wdt_remove), | 207 | .remove = __devexit_p(mpc83xx_wdt_remove), |
| 208 | .driver = { | 208 | .driver = { |
| @@ -213,12 +213,12 @@ static struct platform_driver mpc83xx_wdt_driver = { | |||
| 213 | 213 | ||
| 214 | static int __init mpc83xx_wdt_init(void) | 214 | static int __init mpc83xx_wdt_init(void) |
| 215 | { | 215 | { |
| 216 | return platform_driver_register(&mpc83xx_wdt_driver); | 216 | return of_register_platform_driver(&mpc83xx_wdt_driver); |
| 217 | } | 217 | } |
| 218 | 218 | ||
| 219 | static void __exit mpc83xx_wdt_exit(void) | 219 | static void __exit mpc83xx_wdt_exit(void) |
| 220 | { | 220 | { |
| 221 | platform_driver_unregister(&mpc83xx_wdt_driver); | 221 | of_unregister_platform_driver(&mpc83xx_wdt_driver); |
| 222 | } | 222 | } |
| 223 | 223 | ||
| 224 | module_init(mpc83xx_wdt_init); | 224 | module_init(mpc83xx_wdt_init); |
| @@ -228,4 +228,3 @@ MODULE_AUTHOR("Dave Updegraff, Kumar Gala"); | |||
| 228 | MODULE_DESCRIPTION("Driver for watchdog timer in MPC83xx uProcessor"); | 228 | MODULE_DESCRIPTION("Driver for watchdog timer in MPC83xx uProcessor"); |
| 229 | MODULE_LICENSE("GPL"); | 229 | MODULE_LICENSE("GPL"); |
| 230 | MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); | 230 | MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); |
| 231 | MODULE_ALIAS("platform:mpc83xx_wdt"); | ||
