linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* AT91: Convert WDT driver to be independent of processor base-address
@ 2011-04-29 20:48 Andrew Victor
  2011-05-04 20:42 ` Ryan Mallon
  2011-05-04 21:12 ` Russell King - ARM Linux
  0 siblings, 2 replies; 4+ messages in thread
From: Andrew Victor @ 2011-04-29 20:48 UTC (permalink / raw)
  To: linux-arm-kernel

For supporting multiple AT91 processors in a single kernel image, the
following changes to the WDT driver support:
 * pass base addresses via platform resources
 * replace calls to at91_sys_read() / at91_sys_write()
 * rename AT91_WDT to AT91xxx_WDT to denote they are processor-specific
definitions.

Signed-off-by: Andrew Victor <linux@maxim.org.za>


diff --git a/arch/arm/mach-at91/at572d940hf_devices.c b/arch/arm/mach-at91/at572d940hf_devices.c
index a3534e3..9e7e513 100644
--- a/arch/arm/mach-at91/at572d940hf_devices.c
+++ b/arch/arm/mach-at91/at572d940hf_devices.c
@@ -628,10 +628,20 @@ static void __init at91_add_device_rtt(void)
  * -------------------------------------------------------------------- */
 
 #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
+
+static struct resource wdt_resources[] = {
+	{
+		.start	= AT91_VA_BASE_SYS + AT572D940HF_WDT,
+		.end	= AT91_VA_BASE_SYS + AT572D940HF_WDT + SZ_16 - 1,
+		.flags	= IORESOURCE_MEM,
+	}
+};
+
 static struct platform_device at572d940hf_wdt_device = {
 	.name		= "at91_wdt",
 	.id		= -1,
-	.num_resources	= 0,
+	.resource	= wdt_resources,
+	.num_resources	= ARRAY_SIZE(wdt_resources),
 };
 
 static void __init at91_add_device_watchdog(void)
diff --git a/arch/arm/mach-at91/at91cap9_devices.c b/arch/arm/mach-at91/at91cap9_devices.c
index f20a31d..d7ba0f2 100644
--- a/arch/arm/mach-at91/at91cap9_devices.c
+++ b/arch/arm/mach-at91/at91cap9_devices.c
@@ -698,10 +698,20 @@ static void __init at91_add_device_rtt(void)
  * -------------------------------------------------------------------- */
 
 #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
+
+static struct resource wdt_resources[] = {
+	{
+		.start	= AT91_VA_BASE_SYS + AT91CAP9_WDT,
+		.end	= AT91_VA_BASE_SYS + AT91CAP9_WDT + SZ_16 - 1,
+		.flags	= IORESOURCE_MEM,
+	}
+};
+
 static struct platform_device at91cap9_wdt_device = {
 	.name		= "at91_wdt",
 	.id		= -1,
-	.num_resources	= 0,
+	.resource	= wdt_resources,
+	.num_resources	= ARRAY_SIZE(wdt_resources),
 };
 
 static void __init at91_add_device_watchdog(void)
diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c
index fa783c7..652a2f9 100644
--- a/arch/arm/mach-at91/at91sam9260_devices.c
+++ b/arch/arm/mach-at91/at91sam9260_devices.c
@@ -740,10 +740,20 @@ static void __init at91_add_device_rtt(void)
  * -------------------------------------------------------------------- */
 
 #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
+
+static struct resource wdt_resources[] = {
+	{
+		.start	= AT91_VA_BASE_SYS + AT91SAM9260_WDT,
+		.end	= AT91_VA_BASE_SYS + AT91SAM9260_WDT + SZ_16 - 1,
+		.flags	= IORESOURCE_MEM,
+	}
+};
+
 static struct platform_device at91sam9260_wdt_device = {
 	.name		= "at91_wdt",
 	.id		= -1,
-	.num_resources	= 0,
+	.resource	= wdt_resources,
+	.num_resources	= ARRAY_SIZE(wdt_resources),
 };
 
 static void __init at91_add_device_watchdog(void)
diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c
index f8a6bc9..c0bfcb6 100644
--- a/arch/arm/mach-at91/at91sam9261_devices.c
+++ b/arch/arm/mach-at91/at91sam9261_devices.c
@@ -622,10 +622,20 @@ static void __init at91_add_device_rtt(void)
  * -------------------------------------------------------------------- */
 
 #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
+
+static struct resource wdt_resources[] = {
+	{
+		.start	= AT91_VA_BASE_SYS + AT91SAM9261_WDT,
+		.end	= AT91_VA_BASE_SYS + AT91SAM9261_WDT + SZ_16 - 1,
+		.flags	= IORESOURCE_MEM,
+	}
+};
+
 static struct platform_device at91sam9261_wdt_device = {
 	.name		= "at91_wdt",
 	.id		= -1,
-	.num_resources	= 0,
+	.resource	= wdt_resources,
+	.num_resources	= ARRAY_SIZE(wdt_resources),
 };
 
 static void __init at91_add_device_watchdog(void)
diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c
index 5a8fb39..575b843 100644
--- a/arch/arm/mach-at91/at91sam9263_devices.c
+++ b/arch/arm/mach-at91/at91sam9263_devices.c
@@ -996,10 +996,20 @@ static void __init at91_add_device_rtt(void)
  * -------------------------------------------------------------------- */
 
 #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
