[brcm63xx] extend bcm63xx_wdt driver for debugging purposes, thx Miguel
authorRaphaël Huck <rhk@cksum.org>
Tue, 27 Apr 2010 15:45:03 +0000 (15:45 +0000)
committerRaphaël Huck <rhk@cksum.org>
Tue, 27 Apr 2010 15:45:03 +0000 (15:45 +0000)
SVN-Revision: 21199

target/linux/brcm63xx/patches-2.6.32/020-watchdog.patch
target/linux/brcm63xx/patches-2.6.33/020-watchdog.patch

index 0d0a21aeb7694136db6d920eeb470d3242cd18a2..511bce7112355c3f822d4e10c890d9ab9380f0c8 100644 (file)
@@ -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
 + *
 +#include <linux/watchdog.h>
 +#include <linux/timer.h>
 +#include <linux/jiffies.h>
++#include <linux/interrupt.h>
++#include <linux/ptrace.h>
 +#include <linux/resource.h>
 +#include <linux/platform_device.h>
 +
 +#include <bcm63xx_cpu.h>
 +#include <bcm63xx_io.h>
 +#include <bcm63xx_regs.h>
++#include <bcm63xx_timer.h>
 +
 +#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;
 +      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)) {
 +              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
 +      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;
 +}
 +      iounmap(bcm63xx_wdt_device.regs);
 +
 +      unregister_reboot_notifier(&bcm63xx_wdt_notifier);
++      bcm63xx_timer_unregister(TIMER_WDT_ID);
 +
 +      return 0;
 +}
index b4204d8f109a89dd42ef392b42e9b222c90d9260..2b3e6c1b4eb371495f2ccc686aae6302ec72df2a 100644 (file)
@@ -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
 + *
 +#include <linux/watchdog.h>
 +#include <linux/timer.h>
 +#include <linux/jiffies.h>
++#include <linux/interrupt.h>
++#include <linux/ptrace.h>
 +#include <linux/resource.h>
 +#include <linux/platform_device.h>
 +
 +#include <bcm63xx_cpu.h>
 +#include <bcm63xx_io.h>
 +#include <bcm63xx_regs.h>
++#include <bcm63xx_timer.h>
 +
 +#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;
 +      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)) {
 +              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
 +      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;
 +}
 +      iounmap(bcm63xx_wdt_device.regs);
 +
 +      unregister_reboot_notifier(&bcm63xx_wdt_notifier);
++      bcm63xx_timer_unregister(TIMER_WDT_ID);
 +
 +      return 0;
 +}