ARM: at91: make watchdog drivers soc independent

switch the watchdog drivers to resource and pass it via platform_device
Signed-off-by: default avatarJean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Acked-by: default avatarNicolas Ferre <nicolas.ferre@atmel.com>
Signed-off-by: default avatarWim Van Sebroeck <wim@iguana.be>
parent f22deee5
...@@ -694,10 +694,19 @@ static void __init at91_add_device_rtt(void) ...@@ -694,10 +694,19 @@ static void __init at91_add_device_rtt(void)
* -------------------------------------------------------------------- */ * -------------------------------------------------------------------- */
#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE) #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
static struct resource wdt_resources[] = {
{
.start = AT91CAP9_BASE_WDT,
.end = AT91CAP9_BASE_WDT + SZ_16 - 1,
.flags = IORESOURCE_MEM,
}
};
static struct platform_device at91cap9_wdt_device = { static struct platform_device at91cap9_wdt_device = {
.name = "at91_wdt", .name = "at91_wdt",
.id = -1, .id = -1,
.num_resources = 0, .resource = wdt_resources,
.num_resources = ARRAY_SIZE(wdt_resources),
}; };
static void __init at91_add_device_watchdog(void) static void __init at91_add_device_watchdog(void)
......
...@@ -738,10 +738,19 @@ static void __init at91_add_device_rtt(void) ...@@ -738,10 +738,19 @@ static void __init at91_add_device_rtt(void)
* -------------------------------------------------------------------- */ * -------------------------------------------------------------------- */
#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE) #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
static struct resource wdt_resources[] = {
{
.start = AT91SAM9260_BASE_WDT,
.end = AT91SAM9260_BASE_WDT + SZ_16 - 1,
.flags = IORESOURCE_MEM,
}
};
static struct platform_device at91sam9260_wdt_device = { static struct platform_device at91sam9260_wdt_device = {
.name = "at91_wdt", .name = "at91_wdt",
.id = -1, .id = -1,
.num_resources = 0, .resource = wdt_resources,
.num_resources = ARRAY_SIZE(wdt_resources),
}; };
static void __init at91_add_device_watchdog(void) static void __init at91_add_device_watchdog(void)
......
...@@ -624,10 +624,19 @@ static void __init at91_add_device_rtt(void) ...@@ -624,10 +624,19 @@ static void __init at91_add_device_rtt(void)
* -------------------------------------------------------------------- */ * -------------------------------------------------------------------- */
#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE) #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
static struct resource wdt_resources[] = {
{
.start = AT91SAM9261_BASE_WDT,
.end = AT91SAM9261_BASE_WDT + SZ_16 - 1,
.flags = IORESOURCE_MEM,
}
};
static struct platform_device at91sam9261_wdt_device = { static struct platform_device at91sam9261_wdt_device = {
.name = "at91_wdt", .name = "at91_wdt",
.id = -1, .id = -1,
.num_resources = 0, .resource = wdt_resources,
.num_resources = ARRAY_SIZE(wdt_resources),
}; };
static void __init at91_add_device_watchdog(void) static void __init at91_add_device_watchdog(void)
......
...@@ -996,10 +996,19 @@ static void __init at91_add_device_rtt(void) ...@@ -996,10 +996,19 @@ static void __init at91_add_device_rtt(void)
* -------------------------------------------------------------------- */ * -------------------------------------------------------------------- */
#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE) #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
static struct resource wdt_resources[] = {
{
.start = AT91SAM9263_BASE_WDT,
.end = AT91SAM9263_BASE_WDT + SZ_16 - 1,
.flags = IORESOURCE_MEM,
}
};
static struct platform_device at91sam9263_wdt_device = { static struct platform_device at91sam9263_wdt_device = {
.name = "at91_wdt", .name = "at91_wdt",
.id = -1, .id = -1,
.num_resources = 0, .resource = wdt_resources,
.num_resources = ARRAY_SIZE(wdt_resources),
}; };
static void __init at91_add_device_watchdog(void) static void __init at91_add_device_watchdog(void)
......
...@@ -1133,10 +1133,19 @@ static void __init at91_add_device_trng(void) {} ...@@ -1133,10 +1133,19 @@ static void __init at91_add_device_trng(void) {}
* -------------------------------------------------------------------- */ * -------------------------------------------------------------------- */
#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE) #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
static struct resource wdt_resources[] = {
{
.start = AT91SAM9G45_BASE_WDT,
.end = AT91SAM9G45_BASE_WDT + SZ_16 - 1,
.flags = IORESOURCE_MEM,
}
};
static struct platform_device at91sam9g45_wdt_device = { static struct platform_device at91sam9g45_wdt_device = {
.name = "at91_wdt", .name = "at91_wdt",
.id = -1, .id = -1,
.num_resources = 0, .resource = wdt_resources,
.num_resources = ARRAY_SIZE(wdt_resources),
}; };
static void __init at91_add_device_watchdog(void) static void __init at91_add_device_watchdog(void)
......
...@@ -709,10 +709,19 @@ static void __init at91_add_device_rtt(void) ...@@ -709,10 +709,19 @@ static void __init at91_add_device_rtt(void)
* -------------------------------------------------------------------- */ * -------------------------------------------------------------------- */
#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE) #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
static struct resource wdt_resources[] = {
{
.start = AT91SAM9RL_BASE_WDT,
.end = AT91SAM9RL_BASE_WDT + SZ_16 - 1,
.flags = IORESOURCE_MEM,
}
};
static struct platform_device at91sam9rl_wdt_device = { static struct platform_device at91sam9rl_wdt_device = {
.name = "at91_wdt", .name = "at91_wdt",
.id = -1, .id = -1,
.num_resources = 0, .resource = wdt_resources,
.num_resources = ARRAY_SIZE(wdt_resources),
}; };
static void __init at91_add_device_watchdog(void) static void __init at91_add_device_watchdog(void)
......
...@@ -86,7 +86,6 @@ ...@@ -86,7 +86,6 @@
#define AT91_AIC (0xfffff000 - AT91_BASE_SYS) #define AT91_AIC (0xfffff000 - AT91_BASE_SYS)
#define AT91_PMC (0xfffffc00 - AT91_BASE_SYS) #define AT91_PMC (0xfffffc00 - AT91_BASE_SYS)
#define AT91_RSTC (0xfffffd00 - AT91_BASE_SYS) #define AT91_RSTC (0xfffffd00 - AT91_BASE_SYS)
#define AT91_WDT (0xfffffd40 - AT91_BASE_SYS)
#define AT91_GPBR (cpu_is_at91cap9_revB() ? \ #define AT91_GPBR (cpu_is_at91cap9_revB() ? \
(0xfffffd50 - AT91_BASE_SYS) : \ (0xfffffd50 - AT91_BASE_SYS) : \
(0xfffffd60 - AT91_BASE_SYS)) (0xfffffd60 - AT91_BASE_SYS))
...@@ -101,6 +100,7 @@ ...@@ -101,6 +100,7 @@
#define AT91CAP9_BASE_SHDWC 0xfffffd10 #define AT91CAP9_BASE_SHDWC 0xfffffd10
#define AT91CAP9_BASE_RTT 0xfffffd20 #define AT91CAP9_BASE_RTT 0xfffffd20
#define AT91CAP9_BASE_PIT 0xfffffd30 #define AT91CAP9_BASE_PIT 0xfffffd30
#define AT91CAP9_BASE_WDT 0xfffffd40
#define AT91_USART0 AT91CAP9_BASE_US0 #define AT91_USART0 AT91CAP9_BASE_US0
#define AT91_USART1 AT91CAP9_BASE_US1 #define AT91_USART1 AT91CAP9_BASE_US1
......
...@@ -86,7 +86,6 @@ ...@@ -86,7 +86,6 @@
#define AT91_DBGU (0xfffff200 - AT91_BASE_SYS) #define AT91_DBGU (0xfffff200 - AT91_BASE_SYS)
#define AT91_PMC (0xfffffc00 - AT91_BASE_SYS) #define AT91_PMC (0xfffffc00 - AT91_BASE_SYS)
#define AT91_RSTC (0xfffffd00 - AT91_BASE_SYS) #define AT91_RSTC (0xfffffd00 - AT91_BASE_SYS)
#define AT91_WDT (0xfffffd40 - AT91_BASE_SYS)
#define AT91_GPBR (0xfffffd50 - AT91_BASE_SYS) #define AT91_GPBR (0xfffffd50 - AT91_BASE_SYS)
#define AT91SAM9260_BASE_ECC 0xffffe800 #define AT91SAM9260_BASE_ECC 0xffffe800
...@@ -97,6 +96,7 @@ ...@@ -97,6 +96,7 @@
#define AT91SAM9260_BASE_SHDWC 0xfffffd10 #define AT91SAM9260_BASE_SHDWC 0xfffffd10
#define AT91SAM9260_BASE_RTT 0xfffffd20 #define AT91SAM9260_BASE_RTT 0xfffffd20
#define AT91SAM9260_BASE_PIT 0xfffffd30 #define AT91SAM9260_BASE_PIT 0xfffffd30
#define AT91SAM9260_BASE_WDT 0xfffffd40
#define AT91_USART0 AT91SAM9260_BASE_US0 #define AT91_USART0 AT91SAM9260_BASE_US0
#define AT91_USART1 AT91SAM9260_BASE_US1 #define AT91_USART1 AT91SAM9260_BASE_US1
......
...@@ -71,7 +71,6 @@ ...@@ -71,7 +71,6 @@
#define AT91_DBGU (0xfffff200 - AT91_BASE_SYS) #define AT91_DBGU (0xfffff200 - AT91_BASE_SYS)
#define AT91_PMC (0xfffffc00 - AT91_BASE_SYS) #define AT91_PMC (0xfffffc00 - AT91_BASE_SYS)
#define AT91_RSTC (0xfffffd00 - AT91_BASE_SYS) #define AT91_RSTC (0xfffffd00 - AT91_BASE_SYS)
#define AT91_WDT (0xfffffd40 - AT91_BASE_SYS)
#define AT91_GPBR (0xfffffd50 - AT91_BASE_SYS) #define AT91_GPBR (0xfffffd50 - AT91_BASE_SYS)
#define AT91SAM9261_BASE_SMC 0xffffec00 #define AT91SAM9261_BASE_SMC 0xffffec00
...@@ -81,6 +80,7 @@ ...@@ -81,6 +80,7 @@
#define AT91SAM9261_BASE_SHDWC 0xfffffd10 #define AT91SAM9261_BASE_SHDWC 0xfffffd10
#define AT91SAM9261_BASE_RTT 0xfffffd20 #define AT91SAM9261_BASE_RTT 0xfffffd20
#define AT91SAM9261_BASE_PIT 0xfffffd30 #define AT91SAM9261_BASE_PIT 0xfffffd30
#define AT91SAM9261_BASE_WDT 0xfffffd40
#define AT91_USART0 AT91SAM9261_BASE_US0 #define AT91_USART0 AT91SAM9261_BASE_US0
#define AT91_USART1 AT91SAM9261_BASE_US1 #define AT91_USART1 AT91SAM9261_BASE_US1
......
...@@ -81,7 +81,6 @@ ...@@ -81,7 +81,6 @@
#define AT91_AIC (0xfffff000 - AT91_BASE_SYS) #define AT91_AIC (0xfffff000 - AT91_BASE_SYS)
#define AT91_PMC (0xfffffc00 - AT91_BASE_SYS) #define AT91_PMC (0xfffffc00 - AT91_BASE_SYS)
#define AT91_RSTC (0xfffffd00 - AT91_BASE_SYS) #define AT91_RSTC (0xfffffd00 - AT91_BASE_SYS)
#define AT91_WDT (0xfffffd40 - AT91_BASE_SYS)
#define AT91_GPBR (0xfffffd60 - AT91_BASE_SYS) #define AT91_GPBR (0xfffffd60 - AT91_BASE_SYS)
#define AT91SAM9263_BASE_ECC0 0xffffe000 #define AT91SAM9263_BASE_ECC0 0xffffe000
...@@ -96,6 +95,7 @@ ...@@ -96,6 +95,7 @@
#define AT91SAM9263_BASE_SHDWC 0xfffffd10 #define AT91SAM9263_BASE_SHDWC 0xfffffd10
#define AT91SAM9263_BASE_RTT0 0xfffffd20 #define AT91SAM9263_BASE_RTT0 0xfffffd20
#define AT91SAM9263_BASE_PIT 0xfffffd30 #define AT91SAM9263_BASE_PIT 0xfffffd30
#define AT91SAM9263_BASE_WDT 0xfffffd40
#define AT91SAM9263_BASE_RTT1 0xfffffd50 #define AT91SAM9263_BASE_RTT1 0xfffffd50
#define AT91_USART0 AT91SAM9263_BASE_US0 #define AT91_USART0 AT91SAM9263_BASE_US0
......
...@@ -93,7 +93,6 @@ ...@@ -93,7 +93,6 @@
#define AT91_AIC (0xfffff000 - AT91_BASE_SYS) #define AT91_AIC (0xfffff000 - AT91_BASE_SYS)
#define AT91_PMC (0xfffffc00 - AT91_BASE_SYS) #define AT91_PMC (0xfffffc00 - AT91_BASE_SYS)
#define AT91_RSTC (0xfffffd00 - AT91_BASE_SYS) #define AT91_RSTC (0xfffffd00 - AT91_BASE_SYS)
#define AT91_WDT (0xfffffd40 - AT91_BASE_SYS)
#define AT91_GPBR (0xfffffd60 - AT91_BASE_SYS) #define AT91_GPBR (0xfffffd60 - AT91_BASE_SYS)
#define AT91_RTC (0xfffffdb0 - AT91_BASE_SYS) #define AT91_RTC (0xfffffdb0 - AT91_BASE_SYS)
...@@ -108,6 +107,7 @@ ...@@ -108,6 +107,7 @@
#define AT91SAM9G45_BASE_SHDWC 0xfffffd10 #define AT91SAM9G45_BASE_SHDWC 0xfffffd10
#define AT91SAM9G45_BASE_RTT 0xfffffd20 #define AT91SAM9G45_BASE_RTT 0xfffffd20
#define AT91SAM9G45_BASE_PIT 0xfffffd30 #define AT91SAM9G45_BASE_PIT 0xfffffd30
#define AT91SAM9G45_BASE_WDT 0xfffffd40
#define AT91_USART0 AT91SAM9G45_BASE_US0 #define AT91_USART0 AT91SAM9G45_BASE_US0
#define AT91_USART1 AT91SAM9G45_BASE_US1 #define AT91_USART1 AT91SAM9G45_BASE_US1
......
...@@ -75,7 +75,6 @@ ...@@ -75,7 +75,6 @@
#define AT91_DBGU (0xfffff200 - AT91_BASE_SYS) #define AT91_DBGU (0xfffff200 - AT91_BASE_SYS)
#define AT91_PMC (0xfffffc00 - AT91_BASE_SYS) #define AT91_PMC (0xfffffc00 - AT91_BASE_SYS)
#define AT91_RSTC (0xfffffd00 - AT91_BASE_SYS) #define AT91_RSTC (0xfffffd00 - AT91_BASE_SYS)
#define AT91_WDT (0xfffffd40 - AT91_BASE_SYS)
#define AT91_SCKCR (0xfffffd50 - AT91_BASE_SYS) #define AT91_SCKCR (0xfffffd50 - AT91_BASE_SYS)
#define AT91_GPBR (0xfffffd60 - AT91_BASE_SYS) #define AT91_GPBR (0xfffffd60 - AT91_BASE_SYS)
#define AT91_RTC (0xfffffe00 - AT91_BASE_SYS) #define AT91_RTC (0xfffffe00 - AT91_BASE_SYS)
...@@ -90,6 +89,7 @@ ...@@ -90,6 +89,7 @@
#define AT91SAM9RL_BASE_SHDWC 0xfffffd10 #define AT91SAM9RL_BASE_SHDWC 0xfffffd10
#define AT91SAM9RL_BASE_RTT 0xfffffd20 #define AT91SAM9RL_BASE_RTT 0xfffffd20
#define AT91SAM9RL_BASE_PIT 0xfffffd30 #define AT91SAM9RL_BASE_PIT 0xfffffd30
#define AT91SAM9RL_BASE_WDT 0xfffffd40
#define AT91_USART0 AT91SAM9RL_BASE_US0 #define AT91_USART0 AT91SAM9RL_BASE_US0
#define AT91_USART1 AT91SAM9RL_BASE_US1 #define AT91_USART1 AT91SAM9RL_BASE_US1
......
...@@ -35,6 +35,11 @@ ...@@ -35,6 +35,11 @@
#define DRV_NAME "AT91SAM9 Watchdog" #define DRV_NAME "AT91SAM9 Watchdog"
#define wdt_read(field) \
__raw_readl(at91wdt_private.base + field)
#define wdt_write(field, val) \
__raw_writel((val), at91wdt_private.base + field)
/* AT91SAM9 watchdog runs a 12bit counter @ 256Hz, /* AT91SAM9 watchdog runs a 12bit counter @ 256Hz,
* use this to convert a watchdog * use this to convert a watchdog
* value from/to milliseconds. * value from/to milliseconds.
...@@ -63,6 +68,7 @@ MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started " ...@@ -63,6 +68,7 @@ MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started "
static void at91_ping(unsigned long data); static void at91_ping(unsigned long data);
static struct { static struct {
void __iomem *base;
unsigned long next_heartbeat; /* the next_heartbeat for the timer */ unsigned long next_heartbeat; /* the next_heartbeat for the timer */
unsigned long open; unsigned long open;
char expect_close; char expect_close;
...@@ -77,7 +83,7 @@ static struct { ...@@ -77,7 +83,7 @@ static struct {
*/ */
static inline void at91_wdt_reset(void) static inline void at91_wdt_reset(void)
{ {
at91_sys_write(AT91_WDT_CR, AT91_WDT_KEY | AT91_WDT_WDRSTT); wdt_write(AT91_WDT_CR, AT91_WDT_KEY | AT91_WDT_WDRSTT);
} }
/* /*
...@@ -132,7 +138,7 @@ static int at91_wdt_settimeout(unsigned int timeout) ...@@ -132,7 +138,7 @@ static int at91_wdt_settimeout(unsigned int timeout)
unsigned int mr; unsigned int mr;
/* Check if disabled */ /* Check if disabled */
mr = at91_sys_read(AT91_WDT_MR); mr = wdt_read(AT91_WDT_MR);
if (mr & AT91_WDT_WDDIS) { if (mr & AT91_WDT_WDDIS) {
printk(KERN_ERR DRV_NAME": sorry, watchdog is disabled\n"); printk(KERN_ERR DRV_NAME": sorry, watchdog is disabled\n");
return -EIO; return -EIO;
...@@ -149,7 +155,7 @@ static int at91_wdt_settimeout(unsigned int timeout) ...@@ -149,7 +155,7 @@ static int at91_wdt_settimeout(unsigned int timeout)
| AT91_WDT_WDDBGHLT /* disabled in debug mode */ | AT91_WDT_WDDBGHLT /* disabled in debug mode */
| AT91_WDT_WDD /* restart at any time */ | AT91_WDT_WDD /* restart at any time */
| (timeout & AT91_WDT_WDV); /* timer value */ | (timeout & AT91_WDT_WDV); /* timer value */
at91_sys_write(AT91_WDT_MR, reg); wdt_write(AT91_WDT_MR, reg);
return 0; return 0;
} }
...@@ -248,12 +254,22 @@ static struct miscdevice at91wdt_miscdev = { ...@@ -248,12 +254,22 @@ static struct miscdevice at91wdt_miscdev = {
static int __init at91wdt_probe(struct platform_device *pdev) static int __init at91wdt_probe(struct platform_device *pdev)
{ {
struct resource *r;
int res; int res;
if (at91wdt_miscdev.parent) if (at91wdt_miscdev.parent)
return -EBUSY; return -EBUSY;
at91wdt_miscdev.parent = &pdev->dev; at91wdt_miscdev.parent = &pdev->dev;
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!r)
return -ENODEV;
at91wdt_private.base = ioremap(r->start, resource_size(r));
if (!at91wdt_private.base) {
dev_err(&pdev->dev, "failed to map registers, aborting.\n");
return -ENOMEM;
}
/* Set watchdog */ /* Set watchdog */
res = at91_wdt_settimeout(ms_to_ticks(WDT_HW_TIMEOUT * 1000)); res = at91_wdt_settimeout(ms_to_ticks(WDT_HW_TIMEOUT * 1000));
if (res) if (res)
......
...@@ -16,11 +16,11 @@ ...@@ -16,11 +16,11 @@
#ifndef AT91_WDT_H #ifndef AT91_WDT_H
#define AT91_WDT_H #define AT91_WDT_H
#define AT91_WDT_CR (AT91_WDT + 0x00) /* Watchdog Control Register */ #define AT91_WDT_CR 0x00 /* Watchdog Control Register */
#define AT91_WDT_WDRSTT (1 << 0) /* Restart */ #define AT91_WDT_WDRSTT (1 << 0) /* Restart */
#define AT91_WDT_KEY (0xa5 << 24) /* KEY Password */ #define AT91_WDT_KEY (0xa5 << 24) /* KEY Password */
#define AT91_WDT_MR (AT91_WDT + 0x04) /* Watchdog Mode Register */ #define AT91_WDT_MR 0x04 /* Watchdog Mode Register */
#define AT91_WDT_WDV (0xfff << 0) /* Counter Value */ #define AT91_WDT_WDV (0xfff << 0) /* Counter Value */
#define AT91_WDT_WDFIEN (1 << 12) /* Fault Interrupt Enable */ #define AT91_WDT_WDFIEN (1 << 12) /* Fault Interrupt Enable */
#define AT91_WDT_WDRSTEN (1 << 13) /* Reset Processor */ #define AT91_WDT_WDRSTEN (1 << 13) /* Reset Processor */
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
#define AT91_WDT_WDDBGHLT (1 << 28) /* Debug Halt */ #define AT91_WDT_WDDBGHLT (1 << 28) /* Debug Halt */
#define AT91_WDT_WDIDLEHLT (1 << 29) /* Idle Halt */ #define AT91_WDT_WDIDLEHLT (1 << 29) /* Idle Halt */
#define AT91_WDT_SR (AT91_WDT + 0x08) /* Watchdog Status Register */ #define AT91_WDT_SR 0x08 /* Watchdog Status Register */
#define AT91_WDT_WDUNF (1 << 0) /* Watchdog Underflow */ #define AT91_WDT_WDUNF (1 << 0) /* Watchdog Underflow */
#define AT91_WDT_WDERR (1 << 1) /* Watchdog Error */ #define AT91_WDT_WDERR (1 << 1) /* Watchdog Error */
......
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