+
+static struct resource wdt_resources[] = {
+	{
+		.start	= AT91_VA_BASE_SYS + AT91SAM9263_WDT,
+		.end	= AT91_VA_BASE_SYS + AT91SAM9263_WDT + SZ_16 - 1,
+		.flags	= IORESOURCE_MEM,
+	}
+};
+
 static struct platform_device at91sam9263_wdt_device = {
 	.name		= "at91_wdt",
 	.id		= -1,
-	.num_resources	= 0,
+	.resource	= wdt_resources,
+	.num_resources	= ARRAY_SIZE(wdt_resources),
 };
 
 static void __init at91_add_device_watchdog(void)
diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c
index 464d7ff..c8d9094 100644
--- a/arch/arm/mach-at91/at91sam9g45_devices.c
+++ b/arch/arm/mach-at91/at91sam9g45_devices.c
@@ -1120,10 +1120,20 @@ static void __init at91_add_device_rtt(void)
  * -------------------------------------------------------------------- */
 
 #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
+
+static struct resource wdt_resources[] = {
+	{
+		.start	= AT91_VA_BASE_SYS + AT91SAM9G45_WDT,
+		.end	= AT91_VA_BASE_SYS + AT91SAM9G45_WDT + SZ_16 - 1,
+		.flags	= IORESOURCE_MEM,
+	}
+};
+
 static struct platform_device at91sam9g45_wdt_device = {
 	.name		= "at91_wdt",
 	.id		= -1,
-	.num_resources	= 0,
+	.resource	= wdt_resources,
+	.num_resources	= ARRAY_SIZE(wdt_resources),
 };
 
 static void __init at91_add_device_watchdog(void)
diff --git a/arch/arm/mach-at91/at91sam9rl_devices.c b/arch/arm/mach-at91/at91sam9rl_devices.c
index 72effd4..08bc4fa 100644
--- a/arch/arm/mach-at91/at91sam9rl_devices.c
+++ b/arch/arm/mach-at91/at91sam9rl_devices.c
@@ -726,10 +726,20 @@ static void __init at91_add_device_rtt(void)
  * -------------------------------------------------------------------- */
 
 #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
+
+static struct resource wdt_resources[] = {
+	{
+		.start	= AT91_VA_BASE_SYS + AT91SAM9RL_WDT,
+		.end	= AT91_VA_BASE_SYS + AT91SAM9RL_WDT + SZ_16 - 1,
+		.flags	= IORESOURCE_MEM,
+	}
+};
+
 static struct platform_device at91sam9rl_wdt_device = {
 	.name		= "at91_wdt",
 	.id		= -1,
-	.num_resources	= 0,
+	.resource	= wdt_resources,
+	.num_resources	= ARRAY_SIZE(wdt_resources),
 };
 
 static void __init at91_add_device_watchdog(void)
diff --git a/arch/arm/mach-at91/include/mach/at572d940hf.h b/arch/arm/mach-at91/include/mach/at572d940hf.h
index b714a84..e5aba13 100644
--- a/arch/arm/mach-at91/include/mach/at572d940hf.h
+++ b/arch/arm/mach-at91/include/mach/at572d940hf.h
@@ -101,7 +101,7 @@
 #define AT91_RSTC	(0xfffffd00 - AT91_BASE_SYS)
 #define AT572D940HF_RTT		(0xfffffd20 - AT91_BASE_SYS)
 #define AT91_PIT	(0xfffffd30 - AT91_BASE_SYS)
-#define AT91_WDT	(0xfffffd40 - AT91_BASE_SYS)
+#define AT572D940HF_WDT		(0xfffffd40 - AT91_BASE_SYS)
 
 #define AT91_USART0	AT572D940HF_ID_US0
 #define AT91_USART1	AT572D940HF_ID_US1
diff --git a/arch/arm/mach-at91/include/mach/at91_wdt.h b/arch/arm/mach-at91/include/mach/at91_wdt.h
index fecc2e9..d4ec83a 100644
--- a/arch/arm/mach-at91/include/mach/at91_wdt.h
+++ b/arch/arm/mach-at91/include/mach/at91_wdt.h
@@ -16,11 +16,11 @@
 #ifndef 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_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_WDFIEN		(1     << 12)		/* Fault Interrupt Enable */
 #define		AT91_WDT_WDRSTEN	(1     << 13)		/* Reset Processor */
@@ -30,7 +30,7 @@
 #define		AT91_WDT_WDDBGHLT	(1     << 28)		/* Debug 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_WDERR		(1 << 1)		/* Watchdog Error */
 
diff --git a/arch/arm/mach-at91/include/mach/at91cap9.h b/arch/arm/mach-at91/include/mach/at91cap9.h
index a1776a0..95876d5 100644
--- a/arch/arm/mach-at91/include/mach/at91cap9.h
+++ b/arch/arm/mach-at91/include/mach/at91cap9.h
@@ -100,7 +100,7 @@
 #define AT91_SHDWC	(0xfffffd10 - AT91_BASE_SYS)
 #define AT91CAP9_RTT	(0xfffffd20 - AT91_BASE_SYS)
 #define AT91_PIT	(0xfffffd30 - AT91_BASE_SYS)
