Merge branch 'master' of ssh://master.kernel.org/pub/scm/linux/kernel/git/kaber/nf-2.6
[pandora-kernel.git] / arch / mn10300 / unit-asb2364 / unit-init.c
index 1144080..6359b41 100644 (file)
 #include <asm/processor.h>
 #include <asm/irq.h>
 #include <asm/intctl-regs.h>
+#include <asm/serial-regs.h>
 #include <unit/fpga-regs.h>
+#include <unit/serial.h>
+#include <unit/smsc911x.h>
+
+#define TTYS0_SERIAL_IER       __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_IER * 2, u8)
+#define LAN_IRQ_CFG            __SYSREG(SMSC911X_BASE + 0x54, u32)
+#define LAN_INT_EN             __SYSREG(SMSC911X_BASE + 0x5c, u32)
 
 /*
  * initialise some of the unit hardware before gdbstub is set up
  */
 asmlinkage void __init unit_init(void)
 {
+       /* Make sure we aren't going to get unexpected interrupts */
+       TTYS0_SERIAL_IER = 0;
+       SC0RXICR = 0;
+       SC0TXICR = 0;
+       SC1RXICR = 0;
+       SC1TXICR = 0;
+       SC2RXICR = 0;
+       SC2TXICR = 0;
+
+       /* Attempt to reset the FPGA attached peripherals */
+       ASB2364_FPGA_REG_RESET_LAN = 0x0000;
+       SyncExBus();
+       ASB2364_FPGA_REG_RESET_UART = 0x0000;
+       SyncExBus();
+       ASB2364_FPGA_REG_RESET_I2C = 0x0000;
+       SyncExBus();
+       ASB2364_FPGA_REG_RESET_USB = 0x0000;
+       SyncExBus();
+       ASB2364_FPGA_REG_RESET_AV = 0x0000;
+       SyncExBus();
+
        /* set up the external interrupts */
 
        /* XIRQ[0]: NAND RXBY */
@@ -56,7 +84,23 @@ asmlinkage void __init unit_init(void)
  */
 asmlinkage void __init unit_setup(void)
 {
+       /* Release the reset on the SMSC911X so that it is ready by the time we
+        * need it */
+       ASB2364_FPGA_REG_RESET_LAN = 0x0001;
+       SyncExBus();
+       ASB2364_FPGA_REG_RESET_UART = 0x0001;
+       SyncExBus();
+       ASB2364_FPGA_REG_RESET_I2C = 0x0001;
+       SyncExBus();
+       ASB2364_FPGA_REG_RESET_USB = 0x0001;
+       SyncExBus();
+       ASB2364_FPGA_REG_RESET_AV = 0x0001;
+       SyncExBus();
 
+       /* Make sure the ethernet chipset isn't going to give us an interrupt
+        * storm from stuff it was doing pre-reset */
+       LAN_IRQ_CFG = 0;
+       LAN_INT_EN = 0;
 }
 
 /*