Hi Daniel, >> +static struct clk *cpu_clk; >> +static int cpu_clk_cnt; >> + >> +static unsigned int r4k_offset; >> +static unsigned int r4k_cur; >> > What is the sense of these variables? They are never really used. > left overs from old kernel patches, i'll remove them >> +void __init >> +plat_time_init(void) >> +{ >> + struct clk *clk = clk_get(0, "cpu"); >> + mips_hpt_frequency = clk_get_rate(clk) / ltq_get_counter_resolution(); >> + r4k_cur = (read_c0_count() + r4k_offset); >> + write_c0_compare(r4k_cur); >> > Like stated above the r4k_cur and r4k_offset are only initailied with > 0. So the last two lines > could be written as write_c0_compare(read_c0_count()) and are actually > ineffective. > > ok >> +void >> +early_printf(const char *fmt, ...) >> +{ >> + char buf[ASC_BUF]; >> + va_list args; >> + int l; >> + char *p, *buf_end; >> + va_start(args, fmt); >> + l = vsnprintf(buf, ASC_BUF, fmt, args); >> + va_end(args); >> + buf_end = buf + l; >> + for (p = buf; p < buf_end; p++) >> + prom_putchar(*p); >> +} >> > With CONFIG_EARLY_PRINTK enabled and prom_putchar() implemented you > can use printk() everywhere. > So an own early_printf() is not needed. > > not quite, this is used by the prom code where printk is followed by an unreachable() rendering the printk to not work. i asked in #mipslinux about this already and was tolf that this is the only work around as the early_printk api does not expose its internal simple_printf() function. >> + >> +static void >> +ltq_hw_irqdispatch(int module) >> +{ >> + u32 irq; >> + >> + irq = ltq_r32(LTQ_ICU_IM0_IOSR + (module * LTQ_ICU_OFFSET)); >> + if (irq == 0) >> + return; >> + >> + /* silicon bug causes only the msb set to 1 to be valid. all >> + other bits might be bogus */ >> + irq = __fls(irq); >> + do_IRQ((int)irq + INT_NUM_IM0_IRL0 + (INT_NUM_IM_OFFSET * module)); >> +} >> + >> +#define DEFINE_HWx_IRQDISPATCH(x) \ >> +static void ltq_hw ## x ## _irqdispatch(void)\ >> +{\ >> + ltq_hw_irqdispatch(x); \ >> +} >> +DEFINE_HWx_IRQDISPATCH(0) >> +DEFINE_HWx_IRQDISPATCH(1) >> +DEFINE_HWx_IRQDISPATCH(2) >> +DEFINE_HWx_IRQDISPATCH(3) >> +DEFINE_HWx_IRQDISPATCH(4) >> > The interrupt line IM0-IRL22 is shared by PCI (INT A) and EBU. Thus > ltq_hw0_irqdispatch() > should clear the PCI bit (5th bit) in EBU_PCC_ISTAT register (EBU_BASE > + 0xA0) if you enable > this interrupt in pcibios_plat_dev_init(). > This is undocumented in the hardware manuals but can be found in all > Lantiq BSP's. > > i'll look into it > +void __init >> +arch_init_irq(void) >> +{ >> + int i; >> + >> + for (i = 0; i < 5; i++) >> + ltq_w32(0, LTQ_ICU_IM0_IER + (i * LTQ_ICU_OFFSET)); >> > Perhaps pending interrupts should be cleared too with > ltq_w32(~0, LTQ_ICU_IM0_ISR + (i * LTQ_ICU_OFFSET)); > > will look into this too >> + >> +/* all access to the ebu must be locked */ >> +DEFINE_SPINLOCK(ebu_lock); >> +EXPORT_SYMBOL_GPL(ebu_lock); >> > This lock is only needed if you want to use software arbitration. > Normally the EBU does hardware arbitration and can be accessed safely > without lock. > > openwrt borks up on mini_fo init when this lock is not in-place. we saw a lot of issues in the past which lead to this lock being added. i will retry it with out the lock to verify thx i will fold all suggestions into the next version of the series. John