-#define AT91_WDT	(0xfffffd40 - AT91_BASE_SYS)
+#define AT91CAP9_WDT	(0xfffffd40 - AT91_BASE_SYS)
 #define AT91_GPBR	(cpu_is_at91cap9_revB() ?	\
 			(0xfffffd50 - AT91_BASE_SYS) :	\
 			(0xfffffd60 - AT91_BASE_SYS))
diff --git a/arch/arm/mach-at91/include/mach/at91sam9260.h b/arch/arm/mach-at91/include/mach/at91sam9260.h
index 53e715a..3e35785 100644
--- a/arch/arm/mach-at91/include/mach/at91sam9260.h
+++ b/arch/arm/mach-at91/include/mach/at91sam9260.h
@@ -98,7 +98,7 @@
 #define AT91_SHDWC	(0xfffffd10 - AT91_BASE_SYS)
 #define AT91SAM9260_RTT		(0xfffffd20 - AT91_BASE_SYS)
 #define AT91_PIT	(0xfffffd30 - AT91_BASE_SYS)
-#define AT91_WDT	(0xfffffd40 - AT91_BASE_SYS)
+#define AT91SAM9260_WDT		(0xfffffd40 - AT91_BASE_SYS)
 #define AT91_GPBR	(0xfffffd50 - AT91_BASE_SYS)
 
 #define AT91_USART0	AT91SAM9260_BASE_US0
diff --git a/arch/arm/mach-at91/include/mach/at91sam9261.h b/arch/arm/mach-at91/include/mach/at91sam9261.h
index 5e633ae..5ff812f 100644
--- a/arch/arm/mach-at91/include/mach/at91sam9261.h
+++ b/arch/arm/mach-at91/include/mach/at91sam9261.h
@@ -81,7 +81,7 @@
 #define AT91_SHDWC	(0xfffffd10 - AT91_BASE_SYS)
 #define AT91SAM9261_RTT		(0xfffffd20 - AT91_BASE_SYS)
 #define AT91_PIT	(0xfffffd30 - AT91_BASE_SYS)
-#define AT91_WDT	(0xfffffd40 - AT91_BASE_SYS)
+#define AT91SAM9261_WDT		(0xfffffd40 - AT91_BASE_SYS)
 #define AT91_GPBR	(0xfffffd50 - AT91_BASE_SYS)
 
 #define AT91_USART0	AT91SAM9261_BASE_US0
diff --git a/arch/arm/mach-at91/include/mach/at91sam9263.h b/arch/arm/mach-at91/include/mach/at91sam9263.h
index c12514f..88994a2 100644
--- a/arch/arm/mach-at91/include/mach/at91sam9263.h
+++ b/arch/arm/mach-at91/include/mach/at91sam9263.h
@@ -97,7 +97,7 @@
 #define AT91_SHDWC	(0xfffffd10 - AT91_BASE_SYS)
 #define AT91SAM9263_RTT0	(0xfffffd20 - AT91_BASE_SYS)
 #define AT91_PIT	(0xfffffd30 - AT91_BASE_SYS)
-#define AT91_WDT	(0xfffffd40 - AT91_BASE_SYS)
+#define AT91SAM9263_WDT		(0xfffffd40 - AT91_BASE_SYS)
 #define AT91SAM9263_RTT1	(0xfffffd50 - AT91_BASE_SYS)
 #define AT91_GPBR	(0xfffffd60 - AT91_BASE_SYS)
 
diff --git a/arch/arm/mach-at91/include/mach/at91sam9g45.h b/arch/arm/mach-at91/include/mach/at91sam9g45.h
index 6c42060..f1bb0a7 100644
--- a/arch/arm/mach-at91/include/mach/at91sam9g45.h
+++ b/arch/arm/mach-at91/include/mach/at91sam9g45.h
@@ -107,7 +107,7 @@
 #define AT91_SHDWC	(0xfffffd10 - AT91_BASE_SYS)
 #define AT91SAM9G45_RTT		(0xfffffd20 - AT91_BASE_SYS)
 #define AT91_PIT	(0xfffffd30 - AT91_BASE_SYS)
-#define AT91_WDT	(0xfffffd40 - AT91_BASE_SYS)
+#define AT91SAM9G45_WDT	(0xfffffd40 - AT91_BASE_SYS)
 #define AT91_GPBR	(0xfffffd60 - AT91_BASE_SYS)
 #define AT91SAM9G45_RTC		(0xfffffdb0 - AT91_BASE_SYS)
 
diff --git a/arch/arm/mach-at91/include/mach/at91sam9rl.h b/arch/arm/mach-at91/include/mach/at91sam9rl.h
index 003e0b5..f153a77 100644
--- a/arch/arm/mach-at91/include/mach/at91sam9rl.h
+++ b/arch/arm/mach-at91/include/mach/at91sam9rl.h
@@ -89,7 +89,7 @@
 #define AT91_SHDWC	(0xfffffd10 - AT91_BASE_SYS)
 #define AT91SAM9RL_RTT	(0xfffffd20 - AT91_BASE_SYS)
 #define AT91_PIT	(0xfffffd30 - AT91_BASE_SYS)
-#define AT91_WDT	(0xfffffd40 - AT91_BASE_SYS)
+#define AT91SAM9RL_WDT	(0xfffffd40 - AT91_BASE_SYS)
 #define AT91_SCKCR	(0xfffffd50 - AT91_BASE_SYS)
 #define AT91_GPBR	(0xfffffd60 - AT91_BASE_SYS)
 #define AT91SAM9RL_RTC	(0xfffffe00 - AT91_BASE_SYS)
