Hi Ralf, this brings back lasat_ndelay which is necessary because the eeprom containing information about memory sizes (among other things) needs ndelay very early on, before it is calibrated. You removed this code in a cleanup round a long time ago but it really is necessary for the system to work. The rtc also uses a bit-banging interface and is read before ndelay is calibrated (using the rtc). Initcalls now have a return code. There was an unused variable left after a cleanup. Please apply when you have time. I will come and poke you some day soon if you don't ;). /Brian Index: arch/mips/lasat/at93c.c =================================================================== RCS file: /cvs/linux/arch/mips/lasat/at93c.c,v retrieving revision 1.2 diff -u -r1.2 at93c.c --- arch/mips/lasat/at93c.c 25 Feb 2003 22:39:02 -0000 1.2 +++ arch/mips/lasat/at93c.c 14 Apr 2004 18:49:04 -0000 @@ -41,9 +41,9 @@ static void at93c_cycle_clk(u32 data) { at93c_reg_write(data | at93c->clk); - ndelay(250); + lasat_ndelay(250); at93c_reg_write(data & ~at93c->clk); - ndelay(250); + lasat_ndelay(250); } static void at93c_write_databit(u8 bit) @@ -55,7 +55,7 @@ data &= ~(1 << at93c->wdata_shift); at93c_reg_write(data); - ndelay(100); + lasat_ndelay(100); at93c_cycle_clk(data); } @@ -95,13 +95,13 @@ static void at93c_init_op(void) { at93c_reg_write((at93c_reg_read() | at93c->cs) & ~at93c->clk & ~(1 << at93c->rdata_shift)); - ndelay(50); + lasat_ndelay(50); } static void at93c_end_op(void) { at93c_reg_write(at93c_reg_read() & ~at93c->cs); - ndelay(250); + lasat_ndelay(250); } static void at93c_wait(void) Index: arch/mips/lasat/ds1603.c =================================================================== RCS file: /cvs/linux/arch/mips/lasat/ds1603.c,v retrieving revision 1.3 diff -u -r1.3 ds1603.c --- arch/mips/lasat/ds1603.c 25 Feb 2003 22:39:02 -0000 1.3 +++ arch/mips/lasat/ds1603.c 14 Apr 2004 19:05:57 -0000 @@ -51,14 +51,14 @@ { data |= ds1603->clk; rtc_reg_write(data); - ndelay(250); + lasat_ndelay(250); if (ds1603->data_reversed) data &= ~ds1603->data; else data |= ds1603->data; data &= ~ds1603->clk; rtc_reg_write(data); - ndelay(250 + ds1603->huge_delay); + lasat_ndelay(250 + ds1603->huge_delay); } static void rtc_write_databit(unsigned int bit) @@ -72,7 +72,7 @@ data &= ~ds1603->data; rtc_reg_write(data); - ndelay(50 + ds1603->huge_delay); + lasat_ndelay(50 + ds1603->huge_delay); rtc_cycle_clock(data); } @@ -125,13 +125,13 @@ rtc_reg_write(rtc_reg_read() & ~ds1603->clk); - ndelay(50); + lasat_ndelay(50); } static void rtc_end_op(void) { rtc_nrst_low(); - ndelay(1000); + lasat_ndelay(1000); } /* interface */ Index: arch/mips/lasat/interrupt.c =================================================================== RCS file: /cvs/linux/arch/mips/lasat/interrupt.c,v retrieving revision 1.10 diff -u -r1.10 interrupt.c --- arch/mips/lasat/interrupt.c 13 Apr 2004 22:07:45 -0000 1.10 +++ arch/mips/lasat/interrupt.c 13 Apr 2004 22:35:54 -0000 @@ -112,7 +112,6 @@ void lasat_hw0_irqdispatch(struct pt_regs *regs) { - struct irqaction *action; unsigned long int_status; int irq; Index: arch/mips/lasat/prom.c =================================================================== RCS file: /cvs/linux/arch/mips/lasat/prom.c,v retrieving revision 1.9 diff -u -r1.9 prom.c --- arch/mips/lasat/prom.c 28 Jan 2004 22:16:39 -0000 1.9 +++ arch/mips/lasat/prom.c 14 Apr 2004 19:00:10 -0000 @@ -46,6 +46,8 @@ null_prom_display; void (* prom_monitor)(void) = null_prom_monitor; +unsigned int lasat_ndelay_divider; + #define PROM_PRINTFBUF_SIZE 256 static char prom_printfbuf[PROM_PRINTFBUF_SIZE]; @@ -98,10 +100,15 @@ setup_prom_vectors(); - if (current_cpu_data.cputype == CPU_R5000) + if (current_cpu_data.cputype == CPU_R5000) { + prom_printf("LASAT 200 board\n"); mips_machtype = MACH_LASAT_200; - else + lasat_ndelay_divider = LASAT_200_DIVIDER; + } else { + prom_printf("LASAT 100 board\n"); mips_machtype = MACH_LASAT_100; + lasat_ndelay_divider = LASAT_100_DIVIDER; + } at93c = &at93c_defs[mips_machtype]; Index: arch/mips/lasat/setup.c =================================================================== RCS file: /cvs/linux/arch/mips/lasat/setup.c,v retrieving revision 1.13 diff -u -r1.13 setup.c --- arch/mips/lasat/setup.c 13 Apr 2004 22:07:45 -0000 1.13 +++ arch/mips/lasat/setup.c 13 Apr 2004 22:27:54 -0000 @@ -155,7 +155,7 @@ } #endif -static void __init lasat_setup(void) +static int __init lasat_setup(void) { int i; lasat_misc = &lasat_misc_info[mips_machtype]; @@ -185,6 +185,8 @@ change_c0_status(ST0_BEV,0); prom_printf("Lasat specific initialization complete\n"); + + return 0; } early_initcall(lasat_setup); Index: include/asm-mips/lasat/lasat.h =================================================================== RCS file: /cvs/linux/include/asm-mips/lasat/lasat.h,v retrieving revision 1.4 diff -u -r1.4 lasat.h --- include/asm-mips/lasat/lasat.h 6 Jun 2003 11:47:49 -0000 1.4 +++ include/asm-mips/lasat/lasat.h 14 Apr 2004 21:14:39 -0000 @@ -220,7 +220,22 @@ #define N_MACHTYPES 2 /* for calibration of delays */ +/* the lasat_ndelay function is necessary because it is used at an + * early stage of the boot process where ndelay is not calibrated. + * It is used for the bit-banging rtc and eeprom drivers */ + #include <asm/delay.h> +/* calculating with the slowest board with 100 MHz clock */ +#define LASAT_100_DIVIDER 20 +/* All 200's run at 250 MHz clock */ +#define LASAT_200_DIVIDER 8 + +extern unsigned int lasat_ndelay_divider; + +static inline void lasat_ndelay(unsigned int ns) +{ + __delay(ns / lasat_ndelay_divider); +} extern void (* prom_printf)(const char *fmt, ...);