Hello Ralf, I made a patch for vr41xx. This patch changes a clock function for a power management. This is required because of a power management. Please apply this patch to v2.4. Yoichi diff -urN -X dontdiff linux-orig/arch/mips/vr41xx/common/cmu.c linux/arch/mips/vr41xx/common/cmu.c --- linux-orig/arch/mips/vr41xx/common/cmu.c Tue Jan 13 08:16:58 2004 +++ linux/arch/mips/vr41xx/common/cmu.c Wed Feb 11 00:34:15 2004 @@ -40,6 +40,7 @@ * - Added support for NEC VR4133. */ #include <linux/init.h> +#include <linux/spinlock.h> #include <linux/types.h> #include <asm/cpu.h> @@ -66,16 +67,19 @@ #define MSKMAC0 0x0002 #define MSKMAC1 0x0004 -static u32 vr41xx_cmu_base; -static u16 cmuclkmsk, cmuclkmsk2; +static uint32_t cmu_base; +static uint16_t cmuclkmsk, cmuclkmsk2; +static spinlock_t cmu_lock; -#define read_cmuclkmsk() readw(vr41xx_cmu_base) +#define read_cmuclkmsk() readw(cmu_base) #define read_cmuclkmsk2() readw(CMUCLKMSK2) -#define write_cmuclkmsk() writew(cmuclkmsk, vr41xx_cmu_base) +#define write_cmuclkmsk() writew(cmuclkmsk, cmu_base) #define write_cmuclkmsk2() writew(cmuclkmsk2, CMUCLKMSK2) -void vr41xx_clock_supply(unsigned int clock) +void vr41xx_supply_clock(unsigned int clock) { + spin_lock_irq(&cmu_lock); + switch (clock) { case PIU_CLOCK: cmuclkmsk |= MSKPIU; @@ -129,10 +133,14 @@ write_cmuclkmsk2(); else write_cmuclkmsk(); + + spin_unlock_irq(&cmu_lock); } -void vr41xx_clock_mask(unsigned int clock) +void vr41xx_mask_clock(unsigned int clock) { + spin_lock_irq(&cmu_lock); + switch (clock) { case PIU_CLOCK: cmuclkmsk &= ~MSKPIU; @@ -198,6 +206,8 @@ write_cmuclkmsk2(); else write_cmuclkmsk(); + + spin_unlock_irq(&cmu_lock); } void __init vr41xx_cmu_init(void) @@ -205,14 +215,14 @@ switch (current_cpu_data.cputype) { case CPU_VR4111: case CPU_VR4121: - vr41xx_cmu_base = CMUCLKMSK_TYPE1; + cmu_base = CMUCLKMSK_TYPE1; break; case CPU_VR4122: case CPU_VR4131: - vr41xx_cmu_base = CMUCLKMSK_TYPE2; + cmu_base = CMUCLKMSK_TYPE2; break; case CPU_VR4133: - vr41xx_cmu_base = CMUCLKMSK_TYPE2; + cmu_base = CMUCLKMSK_TYPE2; cmuclkmsk2 = read_cmuclkmsk2(); break; default: @@ -221,4 +231,6 @@ } cmuclkmsk = read_cmuclkmsk(); + + spin_lock_init(&cmu_lock); } diff -urN -X dontdiff linux-orig/arch/mips/vr41xx/common/ksyms.c linux/arch/mips/vr41xx/common/ksyms.c --- linux-orig/arch/mips/vr41xx/common/ksyms.c Thu Dec 18 00:58:12 2003 +++ linux/arch/mips/vr41xx/common/ksyms.c Wed Feb 11 00:34:15 2004 @@ -25,6 +25,9 @@ EXPORT_SYMBOL(vr41xx_get_vtclock_frequency); EXPORT_SYMBOL(vr41xx_get_tclock_frequency); +EXPORT_SYMBOL(vr41xx_supply_clock); +EXPORT_SYMBOL(vr41xx_mask_clock); + EXPORT_SYMBOL(vr41xx_set_intassign); EXPORT_SYMBOL(vr41xx_set_rtclong1_cycle); diff -urN -X dontdiff linux-orig/arch/mips/vr41xx/common/pciu.c linux/arch/mips/vr41xx/common/pciu.c --- linux-orig/arch/mips/vr41xx/common/pciu.c Tue Feb 10 22:33:40 2004 +++ linux/arch/mips/vr41xx/common/pciu.c Wed Feb 11 00:34:15 2004 @@ -178,7 +178,7 @@ writew(0, MPCIINTREG); /* Supply VTClock to PCIU */ - vr41xx_clock_supply(PCIU_CLOCK); + vr41xx_supply_clock(PCIU_CLOCK); /* Dummy read/write, waiting for supply of VTClock. */ readw(MPCIINTREG); @@ -196,7 +196,7 @@ printk(KERN_INFO "Warning: PCI Clock is over 33MHz.\n"); /* Supply PCI clock by PCI bus */ - vr41xx_clock_supply(PCI_CLOCK); + vr41xx_supply_clock(PCI_CLOCK); /* * Set PCI memory & I/O space address conversion registers diff -urN -X dontdiff linux-orig/arch/mips/vr41xx/common/serial.c linux/arch/mips/vr41xx/common/serial.c --- linux-orig/arch/mips/vr41xx/common/serial.c Tue Jan 13 08:16:58 2004 +++ linux/arch/mips/vr41xx/common/serial.c Wed Feb 11 00:34:15 2004 @@ -145,7 +145,7 @@ if (early_serial_setup(&s) != 0) printk(KERN_ERR "SIU setup failed!\n"); - vr41xx_clock_supply(SIU_CLOCK); + vr41xx_supply_clock(SIU_CLOCK); vr41xx_serial_ports++; } @@ -171,7 +171,7 @@ if (early_serial_setup(&s) != 0) printk(KERN_ERR "DSIU setup failed!\n"); - vr41xx_clock_supply(DSIU_CLOCK); + vr41xx_supply_clock(DSIU_CLOCK); writew(INTDSIU, MDSIUINTREG); diff -urN -X dontdiff linux-orig/drivers/char/vr41xx_keyb.c linux/drivers/char/vr41xx_keyb.c --- linux-orig/drivers/char/vr41xx_keyb.c Tue Feb 10 06:21:26 2004 +++ linux/drivers/char/vr41xx_keyb.c Wed Feb 11 00:34:15 2004 @@ -325,7 +325,7 @@ if (current_cpu_data.cputype == CPU_VR4111 || current_cpu_data.cputype == CPU_VR4121) - vr41xx_clock_supply(KIU_CLOCK); + vr41xx_supply_clock(KIU_CLOCK); kiu_writew(KIURST_KIURST, KIURST); diff -urN -X dontdiff linux-orig/include/asm-mips/vr41xx/vr41xx.h linux/include/asm-mips/vr41xx/vr41xx.h --- linux-orig/include/asm-mips/vr41xx/vr41xx.h Tue Feb 10 22:33:56 2004 +++ linux/include/asm-mips/vr41xx/vr41xx.h Wed Feb 11 00:36:44 2004 @@ -53,8 +53,6 @@ * Clock Mask Unit */ extern void vr41xx_cmu_init(void); -extern void vr41xx_clock_supply(unsigned int clock); -extern void vr41xx_clock_mask(unsigned int clock); enum { PIU_CLOCK, @@ -71,6 +69,9 @@ ETHER0_CLOCK, ETHER1_CLOCK }; + +extern void vr41xx_supply_clock(unsigned int clock); +extern void vr41xx_mask_clock(unsigned int clock); /* * Interrupt Control Unit