Commit c88e5dbf authored by Felipe Balbi's avatar Felipe Balbi Committed by Tony Lindgren

watchdog: cleanup a bit omap_wdt.c

Trivial cleanup patch.
Signed-off-by: default avatarFelipe Balbi <felipe.balbi@nokia.com>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 872de949
/* /*
* linux/drivers/watchdog/omap_wdt.c * omap_wdt.c
* *
* Watchdog driver for the TI OMAP 16xx & 24xx/34xx 32KHz (non-secure) watchdog * Watchdog driver for the TI OMAP 16xx & 24xx/34xx 32KHz (non-secure) watchdog
* *
...@@ -39,7 +39,6 @@ ...@@ -39,7 +39,6 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
...@@ -71,11 +70,14 @@ struct omap_wdt_dev { ...@@ -71,11 +70,14 @@ struct omap_wdt_dev {
static void omap_wdt_ping(struct omap_wdt_dev *wdev) static void omap_wdt_ping(struct omap_wdt_dev *wdev)
{ {
void __iomem *base = wdev->base; void __iomem *base = wdev->base;
/* wait for posted write to complete */ /* wait for posted write to complete */
while ((__raw_readl(base + OMAP_WATCHDOG_WPS)) & 0x08) while ((__raw_readl(base + OMAP_WATCHDOG_WPS)) & 0x08)
cpu_relax(); cpu_relax();
wdt_trgr_pattern = ~wdt_trgr_pattern; wdt_trgr_pattern = ~wdt_trgr_pattern;
__raw_writel(wdt_trgr_pattern, (base + OMAP_WATCHDOG_TGR)); __raw_writel(wdt_trgr_pattern, (base + OMAP_WATCHDOG_TGR));
/* wait for posted write to complete */ /* wait for posted write to complete */
while ((__raw_readl(base + OMAP_WATCHDOG_WPS)) & 0x08) while ((__raw_readl(base + OMAP_WATCHDOG_WPS)) & 0x08)
cpu_relax(); cpu_relax();
...@@ -84,12 +86,13 @@ static void omap_wdt_ping(struct omap_wdt_dev *wdev) ...@@ -84,12 +86,13 @@ static void omap_wdt_ping(struct omap_wdt_dev *wdev)
static void omap_wdt_enable(struct omap_wdt_dev *wdev) static void omap_wdt_enable(struct omap_wdt_dev *wdev)
{ {
void __iomem *base; void __iomem *base = wdev->base;
base = wdev->base;
/* Sequence to enable the watchdog */ /* Sequence to enable the watchdog */
__raw_writel(0xBBBB, base + OMAP_WATCHDOG_SPR); __raw_writel(0xBBBB, base + OMAP_WATCHDOG_SPR);
while ((__raw_readl(base + OMAP_WATCHDOG_WPS)) & 0x10) while ((__raw_readl(base + OMAP_WATCHDOG_WPS)) & 0x10)
cpu_relax(); cpu_relax();
__raw_writel(0x4444, base + OMAP_WATCHDOG_SPR); __raw_writel(0x4444, base + OMAP_WATCHDOG_SPR);
while ((__raw_readl(base + OMAP_WATCHDOG_WPS)) & 0x10) while ((__raw_readl(base + OMAP_WATCHDOG_WPS)) & 0x10)
cpu_relax(); cpu_relax();
...@@ -97,12 +100,13 @@ static void omap_wdt_enable(struct omap_wdt_dev *wdev) ...@@ -97,12 +100,13 @@ static void omap_wdt_enable(struct omap_wdt_dev *wdev)
static void omap_wdt_disable(struct omap_wdt_dev *wdev) static void omap_wdt_disable(struct omap_wdt_dev *wdev)
{ {
void __iomem *base; void __iomem *base = wdev->base;
base = wdev->base;
/* sequence required to disable watchdog */ /* sequence required to disable watchdog */
__raw_writel(0xAAAA, base + OMAP_WATCHDOG_SPR); /* TIMER_MODE */ __raw_writel(0xAAAA, base + OMAP_WATCHDOG_SPR); /* TIMER_MODE */
while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x10) while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x10)
cpu_relax(); cpu_relax();
__raw_writel(0x5555, base + OMAP_WATCHDOG_SPR); /* TIMER_MODE */ __raw_writel(0x5555, base + OMAP_WATCHDOG_SPR); /* TIMER_MODE */
while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x10) while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x10)
cpu_relax(); cpu_relax();
...@@ -120,12 +124,12 @@ static void omap_wdt_adjust_timeout(unsigned new_timeout) ...@@ -120,12 +124,12 @@ static void omap_wdt_adjust_timeout(unsigned new_timeout)
static void omap_wdt_set_timeout(struct omap_wdt_dev *wdev) static void omap_wdt_set_timeout(struct omap_wdt_dev *wdev)
{ {
u32 pre_margin = GET_WLDR_VAL(timer_margin); u32 pre_margin = GET_WLDR_VAL(timer_margin);
void __iomem *base; void __iomem *base = wdev->base;
base = wdev->base;
/* just count up at 32 KHz */ /* just count up at 32 KHz */
while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x04) while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x04)
cpu_relax(); cpu_relax();
__raw_writel(pre_margin, base + OMAP_WATCHDOG_LDR); __raw_writel(pre_margin, base + OMAP_WATCHDOG_LDR);
while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x04) while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x04)
cpu_relax(); cpu_relax();
...@@ -134,13 +138,11 @@ static void omap_wdt_set_timeout(struct omap_wdt_dev *wdev) ...@@ -134,13 +138,11 @@ static void omap_wdt_set_timeout(struct omap_wdt_dev *wdev)
/* /*
* Allow only one task to hold it open * Allow only one task to hold it open
*/ */
static int omap_wdt_open(struct inode *inode, struct file *file) static int omap_wdt_open(struct inode *inode, struct file *file)
{ {
struct omap_wdt_dev *wdev; struct omap_wdt_dev *wdev = platform_get_drvdata(omap_wdt_dev);
void __iomem *base; void __iomem *base = wdev->base;
wdev = platform_get_drvdata(omap_wdt_dev);
base = wdev->base;
if (test_and_set_bit(1, (unsigned long *)&(wdev->omap_wdt_users))) if (test_and_set_bit(1, (unsigned long *)&(wdev->omap_wdt_users)))
return -EBUSY; return -EBUSY;
...@@ -155,6 +157,7 @@ static int omap_wdt_open(struct inode *inode, struct file *file) ...@@ -155,6 +157,7 @@ static int omap_wdt_open(struct inode *inode, struct file *file)
/* initialize prescaler */ /* initialize prescaler */
while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x01) while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x01)
cpu_relax(); cpu_relax();
__raw_writel((1 << 5) | (PTV << 2), base + OMAP_WATCHDOG_CNTRL); __raw_writel((1 << 5) | (PTV << 2), base + OMAP_WATCHDOG_CNTRL);
while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x01) while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x01)
cpu_relax(); cpu_relax();
...@@ -163,13 +166,14 @@ static int omap_wdt_open(struct inode *inode, struct file *file) ...@@ -163,13 +166,14 @@ static int omap_wdt_open(struct inode *inode, struct file *file)
omap_wdt_set_timeout(wdev); omap_wdt_set_timeout(wdev);
omap_wdt_enable(wdev); omap_wdt_enable(wdev);
return nonseekable_open(inode, file); return nonseekable_open(inode, file);
} }
static int omap_wdt_release(struct inode *inode, struct file *file) static int omap_wdt_release(struct inode *inode, struct file *file)
{ {
struct omap_wdt_dev *wdev; struct omap_wdt_dev *wdev = file->private_data;
wdev = file->private_data;
/* /*
* Shut off the timer unless NOWAYOUT is defined. * Shut off the timer unless NOWAYOUT is defined.
*/ */
...@@ -188,14 +192,15 @@ static int omap_wdt_release(struct inode *inode, struct file *file) ...@@ -188,14 +192,15 @@ static int omap_wdt_release(struct inode *inode, struct file *file)
printk(KERN_CRIT "omap_wdt: Unexpected close, not stopping!\n"); printk(KERN_CRIT "omap_wdt: Unexpected close, not stopping!\n");
#endif #endif
wdev->omap_wdt_users = 0; wdev->omap_wdt_users = 0;
return 0; return 0;
} }
static ssize_t omap_wdt_write(struct file *file, const char __user *data, static ssize_t omap_wdt_write(struct file *file, const char __user *data,
size_t len, loff_t *ppos) size_t len, loff_t *ppos)
{ {
struct omap_wdt_dev *wdev; struct omap_wdt_dev *wdev = file->private_data;
wdev = file->private_data;
/* Refresh LOAD_TIME. */ /* Refresh LOAD_TIME. */
if (len) { if (len) {
spin_lock(&wdt_lock); spin_lock(&wdt_lock);
...@@ -215,6 +220,7 @@ static long omap_wdt_ioctl(struct file *file, unsigned int cmd, ...@@ -215,6 +220,7 @@ static long omap_wdt_ioctl(struct file *file, unsigned int cmd,
.options = WDIOF_SETTIMEOUT, .options = WDIOF_SETTIMEOUT,
.firmware_version = 0, .firmware_version = 0,
}; };
wdev = file->private_data; wdev = file->private_data;
switch (cmd) { switch (cmd) {
...@@ -253,7 +259,6 @@ static long omap_wdt_ioctl(struct file *file, unsigned int cmd, ...@@ -253,7 +259,6 @@ static long omap_wdt_ioctl(struct file *file, unsigned int cmd,
default: default:
return -ENOTTY; return -ENOTTY;
} }
return 0;
} }
static const struct file_operations omap_wdt_fops = { static const struct file_operations omap_wdt_fops = {
...@@ -264,31 +269,37 @@ static const struct file_operations omap_wdt_fops = { ...@@ -264,31 +269,37 @@ static const struct file_operations omap_wdt_fops = {
.release = omap_wdt_release, .release = omap_wdt_release,
}; };
static int __init omap_wdt_probe(struct platform_device *pdev) static int __init omap_wdt_probe(struct platform_device *pdev)
{ {
struct resource *res, *mem; struct resource *res, *mem;
int ret;
struct omap_wdt_dev *wdev; struct omap_wdt_dev *wdev;
int ret;
/* reserve static register mappings */ /* reserve static register mappings */
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) if (!res) {
return -ENOENT; ret = -ENOENT;
goto err_get_resource;
}
if (omap_wdt_dev) if (omap_wdt_dev) {
return -EBUSY; ret - EBUSY;
goto err_busy;
}
mem = request_mem_region(res->start, res->end - res->start + 1, mem = request_mem_region(res->start, res->end - res->start + 1,
pdev->name); pdev->name);
if (mem == NULL) if (!mem) {
return -EBUSY; ret = -EBUSY;
goto err_busy;
}
wdev = kzalloc(sizeof(struct omap_wdt_dev), GFP_KERNEL); wdev = kzalloc(sizeof(struct omap_wdt_dev), GFP_KERNEL);
if (!wdev) { if (!wdev) {
ret = -ENOMEM; ret = -ENOMEM;
goto fail; goto err_kzalloc;
} }
wdev->omap_wdt_users = 0; wdev->omap_wdt_users = 0;
wdev->mem = mem; wdev->mem = mem;
...@@ -297,7 +308,7 @@ static int __init omap_wdt_probe(struct platform_device *pdev) ...@@ -297,7 +308,7 @@ static int __init omap_wdt_probe(struct platform_device *pdev)
if (IS_ERR(wdev->armwdt_ck)) { if (IS_ERR(wdev->armwdt_ck)) {
ret = PTR_ERR(wdev->armwdt_ck); ret = PTR_ERR(wdev->armwdt_ck);
wdev->armwdt_ck = NULL; wdev->armwdt_ck = NULL;
goto fail; goto err_clk;
} }
} }
...@@ -306,13 +317,13 @@ static int __init omap_wdt_probe(struct platform_device *pdev) ...@@ -306,13 +317,13 @@ static int __init omap_wdt_probe(struct platform_device *pdev)
if (IS_ERR(wdev->mpu_wdt_ick)) { if (IS_ERR(wdev->mpu_wdt_ick)) {
ret = PTR_ERR(wdev->mpu_wdt_ick); ret = PTR_ERR(wdev->mpu_wdt_ick);
wdev->mpu_wdt_ick = NULL; wdev->mpu_wdt_ick = NULL;
goto fail; goto err_clk;
} }
wdev->mpu_wdt_fck = clk_get(&pdev->dev, "mpu_wdt_fck"); wdev->mpu_wdt_fck = clk_get(&pdev->dev, "mpu_wdt_fck");
if (IS_ERR(wdev->mpu_wdt_fck)) { if (IS_ERR(wdev->mpu_wdt_fck)) {
ret = PTR_ERR(wdev->mpu_wdt_fck); ret = PTR_ERR(wdev->mpu_wdt_fck);
wdev->mpu_wdt_fck = NULL; wdev->mpu_wdt_fck = NULL;
goto fail; goto err_clk;
} }
} }
...@@ -321,19 +332,19 @@ static int __init omap_wdt_probe(struct platform_device *pdev) ...@@ -321,19 +332,19 @@ static int __init omap_wdt_probe(struct platform_device *pdev)
if (IS_ERR(wdev->mpu_wdt_ick)) { if (IS_ERR(wdev->mpu_wdt_ick)) {
ret = PTR_ERR(wdev->mpu_wdt_ick); ret = PTR_ERR(wdev->mpu_wdt_ick);
wdev->mpu_wdt_ick = NULL; wdev->mpu_wdt_ick = NULL;
goto fail; goto err_clk;
} }
wdev->mpu_wdt_fck = clk_get(&pdev->dev, "wdt2_fck"); wdev->mpu_wdt_fck = clk_get(&pdev->dev, "wdt2_fck");
if (IS_ERR(wdev->mpu_wdt_fck)) { if (IS_ERR(wdev->mpu_wdt_fck)) {
ret = PTR_ERR(wdev->mpu_wdt_fck); ret = PTR_ERR(wdev->mpu_wdt_fck);
wdev->mpu_wdt_fck = NULL; wdev->mpu_wdt_fck = NULL;
goto fail; goto err_clk;
} }
} }
wdev->base = ioremap(res->start, res->end - res->start + 1); wdev->base = ioremap(res->start, res->end - res->start + 1);
if (!wdev->base) { if (!wdev->base) {
ret = -ENOMEM; ret = -ENOMEM;
goto fail; goto err_ioremap;
} }
platform_set_drvdata(pdev, wdev); platform_set_drvdata(pdev, wdev);
...@@ -348,7 +359,7 @@ static int __init omap_wdt_probe(struct platform_device *pdev) ...@@ -348,7 +359,7 @@ static int __init omap_wdt_probe(struct platform_device *pdev)
ret = misc_register(&(wdev->omap_wdt_miscdev)); ret = misc_register(&(wdev->omap_wdt_miscdev));
if (ret) if (ret)
goto fail; goto err_misc;
pr_info("OMAP Watchdog Timer Rev 0x%02x: initial timeout %d sec\n", pr_info("OMAP Watchdog Timer Rev 0x%02x: initial timeout %d sec\n",
__raw_readl(wdev->base + OMAP_WATCHDOG_REV) & 0xFF, __raw_readl(wdev->base + OMAP_WATCHDOG_REV) & 0xFF,
...@@ -361,28 +372,34 @@ static int __init omap_wdt_probe(struct platform_device *pdev) ...@@ -361,28 +372,34 @@ static int __init omap_wdt_probe(struct platform_device *pdev)
return 0; return 0;
fail: err_misc:
if (wdev) {
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
iounmap(wdev->base);
err_ioremap:
wdev->base = NULL;
err_clk:
if (wdev->armwdt_ck) if (wdev->armwdt_ck)
clk_put(wdev->armwdt_ck); clk_put(wdev->armwdt_ck);
if (wdev->mpu_wdt_ick) if (wdev->mpu_wdt_ick)
clk_put(wdev->mpu_wdt_ick); clk_put(wdev->mpu_wdt_ick);
if (wdev->mpu_wdt_fck) if (wdev->mpu_wdt_fck)
clk_put(wdev->mpu_wdt_fck); clk_put(wdev->mpu_wdt_fck);
iounmap(wdev->base);
kfree(wdev); kfree(wdev);
}
if (mem) { err_kzalloc:
release_mem_region(res->start, res->end - res->start + 1); release_mem_region(res->start, res->end - res->start + 1);
}
err_busy:
err_get_resource:
return ret; return ret;
} }
static void omap_wdt_shutdown(struct platform_device *pdev) static void omap_wdt_shutdown(struct platform_device *pdev)
{ {
struct omap_wdt_dev *wdev; struct omap_wdt_dev *wdev = platform_get_drvdata(pdev);
wdev = platform_get_drvdata(pdev);
if (wdev->omap_wdt_users) if (wdev->omap_wdt_users)
omap_wdt_disable(wdev); omap_wdt_disable(wdev);
...@@ -390,8 +407,7 @@ static void omap_wdt_shutdown(struct platform_device *pdev) ...@@ -390,8 +407,7 @@ static void omap_wdt_shutdown(struct platform_device *pdev)
static int omap_wdt_remove(struct platform_device *pdev) static int omap_wdt_remove(struct platform_device *pdev)
{ {
struct omap_wdt_dev *wdev; struct omap_wdt_dev *wdev = platform_get_drvdata(pdev);
wdev = platform_get_drvdata(pdev);
struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) if (!res)
...@@ -400,14 +416,17 @@ static int omap_wdt_remove(struct platform_device *pdev) ...@@ -400,14 +416,17 @@ static int omap_wdt_remove(struct platform_device *pdev)
misc_deregister(&(wdev->omap_wdt_miscdev)); misc_deregister(&(wdev->omap_wdt_miscdev));
release_mem_region(res->start, res->end - res->start + 1); release_mem_region(res->start, res->end - res->start + 1);
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
if (wdev->armwdt_ck) { if (wdev->armwdt_ck) {
clk_put(wdev->armwdt_ck); clk_put(wdev->armwdt_ck);
wdev->armwdt_ck = NULL; wdev->armwdt_ck = NULL;
} }
if (wdev->mpu_wdt_ick) { if (wdev->mpu_wdt_ick) {
clk_put(wdev->mpu_wdt_ick); clk_put(wdev->mpu_wdt_ick);
wdev->mpu_wdt_ick = NULL; wdev->mpu_wdt_ick = NULL;
} }
if (wdev->mpu_wdt_fck) { if (wdev->mpu_wdt_fck) {
clk_put(wdev->mpu_wdt_fck); clk_put(wdev->mpu_wdt_fck);
wdev->mpu_wdt_fck = NULL; wdev->mpu_wdt_fck = NULL;
...@@ -416,6 +435,7 @@ static int omap_wdt_remove(struct platform_device *pdev) ...@@ -416,6 +435,7 @@ static int omap_wdt_remove(struct platform_device *pdev)
kfree(wdev); kfree(wdev);
omap_wdt_dev = NULL; omap_wdt_dev = NULL;
return 0; return 0;
} }
...@@ -429,21 +449,23 @@ static int omap_wdt_remove(struct platform_device *pdev) ...@@ -429,21 +449,23 @@ static int omap_wdt_remove(struct platform_device *pdev)
static int omap_wdt_suspend(struct platform_device *pdev, pm_message_t state) static int omap_wdt_suspend(struct platform_device *pdev, pm_message_t state)
{ {
struct omap_wdt_dev *wdev; struct omap_wdt_dev *wdev = platform_get_drvdata(pdev);
wdev = platform_get_drvdata(pdev);
if (wdev->omap_wdt_users) if (wdev->omap_wdt_users)
omap_wdt_disable(wdev); omap_wdt_disable(wdev);
return 0; return 0;
} }
static int omap_wdt_resume(struct platform_device *pdev) static int omap_wdt_resume(struct platform_device *pdev)
{ {
struct omap_wdt_dev *wdev; struct omap_wdt_dev *wdev = platform_get_drvdata(pdev);
wdev = platform_get_drvdata(pdev);
if (wdev->omap_wdt_users) { if (wdev->omap_wdt_users) {
omap_wdt_enable(wdev); omap_wdt_enable(wdev);
omap_wdt_ping(wdev); omap_wdt_ping(wdev);
} }
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment