MXC uncompress macros: determine uart base by machine type
authorSascha Hauer <s.hauer@pengutronix.de>
Thu, 4 Jun 2009 11:29:57 +0000 (13:29 +0200)
committerSascha Hauer <s.hauer@pengutronix.de>
Fri, 7 Aug 2009 10:10:52 +0000 (12:10 +0200)
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
arch/arm/plat-mxc/include/mach/uncompress.h

index de6fe03..98c8a60 100644 (file)
 #define __MXC_BOOT_UNCOMPRESS
 
 #include <mach/hardware.h>
+#include <asm/mach-types.h>
 
-#define UART(x) (*(volatile unsigned long *)(serial_port + (x)))
+static unsigned long uart_base;
+
+#define UART(x) (*(volatile unsigned long *)(uart_base + (x)))
 
 #define USR2 0x98
 #define USR2_TXFE (1<<14)
 
 static void putc(int ch)
 {
-       static unsigned long serial_port = 0;
-
-       if (unlikely(serial_port == 0)) {
-               do {
-                       serial_port = UART1_BASE_ADDR;
-                       if (UART(UCR1) & UCR1_UARTEN)
-                               break;
-                       serial_port = UART2_BASE_ADDR;
-                       if (UART(UCR1) & UCR1_UARTEN)
-                               break;
-                       return;
-               } while (0);
-       }
+       if (!uart_base)
+               return;
+       if (!(UART(UCR1) & UCR1_UARTEN))
+               return;
 
        while (!(UART(USR2) & USR2_TXFE))
                barrier();
@@ -68,11 +62,41 @@ static void putc(int ch)
 
 #define flush() do { } while (0)
 
-/*
- * nothing to do
- */
-#define arch_decomp_setup()
+#define MX1_UART1_BASE_ADDR    0x00206000
+#define MX2X_UART1_BASE_ADDR   0x1000a000
+#define MX3X_UART1_BASE_ADDR   0x43F90000
+
+static __inline__ void __arch_decomp_setup(unsigned long arch_id)
+{
+       switch (arch_id) {
+       case MACH_TYPE_MX1ADS:
+       case MACH_TYPE_SCB9328:
+               uart_base = MX1_UART1_BASE_ADDR;
+               break;
+       case MACH_TYPE_IMX27LITE:
+       case MACH_TYPE_MX27_3DS:
+       case MACH_TYPE_MX27ADS:
+       case MACH_TYPE_PCM038:
+       case MACH_TYPE_MX21ADS:
+               uart_base = MX2X_UART1_BASE_ADDR;
+               break;
+       case MACH_TYPE_MX31LITE:
+       case MACH_TYPE_ARMADILLO5X0:
+       case MACH_TYPE_MX31MOBOARD:
+       case MACH_TYPE_QONG:
+       case MACH_TYPE_MX31_3DS:
+       case MACH_TYPE_PCM037:
+       case MACH_TYPE_MX31ADS:
+       case MACH_TYPE_MX35_3DS:
+       case MACH_TYPE_PCM043:
+               uart_base = MX3X_UART1_BASE_ADDR;
+               break;
+       default:
+               break;
+       }
+}
 
+#define arch_decomp_setup()    __arch_decomp_setup(arch_id)
 #define arch_decomp_wdog()
 
 #endif                         /* __ASM_ARCH_MXC_UNCOMPRESS_H__ */