commit: http://blackfin.uclinux.org/git/?p=linux-kernel;a=commitdiff;h=b2e2d5fb670a1139717097b5dda866802b60827d
branch: http://blackfin.uclinux.org/git/?p=linux-kernel;a=shortlog;h=refs/heads/trunk

Add watchdog as a fault to reset the system.

Signed-off-by: Bob Liu <[email protected]>
---
 .../mach-bf609/include/mach/cdefBF60x_base.h       |   10 +++++++++-
 arch/blackfin/mach-common/ints-priority.c          |   11 ++++++++---
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/arch/blackfin/mach-bf609/include/mach/cdefBF60x_base.h b/arch/blackfin/mach-bf609/include/mach/cdefBF60x_base.h
index e3aa097..4a1b506 100644
--- a/arch/blackfin/mach-bf609/include/mach/cdefBF60x_base.h
+++ b/arch/blackfin/mach-bf609/include/mach/cdefBF60x_base.h
@@ -26,6 +26,9 @@
 #define bfin_read_SEC_GCTL()		bfin_read32(SEC_GCTL)
 #define bfin_write_SEC_GCTL(val)	bfin_write32(SEC_GCTL, val)
 
+#define bfin_read_SEC_FCTL()		bfin_read32(SEC_FCTL)
+#define bfin_write_SEC_FCTL(val)	bfin_write32(SEC_FCTL, val)
+
 #define bfin_read_SEC_SCTL(sid)		bfin_read32((SEC_SCTL0 + (sid) * 8))
 #define bfin_write_SEC_SCTL(sid, val)	bfin_write32((SEC_SCTL0 + (sid) * 8), val)
 
@@ -37,7 +40,12 @@
 #define bfin_write_RCU0_CTL(val)	bfin_write32(RCU0_CTL, val)
 
 /* Watchdog Timer Registers */
-
+#define bfin_read_WDOG_CTL()		bfin_read16(WDOG_CTL)
+#define bfin_write_WDOG_CTL(val)	bfin_write16(WDOG_CTL, val)
+#define bfin_read_WDOG_CNT()		bfin_read32(WDOG_CNT)
+#define bfin_write_WDOG_CNT(val)	bfin_write32(WDOG_CNT, val)
+#define bfin_read_WDOG_STAT()		bfin_read32(WDOG_STAT)
+#define bfin_write_WDOG_STAT(val)	bfin_write32(WDOG_STAT, val)
 
 /* RTC Registers */
 
diff --git a/arch/blackfin/mach-common/ints-priority.c b/arch/blackfin/mach-common/ints-priority.c
index 2204da1..e0ae811 100644
--- a/arch/blackfin/mach-common/ints-priority.c
+++ b/arch/blackfin/mach-common/ints-priority.c
@@ -256,7 +256,10 @@ static void bfin_sec_enable_sci(unsigned int sid)
 	unsigned long flags = hard_local_irq_save();
 	uint32_t reg_sctl = bfin_read_SEC_SCTL(sid);
 
-	reg_sctl |= SEC_SCTL_INT_EN;
+	if (sid == SIC_SYSIRQ(IRQ_WATCH0))
+		reg_sctl |= SEC_SCTL_FAULT_EN;
+	else
+		reg_sctl |= SEC_SCTL_INT_EN;
 	bfin_write_SEC_SCTL(sid, reg_sctl);
 
 	hard_local_irq_restore(flags);
@@ -348,7 +351,6 @@ void handle_sec_ssi_fault(uint32_t gstat)
 
 void handle_sec_fault(unsigned int irq, struct irq_desc *desc)
 {
-	struct irq_chip *chip = irq_desc_get_chip(desc);
 	uint32_t sec_gstat;
 
 	raw_spin_lock(&desc->lock);
@@ -1293,7 +1295,7 @@ int __init init_arch_irq(void)
 	for (irq = BFIN_IRQ(0); irq <= SYS_IRQS; irq++) {
 		if (irq < CORE_IRQS) {
 			irq_set_chip(irq, &bfin_sec_irqchip);
-			__irq_set_handler(irq, handle_sec_fault, 1, NULL);
+			__irq_set_handler(irq, handle_sec_fault, 0, NULL);
 		} else if (irq >= BFIN_IRQ(21) && irq <= BFIN_IRQ(26)) {
 			irq_set_chip(irq, &bfin_sec_irqchip);
 			irq_set_chained_handler(irq, bfin_demux_gpio_irq);
@@ -1364,6 +1366,9 @@ int __init init_arch_irq(void)
 	bfin_write_SEC_GCTL(SEC_GCTL_RESET);
 	udelay(100);
 
+	bfin_write_SEC_FCTL(SEC_FCTL_EN | SEC_FCTL_SYSRST_EN | SEC_FCTL_FLTIN_EN);
+	bfin_sec_enable_sci(SIC_SYSIRQ(IRQ_WATCH0));
+	bfin_sec_enable_ssi(SIC_SYSIRQ(IRQ_WATCH0));
 	bfin_write_SEC_SCI(0, SEC_CCTL, SEC_CCTL_RESET);
 	udelay(100);
 	bfin_write_SEC_GCTL(SEC_GCTL_EN);
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to