Matt and Kurmar: I performed name-cleanup in the driver.
Moreover, I tested this driver with PowerPC405GPr(Sycamore) in addition to PowerPC440GP(ebony)/MPC8555(MPC8555-CDS). This driver consist of two patches as follows: 1) Architecture specific part(booke_wdt-arch.patch) This is the architecture specific part of the driver. It contains WDT exception handlers and kernel command line processing routines. 2) Device driver part(booke_wdt-drv.patch) This is the core of this WDT driver. At first, I post the architecture specific part with this mail. Please apply. Regards, Signed-off-by: Takeharu KATO <kato.takeharu at jp.fujitsu.com> --- linux-2.6.11/arch/ppc/kernel/head_44x.S 2005-03-04 17:12:42.944450424 +0900 +++ linux-2.6.11-booke-wdt/arch/ppc/kernel/head_44x.S 2005-03-04 13:21:31.000000000 +0900 @@ -444,8 +444,12 @@ interrupt_base: EXCEPTION(0x1010, FixedIntervalTimer, UnknownException, EXC_XFER_EE) /* Watchdog Timer Interrupt */ - /* TODO: Add watchdog support */ +#if defined(CONFIG_BOOKE_WDT) + CRITICAL_EXCEPTION(0x1020, WatchdogTimer, booke_wdt_exception) +#else CRITICAL_EXCEPTION(0x1020, WatchdogTimer, UnknownException) +#endif /* CONFIG_BOOKE_WDT */ + /* Data TLB Error Interrupt */ START_EXCEPTION(DataTLBError) --- linux-2.6.11/arch/ppc/kernel/head_4xx.S 2005-03-04 17:16:48.089182760 +0900 +++ linux-2.6.11-booke-wdt/arch/ppc/kernel/head_4xx.S 2005-03-04 13:21:31.000000000 +0900 @@ -469,27 +469,23 @@ label: /* 0x1000 - Programmable Interval Timer (PIT) Exception */ START_EXCEPTION(0x1000, Decrementer) - NORMAL_EXCEPTION_PROLOG - lis r0,TSR_PIS at h - mtspr SPRN_TSR,r0 /* Clear the PIT exception */ - addi r3,r1,STACK_FRAME_OVERHEAD - EXC_XFER_LITE(0x1000, timer_interrupt) - + b DecrementerHandler #if 0 /* NOTE: - * FIT and WDT handlers are not implemented yet. + * FIT handler are not implemented yet. */ /* 0x1010 - Fixed Interval Timer (FIT) Exception */ STND_EXCEPTION(0x1010, FITException, UnknownException) -/* 0x1020 - Watchdog Timer (WDT) Exception -*/ - - CRITICAL_EXCEPTION(0x1020, WDTException, UnknownException) #endif + /* 0x1020 - Watchdog Timer (WDT) Exception + */ + START_EXCEPTION(0x1020, WDTException) + b WatchDogHandler + /* 0x1100 - Data TLB Miss Exception * As the name implies, translation is not in the MMU, so search the * page tables and fix it. The only purpose of this function is to @@ -771,6 +767,14 @@ label: (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), \ NOCOPY, crit_transfer_to_handler, ret_from_crit_exc) + +DecrementerHandler: + NORMAL_EXCEPTION_PROLOG + lis r0,TSR_PIS at h + mtspr SPRN_TSR,r0 /* Clear the PIT exception */ + addi r3,r1,STACK_FRAME_OVERHEAD + EXC_XFER_LITE(0x1000, timer_interrupt) + /* * The other Data TLB exceptions bail out to this point * if they can't resolve the lightweight TLB fault. @@ -844,6 +848,19 @@ finish_tlb_load: rfi /* Should sync shadow TLBs */ b . /* prevent prefetch past rfi */ +/* + * WatchDog Exception + */ +WatchDogHandler: + CRITICAL_EXCEPTION_PROLOG; + addi r3,r1,STACK_FRAME_OVERHEAD; +#if defined(CONFIG_BOOKE_WDT) + EXC_XFER_TEMPLATE(booke_wdt_exception, 0x1022, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)),NOCOPY, crit_transfer_to_handler, ret_from_crit_exc) + +#else + EXC_XFER_TEMPLATE(UnknownException, 0x1022, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)),NOCOPY, crit_transfer_to_handler, ret_from_crit_exc) +#endif /* CONFIG_BOOKE_WDT */ + /* extern void giveup_fpu(struct task_struct *prev) * * The PowerPC 4xx family of processors do not have an FPU, so this just --- linux-2.6.11/arch/ppc/kernel/head_e500.S 2005-03-04 17:15:36.641044528 +0900 +++ linux-2.6.11-booke-wdt/arch/ppc/kernel/head_e500.S 2005-03-04 13:21:31.000000000 +0900 @@ -494,8 +494,11 @@ interrupt_base: EXCEPTION(0x3100, FixedIntervalTimer, UnknownException, EXC_XFER_EE) /* Watchdog Timer Interrupt */ - /* TODO: Add watchdog support */ +#if defined(CONFIG_BOOKE_WDT) + CRITICAL_EXCEPTION(0x3200, WatchdogTimer, booke_wdt_exception) +#else CRITICAL_EXCEPTION(0x3200, WatchdogTimer, UnknownException) +#endif /* CONFIG_BOOKE_WDT */ /* Data TLB Error Interrupt */ START_EXCEPTION(DataTLBError) --- linux-2.6.11/arch/ppc/platforms/85xx/mpc8540_ads.c 2005-03-04 17:13:11.927044400 +0900 +++ linux-2.6.11-booke-wdt/arch/ppc/platforms/85xx/mpc8540_ads.c 2005-03-04 13:21:31.000000000 +0900 @@ -54,6 +54,7 @@ #include <syslib/ppc85xx_setup.h> + /* ************************************************************************ * * Setup the architecture @@ -187,6 +188,14 @@ platform_init(unsigned long r3, unsigned strcpy(cmd_line, (char *) (r6 + KERNELBASE)); } +#ifdef CONFIG_BOOKE_WDT + { + extern void booke_wdt_setup_options(char *cmd_line); + + booke_wdt_setup_options(cmd_line); + } +#endif /* CONFIG_BOOKE_WDT */ + identify_ppc_sys_by_id(mfspr(SVR)); /* setup the PowerPC module struct */ --- linux-2.6.11/arch/ppc/platforms/85xx/mpc8560_ads.c 2005-03-04 17:17:54.566076736 +0900 +++ linux-2.6.11-booke-wdt/arch/ppc/platforms/85xx/mpc8560_ads.c 2005-03-04 13:21:31.000000000 +0900 @@ -197,6 +197,14 @@ platform_init(unsigned long r3, unsigned strcpy(cmd_line, (char *) (r6 + KERNELBASE)); } +#ifdef CONFIG_BOOKE_WDT + { + extern void booke_wdt_setup_options(char *cmd_line); + + booke_wdt_setup_options(cmd_line); + } +#endif /* CONFIG_BOOKE_WDT */ + identify_ppc_sys_by_id(mfspr(SVR)); /* setup the PowerPC module struct */ --- linux-2.6.11/arch/ppc/platforms/85xx/mpc85xx_cds_common.c 2005-03-04 17:16:27.056380232 +0900 +++ linux-2.6.11-booke-wdt/arch/ppc/platforms/85xx/mpc85xx_cds_common.c 2005-03-04 13:21:31.000000000 +0900 @@ -437,6 +437,14 @@ platform_init(unsigned long r3, unsigned strcpy(cmd_line, (char *) (r6 + KERNELBASE)); } +#ifdef CONFIG_BOOKE_WDT + { + extern void booke_wdt_setup_options(char *cmd_line); + + booke_wdt_setup_options(cmd_line); + } +#endif /* CONFIG_BOOKE_WDT */ + identify_ppc_sys_by_id(mfspr(SVR)); /* setup the PowerPC module struct */ --- linux-2.6.11/arch/ppc/platforms/85xx/sbc8560.c 2005-03-04 17:17:22.985877656 +0900 +++ linux-2.6.11-booke-wdt/arch/ppc/platforms/85xx/sbc8560.c 2005-03-04 13:21:31.000000000 +0900 @@ -198,6 +198,14 @@ platform_init(unsigned long r3, unsigned strcpy(cmd_line, (char *) (r6 + KERNELBASE)); } +#ifdef CONFIG_BOOKE_WDT + { + extern void booke_wdt_setup_options(char *cmd_line); + + booke_wdt_setup_options(cmd_line); + } +#endif /* CONFIG_BOOKE_WDT */ + identify_ppc_sys_by_id(mfspr(SVR)); /* setup the PowerPC module struct */ --- linux-2.6.11/arch/ppc/platforms/85xx/stx_gp3.c 2005-03-04 17:14:12.883777568 +0900 +++ linux-2.6.11-booke-wdt/arch/ppc/platforms/85xx/stx_gp3.c 2005-03-04 13:21:31.000000000 +0900 @@ -68,6 +68,7 @@ unsigned long isa_mem_base = 0; unsigned long pci_dram_offset = 0; #endif + /* Internal interrupts are all Level Sensitive, and Positive Polarity */ static u8 gp3_openpic_initsenses[] __initdata = { (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 0: L2 Cache */ @@ -357,6 +358,14 @@ platform_init(unsigned long r3, unsigned strcpy(cmd_line, (char *) (r6 + KERNELBASE)); } +#ifdef CONFIG_BOOKE_WDT + { + extern void booke_wdt_setup_options(char *cmd_line); + + booke_wdt_setup_options(cmd_line); + } +#endif /* CONFIG_BOOKE_WDT */ + identify_ppc_sys_by_id(mfspr(SVR)); /* setup the PowerPC module struct */ --- linux-2.6.11/arch/ppc/syslib/ppc4xx_setup.c 2005-03-04 17:10:56.867576560 +0900 +++ linux-2.6.11-booke-wdt/arch/ppc/syslib/ppc4xx_setup.c 2005-03-04 13:21:31.000000000 +0900 @@ -48,10 +48,6 @@ extern void abort(void); extern void ppc4xx_find_bridges(void); -extern void ppc4xx_wdt_heartbeat(void); -extern int wdt_enable; -extern unsigned long wdt_period; - /* Global Variables */ bd_t __res; @@ -257,22 +253,14 @@ ppc4xx_init(unsigned long r3, unsigned l *(char *) (r7 + KERNELBASE) = 0; strcpy(cmd_line, (char *) (r6 + KERNELBASE)); } -#if defined(CONFIG_PPC405_WDT) -/* Look for wdt= option on command line */ - if (strstr(cmd_line, "wdt=")) { - int valid_wdt = 0; - char *p, *q; - for (q = cmd_line; (p = strstr(q, "wdt=")) != 0;) { - q = p + 4; - if (p > cmd_line && p[-1] != ' ') - continue; - wdt_period = simple_strtoul(q, &q, 0); - valid_wdt = 1; - ++q; - } - wdt_enable = valid_wdt; - } -#endif + +#ifdef CONFIG_BOOKE_WDT + { + extern void booke_wdt_setup_options(char *cmd_line); + + booke_wdt_setup_options(cmd_line); + } +#endif /* CONFIG_BOOKE_WDT */ /* Initialize machine-dependent vectors */ @@ -319,3 +307,5 @@ void platform_machine_check(struct pt_re #endif } + +