From 22a8394293ccf8fe1fc3212897b13581329924d1 Mon Sep 17 00:00:00 2001 From: rhk Date: Tue, 27 Apr 2010 15:45:03 +0000 Subject: [PATCH] [brcm63xx] extend bcm63xx_wdt driver for debugging purposes, thx Miguel git-svn-id: svn://svn.openwrt.org/openwrt/trunk@21199 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../patches-2.6.32/020-watchdog.patch | 30 +++++++++++++++---- .../patches-2.6.33/020-watchdog.patch | 30 +++++++++++++++---- 2 files changed, 50 insertions(+), 10 deletions(-) diff --git a/target/linux/brcm63xx/patches-2.6.32/020-watchdog.patch b/target/linux/brcm63xx/patches-2.6.32/020-watchdog.patch index 0d0a21aeb..511bce711 100644 --- a/target/linux/brcm63xx/patches-2.6.32/020-watchdog.patch +++ b/target/linux/brcm63xx/patches-2.6.32/020-watchdog.patch @@ -29,7 +29,7 @@ # POWERPC Architecture --- /dev/null +++ b/drivers/watchdog/bcm63xx_wdt.c -@@ -0,0 +1,334 @@ +@@ -0,0 +1,354 @@ +/* + * Broadcom BCM63xx SoC watchdog driver + * @@ -56,12 +56,15 @@ +#include +#include +#include ++#include ++#include +#include +#include + +#include +#include +#include ++#include + +#define PFX KBUILD_MODNAME + @@ -78,7 +81,6 @@ +} bcm63xx_wdt_device; + +static int expect_close; -+static int timeout; + +static int wdt_time = WDT_DEFAULT_TIME; +static int nowayout = WATCHDOG_NOWAYOUT; @@ -100,6 +102,13 @@ + bcm_writel(WDT_STOP_2, bcm63xx_wdt_device.regs + WDT_CTL_REG); +} + ++static void bcm63xx_wdt_isr(void *data) ++{ ++ struct pt_regs *regs = get_irq_regs(); ++ ++ die(PFX " fire", regs); ++} ++ +static void bcm63xx_timer_tick(unsigned long unused) +{ + if (!atomic_dec_and_test(&bcm63xx_wdt_device.ticks)) { @@ -292,6 +301,13 @@ + return -ENXIO; + } + ++ ret = bcm63xx_timer_register(TIMER_WDT_ID, bcm63xx_wdt_isr, NULL); ++ if (ret < 0) { ++ printk(KERN_ERR PFX ++ "failed to register wdt timer isr\n"); ++ goto unmap; ++ } ++ + if (bcm63xx_wdt_settimeout(wdt_time)) { + bcm63xx_wdt_settimeout(WDT_DEFAULT_TIME); + printk(KERN_INFO PFX @@ -303,22 +319,25 @@ + if (ret) { + printk(KERN_ERR PFX + "failed to register reboot_notifier\n"); -+ return ret; ++ goto unregister_timer; + } + + ret = misc_register(&bcm63xx_wdt_miscdev); + if (ret < 0) { + printk(KERN_ERR PFX + "failed to register watchdog device\n"); -+ goto unmap; ++ goto unregister_reboot_notifier; + } + + printk(KERN_INFO PFX " started, timer margin: %d sec\n", WDT_DEFAULT_TIME); + + return 0; + -+unmap: ++unregister_reboot_notifier: + unregister_reboot_notifier(&bcm63xx_wdt_notifier); ++unregister_timer: ++ bcm63xx_timer_unregister(TIMER_WDT_ID); ++unmap: + iounmap(bcm63xx_wdt_device.regs); + return ret; +} @@ -333,6 +352,7 @@ + iounmap(bcm63xx_wdt_device.regs); + + unregister_reboot_notifier(&bcm63xx_wdt_notifier); ++ bcm63xx_timer_unregister(TIMER_WDT_ID); + + return 0; +} diff --git a/target/linux/brcm63xx/patches-2.6.33/020-watchdog.patch b/target/linux/brcm63xx/patches-2.6.33/020-watchdog.patch index b4204d8f1..2b3e6c1b4 100644 --- a/target/linux/brcm63xx/patches-2.6.33/020-watchdog.patch +++ b/target/linux/brcm63xx/patches-2.6.33/020-watchdog.patch @@ -29,7 +29,7 @@ # POWERPC Architecture --- /dev/null +++ b/drivers/watchdog/bcm63xx_wdt.c -@@ -0,0 +1,334 @@ +@@ -0,0 +1,354 @@ +/* + * Broadcom BCM63xx SoC watchdog driver + * @@ -56,12 +56,15 @@ +#include +#include +#include ++#include ++#include +#include +#include + +#include +#include +#include ++#include + +#define PFX KBUILD_MODNAME + @@ -78,7 +81,6 @@ +} bcm63xx_wdt_device; + +static int expect_close; -+static int timeout; + +static int wdt_time = WDT_DEFAULT_TIME; +static int nowayout = WATCHDOG_NOWAYOUT; @@ -100,6 +102,13 @@ + bcm_writel(WDT_STOP_2, bcm63xx_wdt_device.regs + WDT_CTL_REG); +} + ++static void bcm63xx_wdt_isr(void *data) ++{ ++ struct pt_regs *regs = get_irq_regs(); ++ ++ die(PFX " fire", regs); ++} ++ +static void bcm63xx_timer_tick(unsigned long unused) +{ + if (!atomic_dec_and_test(&bcm63xx_wdt_device.ticks)) { @@ -292,6 +301,13 @@ + return -ENXIO; + } + ++ ret = bcm63xx_timer_register(TIMER_WDT_ID, bcm63xx_wdt_isr, NULL); ++ if (ret < 0) { ++ printk(KERN_ERR PFX ++ "failed to register wdt timer isr\n"); ++ goto unmap; ++ } ++ + if (bcm63xx_wdt_settimeout(wdt_time)) { + bcm63xx_wdt_settimeout(WDT_DEFAULT_TIME); + printk(KERN_INFO PFX @@ -303,22 +319,25 @@ + if (ret) { + printk(KERN_ERR PFX + "failed to register reboot_notifier\n"); -+ return ret; ++ goto unregister_timer; + } + + ret = misc_register(&bcm63xx_wdt_miscdev); + if (ret < 0) { + printk(KERN_ERR PFX + "failed to register watchdog device\n"); -+ goto unmap; ++ goto unregister_reboot_notifier; + } + + printk(KERN_INFO PFX " started, timer margin: %d sec\n", WDT_DEFAULT_TIME); + + return 0; + -+unmap: ++unregister_reboot_notifier: + unregister_reboot_notifier(&bcm63xx_wdt_notifier); ++unregister_timer: ++ bcm63xx_timer_unregister(TIMER_WDT_ID); ++unmap: + iounmap(bcm63xx_wdt_device.regs); + return ret; +} @@ -333,6 +352,7 @@ + iounmap(bcm63xx_wdt_device.regs); + + unregister_reboot_notifier(&bcm63xx_wdt_notifier); ++ bcm63xx_timer_unregister(TIMER_WDT_ID); + + return 0; +} -- 2.20.1