MN10300: Clear ASB2364 peripheral interrupt masks before enabling interrupts
authorDavid Howells <dhowells@redhat.com>
Fri, 18 Mar 2011 16:52:54 +0000 (16:52 +0000)
committerDavid Howells <dhowells@redhat.com>
Fri, 18 Mar 2011 16:52:54 +0000 (16:52 +0000)
Clear the interrupt mask registers of ASB2364 peripherals before enabling
interrupts so that any peripherals that weren't dealt with by the bootloader
after a reboot (if there was one) won't cause an interrupt storm when
interrupts are first enabled before the drivers are initialised.

Also, attempt to reset the peripherals attached to the FPGA.

Signed-off-by: David Howells <dhowells@redhat.com>
arch/mn10300/unit-asb2364/irq-fpga.c
arch/mn10300/unit-asb2364/unit-init.c

index 4204a6c62a25435c4e74e4b29a18fc5ae3b6072c..ee84e62b16ede6e40d93592e3e6bd9342575cdd4 100644 (file)
@@ -88,6 +88,17 @@ void __init irq_fpga_init(void)
 {
        int irq;
 
+       ASB2364_FPGA_REG_MASK_LAN  = 0x0001;
+       SyncExBus();
+       ASB2364_FPGA_REG_MASK_UART = 0x0001;
+       SyncExBus();
+       ASB2364_FPGA_REG_MASK_I2C  = 0x0001;
+       SyncExBus();
+       ASB2364_FPGA_REG_MASK_USB  = 0x0001;
+       SyncExBus();
+       ASB2364_FPGA_REG_MASK_FPGA = 0x0001;
+       SyncExBus();
+
        for (irq = NR_CPU_IRQS; irq < NR_IRQS; irq++)
                set_irq_chip_and_handler(irq, &asb2364_fpga_pic, handle_level_irq);
 
index 11440803db10f97a8adfdb320541850939f7535e..6359b41ce7e970ce0bc8f7d71919487b366b3d8e 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;
 }
 
 /*