diff --git a/drivers/watchdog/at91sam9_wdt.c b/drivers/watchdog/at91sam9_wdt.c
index eac2602..a7a63e9 100644
--- a/drivers/watchdog/at91sam9_wdt.c
+++ b/drivers/watchdog/at91sam9_wdt.c
@@ -67,6 +67,7 @@ static struct {
 	unsigned long open;
 	char expect_close;
 	struct timer_list timer;	/* The timer that pings the watchdog */
+	void __iomem *regbase;		/* base address of WDT */
 } at91wdt_private;
 
 /* ......................................................................... */
@@ -77,7 +78,8 @@ static struct {
  */
 static inline void at91_wdt_reset(void)
 {
-	at91_sys_write(AT91_WDT_CR, AT91_WDT_KEY | AT91_WDT_WDRSTT);
+	__raw_writel(AT91_WDT_KEY | AT91_WDT_WDRSTT,
+		at91wdt_private.regbase + AT91_WDT_CR);
 }
 
 /*
@@ -132,7 +134,7 @@ static int at91_wdt_settimeout(unsigned int timeout)
 	unsigned int mr;
 
 	/* Check if disabled */
-	mr = at91_sys_read(AT91_WDT_MR);
+	mr = __raw_readl(at91wdt_private.regbase + AT91_WDT_MR);
 	if (mr & AT91_WDT_WDDIS) {
 		printk(KERN_ERR DRV_NAME": sorry, watchdog is disabled\n");
 		return -EIO;
@@ -149,7 +151,7 @@ static int at91_wdt_settimeout(unsigned int timeout)
 		| AT91_WDT_WDDBGHLT	/* disabled in debug mode */
 		| AT91_WDT_WDD		/* restart@any time */
 		| (timeout & AT91_WDT_WDV);  /* timer value */
-	at91_sys_write(AT91_WDT_MR, reg);
+	__raw_writel(reg, at91wdt_private.regbase + AT91_WDT_MR);
 
 	return 0;
 }
@@ -248,11 +250,17 @@ static struct miscdevice at91wdt_miscdev = {
 
 static int __init at91wdt_probe(struct platform_device *pdev)
 {
+	struct resource	*r;
 	int res;
 
+	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!r)
+		return -ENODEV;
+
 	if (at91wdt_miscdev.parent)
 		return -EBUSY;
 	at91wdt_miscdev.parent = &pdev->dev;
+	at91wdt_private.regbase = (void __force __iomem *) r->start;
 
 	/* Set watchdog */
 	res = at91_wdt_settimeout(ms_to_ticks(WDT_HW_TIMEOUT * 1000));

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* AT91: Convert WDT driver to be independent of processor base-address
  2011-04-29 20:48 AT91: Convert WDT driver to be independent of processor base-address Andrew Victor
@ 2011-05-04 20:42 ` Ryan Mallon
  2011-05-04 21:12 ` Russell King - ARM Linux
  1 sibling, 0 replies; 4+ messages in thread
From: Ryan Mallon @ 2011-05-04 20:42 UTC (permalink / raw)
  To: linux-arm-kernel

On 04/30/2011 08:48 AM, Andrew Victor wrote:
> For supporting multiple AT91 processors in a single kernel image, the
> following changes to the WDT driver support:
>  * pass base addresses via platform resources
>  * replace calls to at91_sys_read() / at91_sys_write()
>  * rename AT91_WDT to AT91xxx_WDT to denote they are processor-specific
> definitions.
> 
> Signed-off-by: Andrew Victor <linux@maxim.org.za>

Acked-by: Ryan Mallon <ryan@bluewatersys.com>

> diff --git a/arch/arm/mach-at91/at572d940hf_devices.c b/arch/arm/mach-at91/at572d940hf_devices.c
> index a3534e3..9e7e513 100644
> --- a/arch/arm/mach-at91/at572d940hf_devices.c
> +++ b/arch/arm/mach-at91/at572d940hf_devices.c
> @@ -628,10 +628,20 @@ static void __init at91_add_device_rtt(void)
>   * -------------------------------------------------------------------- */
>  
>  #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
> +
> +static struct resource wdt_resources[] = {
> +	{
> +		.start	= AT91_VA_BASE_SYS + AT572D940HF_WDT,
> +		.end	= AT91_VA_BASE_SYS + AT572D940HF_WDT + SZ_16 - 1,
> +		.flags	= IORESOURCE_MEM,
> +	}
> +};
> +
>  static struct platform_device at572d940hf_wdt_device = {
>  	.name		= "at91_wdt",
>  	.id		= -1,
> -	.num_resources	= 0,
> +	.resource	= wdt_resources,
> +	.num_resources	= ARRAY_SIZE(wdt_resources),
>  };
>  
>  static void __init at91_add_device_watchdog(void)
> diff --git a/arch/arm/mach-at91/at91cap9_devices.c b/arch/arm/mach-at91/at91cap9_devices.c
> index f20a31d..d7ba0f2 100644
> --- a/arch/arm/mach-at91/at91cap9_devices.c
> +++ b/arch/arm/mach-at91/at91cap9_devices.c
> @@ -698,10 +698,20 @@ static void __init at91_add_device_rtt(void)
>   * -------------------------------------------------------------------- */
>  
>  #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
> +
> +static struct resource wdt_resources[] = {
> +	{
> +		.start	= AT91_VA_BASE_SYS + AT91CAP9_WDT,
> +		.end	= AT91_VA_BASE_SYS + AT91CAP9_WDT + SZ_16 - 1,
> +		.flags	= IORESOURCE_MEM,
> +	}
> +};
> +
>  static struct platform_device at91cap9_wdt_device = {
>  	.name		= "at91_wdt",
>  	.id		= -1,
> -	.num_resources	= 0,
> +	.resource	= wdt_resources,
> +	.num_resources	= ARRAY_SIZE(wdt_resources),
>  };
>  
>  static void __init at91_add_device_watchdog(void)
> diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c
> index fa783c7..652a2f9 100644
> --- a/arch/arm/mach-at91/at91sam9260_devices.c
> +++ b/arch/arm/mach-at91/at91sam9260_devices.c
> @@ -740,10 +740,20 @@ static void __init at91_add_device_rtt(void)
>   * -------------------------------------------------------------------- */
>  
>  #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
> +
> +static struct resource wdt_resources[] = {
> +	{
> +		.start	= AT91_VA_BASE_SYS + AT91SAM9260_WDT,
> +		.end	= AT91_VA_BASE_SYS + AT91SAM9260_WDT + SZ_16 - 1,
> +		.flags	= IORESOURCE_MEM,
> +	}
> +};
> +
>  static struct platform_device at91sam9260_wdt_device = {
>  	.name		= "at91_wdt",
>  	.id		= -1,
> -	.num_resources	= 0,
> +	.resource	= wdt_resources,
> +	.num_resources	= ARRAY_SIZE(wdt_resources),
>  };
>  
>  static void __init at91_add_device_watchdog(void)
> diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c
> index f8a6bc9..c0bfcb6 100644
> --- a/arch/arm/mach-at91/at91sam9261_devices.c
> +++ b/arch/arm/mach-at91/at91sam9261_devices.c
> @@ -622,10 +622,20 @@ static void __init at91_add_device_rtt(void)
>   * -------------------------------------------------------------------- */
>  
>  #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
> +
> +static struct resource wdt_resources[] = {
> +	{
> +		.start	= AT91_VA_BASE_SYS + AT91SAM9261_WDT,
> +		.end	= AT91_VA_BASE_SYS + AT91SAM9261_WDT + SZ_16 - 1,
> +		.flags	= IORESOURCE_MEM,
> +	}
> +};
> +
>  static struct platform_device at91sam9261_wdt_device = {
>  	.name		= "at91_wdt",
>  	.id		= -1,
> -	.num_resources	= 0,
> +	.resource	= wdt_resources,
> +	.num_resources	= ARRAY_SIZE(wdt_resources),
>  };
>  
>  static void __init at91_add_device_watchdog(void)
> diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c
> index 5a8fb39..575b843 100644
> --- a/arch/arm/mach-at91/at91sam9263_devices.c
> +++ b/arch/arm/mach-at91/at91sam9263_devices.c
> @@ -996,10 +996,20 @@ static void __init at91_add_device_rtt(void)
>   * -------------------------------------------------------------------- */
>  
>  #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
> +
> +static struct resource wdt_resources[] = {
> +	{
> +		.start	= AT91_VA_BASE_SYS + AT91SAM9263_WDT,
> +		.end	= AT91_VA_BASE_SYS + AT91SAM9263_WDT + SZ_16 - 1,
> +		.flags	= IORESOURCE_MEM,
> +	}
> +};
> +
>  static struct platform_device at91sam9263_wdt_device = {
>  	.name		= "at91_wdt",
>  	.id		= -1,
> -	.num_resources	= 0,
> +	.resource	= wdt_resources,
> +	.num_resources	= ARRAY_SIZE(wdt_resources),
>  };
>  
>  static void __init at91_add_device_watchdog(void)
> diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c
> index 464d7ff..c8d9094 100644
> --- a/arch/arm/mach-at91/at91sam9g45_devices.c
> +++ b/arch/arm/mach-at91/at91sam9g45_devices.c
> @@ -1120,10 +1120,20 @@ static void __init at91_add_device_rtt(void)
>   * -------------------------------------------------------------------- */
>  
>  #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
> +
> +static struct resource wdt_resources[] = {
> +	{
> +		.start	= AT91_VA_BASE_SYS + AT91SAM9G45_WDT,
> +		.end	= AT91_VA_BASE_SYS + AT91SAM9G45_WDT + SZ_16 - 1,
> +		.flags	= IORESOURCE_MEM,
> +	}
> +};
> +
>  static struct platform_device at91sam9g45_wdt_device = {
>  	.name		= "at91_wdt",
>  	.id		= -1,
> -	.num_resources	= 0,
> +	.resource	= wdt_resources,
> +	.num_resources	= ARRAY_SIZE(wdt_resources),
>  };
>  
>  static void __init at91_add_device_watchdog(void)
> diff --git a/arch/arm/mach-at91/at91sam9rl_devices.c b/arch/arm/mach-at91/at91sam9rl_devices.c
> index 72effd4..08bc4fa 100644
> --- a/arch/arm/mach-at91/at91sam9rl_devices.c
> +++ b/arch/arm/mach-at91/at91sam9rl_devices.c
> @@ -726,10 +726,20 @@ static void __init at91_add_device_rtt(void)
>   * -------------------------------------------------------------------- */
>  
>  #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
> +
> +static struct resource wdt_resources[] = {
> +	{
> +		.start	= AT91_VA_BASE_SYS + AT91SAM9RL_WDT,
> +		.end	= AT91_VA_BASE_SYS + AT91SAM9RL_WDT + SZ_16 - 1,
> +		.flags	= IORESOURCE_MEM,
> +	}
> +};
> +
>  static struct platform_device at91sam9rl_wdt_device = {
>  	.name		= "at91_wdt",
>  	.id		= -1,
> -	.num_resources	= 0,
> +	.resource	= wdt_resources,
> +	.num_resources	= ARRAY_SIZE(wdt_resources),
>  };
>  
>  static void __init at91_add_device_watchdog(void)
> diff --git a/arch/arm/mach-at91/include/mach/at572d940hf.h b/arch/arm/mach-at91/include/mach/at572d940hf.h
> index b714a84..e5aba13 100644
> --- a/arch/arm/mach-at91/include/mach/at572d940hf.h
> +++ b/arch/arm/mach-at91/include/mach/at572d940hf.h
> @@ -101,7 +101,7 @@
>  #define AT91_RSTC	(0xfffffd00 - AT91_BASE_SYS)
>  #define AT572D940HF_RTT		(0xfffffd20 - AT91_BASE_SYS)
>  #define AT91_PIT	(0xfffffd30 - AT91_BASE_SYS)
> -#define AT91_WDT	(0xfffffd40 - AT91_BASE_SYS)
> +#define AT572D940HF_WDT		(0xfffffd40 - AT91_BASE_SYS)
>  
>  #define AT91_USART0	AT572D940HF_ID_US0
>  #define AT91_USART1	AT572D940HF_ID_US1
> diff --git a/arch/arm/mach-at91/include/mach/at91_wdt.h b/arch/arm/mach-at91/include/mach/at91_wdt.h
> index fecc2e9..d4ec83a 100644
> --- a/arch/arm/mach-at91/include/mach/at91_wdt.h
> +++ b/arch/arm/mach-at91/include/mach/at91_wdt.h
> @@ -16,11 +16,11 @@
>  #ifndef 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_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_WDFIEN		(1     << 12)		/* Fault Interrupt Enable */
>  #define		AT91_WDT_WDRSTEN	(1     << 13)		/* Reset Processor */
> @@ -30,7 +30,7 @@
>  #define		AT91_WDT_WDDBGHLT	(1     << 28)		/* Debug 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_WDERR		(1 << 1)		/* Watchdog Error */
>  
> diff --git a/arch/arm/mach-at91/include/mach/at91cap9.h b/arch/arm/mach-at91/include/mach/at91cap9.h
> index a1776a0..95876d5 100644
> --- a/arch/arm/mach-at91/include/mach/at91cap9.h
> +++ b/arch/arm/mach-at91/include/mach/at91cap9.h
> @@ -100,7 +100,7 @@
>  #define AT91_SHDWC	(0xfffffd10 - AT91_BASE_SYS)
>  #define AT91CAP9_RTT	(0xfffffd20 - AT91_BASE_SYS)
>  #define AT91_PIT	(0xfffffd30 - AT91_BASE_SYS)
> -#define AT91_WDT	(0xfffffd40 - AT91_BASE_SYS)
> +#define AT91CAP9_WDT	(0xfffffd40 - AT91_BASE_SYS)
>  #define AT91_GPBR	(cpu_is_at91cap9_revB() ?	\
>  			(0xfffffd50 - AT91_BASE_SYS) :	\
>  			(0xfffffd60 - AT91_BASE_SYS))
> diff --git a/arch/arm/mach-at91/include/mach/at91sam9260.h b/arch/arm/mach-at91/include/mach/at91sam9260.h
> index 53e715a..3e35785 100644
> --- a/arch/arm/mach-at91/include/mach/at91sam9260.h
> +++ b/arch/arm/mach-at91/include/mach/at91sam9260.h
> @@ -98,7 +98,7 @@
>  #define AT91_SHDWC	(0xfffffd10 - AT91_BASE_SYS)
>  #define AT91SAM9260_RTT		(0xfffffd20 - AT91_BASE_SYS)
>  #define AT91_PIT	(0xfffffd30 - AT91_BASE_SYS)
> -#define AT91_WDT	(0xfffffd40 - AT91_BASE_SYS)
> +#define AT91SAM9260_WDT		(0xfffffd40 - AT91_BASE_SYS)
>  #define AT91_GPBR	(0xfffffd50 - AT91_BASE_SYS)
>  
>  #define AT91_USART0	AT91SAM9260_BASE_US0
> diff --git a/arch/arm/mach-at91/include/mach/at91sam9261.h b/arch/arm/mach-at91/include/mach/at91sam9261.h
> index 5e633ae..5ff812f 100644
> --- a/arch/arm/mach-at91/include/mach/at91sam9261.h
> +++ b/arch/arm/mach-at91/include/mach/at91sam9261.h
> @@ -81,7 +81,7 @@
>  #define AT91_SHDWC	(0xfffffd10 - AT91_BASE_SYS)
>  #define AT91SAM9261_RTT		(0xfffffd20 - AT91_BASE_SYS)
>  #define AT91_PIT	(0xfffffd30 - AT91_BASE_SYS)
> -#define AT91_WDT	(0xfffffd40 - AT91_BASE_SYS)
> +#define AT91SAM9261_WDT		(0xfffffd40 - AT91_BASE_SYS)
>  #define AT91_GPBR	(0xfffffd50 - AT91_BASE_SYS)
>  
>  #define AT91_USART0	AT91SAM9261_BASE_US0
> diff --git a/arch/arm/mach-at91/include/mach/at91sam9263.h b/arch/arm/mach-at91/include/mach/at91sam9263.h
> index c12514f..88994a2 100644
> --- a/arch/arm/mach-at91/include/mach/at91sam9263.h
> +++ b/arch/arm/mach-at91/include/mach/at91sam9263.h
> @@ -97,7 +97,7 @@
>  #define AT91_SHDWC	(0xfffffd10 - AT91_BASE_SYS)
>  #define AT91SAM9263_RTT0	(0xfffffd20 - AT91_BASE_SYS)
>  #define AT91_PIT	(0xfffffd30 - AT91_BASE_SYS)
> -#define AT91_WDT	(0xfffffd40 - AT91_BASE_SYS)
> +#define AT91SAM9263_WDT		(0xfffffd40 - AT91_BASE_SYS)
>  #define AT91SAM9263_RTT1	(0xfffffd50 - AT91_BASE_SYS)
>  #define AT91_GPBR	(0xfffffd60 - AT91_BASE_SYS)
>  
> diff --git a/arch/arm/mach-at91/include/mach/at91sam9g45.h b/arch/arm/mach-at91/include/mach/at91sam9g45.h
> index 6c42060..f1bb0a7 100644
> --- a/arch/arm/mach-at91/include/mach/at91sam9g45.h
> +++ b/arch/arm/mach-at91/include/mach/at91sam9g45.h
> @@ -107,7 +107,7 @@
>  #define AT91_SHDWC	(0xfffffd10 - AT91_BASE_SYS)
>  #define AT91SAM9G45_RTT		(0xfffffd20 - AT91_BASE_SYS)
>  #define AT91_PIT	(0xfffffd30 - AT91_BASE_SYS)
> -#define AT91_WDT	(0xfffffd40 - AT91_BASE_SYS)
> +#define AT91SAM9G45_WDT	(0xfffffd40 - AT91_BASE_SYS)
>  #define AT91_GPBR	(0xfffffd60 - AT91_BASE_SYS)
>  #define AT91SAM9G45_RTC		(0xfffffdb0 - AT91_BASE_SYS)
>  
> diff --git a/arch/arm/mach-at91/include/mach/at91sam9rl.h b/arch/arm/mach-at91/include/mach/at91sam9rl.h
> index 003e0b5..f153a77 100644
> --- a/arch/arm/mach-at91/include/mach/at91sam9rl.h
> +++ b/arch/arm/mach-at91/include/mach/at91sam9rl.h
> @@ -89,7 +89,7 @@
>  #define AT91_SHDWC	(0xfffffd10 - AT91_BASE_SYS)
>  #define AT91SAM9RL_RTT	(0xfffffd20 - AT91_BASE_SYS)
>  #define AT91_PIT	(0xfffffd30 - AT91_BASE_SYS)
> -#define AT91_WDT	(0xfffffd40 - AT91_BASE_SYS)
> +#define AT91SAM9RL_WDT	(0xfffffd40 - AT91_BASE_SYS)
>  #define AT91_SCKCR	(0xfffffd50 - AT91_BASE_SYS)
>  #define AT91_GPBR	(0xfffffd60 - AT91_BASE_SYS)
>  #define AT91SAM9RL_RTC	(0xfffffe00 - AT91_BASE_SYS)
> diff --git a/drivers/watchdog/at91sam9_wdt.c b/drivers/watchdog/at91sam9_wdt.c
> index eac2602..a7a63e9 100644
> --- a/drivers/watchdog/at91sam9_wdt.c
> +++ b/drivers/watchdog/at91sam9_wdt.c
> @@ -67,6 +67,7 @@ static struct {
>  	unsigned long open;
>  	char expect_close;
>  	struct timer_list timer;	/* The timer that pings the watchdog */
> +	void __iomem *regbase;		/* base address of WDT */
>  } at91wdt_private;
>  
>  /* ......................................................................... */
> @@ -77,7 +78,8 @@ static struct {
>   */
>  static inline void at91_wdt_reset(void)
>  {
> -	at91_sys_write(AT91_WDT_CR, AT91_WDT_KEY | AT91_WDT_WDRSTT);
> +	__raw_writel(AT91_WDT_KEY | AT91_WDT_WDRSTT,
> +		at91wdt_private.regbase + AT91_WDT_CR);
>  }
>  
>  /*
> @@ -132,7 +134,7 @@ static int at91_wdt_settimeout(unsigned int timeout)
>  	unsigned int mr;
>  
>  	/* Check if disabled */
> -	mr = at91_sys_read(AT91_WDT_MR);
> +	mr = __raw_readl(at91wdt_private.regbase + AT91_WDT_MR);
>  	if (mr & AT91_WDT_WDDIS) {
>  		printk(KERN_ERR DRV_NAME": sorry, watchdog is disabled\n");
>  		return -EIO;
> @@ -149,7 +151,7 @@ static int at91_wdt_settimeout(unsigned int timeout)
>  		| AT91_WDT_WDDBGHLT	/* disabled in debug mode */
>  		| AT91_WDT_WDD		/* restart at any time */
>  		| (timeout & AT91_WDT_WDV);  /* timer value */
> -	at91_sys_write(AT91_WDT_MR, reg);
> +	__raw_writel(reg, at91wdt_private.regbase + AT91_WDT_MR);
>  
>  	return 0;
>  }
> @@ -248,11 +250,17 @@ static struct miscdevice at91wdt_miscdev = {
>  
>  static int __init at91wdt_probe(struct platform_device *pdev)
>  {
> +	struct resource	*r;
>  	int res;
>  
> +	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +	if (!r)
> +		return -ENODEV;
> +
>  	if (at91wdt_miscdev.parent)
>  		return -EBUSY;
>  	at91wdt_miscdev.parent = &pdev->dev;
> +	at91wdt_private.regbase = (void __force __iomem *) r->start;
>  
>  	/* Set watchdog */
>  	res = at91_wdt_settimeout(ms_to_ticks(WDT_HW_TIMEOUT * 1000));
> 
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel


-- 
Bluewater Systems Ltd - ARM Technology Solution Centre

Ryan Mallon         		5 Amuri Park, 404 Barbadoes St
ryan at bluewatersys.com         	PO Box 13 889, Christchurch 8013
http://www.bluewatersys.com	New Zealand
Phone: +64 3 3779127		Freecall: Australia 1800 148 751
Fax:   +64 3 3779135			  USA 1800 261 2934

^ permalink raw reply	[flat|nested] 4+ messages in thread

* AT91: Convert WDT driver to be independent of processor base-address
  2011-04-29 20:48 AT91: Convert WDT driver to be independent of processor base-address Andrew Victor
  2011-05-04 20:42 ` Ryan Mallon
@ 2011-05-04 21:12 ` Russell King - ARM Linux
  2011-05-05 10:00   ` Jean-Christophe PLAGNIOL-VILLARD
  1 sibling, 1 reply; 4+ messages in thread
From: Russell King - ARM Linux @ 2011-05-04 21:12 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Apr 29, 2011 at 10:48:10PM +0200, Andrew Victor wrote:
> @@ -248,11 +250,17 @@ static struct miscdevice at91wdt_miscdev = {
>  
>  static int __init at91wdt_probe(struct platform_device *pdev)
>  {
> +	struct resource	*r;
>  	int res;
>  
> +	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +	if (!r)
> +		return -ENODEV;
> +
>  	if (at91wdt_miscdev.parent)
>  		return -EBUSY;
>  	at91wdt_miscdev.parent = &pdev->dev;
> +	at91wdt_private.regbase = (void __force __iomem *) r->start;

Passing virtual addresses through iomem resources really isn't nice - they
get added to the resource tree as bus addresses, which actually being
virtual addresses can conflict with real bus addresses.

The proper way to handle this is like every other platform driver, and to
use ioremap() on the resource to obtain a virtual mapping for the device.

If you wish to reuse your fixed io mapping, then override ioremap() in
a similar way to OMAP and arrange for bus addresses in the fixed io
mapping to return an appropriate iomem pointer for those.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* AT91: Convert WDT driver to be independent of processor base-address
  2011-05-04 21:12 ` Russell King - ARM Linux
@ 2011-05-05 10:00   ` Jean-Christophe PLAGNIOL-VILLARD
  0 siblings, 0 replies; 4+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2011-05-05 10:00 UTC (permalink / raw)
  To: linux-arm-kernel

On 22:12 Wed 04 May     , Russell King - ARM Linux wrote:
> On Fri, Apr 29, 2011 at 10:48:10PM +0200, Andrew Victor wrote:
> > @@ -248,11 +250,17 @@ static struct miscdevice at91wdt_miscdev = {
> >  
> >  static int __init at91wdt_probe(struct platform_device *pdev)
> >  {
> > +	struct resource	*r;
> >  	int res;
> >  
> > +	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> > +	if (!r)
> > +		return -ENODEV;
> > +
> >  	if (at91wdt_miscdev.parent)
> >  		return -EBUSY;
> >  	at91wdt_miscdev.parent = &pdev->dev;
> > +	at91wdt_private.regbase = (void __force __iomem *) r->start;
> 
> Passing virtual addresses through iomem resources really isn't nice - they
> get added to the resource tree as bus addresses, which actually being
> virtual addresses can conflict with real bus addresses.
> 
> The proper way to handle this is like every other platform driver, and to
> use ioremap() on the resource to obtain a virtual mapping for the device.
> 
> If you wish to reuse your fixed io mapping, then override ioremap() in
> a similar way to OMAP and arrange for bus addresses in the fixed io
> mapping to return an appropriate iomem pointer for those.
ok will update

Best Regards,
J.

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2011-05-05 10:00 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-04-29 20:48 AT91: Convert WDT driver to be independent of processor base-address Andrew Victor
2011-05-04 20:42 ` Ryan Mallon
2011-05-04 21:12 ` Russell King - ARM Linux
2011-05-05 10:00   ` Jean-Christophe PLAGNIOL-VILLARD

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).