X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/b338f05ee4ea7a93400472733e4f5141b5e42cc5..dc1f0c32c7fc544b6b18a2235fd152c4dc6d693a:/target/linux/brcm47xx/patches-2.6.23/610-ssb-watchdog-fix.patch diff --git a/target/linux/brcm47xx/patches-2.6.23/610-ssb-watchdog-fix.patch b/target/linux/brcm47xx/patches-2.6.23/610-ssb-watchdog-fix.patch index 55ba9a02f..f0a8772ce 100644 --- a/target/linux/brcm47xx/patches-2.6.23/610-ssb-watchdog-fix.patch +++ b/target/linux/brcm47xx/patches-2.6.23/610-ssb-watchdog-fix.patch @@ -1,53 +1,119 @@ ---- a/drivers/ssb/driver_mipscore.c 2007-12-06 08:07:00.000000000 +0100 -+++ b/drivers/ssb/driver_mipscore.c 2007-12-06 10:27:43.000000000 +0100 -@@ -31,6 +31,19 @@ - ssb_write32(extif->dev, offset, value); +--- a/drivers/ssb/Kconfig ++++ b/drivers/ssb/Kconfig +@@ -105,6 +105,12 @@ + + If unsure, say N + ++# Assumption: We are on embedded, if we compile the MIPS core. ++config SSB_EMBEDDED ++ bool ++ depends on SSB_DRIVER_MIPS ++ default y ++ + config SSB_DRIVER_EXTIF + bool "SSB Broadcom EXTIF core driver (EXPERIMENTAL)" + depends on SSB_DRIVER_MIPS && EXPERIMENTAL +--- a/drivers/ssb/Makefile ++++ b/drivers/ssb/Makefile +@@ -1,5 +1,6 @@ + # core + ssb-y += main.o scan.o ++ssb-$(CONFIG_SSB_EMBEDDED) += embedded.o + + # host support + ssb-$(CONFIG_SSB_PCIHOST) += pci.o pcihost_wrapper.o +--- a/drivers/ssb/driver_extif.c ++++ b/drivers/ssb/driver_extif.c +@@ -37,6 +37,12 @@ + return value; } -+/* Set chip watchdog reset timer to fire in 'ticks' backplane cycles */ -+int -+ssb_watchdog(struct ssb_bus *bus, uint ticks) ++void ssb_extif_watchdog_timer_set(struct ssb_extif *extif, ++ u32 ticks) +{ -+ /* instant NMI */ -+ if (bus->chipco.dev) -+ ssb_write32(bus->chipco.dev, SSB_CHIPCO_WATCHDOG, ticks); -+ else if (bus->extif.dev) -+ ssb_write32(bus->extif.dev, SSB_EXTIF_WATCHDOG, ticks); -+ return 0; ++ extif_write32(extif, SSB_EXTIF_WATCHDOG, ticks); +} -+EXPORT_SYMBOL(ssb_watchdog); + - static const u32 ipsflag_irq_mask[] = { - 0, - SSB_IPSFLAG_IRQ1, ---- a/include/linux/ssb/ssb_driver_mips.h 2007-12-06 08:07:00.000000000 +0100 -+++ b/include/linux/ssb/ssb_driver_mips.h 2007-12-06 10:32:36.000000000 +0100 -@@ -30,6 +30,8 @@ - - extern unsigned int ssb_mips_irq(struct ssb_device *dev); - -+/* Set watchdog reset timer to fire in 'ticks' backplane cycles */ -+extern int ssb_watchdog(struct ssb_bus *bus, uint ticks); + #ifdef CONFIG_SSB_SERIAL + static bool serial_exists(u8 *regs) + { +--- /dev/null ++++ b/drivers/ssb/embedded.c +@@ -0,0 +1,26 @@ ++/* ++ * Sonics Silicon Backplane ++ * Embedded systems support code ++ * ++ * Copyright 2005-2008, Broadcom Corporation ++ * Copyright 2006-2008, Michael Buesch ++ * ++ * Licensed under the GNU/GPL. See COPYING for details. ++ */ ++ ++#include ++#include ++ ++ ++int ssb_watchdog_timer_set(struct ssb_bus *bus, u32 ticks) ++{ ++ if (ssb_chipco_available(&bus->chipco)) { ++ ssb_chipco_watchdog_timer_set(&bus->chipco, ticks); ++ return 0; ++ } ++ if (ssb_extif_available(&bus->extif)) { ++ ssb_extif_watchdog_timer_set(&bus->extif, ticks); ++ return 0; ++ } ++ return -ENODEV; ++} +--- a/include/linux/ssb/ssb_driver_chipcommon.h ++++ b/include/linux/ssb/ssb_driver_chipcommon.h +@@ -360,6 +360,11 @@ + u16 fast_pwrup_delay; + }; - #else /* CONFIG_SSB_DRIVER_MIPS */ ++static inline bool ssb_chipco_available(struct ssb_chipcommon *cc) ++{ ++ return (cc->dev != NULL); ++} ++ + extern void ssb_chipcommon_init(struct ssb_chipcommon *cc); ---- a/arch/mips/bcm947xx/setup.c 2007-12-06 08:07:00.000000000 +0100 -+++ b/arch/mips/bcm947xx/setup.c 2007-12-06 10:33:39.000000000 +0100 -@@ -55,7 +55,7 @@ - */ + #include +--- a/include/linux/ssb/ssb_driver_extif.h ++++ b/include/linux/ssb/ssb_driver_extif.h +@@ -178,6 +178,9 @@ + u32 ssb_extif_gpio_polarity(struct ssb_extif *extif, u32 mask, u32 value); + u32 ssb_extif_gpio_intmask(struct ssb_extif *extif, u32 mask, u32 value); - /* Set the watchdog timer to reset immediately */ -- ssb_chipco_watchdog_timer_set(&ssb.chipco, 1); -+ ssb_watchdog(&ssb, 1); - while (1) - cpu_relax(); - } -@@ -64,7 +64,7 @@ ++extern void ssb_extif_watchdog_timer_set(struct ssb_extif *extif, ++ u32 ticks); ++ + #ifdef CONFIG_SSB_SERIAL + extern int ssb_extif_serial_init(struct ssb_extif *extif, + struct ssb_serial_port *ports); +@@ -201,5 +204,11 @@ { - /* Disable interrupts and watchdog and spin forever */ - local_irq_disable(); -- ssb_chipco_watchdog_timer_set(&ssb.chipco, 0); -+ ssb_watchdog(&ssb, 0); - while (1) - cpu_relax(); } + ++static inline ++void ssb_extif_watchdog_timer_set(struct ssb_extif *extif, ++ u32 ticks) ++{ ++} ++ + #endif /* CONFIG_SSB_DRIVER_EXTIF */ + #endif /* LINUX_SSB_EXTIFCORE_H_ */ +--- /dev/null ++++ b/include/linux/ssb/ssb_embedded.h +@@ -0,0 +1,10 @@ ++#ifndef LINUX_SSB_EMBEDDED_H_ ++#define LINUX_SSB_EMBEDDED_H_ ++ ++#include ++#include ++ ++ ++extern int ssb_watchdog_timer_set(struct ssb_bus *bus, u32 ticks); ++ ++#endif /* LINUX_SSB_EMBEDDED_H_ */