diff --git a/arch/sparc32/tree.fs b/arch/sparc32/tree.fs index 40ae84f..4b14dcb 100644 --- a/arch/sparc32/tree.fs +++ b/arch/sparc32/tree.fs @@ -56,22 +56,14 @@ new-device : decode-unit decode-unit-sbus ; finish-device -" /iommu/sbus" find-device -new-device - " SUNW,CS4231" device-name - " serial" device-type - 5 encode-int 0 encode-int encode+ " intr" property - 5 encode-int " interrupts" property - h# 3 encode-int h# 0c000000 encode-int encode+ h# 00000040 encode-int encode+ " reg" property - " audio" encode-string " alias" property -finish-device - +[IFDEF] CONFIG_BPP " /iommu/sbus" find-device new-device " SUNW,bpp" device-name h# 4 encode-int h# 0c800000 encode-int encode+ h# 0000001c encode-int encode+ " reg" property h# 33 encode-int 0 encode-int encode+ " intr" property finish-device +[THEN] " /iommu/sbus" find-device new-device diff --git a/drivers/esp.c b/drivers/esp.c index f04d2c0..96458e6 100644 --- a/drivers/esp.c +++ b/drivers/esp.c @@ -491,6 +491,11 @@ ob_esp_init(unsigned int slot, unsigned long base, unsigned long offset) push_str("reg"); fword("property"); + PUSH(0x02625a00); + fword("encode-int"); + push_str("clock-frequency"); + fword("property"); + for (id = 0; id < 8; id++) { if (!esp->sd[id].present) continue; diff --git a/drivers/obio.c b/drivers/obio.c index da1e838..2ad1a3c 100644 --- a/drivers/obio.c +++ b/drivers/obio.c @@ -859,8 +859,15 @@ ob_counter_init(unsigned long base, unsigned long offset) regs->l10_timer_limit = (((1000000/100) + 1) << 10); regs->cpu_timers[0].l14_timer_limit = 0; - PUSH((unsigned long)regs); + for (i = 0; i < SUN4M_NCPU; i++) { + PUSH((unsigned long)®s->cpu_timers[i]); + fword("encode-int"); + if (i != 0) + fword("encode+"); + } + PUSH((unsigned long)®s->l10_timer_limit); fword("encode-int"); + fword("encode+"); push_str("address"); fword("property"); @@ -905,10 +912,13 @@ ob_interrupt_init(unsigned long base, unsigned long offset) intregs->set = ~SUN4M_INT_MASKALL; intregs->cpu_intregs[0].clear = ~0x17fff; - // Is this correct? It works for NetBSD at least - PUSH((int)intregs); - fword("encode-int"); - PUSH((int)intregs); + for (i = 0; i < SUN4M_NCPU; i++) { + PUSH((unsigned long)&intregs->cpu_intregs[i]); + fword("encode-int"); + if (i != 0) + fword("encode+"); + } + PUSH((unsigned long)&intregs->tbt); fword("encode-int"); fword("encode+"); push_str("address"); diff --git a/drivers/sbus.c b/drivers/sbus.c index ce9f5b1..e89003d 100644 --- a/drivers/sbus.c +++ b/drivers/sbus.c @@ -22,6 +22,8 @@ #define SBUS_SLOTS 16 #define POWER_REGS 0x10 #define POWER_OFFSET 0x0a000000 +#define CS4231_REGS 0x40 +#define CS4231_OFFSET 0x0c000000 static void ob_sbus_node_init(unsigned long bus, unsigned long base) @@ -296,6 +298,51 @@ ob_power_init(unsigned int slot, unsigned long base) fword("finish-device"); } +static void +ob_cs4231_init(unsigned int slot, unsigned long base) +{ + push_str("/iommu/sbus"); + fword("find-device"); + fword("new-device"); + + push_str("SUNW,CS4231"); + fword("device-name"); + + push_str("serial"); + fword("device-type"); + + PUSH(slot); + fword("encode-int"); + PUSH(CS4231_OFFSET); + fword("encode-int"); + fword("encode+"); + PUSH(CS4231_REGS); + fword("encode-int"); + fword("encode+"); + push_str("reg"); + fword("property"); + + PUSH(5); + fword("encode-int"); + PUSH(0); + fword("encode-int"); + fword("encode+"); + push_str("intr"); + fword("property"); + + PUSH(5); + fword("encode-int"); + push_str("interrupts"); + fword("property"); + + push_str("audio"); + fword("encode-string"); + push_str("alias"); + fword("property"); + + fword("finish-device"); +} + static void ob_macio_init(unsigned int slot, unsigned long base, unsigned long offset) { @@ -327,7 +374,7 @@ sbus_probe_slot_ss5(unsigned int slot, unsigned long base) ob_tcx_init(slot, base); break; case 4: // SUNW,CS4231 - //ob_cs4231_init(slot, base); + ob_cs4231_init(slot, base); break; case 5: // MACIO: le, esp, bpp, power-management ob_macio_init(slot, base, 0x08000000);