msm: watchdog: Get the base and irq from platform data
The FSM targets need to use the Watchdog1 timer instead of the
Watchdog0 timer. Add support to get the base and the interrupt
information from the platform data so that the watchdog driver
can support both WDT0 and WDT1.
Change-Id: Ibce013c0287e34dbd702d75dab2c3f321132e9ed
Signed-off-by: Rohit Vaswani <rvaswani@codeaurora.org>
diff --git a/arch/arm/mach-msm/devices-8064.c b/arch/arm/mach-msm/devices-8064.c
index 90e0089..0d05df9 100644
--- a/arch/arm/mach-msm/devices-8064.c
+++ b/arch/arm/mach-msm/devices-8064.c
@@ -102,6 +102,15 @@
.bark_time = 11000,
.has_secure = true,
.needs_expired_enable = true,
+ .base = MSM_TMR0_BASE + WDT0_OFFSET,
+};
+
+static struct resource msm_watchdog_resources[] = {
+ {
+ .start = WDT0_ACCSCSSNBARK_INT,
+ .end = WDT0_ACCSCSSNBARK_INT,
+ .flags = IORESOURCE_IRQ,
+ },
};
struct platform_device msm8064_device_watchdog = {
@@ -110,6 +119,8 @@
.dev = {
.platform_data = &msm_watchdog_pdata,
},
+ .num_resources = ARRAY_SIZE(msm_watchdog_resources),
+ .resource = msm_watchdog_resources,
};
static struct resource msm_dmov_resource[] = {
diff --git a/arch/arm/mach-msm/devices-8960.c b/arch/arm/mach-msm/devices-8960.c
index 680770e..8347580 100644
--- a/arch/arm/mach-msm/devices-8960.c
+++ b/arch/arm/mach-msm/devices-8960.c
@@ -1331,6 +1331,15 @@
.pet_time = 10000,
.bark_time = 11000,
.has_secure = true,
+ .base = MSM_TMR0_BASE + WDT0_OFFSET,
+};
+
+static struct resource msm_watchdog_resources[] = {
+ {
+ .start = WDT0_ACCSCSSNBARK_INT,
+ .end = WDT0_ACCSCSSNBARK_INT,
+ .flags = IORESOURCE_IRQ,
+ },
};
struct platform_device msm8960_device_watchdog = {
@@ -1339,6 +1348,8 @@
.dev = {
.platform_data = &msm_watchdog_pdata,
},
+ .num_resources = ARRAY_SIZE(msm_watchdog_resources),
+ .resource = msm_watchdog_resources,
};
static struct resource msm_dmov_resource[] = {
diff --git a/arch/arm/mach-msm/devices-9615.c b/arch/arm/mach-msm/devices-9615.c
index fff8e0d..c307714 100644
--- a/arch/arm/mach-msm/devices-9615.c
+++ b/arch/arm/mach-msm/devices-9615.c
@@ -70,6 +70,15 @@
.bark_time = 11000,
.has_secure = false,
.use_kernel_fiq = true,
+ .base = MSM_TMR_BASE + WDT0_OFFSET,
+};
+
+static struct resource msm_watchdog_resources[] = {
+ {
+ .start = WDT0_ACCSCSSNBARK_INT,
+ .end = WDT0_ACCSCSSNBARK_INT,
+ .flags = IORESOURCE_IRQ,
+ },
};
struct platform_device msm9615_device_watchdog = {
@@ -78,6 +87,8 @@
.dev = {
.platform_data = &msm_watchdog_pdata,
},
+ .num_resources = ARRAY_SIZE(msm_watchdog_resources),
+ .resource = msm_watchdog_resources,
};
static struct resource msm_dmov_resource[] = {
diff --git a/arch/arm/mach-msm/devices-fsm9xxx.c b/arch/arm/mach-msm/devices-fsm9xxx.c
index 5f4d940..639eeae 100644
--- a/arch/arm/mach-msm/devices-fsm9xxx.c
+++ b/arch/arm/mach-msm/devices-fsm9xxx.c
@@ -419,6 +419,15 @@
.bark_time = 11000,
.has_secure = false,
.has_vic = true,
+ .base = MSM_TMR_BASE + WDT1_OFFSET,
+};
+
+static struct resource msm_watchdog_resources[] = {
+ {
+ .start = INT_WDT1_ACCSCSSBARK,
+ .end = INT_WDT1_ACCSCSSBARK,
+ .flags = IORESOURCE_IRQ,
+ },
};
struct platform_device fsm9xxx_device_watchdog = {
@@ -427,5 +436,7 @@
.dev = {
.platform_data = &fsm_watchdog_pdata,
},
+ .num_resources = ARRAY_SIZE(msm_watchdog_resources),
+ .resource = msm_watchdog_resources,
};
diff --git a/arch/arm/mach-msm/devices-msm8x60.c b/arch/arm/mach-msm/devices-msm8x60.c
index 5402251..05f9d75 100644
--- a/arch/arm/mach-msm/devices-msm8x60.c
+++ b/arch/arm/mach-msm/devices-msm8x60.c
@@ -1996,6 +1996,15 @@
.pet_time = 10000,
.bark_time = 11000,
.has_secure = true,
+ .base = MSM_TMR0_BASE + WDT0_OFFSET,
+};
+
+static struct resource msm_watchdog_resources[] = {
+ {
+ .start = WDT0_ACCSCSSNBARK_INT,
+ .end = WDT0_ACCSCSSNBARK_INT,
+ .flags = IORESOURCE_IRQ,
+ },
};
struct platform_device msm8660_device_watchdog = {
@@ -2004,6 +2013,8 @@
.dev = {
.platform_data = &msm_watchdog_pdata,
},
+ .num_resources = ARRAY_SIZE(msm_watchdog_resources),
+ .resource = msm_watchdog_resources,
};
static struct resource msm_dmov_resource_adm0[] = {
diff --git a/arch/arm/mach-msm/msm_watchdog.c b/arch/arm/mach-msm/msm_watchdog.c
index b471426..aca7667 100644
--- a/arch/arm/mach-msm/msm_watchdog.c
+++ b/arch/arm/mach-msm/msm_watchdog.c
@@ -37,22 +37,23 @@
#define TCSR_WDT_CFG 0x30
-#define WDT0_RST 0x38
-#define WDT0_EN 0x40
-#define WDT0_STS 0x44
-#define WDT0_BARK_TIME 0x4C
-#define WDT0_BITE_TIME 0x5C
+#define WDT_RST 0x0
+#define WDT_EN 0x8
+#define WDT_STS 0xC
+#define WDT_BARK_TIME 0x14
+#define WDT_BITE_TIME 0x24
#define WDT_HZ 32768
struct msm_watchdog_dump msm_dump_cpu_ctx;
-static void __iomem *msm_tmr0_base;
+static void __iomem *msm_wdt_base;
static unsigned long delay_time;
static unsigned long bark_time;
static unsigned long long last_pet;
static bool has_vic;
+static unsigned int msm_wdog_irq;
/*
* On the kernel command line specify
@@ -116,8 +117,8 @@
if (!enable)
return 0;
- __raw_writel(1, msm_tmr0_base + WDT0_RST);
- __raw_writel(0, msm_tmr0_base + WDT0_EN);
+ __raw_writel(1, msm_wdt_base + WDT_RST);
+ __raw_writel(0, msm_wdt_base + WDT_EN);
mb();
return 0;
}
@@ -127,8 +128,8 @@
if (!enable)
return 0;
- __raw_writel(1, msm_tmr0_base + WDT0_EN);
- __raw_writel(1, msm_tmr0_base + WDT0_RST);
+ __raw_writel(1, msm_wdt_base + WDT_EN);
+ __raw_writel(1, msm_wdt_base + WDT_RST);
mb();
return 0;
}
@@ -137,14 +138,14 @@
unsigned long event, void *ptr)
{
if (panic_timeout == 0) {
- __raw_writel(0, msm_tmr0_base + WDT0_EN);
+ __raw_writel(0, msm_wdt_base + WDT_EN);
mb();
} else {
__raw_writel(WDT_HZ * (panic_timeout + 4),
- msm_tmr0_base + WDT0_BARK_TIME);
+ msm_wdt_base + WDT_BARK_TIME);
__raw_writel(WDT_HZ * (panic_timeout + 4),
- msm_tmr0_base + WDT0_BITE_TIME);
- __raw_writel(1, msm_tmr0_base + WDT0_RST);
+ msm_wdt_base + WDT_BITE_TIME);
+ __raw_writel(1, msm_wdt_base + WDT_RST);
}
return NOTIFY_DONE;
}
@@ -162,14 +163,14 @@
{
struct wdog_disable_work_data *work_data =
container_of(work, struct wdog_disable_work_data, work);
- __raw_writel(0, msm_tmr0_base + WDT0_EN);
+ __raw_writel(0, msm_wdt_base + WDT_EN);
mb();
if (has_vic) {
- free_irq(WDT0_ACCSCSSNBARK_INT, 0);
+ free_irq(msm_wdog_irq, 0);
} else {
- disable_percpu_irq(WDT0_ACCSCSSNBARK_INT);
+ disable_percpu_irq(msm_wdog_irq);
if (!appsbark_fiq) {
- free_percpu_irq(WDT0_ACCSCSSNBARK_INT,
+ free_percpu_irq(msm_wdog_irq,
percpu_pdata);
free_percpu(percpu_pdata);
}
@@ -178,7 +179,7 @@
atomic_notifier_chain_unregister(&panic_notifier_list, &panic_blk);
cancel_delayed_work(&dogwork_struct);
/* may be suspended after the first write above */
- __raw_writel(0, msm_tmr0_base + WDT0_EN);
+ __raw_writel(0, msm_wdt_base + WDT_EN);
complete(&work_data->complete);
pr_info("MSM Watchdog deactivated.\n");
}
@@ -229,11 +230,11 @@
if (!enable)
return;
- slack = __raw_readl(msm_tmr0_base + WDT0_STS) >> 3;
+ slack = __raw_readl(msm_wdt_base + WDT_STS) >> 3;
slack = ((bark_time*WDT_HZ)/1000) - slack;
if (slack < min_slack_ticks)
min_slack_ticks = slack;
- __raw_writel(1, msm_tmr0_base + WDT0_RST);
+ __raw_writel(1, msm_wdt_base + WDT_RST);
time_ns = sched_clock();
slack_ns = (last_pet + bark_time_ns) - time_ns;
if (slack_ns < min_slack_ns)
@@ -329,7 +330,7 @@
int ret;
if (has_vic) {
- ret = request_irq(WDT0_ACCSCSSNBARK_INT, wdog_bark_handler, 0,
+ ret = request_irq(msm_wdog_irq, wdog_bark_handler, 0,
"apps_wdog_bark", NULL);
if (ret)
return;
@@ -344,7 +345,7 @@
}
msm_wdog_fiq_setup(stack);
- gic_set_irq_secure(WDT0_ACCSCSSNBARK_INT);
+ gic_set_irq_secure(msm_wdog_irq);
} else {
percpu_pdata = alloc_percpu(struct msm_watchdog_pdata *);
if (!percpu_pdata) {
@@ -354,7 +355,7 @@
}
/* Must request irq before sending scm command */
- ret = request_percpu_irq(WDT0_ACCSCSSNBARK_INT,
+ ret = request_percpu_irq(msm_wdog_irq,
wdog_bark_handler, "apps_wdog_bark", percpu_pdata);
if (ret) {
free_percpu(percpu_pdata);
@@ -364,20 +365,20 @@
configure_bark_dump();
- __raw_writel(timeout, msm_tmr0_base + WDT0_BARK_TIME);
- __raw_writel(timeout + 3*WDT_HZ, msm_tmr0_base + WDT0_BITE_TIME);
+ __raw_writel(timeout, msm_wdt_base + WDT_BARK_TIME);
+ __raw_writel(timeout + 3*WDT_HZ, msm_wdt_base + WDT_BITE_TIME);
schedule_delayed_work_on(0, &dogwork_struct, delay_time);
atomic_notifier_chain_register(&panic_notifier_list,
&panic_blk);
- __raw_writel(1, msm_tmr0_base + WDT0_EN);
- __raw_writel(1, msm_tmr0_base + WDT0_RST);
+ __raw_writel(1, msm_wdt_base + WDT_EN);
+ __raw_writel(1, msm_wdt_base + WDT_RST);
last_pet = sched_clock();
if (!has_vic)
- enable_percpu_irq(WDT0_ACCSCSSNBARK_INT, IRQ_TYPE_EDGE_RISING);
+ enable_percpu_irq(msm_wdog_irq, IRQ_TYPE_EDGE_RISING);
printk(KERN_INFO "MSM Watchdog Initialized\n");
@@ -400,7 +401,8 @@
appsbark_fiq = pdata->use_kernel_fiq;
}
- msm_tmr0_base = msm_timer_get_timer0_base();
+ msm_wdt_base = pdata->base;
+ msm_wdog_irq = platform_get_irq(pdev, 0);
/*
* This is only temporary till SBLs turn on the XPUs
diff --git a/arch/arm/mach-msm/msm_watchdog.h b/arch/arm/mach-msm/msm_watchdog.h
index 00ff0b6..5fb82ee 100644
--- a/arch/arm/mach-msm/msm_watchdog.h
+++ b/arch/arm/mach-msm/msm_watchdog.h
@@ -13,6 +13,10 @@
#ifndef __ARCH_ARM_MACH_MSM_MSM_WATCHDOG_H
#define __ARCH_ARM_MACH_MSM_MSM_WATCHDOG_H
+/* The base is just address of the WDT_RST register */
+#define WDT0_OFFSET 0x38
+#define WDT1_OFFSET 0x60
+
struct msm_watchdog_pdata {
/* pet interval period in ms */
unsigned int pet_time;
@@ -23,6 +27,7 @@
bool has_vic;
/* You have to be running in secure mode to use FIQ */
bool use_kernel_fiq;
+ void __iomem *base;
};
struct msm_watchdog_dump {