]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge branch 'for-rmk' of git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa...
authorRussell King <rmk@dyn-67.arm.linux.org.uk>
Tue, 23 Dec 2008 18:06:37 +0000 (18:06 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Tue, 23 Dec 2008 18:06:37 +0000 (18:06 +0000)
Conflicts:

arch/arm/mach-pxa/am200epd.c
arch/arm/mach-pxa/ezx.c

18 files changed:
arch/arm/mach-pxa/Kconfig
arch/arm/mach-pxa/Makefile
arch/arm/mach-pxa/am200epd.c
arch/arm/mach-pxa/cm-x2xx.c
arch/arm/mach-pxa/e400.c
arch/arm/mach-pxa/ezx.c
arch/arm/mach-pxa/gumstix.c
arch/arm/mach-pxa/imote2.c [new file with mode: 0644]
arch/arm/mach-pxa/include/mach/gumstix.h
arch/arm/mach-pxa/include/mach/littleton.h
arch/arm/mach-pxa/include/mach/pxafb.h
arch/arm/mach-pxa/include/mach/regs-lcd.h
arch/arm/mach-pxa/include/mach/uncompress.h
arch/arm/mach-pxa/littleton.c
arch/arm/mach-pxa/magician.c
arch/arm/mach-pxa/pcm990-baseboard.c
arch/arm/mach-pxa/saar.c
drivers/video/pxafb.c

index 6755c7d6bb31ed3ac17522bac308d6d9e8f5eeb2..8eea7306f29bc7bbe97e4b9657fbda59f5576a9b 100644 (file)
@@ -27,15 +27,26 @@ endmenu
 endif
 
 config ARCH_GUMSTIX
-       bool "Gumstix XScale boards"
+       bool "Gumstix XScale 255 boards"
+       select PXA25x
        help
-         Say Y here if you intend to run this kernel on a
-         Gumstix Full Function Minature Computer.
+         Say Y here if you intend to run this kernel on
+         Basix, Connex, ws-200ax, ws-400ax systems
 
-config MACH_GUMSTIX_F
-       bool "Basix, Connex, ws-200ax, ws-400ax systems"
+choice
+       prompt "Gumstix Carrier/Expansion Board"
        depends on ARCH_GUMSTIX
-       select PXA25x
+
+config GUMSTIX_AM200EPD
+       bool "Enable AM200EPD board support"
+
+endchoice
+
+config MACH_INTELMOTE2
+       bool "Intel Mote 2 Platform"
+       select PXA27x
+       select IWMMXT
+       select PXA_HAVE_BOARD_IRQS
 
 config ARCH_LUBBOCK
        bool "Intel DBPXA250 Development Platform"
@@ -348,10 +359,6 @@ config PCM990_DISPLAY_NONE
 
 endchoice
 
-config MACH_AM200EPD
-       depends on MACH_GUMSTIX_F
-       bool "Enable AM200EPD board support"
-
 config PXA_EZX
        bool "Motorola EZX Platform"
        select PXA27x
index dc184eae5109646d754e9d486dc3477df74588d3..7b28bb561d63c07830ea3ad04551d9ec44bd92fe 100644 (file)
@@ -27,7 +27,7 @@ obj-$(CONFIG_CPU_PXA930)      += pxa930.o
 
 # Specific board support
 obj-$(CONFIG_ARCH_GUMSTIX)     += gumstix.o
-obj-$(CONFIG_MACH_AM200EPD)    += am200epd.o
+obj-$(CONFIG_GUMSTIX_AM200EPD) += am200epd.o
 obj-$(CONFIG_ARCH_LUBBOCK)     += lubbock.o
 obj-$(CONFIG_MACH_LOGICPD_PXA270) += lpd270.o
 obj-$(CONFIG_MACH_MAINSTONE)   += mainstone.o
@@ -70,6 +70,8 @@ obj-$(CONFIG_MACH_ARMCORE)      += cm-x2xx.o cm-x255.o cm-x270.o
 obj-$(CONFIG_MACH_CM_X300)      += cm-x300.o
 obj-$(CONFIG_PXA_EZX)           += ezx.o
 
+obj-$(CONFIG_MACH_INTELMOTE2)   += imote2.o
+
 # Support for blinky lights
 led-y := leds.o
 led-$(CONFIG_ARCH_LUBBOCK)     += leds-lubbock.o
index 3a4f8d855a521519941813e31b6714c33336e816..77ee80e5e47b028574b553a56597165f251375ab 100644 (file)
@@ -344,7 +344,7 @@ static unsigned long am200_pin_config[] __initdata = {
        GPIO16_GPIO,
 };
 
-static int __init am200_init(void)
+int __init am200_init(void)
 {
        int ret;
 
@@ -382,8 +382,6 @@ static int __init am200_init(void)
 module_param(panel_type, uint, 0);
 MODULE_PARM_DESC(panel_type, "Select the panel type: 6, 8, 97");
 
-module_init(am200_init);
-
 MODULE_DESCRIPTION("board driver for am200 metronome epd kit");
 MODULE_AUTHOR("Jaya Kumar");
 MODULE_LICENSE("GPL");
index 0b3ce3b6d896e4f348d04a408e13849ccce5538d..d99fd9e4d8885d6e1300a42dbfbae76e6a2cbe51 100644 (file)
@@ -210,10 +210,8 @@ static struct pxafb_mode_info generic_stn_320x240_mode = {
 static struct pxafb_mach_info generic_stn_320x240 = {
        .modes          = &generic_stn_320x240_mode,
        .num_modes      = 1,
-       .lccr0          = 0,
-       .lccr3          = (LCCR3_PixClkDiv(0x03) |
-                          LCCR3_Acb(0xff) |
-                          LCCR3_PCP),
+       .lcd_conn       = LCD_COLOR_STN_8BPP | LCD_PCLK_EDGE_FALL |\
+                         LCD_AC_BIAS_FREQ(0xff),
        .cmap_inverse   = 0,
        .cmap_static    = 0,
 };
@@ -236,10 +234,8 @@ static struct pxafb_mode_info generic_tft_640x480_mode = {
 static struct pxafb_mach_info generic_tft_640x480 = {
        .modes          = &generic_tft_640x480_mode,
        .num_modes      = 1,
-       .lccr0          = (LCCR0_PAS),
-       .lccr3          = (LCCR3_PixClkDiv(0x01) |
-                          LCCR3_Acb(0xff) |
-                          LCCR3_PCP),
+       .lcd_conn       = LCD_COLOR_TFT_8BPP | LCD_PCLK_EDGE_FALL |\
+                         LCD_AC_BIAS_FREQ(0xff),
        .cmap_inverse   = 0,
        .cmap_static    = 0,
 };
@@ -263,9 +259,7 @@ static struct pxafb_mode_info generic_crt_640x480_mode = {
 static struct pxafb_mach_info generic_crt_640x480 = {
        .modes          = &generic_crt_640x480_mode,
        .num_modes      = 1,
-       .lccr0          = (LCCR0_PAS),
-       .lccr3          = (LCCR3_PixClkDiv(0x01) |
-                          LCCR3_Acb(0xff)),
+       .lcd_conn       = LCD_COLOR_TFT_8BPP | LCD_AC_BIAS_FREQ(0xff),
        .cmap_inverse   = 0,
        .cmap_static    = 0,
 };
@@ -289,9 +283,7 @@ static struct pxafb_mode_info generic_crt_800x600_mode = {
 static struct pxafb_mach_info generic_crt_800x600 = {
        .modes          = &generic_crt_800x600_mode,
        .num_modes      = 1,
-       .lccr0          = (LCCR0_PAS),
-       .lccr3          = (LCCR3_PixClkDiv(0x02) |
-                          LCCR3_Acb(0xff)),
+       .lcd_conn       = LCD_COLOR_TFT_8BPP | LCD_AC_BIAS_FREQ(0xff),
        .cmap_inverse   = 0,
        .cmap_static    = 0,
 };
@@ -314,10 +306,7 @@ static struct pxafb_mode_info generic_tft_320x240_mode = {
 static struct pxafb_mach_info generic_tft_320x240 = {
        .modes          = &generic_tft_320x240_mode,
        .num_modes      = 1,
-       .lccr0          = (LCCR0_PAS),
-       .lccr3          = (LCCR3_PixClkDiv(0x06) |
-                          LCCR3_Acb(0xff) |
-                          LCCR3_PCP),
+       .lcd_conn       = LCD_COLOR_TFT_16BPP | LCD_AC_BIAS_FREQ(0xff),
        .cmap_inverse   = 0,
        .cmap_static    = 0,
 };
@@ -341,9 +330,7 @@ static struct pxafb_mode_info generic_stn_640x480_mode = {
 static struct pxafb_mach_info generic_stn_640x480 = {
        .modes          = &generic_stn_640x480_mode,
        .num_modes      = 1,
-       .lccr0          = 0,
-       .lccr3          = (LCCR3_PixClkDiv(0x02) |
-                          LCCR3_Acb(0xff)),
+       .lcd_conn       = LCD_COLOR_STN_8BPP | LCD_AC_BIAS_FREQ(0xff),
        .cmap_inverse   = 0,
        .cmap_static    = 0,
 };
index 7716ad0c3b342d5a0efb5df1722c263cf1a2be5b..bed0336aca3d1c1366d4c3a5826bbefed4875c59 100644 (file)
@@ -52,7 +52,7 @@ static struct pxafb_mode_info e400_pxafb_mode_info = {
 static struct pxafb_mach_info e400_pxafb_mach_info = {
        .modes          = &e400_pxafb_mode_info,
        .num_modes      = 1,
-       .lccr0          = LCCR0_Color | LCCR0_Sngl | LCCR0_Act,
+       .lcd_conn       = LCD_COLOR_TFT_16BPP,
        .lccr3          = 0,
        .pxafb_backlight_power  = NULL,
 };
index 3e6aa33a2c7c463f5190644f21e53461c9fdf015..df5f822f3b6cd79cf351dafb861ae2b5aac5c032 100644 (file)
 #include <linux/platform_device.h>
 #include <linux/delay.h>
 #include <linux/pwm_backlight.h>
+#include <linux/input.h>
 
 #include <asm/setup.h>
 #include <mach/pxafb.h>
 #include <mach/ohci.h>
 #include <mach/i2c.h>
 #include <mach/hardware.h>
+#include <mach/pxa27x_keypad.h>
 
 #include <mach/mfp-pxa27x.h>
 #include <mach/pxa-regs.h>
@@ -102,124 +104,732 @@ static unsigned long ezx_pin_config[] __initdata = {
        GPIO44_BTUART_CTS,
        GPIO45_BTUART_RTS,
 
-       /* STUART */
-       GPIO46_STUART_RXD,
-       GPIO47_STUART_TXD,
-
-       /* For A780 support (connected with Neptune GSM chip) */
-       GPIO30_USB_P3_2,        /* ICL_TXENB */
-       GPIO31_USB_P3_6,        /* ICL_VPOUT */
-       GPIO90_USB_P3_5,        /* ICL_VPIN */
-       GPIO91_USB_P3_1,        /* ICL_XRXD */
-       GPIO56_USB_P3_4,        /* ICL_VMOUT */
-       GPIO113_USB_P3_3,       /* /ICL_VMIN */
-
        /* I2C */
        GPIO117_I2C_SCL,
        GPIO118_I2C_SDA,
+
+       /* PCAP SSP */
+       GPIO29_SSP1_SCLK,
+       GPIO25_SSP1_TXD,
+       GPIO26_SSP1_RXD,
+       GPIO24_GPIO,                            /* pcap chip select */
+       GPIO1_GPIO,                             /* pcap interrupt */
+       GPIO4_GPIO,                             /* WDI_AP */
+       GPIO55_GPIO,                            /* SYS_RESTART */
+
+       /* MMC */
+       GPIO32_MMC_CLK,
+       GPIO92_MMC_DAT_0,
+       GPIO109_MMC_DAT_1,
+       GPIO110_MMC_DAT_2,
+       GPIO111_MMC_DAT_3,
+       GPIO112_MMC_CMD,
+       GPIO11_GPIO,                            /* mmc detect */
+
+       /* usb to external transceiver */
+       GPIO34_USB_P2_2,
+       GPIO35_USB_P2_1,
+       GPIO36_USB_P2_4,
+       GPIO39_USB_P2_6,
+       GPIO40_USB_P2_5,
+       GPIO53_USB_P2_3,
+
+       /* usb to Neptune GSM chip */
+       GPIO30_USB_P3_2,
+       GPIO31_USB_P3_6,
+       GPIO90_USB_P3_5,
+       GPIO91_USB_P3_1,
+       GPIO56_USB_P3_4,
+       GPIO113_USB_P3_3,
+};
+
+#if defined(CONFIG_MACH_EZX_A780) || defined(CONFIG_MACH_EZX_E680)
+static unsigned long gen1_pin_config[] __initdata = {
+       /* flip / lockswitch */
+       GPIO12_GPIO,
+
+       /* bluetooth (bcm2035) */
+       GPIO14_GPIO | WAKEUP_ON_LEVEL_HIGH,     /* HOSTWAKE */
+       GPIO48_GPIO,                            /* RESET */
+       GPIO28_GPIO,                            /* WAKEUP */
+
+       /* Neptune handshake */
+       GPIO0_GPIO | WAKEUP_ON_LEVEL_HIGH,      /* BP_RDY */
+       GPIO57_GPIO,                            /* AP_RDY */
+       GPIO13_GPIO | WAKEUP_ON_LEVEL_HIGH,     /* WDI */
+       GPIO3_GPIO | WAKEUP_ON_LEVEL_HIGH,      /* WDI2 */
+       GPIO82_GPIO,                            /* RESET */
+       GPIO99_GPIO,                            /* TC_MM_EN */
+
+       /* sound */
+       GPIO52_SSP3_SCLK,
+       GPIO83_SSP3_SFRM,
+       GPIO81_SSP3_TXD,
+       GPIO89_SSP3_RXD,
+
+       /* ssp2 pins to in */
+       GPIO22_GPIO,                            /* SSP2_SCLK */
+       GPIO37_GPIO,                            /* SSP2_SFRM */
+       GPIO38_GPIO,                            /* SSP2_TXD */
+       GPIO88_GPIO,                            /* SSP2_RXD */
+
+       /* camera */
+       GPIO23_CIF_MCLK,
+       GPIO54_CIF_PCLK,
+       GPIO85_CIF_LV,
+       GPIO84_CIF_FV,
+       GPIO27_CIF_DD_0,
+       GPIO114_CIF_DD_1,
+       GPIO51_CIF_DD_2,
+       GPIO115_CIF_DD_3,
+       GPIO95_CIF_DD_4,
+       GPIO94_CIF_DD_5,
+       GPIO17_CIF_DD_6,
+       GPIO108_CIF_DD_7,
+       GPIO50_GPIO,                            /* CAM_EN */
+       GPIO19_GPIO,                            /* CAM_RST */
+
+       /* EMU */
+       GPIO120_GPIO,                           /* EMU_MUX1 */
+       GPIO119_GPIO,                           /* EMU_MUX2 */
+       GPIO86_GPIO,                            /* SNP_INT_CTL */
+       GPIO87_GPIO,                            /* SNP_INT_IN */
+};
+#endif
+
+#if defined(CONFIG_MACH_EZX_A1200) || defined(CONFIG_MACH_EZX_A910) || \
+       defined(CONFIG_MACH_EZX_E2) || defined(CONFIG_MACH_EZX_E6)
+static unsigned long gen2_pin_config[] __initdata = {
+       /* flip / lockswitch */
+       GPIO15_GPIO,
+
+       /* EOC */
+       GPIO10_GPIO,
+
+       /* bluetooth (bcm2045) */
+       GPIO13_GPIO | WAKEUP_ON_LEVEL_HIGH,     /* HOSTWAKE */
+       GPIO37_GPIO,                            /* RESET */
+       GPIO57_GPIO,                            /* WAKEUP */
+
+       /* Neptune handshake */
+       GPIO0_GPIO | WAKEUP_ON_LEVEL_HIGH,      /* BP_RDY */
+       GPIO96_GPIO,                            /* AP_RDY */
+       GPIO3_GPIO | WAKEUP_ON_LEVEL_HIGH,      /* WDI */
+       GPIO116_GPIO,                           /* RESET */
+       GPIO41_GPIO,                            /* BP_FLASH */
+
+       /* sound */
+       GPIO52_SSP3_SCLK,
+       GPIO83_SSP3_SFRM,
+       GPIO81_SSP3_TXD,
+       GPIO82_SSP3_RXD,
+
+       /* ssp2 pins to in */
+       GPIO22_GPIO,                            /* SSP2_SCLK */
+       GPIO14_GPIO,                            /* SSP2_SFRM */
+       GPIO38_GPIO,                            /* SSP2_TXD */
+       GPIO88_GPIO,                            /* SSP2_RXD */
+
+       /* camera */
+       GPIO23_CIF_MCLK,
+       GPIO54_CIF_PCLK,
+       GPIO85_CIF_LV,
+       GPIO84_CIF_FV,
+       GPIO27_CIF_DD_0,
+       GPIO114_CIF_DD_1,
+       GPIO51_CIF_DD_2,
+       GPIO115_CIF_DD_3,
+       GPIO95_CIF_DD_4,
+       GPIO48_CIF_DD_5,
+       GPIO93_CIF_DD_6,
+       GPIO12_CIF_DD_7,
+       GPIO50_GPIO,                            /* CAM_EN */
+       GPIO28_GPIO,                            /* CAM_RST */
+       GPIO17_GPIO,                            /* CAM_FLASH */
+};
+#endif
+
+#ifdef CONFIG_MACH_EZX_A780
+static unsigned long a780_pin_config[] __initdata = {
+       /* keypad */
+       GPIO93_KP_DKIN_0 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO98_KP_MKIN_4 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO103_KP_MKOUT_0,
+       GPIO104_KP_MKOUT_1,
+       GPIO105_KP_MKOUT_2,
+       GPIO106_KP_MKOUT_3,
+       GPIO107_KP_MKOUT_4,
+
+       /* attenuate sound */
+       GPIO96_GPIO,
+};
+#endif
+
+#ifdef CONFIG_MACH_EZX_E680
+static unsigned long e680_pin_config[] __initdata = {
+       /* keypad */
+       GPIO93_KP_DKIN_0 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO96_KP_DKIN_3 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO97_KP_DKIN_4 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO98_KP_DKIN_5 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO103_KP_MKOUT_0,
+       GPIO104_KP_MKOUT_1,
+       GPIO105_KP_MKOUT_2,
+       GPIO106_KP_MKOUT_3,
+
+       /* MIDI */
+       GPIO79_GPIO,                            /* VA_SEL_BUL */
+       GPIO80_GPIO,                            /* FLT_SEL_BUL */
+       GPIO78_GPIO,                            /* MIDI_RESET */
+       GPIO33_GPIO,                            /* MIDI_CS */
+       GPIO15_GPIO,                            /* MIDI_IRQ */
+       GPIO49_GPIO,                            /* MIDI_NPWE */
+       GPIO18_GPIO,                            /* MIDI_RDY */
+
+       /* leds */
+       GPIO46_GPIO,
+       GPIO47_GPIO,
+};
+#endif
+
+#ifdef CONFIG_MACH_EZX_A1200
+static unsigned long a1200_pin_config[] __initdata = {
+       /* keypad */
+       GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO98_KP_MKIN_4 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO103_KP_MKOUT_0,
+       GPIO104_KP_MKOUT_1,
+       GPIO105_KP_MKOUT_2,
+       GPIO106_KP_MKOUT_3,
+       GPIO107_KP_MKOUT_4,
+       GPIO108_KP_MKOUT_5,
+};
+#endif
+
+#ifdef CONFIG_MACH_EZX_A910
+static unsigned long a910_pin_config[] __initdata = {
+       /* keypad */
+       GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO98_KP_MKIN_4 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO103_KP_MKOUT_0,
+       GPIO104_KP_MKOUT_1,
+       GPIO105_KP_MKOUT_2,
+       GPIO106_KP_MKOUT_3,
+       GPIO107_KP_MKOUT_4,
+       GPIO108_KP_MKOUT_5,
+
+       /* WLAN */
+       GPIO89_GPIO,                            /* RESET */
+       GPIO33_GPIO,                            /* WAKEUP */
+       GPIO94_GPIO | WAKEUP_ON_LEVEL_HIGH,     /* HOSTWAKE */
+
+       /* MMC CS */
+       GPIO20_GPIO,
+};
+#endif
+
+#ifdef CONFIG_MACH_EZX_E2
+static unsigned long e2_pin_config[] __initdata = {
+       /* keypad */
+       GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO98_KP_MKIN_4 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO103_KP_MKOUT_0,
+       GPIO104_KP_MKOUT_1,
+       GPIO105_KP_MKOUT_2,
+       GPIO106_KP_MKOUT_3,
+       GPIO107_KP_MKOUT_4,
+       GPIO108_KP_MKOUT_5,
+};
+#endif
+
+#ifdef CONFIG_MACH_EZX_E6
+static unsigned long e6_pin_config[] __initdata = {
+       /* keypad */
+       GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO98_KP_MKIN_4 | WAKEUP_ON_LEVEL_HIGH,
+       GPIO103_KP_MKOUT_0,
+       GPIO104_KP_MKOUT_1,
+       GPIO105_KP_MKOUT_2,
+       GPIO106_KP_MKOUT_3,
+       GPIO107_KP_MKOUT_4,
+       GPIO108_KP_MKOUT_5,
+};
+#endif
+
+/* KEYPAD */
+#ifdef CONFIG_MACH_EZX_A780
+static unsigned int a780_key_map[] = {
+       KEY(0, 0, KEY_SEND),
+       KEY(0, 1, KEY_BACK),
+       KEY(0, 2, KEY_END),
+       KEY(0, 3, KEY_PAGEUP),
+       KEY(0, 4, KEY_UP),
+
+       KEY(1, 0, KEY_NUMERIC_1),
+       KEY(1, 1, KEY_NUMERIC_2),
+       KEY(1, 2, KEY_NUMERIC_3),
+       KEY(1, 3, KEY_SELECT),
+       KEY(1, 4, KEY_KPENTER),
+
+       KEY(2, 0, KEY_NUMERIC_4),
+       KEY(2, 1, KEY_NUMERIC_5),
+       KEY(2, 2, KEY_NUMERIC_6),
+       KEY(2, 3, KEY_RECORD),
+       KEY(2, 4, KEY_LEFT),
+
+       KEY(3, 0, KEY_NUMERIC_7),
+       KEY(3, 1, KEY_NUMERIC_8),
+       KEY(3, 2, KEY_NUMERIC_9),
+       KEY(3, 3, KEY_HOME),
+       KEY(3, 4, KEY_RIGHT),
+
+       KEY(4, 0, KEY_NUMERIC_STAR),
+       KEY(4, 1, KEY_NUMERIC_0),
+       KEY(4, 2, KEY_NUMERIC_POUND),
+       KEY(4, 3, KEY_PAGEDOWN),
+       KEY(4, 4, KEY_DOWN),
+};
+
+static struct pxa27x_keypad_platform_data a780_keypad_platform_data = {
+       .matrix_key_rows = 5,
+       .matrix_key_cols = 5,
+       .matrix_key_map = a780_key_map,
+       .matrix_key_map_size = ARRAY_SIZE(a780_key_map),
+
+       .direct_key_map = { KEY_CAMERA },
+       .direct_key_num = 1,
+
+       .debounce_interval = 30,
+};
+#endif /* CONFIG_MACH_EZX_A780 */
+
+#ifdef CONFIG_MACH_EZX_E680
+static unsigned int e680_key_map[] = {
+       KEY(0, 0, KEY_UP),
+       KEY(0, 1, KEY_RIGHT),
+       KEY(0, 2, KEY_RESERVED),
+       KEY(0, 3, KEY_SEND),
+
+       KEY(1, 0, KEY_DOWN),
+       KEY(1, 1, KEY_LEFT),
+       KEY(1, 2, KEY_PAGEUP),
+       KEY(1, 3, KEY_PAGEDOWN),
+
+       KEY(2, 0, KEY_RESERVED),
+       KEY(2, 1, KEY_RESERVED),
+       KEY(2, 2, KEY_RESERVED),
+       KEY(2, 3, KEY_KPENTER),
+};
+
+static struct pxa27x_keypad_platform_data e680_keypad_platform_data = {
+       .matrix_key_rows = 3,
+       .matrix_key_cols = 4,
+       .matrix_key_map = e680_key_map,
+       .matrix_key_map_size = ARRAY_SIZE(e680_key_map),
+
+       .direct_key_map = {
+               KEY_CAMERA,
+               KEY_RESERVED,
+               KEY_RESERVED,
+               KEY_F1,
+               KEY_CANCEL,
+               KEY_F2,
+       },
+       .direct_key_num = 6,
+
+       .debounce_interval = 30,
+};
+#endif /* CONFIG_MACH_EZX_E680 */
+
+#ifdef CONFIG_MACH_EZX_A1200
+static unsigned int a1200_key_map[] = {
+       KEY(0, 0, KEY_RESERVED),
+       KEY(0, 1, KEY_RIGHT),
+       KEY(0, 2, KEY_PAGEDOWN),
+       KEY(0, 3, KEY_RESERVED),
+       KEY(0, 4, KEY_RESERVED),
+       KEY(0, 5, KEY_RESERVED),
+
+       KEY(1, 0, KEY_RESERVED),
+       KEY(1, 1, KEY_DOWN),
+       KEY(1, 2, KEY_CAMERA),
+       KEY(1, 3, KEY_RESERVED),
+       KEY(1, 4, KEY_RESERVED),
+       KEY(1, 5, KEY_RESERVED),
+
+       KEY(2, 0, KEY_RESERVED),
+       KEY(2, 1, KEY_KPENTER),
+       KEY(2, 2, KEY_RECORD),
+       KEY(2, 3, KEY_RESERVED),
+       KEY(2, 4, KEY_RESERVED),
+       KEY(2, 5, KEY_SELECT),
+
+       KEY(3, 0, KEY_RESERVED),
+       KEY(3, 1, KEY_UP),
+       KEY(3, 2, KEY_SEND),
+       KEY(3, 3, KEY_RESERVED),
+       KEY(3, 4, KEY_RESERVED),
+       KEY(3, 5, KEY_RESERVED),
+
+       KEY(4, 0, KEY_RESERVED),
+       KEY(4, 1, KEY_LEFT),
+       KEY(4, 2, KEY_PAGEUP),
+       KEY(4, 3, KEY_RESERVED),
+       KEY(4, 4, KEY_RESERVED),
+       KEY(4, 5, KEY_RESERVED),
+};
+
+static struct pxa27x_keypad_platform_data a1200_keypad_platform_data = {
+       .matrix_key_rows = 5,
+       .matrix_key_cols = 6,
+       .matrix_key_map = a1200_key_map,
+       .matrix_key_map_size = ARRAY_SIZE(a1200_key_map),
+
+       .debounce_interval = 30,
+};
+#endif /* CONFIG_MACH_EZX_A1200 */
+
+#ifdef CONFIG_MACH_EZX_E6
+static unsigned int e6_key_map[] = {
+       KEY(0, 0, KEY_RESERVED),
+       KEY(0, 1, KEY_RIGHT),
+       KEY(0, 2, KEY_PAGEDOWN),
+       KEY(0, 3, KEY_RESERVED),
+       KEY(0, 4, KEY_RESERVED),
+       KEY(0, 5, KEY_NEXTSONG),
+
+       KEY(1, 0, KEY_RESERVED),
+       KEY(1, 1, KEY_DOWN),
+       KEY(1, 2, KEY_PROG1),
+       KEY(1, 3, KEY_RESERVED),
+       KEY(1, 4, KEY_RESERVED),
+       KEY(1, 5, KEY_RESERVED),
+
+       KEY(2, 0, KEY_RESERVED),
+       KEY(2, 1, KEY_ENTER),
+       KEY(2, 2, KEY_CAMERA),
+       KEY(2, 3, KEY_RESERVED),
+       KEY(2, 4, KEY_RESERVED),
+       KEY(2, 5, KEY_WWW),
+
+       KEY(3, 0, KEY_RESERVED),
+       KEY(3, 1, KEY_UP),
+       KEY(3, 2, KEY_SEND),
+       KEY(3, 3, KEY_RESERVED),
+       KEY(3, 4, KEY_RESERVED),
+       KEY(3, 5, KEY_PLAYPAUSE),
+
+       KEY(4, 0, KEY_RESERVED),
+       KEY(4, 1, KEY_LEFT),
+       KEY(4, 2, KEY_PAGEUP),
+       KEY(4, 3, KEY_RESERVED),
+       KEY(4, 4, KEY_RESERVED),
+       KEY(4, 5, KEY_PREVIOUSSONG),
+};
+
+static struct pxa27x_keypad_platform_data e6_keypad_platform_data = {
+       .matrix_key_rows = 5,
+       .matrix_key_cols = 6,
+       .matrix_key_map = e6_key_map,
+       .matrix_key_map_size = ARRAY_SIZE(e6_key_map),
+
+       .debounce_interval = 30,
+};
+#endif /* CONFIG_MACH_EZX_E6 */
+
+#ifdef CONFIG_MACH_EZX_A910
+static unsigned int a910_key_map[] = {
+       KEY(0, 0, KEY_NUMERIC_6),
+       KEY(0, 1, KEY_RIGHT),
+       KEY(0, 2, KEY_PAGEDOWN),
+       KEY(0, 3, KEY_KPENTER),
+       KEY(0, 4, KEY_NUMERIC_5),
+       KEY(0, 5, KEY_CAMERA),
+
+       KEY(1, 0, KEY_NUMERIC_8),
+       KEY(1, 1, KEY_DOWN),
+       KEY(1, 2, KEY_RESERVED),
+       KEY(1, 3, KEY_F1), /* Left SoftKey */
+       KEY(1, 4, KEY_NUMERIC_STAR),
+       KEY(1, 5, KEY_RESERVED),
+
+       KEY(2, 0, KEY_NUMERIC_7),
+       KEY(2, 1, KEY_NUMERIC_9),
+       KEY(2, 2, KEY_RECORD),
+       KEY(2, 3, KEY_F2), /* Right SoftKey */
+       KEY(2, 4, KEY_BACK),
+       KEY(2, 5, KEY_SELECT),
+
+       KEY(3, 0, KEY_NUMERIC_2),
+       KEY(3, 1, KEY_UP),
+       KEY(3, 2, KEY_SEND),
+       KEY(3, 3, KEY_NUMERIC_0),
+       KEY(3, 4, KEY_NUMERIC_1),
+       KEY(3, 5, KEY_RECORD),
+
+       KEY(4, 0, KEY_NUMERIC_4),
+       KEY(4, 1, KEY_LEFT),
+       KEY(4, 2, KEY_PAGEUP),
+       KEY(4, 3, KEY_NUMERIC_POUND),
+       KEY(4, 4, KEY_NUMERIC_3),
+       KEY(4, 5, KEY_RESERVED),
 };
 
-static void __init ezx_init(void)
+static struct pxa27x_keypad_platform_data a910_keypad_platform_data = {
+       .matrix_key_rows = 5,
+       .matrix_key_cols = 6,
+       .matrix_key_map = a910_key_map,
+       .matrix_key_map_size = ARRAY_SIZE(a910_key_map),
+
+       .debounce_interval = 30,
+};
+#endif /* CONFIG_MACH_EZX_A910 */
+
+#ifdef CONFIG_MACH_EZX_E2
+static unsigned int e2_key_map[] = {
+       KEY(0, 0, KEY_NUMERIC_6),
+       KEY(0, 1, KEY_RIGHT),
+       KEY(0, 2, KEY_NUMERIC_9),
+       KEY(0, 3, KEY_NEXTSONG),
+       KEY(0, 4, KEY_NUMERIC_5),
+       KEY(0, 5, KEY_F1), /* Left SoftKey */
+
+       KEY(1, 0, KEY_NUMERIC_8),
+       KEY(1, 1, KEY_DOWN),
+       KEY(1, 2, KEY_RESERVED),
+       KEY(1, 3, KEY_PAGEUP),
+       KEY(1, 4, KEY_NUMERIC_STAR),
+       KEY(1, 5, KEY_F2), /* Right SoftKey */
+
+       KEY(2, 0, KEY_NUMERIC_7),
+       KEY(2, 1, KEY_KPENTER),
+       KEY(2, 2, KEY_RECORD),
+       KEY(2, 3, KEY_PAGEDOWN),
+       KEY(2, 4, KEY_BACK),
+       KEY(2, 5, KEY_NUMERIC_0),
+
+       KEY(3, 0, KEY_NUMERIC_2),
+       KEY(3, 1, KEY_UP),
+       KEY(3, 2, KEY_SEND),
+       KEY(3, 3, KEY_PLAYPAUSE),
+       KEY(3, 4, KEY_NUMERIC_1),
+       KEY(3, 5, KEY_SOUND), /* Music SoftKey */
+
+       KEY(4, 0, KEY_NUMERIC_4),
+       KEY(4, 1, KEY_LEFT),
+       KEY(4, 2, KEY_NUMERIC_POUND),
+       KEY(4, 3, KEY_PREVIOUSSONG),
+       KEY(4, 4, KEY_NUMERIC_3),
+       KEY(4, 5, KEY_RESERVED),
+};
+
+static struct pxa27x_keypad_platform_data e2_keypad_platform_data = {
+       .matrix_key_rows = 5,
+       .matrix_key_cols = 6,
+       .matrix_key_map = e2_key_map,
+       .matrix_key_map_size = ARRAY_SIZE(e2_key_map),
+
+       .debounce_interval = 30,
+};
+#endif /* CONFIG_MACH_EZX_E2 */
+
+#ifdef CONFIG_MACH_EZX_A780
+static void __init a780_init(void)
 {
        pxa2xx_mfp_config(ARRAY_AND_SIZE(ezx_pin_config));
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(gen1_pin_config));
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(a780_pin_config));
+
        pxa_set_i2c_info(NULL);
-       if (machine_is_ezx_a780() || machine_is_ezx_e680())
-               set_pxa_fb_info(&ezx_fb_info_1);
-       else
-               set_pxa_fb_info(&ezx_fb_info_2);
 
-       platform_add_devices(devices, ARRAY_SIZE(devices));
-}
+       set_pxa_fb_info(&ezx_fb_info_1);
 
-static void __init ezx_fixup(struct machine_desc *desc, struct tag *tags,
-               char **cmdline, struct meminfo *mi)
-{
-       /* We have two ram chips. First one with 32MB at 0xA0000000 and a second
-        * 16MB one at 0xAC000000
-        */
-       mi->nr_banks = 2;
-       mi->bank[0].start = 0xa0000000;
-       mi->bank[0].node = 0;
-       mi->bank[0].size = (32*1024*1024);
-       mi->bank[1].start = 0xac000000;
-       mi->bank[1].node = 1;
-       mi->bank[1].size = (16*1024*1024);
+       pxa_set_keypad_info(&a780_keypad_platform_data);
+
+       platform_add_devices(devices, ARRAY_SIZE(devices));
 }
 
-#ifdef CONFIG_MACH_EZX_A780
 MACHINE_START(EZX_A780, "Motorola EZX A780")
        .phys_io        = 0x40000000,
        .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
-       .fixup                  = ezx_fixup,
        .boot_params    = 0xa0000100,
        .map_io         = pxa_map_io,
        .init_irq       = pxa27x_init_irq,
        .timer          = &pxa_timer,
-       .init_machine   = &ezx_init,
+       .init_machine   = a780_init,
 MACHINE_END
 #endif
 
 #ifdef CONFIG_MACH_EZX_E680
+static struct i2c_board_info __initdata e680_i2c_board_info[] = {
+       { I2C_BOARD_INFO("tea5767", 0x81) },
+};
+
+static void __init e680_init(void)
+{
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(ezx_pin_config));
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(gen1_pin_config));
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(e680_pin_config));
+
+       pxa_set_i2c_info(NULL);
+       i2c_register_board_info(0, ARRAY_AND_SIZE(e680_i2c_board_info));
+
+       set_pxa_fb_info(&ezx_fb_info_1);
+
+       pxa_set_keypad_info(&e680_keypad_platform_data);
+
+       platform_add_devices(devices, ARRAY_SIZE(devices));
+}
+
 MACHINE_START(EZX_E680, "Motorola EZX E680")
        .phys_io        = 0x40000000,
        .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
-       .fixup                  = ezx_fixup,
        .boot_params    = 0xa0000100,
        .map_io         = pxa_map_io,
        .init_irq       = pxa27x_init_irq,
        .timer          = &pxa_timer,
-       .init_machine   = &ezx_init,
+       .init_machine   = e680_init,
 MACHINE_END
 #endif
 
 #ifdef CONFIG_MACH_EZX_A1200
+static struct i2c_board_info __initdata a1200_i2c_board_info[] = {
+       { I2C_BOARD_INFO("tea5767", 0x81) },
+};
+
+static void __init a1200_init(void)
+{
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(ezx_pin_config));
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(gen2_pin_config));
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(a1200_pin_config));
+
+       pxa_set_i2c_info(NULL);
+       i2c_register_board_info(0, ARRAY_AND_SIZE(a1200_i2c_board_info));
+
+       set_pxa_fb_info(&ezx_fb_info_2);
+
+       pxa_set_keypad_info(&a1200_keypad_platform_data);
+
+       platform_add_devices(devices, ARRAY_SIZE(devices));
+}
+
 MACHINE_START(EZX_A1200, "Motorola EZX A1200")
        .phys_io        = 0x40000000,
        .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
-       .fixup                  = ezx_fixup,
        .boot_params    = 0xa0000100,
        .map_io         = pxa_map_io,
        .init_irq       = pxa27x_init_irq,
        .timer          = &pxa_timer,
-       .init_machine   = &ezx_init,
+       .init_machine   = a1200_init,
 MACHINE_END
 #endif
 
 #ifdef CONFIG_MACH_EZX_A910
+static void __init a910_init(void)
+{
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(ezx_pin_config));
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(gen2_pin_config));
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(a910_pin_config));
+
+       pxa_set_i2c_info(NULL);
+
+       set_pxa_fb_info(&ezx_fb_info_2);
+
+       pxa_set_keypad_info(&a910_keypad_platform_data);
+
+       platform_add_devices(devices, ARRAY_SIZE(devices));
+}
+
 MACHINE_START(EZX_A910, "Motorola EZX A910")
        .phys_io        = 0x40000000,
        .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
-       .fixup                  = ezx_fixup,
        .boot_params    = 0xa0000100,
        .map_io         = pxa_map_io,
        .init_irq       = pxa27x_init_irq,
        .timer          = &pxa_timer,
-       .init_machine   = &ezx_init,
+       .init_machine   = a910_init,
 MACHINE_END
 #endif
 
 #ifdef CONFIG_MACH_EZX_E6
+static struct i2c_board_info __initdata e6_i2c_board_info[] = {
+       { I2C_BOARD_INFO("tea5767", 0x81) },
+};
+
+static void __init e6_init(void)
+{
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(ezx_pin_config));
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(gen2_pin_config));
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(e6_pin_config));
+
+       pxa_set_i2c_info(NULL);
+       i2c_register_board_info(0, ARRAY_AND_SIZE(e6_i2c_board_info));
+
+       set_pxa_fb_info(&ezx_fb_info_2);
+
+       pxa_set_keypad_info(&e6_keypad_platform_data);
+
+       platform_add_devices(devices, ARRAY_SIZE(devices));
+}
+
 MACHINE_START(EZX_E6, "Motorola EZX E6")
        .phys_io        = 0x40000000,
        .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
-       .fixup                  = ezx_fixup,
        .boot_params    = 0xa0000100,
        .map_io         = pxa_map_io,
        .init_irq       = pxa27x_init_irq,
        .timer          = &pxa_timer,
-       .init_machine   = &ezx_init,
+       .init_machine   = e6_init,
 MACHINE_END
 #endif
 
 #ifdef CONFIG_MACH_EZX_E2
+static struct i2c_board_info __initdata e2_i2c_board_info[] = {
+       { I2C_BOARD_INFO("tea5767", 0x81) },
+};
+
+static void __init e2_init(void)
+{
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(ezx_pin_config));
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(gen2_pin_config));
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(e2_pin_config));
+
+       pxa_set_i2c_info(NULL);
+       i2c_register_board_info(0, ARRAY_AND_SIZE(e2_i2c_board_info));
+
+       set_pxa_fb_info(&ezx_fb_info_2);
+
+       pxa_set_keypad_info(&e2_keypad_platform_data);
+
+       platform_add_devices(devices, ARRAY_SIZE(devices));
+}
+
 MACHINE_START(EZX_E2, "Motorola EZX E2")
        .phys_io        = 0x40000000,
        .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
-       .fixup                  = ezx_fixup,
        .boot_params    = 0xa0000100,
        .map_io         = pxa_map_io,
        .init_irq       = pxa27x_init_irq,
        .timer          = &pxa_timer,
-       .init_machine   = &ezx_init,
+       .init_machine   = e2_init,
 MACHINE_END
 #endif
index 06bc6674b015115c1e85fb76e89d2172ae1f7141..e296ce11658c48633aae5c696fbcaab1355e9ec2 100644 (file)
@@ -186,6 +186,20 @@ static unsigned long gumstix_pin_config[] __initdata = {
        GPIO8_MMC_CS0,
 };
 
+int __attribute__((weak)) am200_init(void)
+{
+       return 0;
+}
+
+static void __init carrier_board_init(void)
+{
+       /*
+        * put carrier/expansion board init here if
+        * they cannot be detected programatically
+        */
+       am200_init();
+}
+
 static void __init gumstix_init(void)
 {
        pxa2xx_mfp_config(ARRAY_AND_SIZE(gumstix_pin_config));
@@ -194,6 +208,7 @@ static void __init gumstix_init(void)
        gumstix_udc_init();
        gumstix_mmc_init();
        (void) platform_add_devices(devices, ARRAY_SIZE(devices));
+       carrier_board_init();
 }
 
 MACHINE_START(GUMSTIX, "Gumstix")
diff --git a/arch/arm/mach-pxa/imote2.c b/arch/arm/mach-pxa/imote2.c
new file mode 100644 (file)
index 0000000..364c5e2
--- /dev/null
@@ -0,0 +1,575 @@
+/*
+ * linux/arch/arm/mach-pxa/imote2.c
+ *
+ * Author:     Ed C. Epp
+ * Created:    Nov 05, 2002
+ * Copyright:  Intel Corp.
+ *
+ * Modified 2008:  Jonathan Cameron
+ *
+ * The Imote2 is a wireless sensor node platform sold
+ * by Crossbow (www.xbow.com).
+ */
+
+#include <linux/init.h>
+#include <linux/device.h>
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/partitions.h>
+#include <linux/platform_device.h>
+#include <linux/regulator/machine.h>
+#include <linux/gpio.h>
+#include <linux/leds.h>
+#include <linux/spi/spi.h>
+#include <linux/i2c.h>
+#include <linux/mfd/da903x.h>
+
+#include <asm/mach-types.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/flash.h>
+
+#include <mach/i2c.h>
+#include <mach/pxa-regs.h>
+#include <mach/pxa2xx-regs.h>
+#include <mach/mfp-pxa27x.h>
+#include <mach/regs-ssp.h>
+#include <mach/udc.h>
+#include <mach/mmc.h>
+#include <mach/pxa2xx_spi.h>
+#include <mach/pxa27x-udc.h>
+
+#include "devices.h"
+#include "generic.h"
+
+static unsigned long imote2_pin_config[] __initdata = {
+
+       /* Device Identification for wakeup*/
+       GPIO102_GPIO,
+
+       /* Button */
+       GPIO91_GPIO,
+
+       /* DA9030 */
+       GPIO1_GPIO,
+
+       /* MMC */
+       GPIO32_MMC_CLK,
+       GPIO112_MMC_CMD,
+       GPIO92_MMC_DAT_0,
+       GPIO109_MMC_DAT_1,
+       GPIO110_MMC_DAT_2,
+       GPIO111_MMC_DAT_3,
+
+       /* 802.15.4 radio - driver out of mainline */
+       GPIO22_GPIO,                    /* CC_RSTN */
+       GPIO114_GPIO,                   /* CC_FIFO */
+       GPIO116_GPIO,                   /* CC_CCA */
+       GPIO0_GPIO,                     /* CC_FIFOP */
+       GPIO16_GPIO,                    /* CCSFD */
+       GPIO39_GPIO,                    /* CSn */
+       GPIO115_GPIO,                   /* Power enable */
+
+       /* I2C */
+       GPIO117_I2C_SCL,
+       GPIO118_I2C_SDA,
+
+       /* SSP 3 - 802.15.4 radio */
+       GPIO39_GPIO,                    /* Chip Select */
+       GPIO34_SSP3_SCLK,
+       GPIO35_SSP3_TXD,
+       GPIO41_SSP3_RXD,
+
+       /* SSP 2 - to daughter boards */
+       GPIO37_GPIO,                    /* Chip Select */
+       GPIO36_SSP2_SCLK,
+       GPIO38_SSP2_TXD,
+       GPIO11_SSP2_RXD,
+
+       /* SSP 1 - to daughter boards */
+       GPIO24_GPIO,                    /* Chip Select */
+       GPIO23_SSP1_SCLK,
+       GPIO25_SSP1_TXD,
+       GPIO26_SSP1_RXD,
+
+       /* BTUART Basic Connector*/
+       GPIO42_BTUART_RXD,
+       GPIO43_BTUART_TXD,
+       GPIO44_BTUART_CTS,
+       GPIO45_BTUART_RTS,
+
+       /* STUART Serial console via debug board*/
+       GPIO46_STUART_RXD,
+       GPIO47_STUART_TXD,
+
+       /* Basic sensor board */
+       GPIO96_GPIO,    /* accelerometer interrupt */
+       GPIO99_GPIO,    /* ADC interrupt */
+
+       /* Connector pins specified as gpios */
+       GPIO94_GPIO, /* large basic connector pin 14 */
+       GPIO10_GPIO, /* large basic connector pin 23 */
+
+       /* LEDS */
+       GPIO103_GPIO, /* red led */
+       GPIO104_GPIO, /* green led */
+       GPIO105_GPIO, /* blue led */
+};
+
+static struct gpio_led imote2_led_pins[] = {
+       {
+               .name       =  "imote2:red",
+               .gpio       = 103,
+               .active_low = 1,
+       }, {
+               .name       = "imote2:green",
+               .gpio       = 104,
+               .active_low = 1,
+       }, {
+               .name       = "imote2:blue",
+               .gpio       = 105,
+               .active_low = 1,
+       },
+};
+
+static struct gpio_led_platform_data imote2_led_data = {
+       .num_leds = ARRAY_SIZE(imote2_led_pins),
+       .leds     = imote2_led_pins,
+};
+
+static struct platform_device imote2_leds = {
+       .name = "leds-gpio",
+       .id   = -1,
+       .dev = {
+               .platform_data = &imote2_led_data,
+       },
+};
+
+/* Reverse engineered partly from Platformx drivers */
+enum imote2_ldos{
+       vcc_vref,
+       vcc_cc2420,
+       vcc_mica,
+       vcc_bt,
+       /* The two voltages available to sensor boards */
+       vcc_sensor_1_8,
+       vcc_sensor_3,
+
+       vcc_sram_ext, /* directly connected to the pxa271 */
+       vcc_pxa_pll,
+       vcc_pxa_usim, /* Reference voltage for certain gpios */
+       vcc_pxa_mem,
+       vcc_pxa_flash,
+       vcc_pxa_core, /*Dc-Dc buck not yet supported */
+       vcc_lcd,
+       vcc_bb,
+       vcc_bbio,
+       vcc_io, /* cc2420 802.15.4 radio and pxa vcc_io ?*/
+};
+
+/* The values of the various regulator constraints are obviously dependent
+ * on exactly what is wired to each ldo.  Unfortunately this information is
+ * not generally available.  More information has been requested from Xbow
+ * but as of yet they haven't been forthcoming.
+ *
+ * Some of these are clearly Stargate 2 related (no way of plugging
+ * in an lcd on the IM2 for example!).
+ */
+static struct regulator_init_data imote2_ldo_init_data[] = {
+       [vcc_bbio] = {
+               .constraints = { /* board default 1.8V */
+                       .name = "vcc_bbio",
+                       .min_uV = 1800000,
+                       .max_uV = 1800000,
+               },
+       },
+       [vcc_bb] = {
+               .constraints = { /* board default 2.8V */
+                       .name = "vcc_bb",
+                       .min_uV = 2700000,
+                       .max_uV = 3000000,
+               },
+       },
+       [vcc_pxa_flash] = {
+               .constraints = {/* default is 1.8V */
+                       .name = "vcc_pxa_flash",
+                       .min_uV = 1800000,
+                       .max_uV = 1800000,
+               },
+       },
+       [vcc_cc2420] = { /* also vcc_io */
+               .constraints = {
+                       /* board default is 2.8V */
+                       .name = "vcc_cc2420",
+                       .min_uV = 2700000,
+                       .max_uV = 3300000,
+               },
+       },
+       [vcc_vref] = { /* Reference for what? */
+               .constraints = { /* default 1.8V */
+                       .name = "vcc_vref",
+                       .min_uV = 1800000,
+                       .max_uV = 1800000,
+               },
+       },
+       [vcc_sram_ext] = {
+               .constraints = { /* default 2.8V */
+                       .name = "vcc_sram_ext",
+                       .min_uV = 2800000,
+                       .max_uV = 2800000,
+               },
+       },
+       [vcc_mica] = {
+               .constraints = { /* default 2.8V */
+                       .name = "vcc_mica",
+                       .min_uV = 2800000,
+                       .max_uV = 2800000,
+               },
+       },
+       [vcc_bt] = {
+               .constraints = { /* default 2.8V */
+                       .name = "vcc_bt",
+                       .min_uV = 2800000,
+                       .max_uV = 2800000,
+               },
+       },
+       [vcc_lcd] = {
+               .constraints = { /* default 2.8V */
+                       .name = "vcc_lcd",
+                       .min_uV = 2700000,
+                       .max_uV = 3300000,
+               },
+       },
+       [vcc_io] = { /* Same or higher than everything
+                         * bar vccbat and vccusb */
+               .constraints = { /* default 2.8V */
+                       .name = "vcc_io",
+                       .min_uV = 2692000,
+                       .max_uV = 3300000,
+               },
+       },
+       [vcc_sensor_1_8] = {
+               .constraints = { /* default 1.8V */
+                       .name = "vcc_sensor_1_8",
+                       .min_uV = 1800000,
+                       .max_uV = 1800000,
+               },
+       },
+       [vcc_sensor_3] = { /* curiously default 2.8V */
+               .constraints = {
+                       .name = "vcc_sensor_3",
+                       .min_uV = 2800000,
+                       .max_uV = 3000000,
+               },
+       },
+       [vcc_pxa_pll] = { /* 1.17V - 1.43V, default 1.3V*/
+               .constraints = {
+                       .name = "vcc_pxa_pll",
+                       .min_uV = 1170000,
+                       .max_uV = 1430000,
+               },
+       },
+       [vcc_pxa_usim] = {
+               .constraints = { /* default 1.8V */
+                       .name = "vcc_pxa_usim",
+                       .min_uV = 1710000,
+                       .max_uV = 2160000,
+               },
+       },
+       [vcc_pxa_mem] = {
+               .constraints = { /* default 1.8V */
+                       .name = "vcc_pxa_mem",
+                       .min_uV = 1800000,
+                       .max_uV = 1800000,
+               },
+       },
+};
+
+static struct da903x_subdev_info imote2_da9030_subdevs[] = {
+       {
+               .name = "da903x-regulator",
+               .id = DA9030_ID_LDO2,
+               .platform_data = &imote2_ldo_init_data[vcc_bbio],
+       }, {
+               .name = "da903x-regulator",
+               .id = DA9030_ID_LDO3,
+               .platform_data = &imote2_ldo_init_data[vcc_bb],
+       }, {
+               .name = "da903x-regulator",
+               .id = DA9030_ID_LDO4,
+               .platform_data = &imote2_ldo_init_data[vcc_pxa_flash],
+       }, {
+               .name = "da903x-regulator",
+               .id = DA9030_ID_LDO5,
+               .platform_data = &imote2_ldo_init_data[vcc_cc2420],
+       }, {
+               .name = "da903x-regulator",
+               .id = DA9030_ID_LDO6,
+               .platform_data = &imote2_ldo_init_data[vcc_vref],
+       }, {
+               .name = "da903x-regulator",
+               .id = DA9030_ID_LDO7,
+               .platform_data = &imote2_ldo_init_data[vcc_sram_ext],
+       }, {
+               .name = "da903x-regulator",
+               .id = DA9030_ID_LDO8,
+               .platform_data = &imote2_ldo_init_data[vcc_mica],
+       }, {
+               .name = "da903x-regulator",
+               .id = DA9030_ID_LDO9,
+               .platform_data = &imote2_ldo_init_data[vcc_bt],
+       }, {
+               .name = "da903x-regulator",
+               .id = DA9030_ID_LDO10,
+               .platform_data = &imote2_ldo_init_data[vcc_sensor_1_8],
+       }, {
+               .name = "da903x-regulator",
+               .id = DA9030_ID_LDO11,
+               .platform_data = &imote2_ldo_init_data[vcc_sensor_3],
+       }, {
+               .name = "da903x-regulator",
+               .id = DA9030_ID_LDO12,
+               .platform_data = &imote2_ldo_init_data[vcc_lcd],
+       }, {
+               .name = "da903x-regulator",
+               .id = DA9030_ID_LDO15,
+               .platform_data = &imote2_ldo_init_data[vcc_pxa_pll],
+       }, {
+               .name = "da903x-regulator",
+               .id = DA9030_ID_LDO17,
+               .platform_data = &imote2_ldo_init_data[vcc_pxa_usim],
+       }, {
+               .name = "da903x-regulator",
+               .id = DA9030_ID_LDO18,
+               .platform_data = &imote2_ldo_init_data[vcc_io],
+       }, {
+               .name = "da903x-regulator",
+               .id = DA9030_ID_LDO19,
+               .platform_data = &imote2_ldo_init_data[vcc_pxa_mem],
+       },
+};
+
+static struct da903x_platform_data imote2_da9030_pdata = {
+       .num_subdevs = ARRAY_SIZE(imote2_da9030_subdevs),
+       .subdevs = imote2_da9030_subdevs,
+};
+
+/* As the the imote2 doesn't currently have a conventional SD slot
+ * there is no option to hotplug cards, making all this rather simple
+ */
+static int imote2_mci_get_ro(struct device *dev)
+{
+       return 0;
+}
+
+/* Rather simple case as hotplugging not possible */
+static struct pxamci_platform_data imote2_mci_platform_data = {
+       .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, /* default anyway */
+       .get_ro = imote2_mci_get_ro,
+};
+
+static struct mtd_partition imote2flash_partitions[] = {
+       {
+               .name = "Bootloader",
+               .size = 0x00040000,
+               .offset = 0,
+               .mask_flags = MTD_WRITEABLE,
+       }, {
+               .name = "Kernel",
+               .size = 0x00200000,
+               .offset = 0x00040000,
+               .mask_flags = 0,
+       }, {
+               .name = "Filesystem",
+               .size = 0x01DC0000,
+               .offset = 0x00240000,
+               .mask_flags = 0,
+       },
+};
+
+static struct resource flash_resources = {
+       .start = PXA_CS0_PHYS,
+       .end = PXA_CS0_PHYS + SZ_32M - 1,
+       .flags = IORESOURCE_MEM,
+};
+
+static struct flash_platform_data imote2_flash_data = {
+       .map_name = "cfi_probe",
+       .parts = imote2flash_partitions,
+       .nr_parts = ARRAY_SIZE(imote2flash_partitions),
+       .name = "PXA27xOnChipROM",
+       .width = 2,
+};
+
+static struct platform_device imote2_flash_device = {
+       .name = "pxa2xx-flash",
+       .id = 0,
+       .dev = {
+               .platform_data = &imote2_flash_data,
+       },
+       .resource = &flash_resources,
+       .num_resources = 1,
+};
+
+/* Some of the drivers here are out of kernel at the moment (parts of IIO)
+ * and it may be a while before they are in the mainline.
+ */
+static struct i2c_board_info __initdata imote2_i2c_board_info[] = {
+       { /* UCAM sensor board */
+               .type = "max1238",
+               .addr = 0x35,
+       }, { /* ITS400 Sensor board only */
+               .type = "max1363",
+               .addr = 0x34,
+               /* Through a nand gate - Also beware, on V2 sensor board the
+                * pull up resistors are missing.
+                */
+               .irq = IRQ_GPIO(99),
+       }, { /* ITS400 Sensor board only */
+               .type = "tsl2561",
+               .addr = 0x49,
+               /* Through a nand gate - Also beware, on V2 sensor board the
+                * pull up resistors are missing.
+                */
+               .irq = IRQ_GPIO(99),
+       }, { /* ITS400 Sensor board only */
+               .type = "tmp175",
+               .addr = 0x4A,
+               .irq = IRQ_GPIO(96),
+       },
+};
+
+static struct i2c_board_info __initdata imote2_pwr_i2c_board_info[] = {
+       {
+               .type = "da9030",
+               .addr = 0x49,
+               .platform_data = &imote2_da9030_pdata,
+               .irq = gpio_to_irq(1),
+       },
+};
+
+static struct pxa2xx_spi_master pxa_ssp_master_0_info = {
+       .num_chipselect = 1,
+};
+
+static struct pxa2xx_spi_master pxa_ssp_master_1_info = {
+       .num_chipselect = 1,
+};
+
+static struct pxa2xx_spi_master pxa_ssp_master_2_info = {
+       .num_chipselect = 1,
+};
+
+/* Patch posted by Eric Miao <eric.miao@marvell.com> will remove
+ * the need for these functions.
+ */
+static void spi1control(u32 command)
+{
+       gpio_set_value(24, command & PXA2XX_CS_ASSERT ? 0 : 1);
+};
+
+static void spi3control(u32 command)
+{
+       gpio_set_value(39, command & PXA2XX_CS_ASSERT ? 0 : 1);
+};
+
+static struct pxa2xx_spi_chip staccel_chip_info = {
+       .tx_threshold = 8,
+       .rx_threshold = 8,
+       .dma_burst_size = 8,
+       .timeout = 235,
+       .cs_control = spi1control,
+};
+
+static struct pxa2xx_spi_chip cc2420_info = {
+       .tx_threshold = 8,
+       .rx_threshold = 8,
+       .dma_burst_size = 8,
+       .timeout = 235,
+       .cs_control = spi3control,
+};
+
+static struct spi_board_info spi_board_info[] __initdata = {
+       { /* Driver in IIO */
+               .modalias = "lis3l02dq",
+               .max_speed_hz = 8000000,/* 8MHz max spi frequency at 3V */
+               .bus_num = 1,
+               .chip_select = 0,
+               .controller_data = &staccel_chip_info,
+               .irq = IRQ_GPIO(96),
+       }, { /* Driver out of kernel as it needs considerable rewriting */
+               .modalias = "cc2420",
+               .max_speed_hz = 6500000,
+               .bus_num = 3,
+               .chip_select = 0,
+               .controller_data = &cc2420_info,
+       },
+};
+
+static void im2_udc_command(int cmd)
+{
+       switch (cmd) {
+       case PXA2XX_UDC_CMD_CONNECT:
+               UP2OCR |=  UP2OCR_HXOE | UP2OCR_DPPUE | UP2OCR_DPPUBE;
+               break;
+       case PXA2XX_UDC_CMD_DISCONNECT:
+               UP2OCR &= ~(UP2OCR_HXOE | UP2OCR_DPPUE | UP2OCR_DPPUBE);
+               break;
+       }
+}
+
+static struct pxa2xx_udc_mach_info imote2_udc_info __initdata = {
+       .udc_command            = im2_udc_command,
+};
+
+static struct platform_device *imote2_devices[] = {
+       &imote2_flash_device,
+       &imote2_leds,
+};
+
+static struct i2c_pxa_platform_data i2c_pwr_pdata = {
+       .fast_mode = 1,
+};
+
+static struct i2c_pxa_platform_data i2c_pdata = {
+       .fast_mode = 1,
+};
+
+static void __init imote2_init(void)
+{
+
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(imote2_pin_config));
+       /* SPI chip select directions - all other directions should
+        * be handled by drivers.*/
+       gpio_direction_output(37, 0);
+       gpio_direction_output(24, 0);
+       gpio_direction_output(39, 0);
+
+       platform_add_devices(imote2_devices, ARRAY_SIZE(imote2_devices));
+
+       pxa2xx_set_spi_info(1, &pxa_ssp_master_0_info);
+       pxa2xx_set_spi_info(2, &pxa_ssp_master_1_info);
+       pxa2xx_set_spi_info(3, &pxa_ssp_master_2_info);
+
+       spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
+
+       i2c_register_board_info(0, imote2_i2c_board_info,
+                               ARRAY_SIZE(imote2_i2c_board_info));
+       i2c_register_board_info(1, imote2_pwr_i2c_board_info,
+                               ARRAY_SIZE(imote2_pwr_i2c_board_info));
+
+       pxa27x_set_i2c_power_info(&i2c_pwr_pdata);
+       pxa_set_i2c_info(&i2c_pdata);
+
+       pxa_set_mci_info(&imote2_mci_platform_data);
+       pxa_set_udc_info(&imote2_udc_info);
+}
+
+MACHINE_START(INTELMOTE2, "IMOTE 2")
+       .phys_io        = 0x40000000,
+       .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
+       .map_io         = pxa_map_io,
+       .init_irq       = pxa27x_init_irq,
+       .timer          = &pxa_timer,
+       .init_machine   = imote2_init,
+       .boot_params    = 0xA0000100,
+MACHINE_END
index 42ee1956750ebc1de1c36ed05eec19421c070da0..099f54a41de4cf1f45cb8905241d1503660899fb 100644 (file)
@@ -94,3 +94,7 @@ has detected a cable insertion; driven low otherwise. */
 #define GPIO26_PRDY_nBSY_MD            (GPIO26_PRDY_nBSY | GPIO_IN)
 #define GPIO27_PRDY_nBSY_MD            (GPIO27_PRDY_nBSY | GPIO_IN)
 #define GPIO36_nCD_MD                  (GPIO36_nCD | GPIO_IN)
+
+/* for expansion boards that can't be programatically detected */
+extern int am200_init(void);
+
index 5c4e320c1437f4e57d7fa2409183dd48be103692..6c9b21c5132254dad261aa1dba4097293248684d 100644 (file)
@@ -1,8 +1,13 @@
-#ifndef __ASM_ARCH_ZYLONITE_H
-#define __ASM_ARCH_ZYLONITE_H
+#ifndef __ASM_ARCH_LITTLETON_H
+#define __ASM_ARCH_LITTLETON_H
+
+#include <mach/gpio.h>
 
 #define LITTLETON_ETH_PHYS     0x30000000
 
 #define LITTLETON_GPIO_LCD_CS  (17)
 
-#endif /* __ASM_ARCH_ZYLONITE_H */
+#define EXT0_GPIO_BASE (NR_BUILTIN_GPIO)
+#define EXT0_GPIO(x)   (EXT0_GPIO_BASE + (x))
+
+#endif /* __ASM_ARCH_LITTLETON_H */
index cbda4d35c42130d44eca008fce11cc03ac9f9ba2..4201a889ff4e5999ff3cc55fbc95777f673c844b 100644 (file)
@@ -48,6 +48,7 @@
 #define LCD_MONO_DSTN_8BPP     ((8  << 4) | LCD_TYPE_MONO_DSTN)
 #define LCD_COLOR_STN_8BPP     ((8  << 4) | LCD_TYPE_COLOR_STN)
 #define LCD_COLOR_DSTN_16BPP   ((16 << 4) | LCD_TYPE_COLOR_DSTN)
+#define LCD_COLOR_TFT_8BPP     ((8  << 4) | LCD_TYPE_COLOR_TFT)
 #define LCD_COLOR_TFT_16BPP    ((16 << 4) | LCD_TYPE_COLOR_TFT)
 #define LCD_COLOR_TFT_18BPP    ((18 << 4) | LCD_TYPE_COLOR_TFT)
 #define LCD_SMART_PANEL_8BPP   ((8  << 4) | LCD_TYPE_SMART_PANEL)
@@ -94,6 +95,10 @@ struct pxafb_mode_info {
         *    in pxa27x and pxa3xx, initialize them to the same value or
         *    the larger one will be used
         * 3. same to {rd,wr}_pulse_width
+        *
+        * 4. LCD_PCLK_EDGE_{RISE,FALL} controls the L_PCLK_WR polarity
+        * 5. sync & FB_SYNC_HOR_HIGH_ACT controls the L_LCLK_A0
+        * 6. sync & FB_SYNC_VERT_HIGH_ACT controls the L_LCLK_RD
         */
        unsigned        a0csrd_set_hld; /* A0 and CS Setup/Hold Time before/after L_FCLK_RD */
        unsigned        a0cswr_set_hld; /* A0 and CS Setup/Hold Time before/after L_PCLK_WR */
index c689c4ea769cbf3892bac3d44134b4324052af8f..f817878d256b523a20a6095e689a9f9e16bd3784 100644 (file)
 
 #define SMART_CMD(x)   (SMART_CMD_WRITE_COMMAND | ((x) & 0xff))
 #define SMART_DAT(x)   (SMART_CMD_WRITE_DATA | ((x) & 0xff))
+
+/* SMART_DELAY() is introduced for software controlled delay primitive which
+ * can be inserted between command sequences, unused command 0x6 is used here
+ * and delay ranges from 0ms ~ 255ms
+ */
+#define SMART_CMD_DELAY                (0x6 << 9)
+#define SMART_DELAY(ms)                (SMART_CMD_DELAY | ((ms) & 0xff))
 #endif /* __ASM_ARCH_REGS_LCD_H */
index a9a4f302b6efcc6fcd67a70879c359e25bb51ff6..f4b029c039571c622a62d9e3a017480c89ce2fc2 100644 (file)
@@ -35,7 +35,7 @@ static inline void flush(void)
 
 static inline void arch_decomp_setup(void)
 {
-       if (machine_is_littleton())
+       if (machine_is_littleton() || machine_is_intelmote2())
                UART = STUART;
 }
 
index 5609f52e36b1bd1551f45e1d93dc083499cea0a8..31da7f3c06f6fa331578218e4cd87306610df780 100644 (file)
 #include <linux/gpio.h>
 #include <linux/spi/spi.h>
 #include <linux/smc91x.h>
+#include <linux/i2c.h>
+#include <linux/leds.h>
+#include <linux/mfd/da903x.h>
+#include <linux/i2c/max732x.h>
 
 #include <asm/types.h>
 #include <asm/setup.h>
@@ -40,6 +44,7 @@
 #include <mach/pxafb.h>
 #include <mach/ssp.h>
 #include <mach/pxa2xx_spi.h>
+#include <mach/i2c.h>
 #include <mach/pxa27x_keypad.h>
 #include <mach/pxa3xx_nand.h>
 #include <mach/littleton.h>
@@ -314,6 +319,73 @@ static void __init littleton_init_nand(void)
 static inline void littleton_init_nand(void) {}
 #endif /* CONFIG_MTD_NAND_PXA3xx || CONFIG_MTD_NAND_PXA3xx_MODULE */
 
+#if defined(CONFIG_I2C_PXA) || defined(CONFIG_I2C_PXA_MODULE)
+static struct led_info littleton_da9034_leds[] = {
+       [0] = {
+               .name   = "littleton:keypad1",
+               .flags  = DA9034_LED_RAMP,
+       },
+       [1] = {
+               .name   = "littleton:keypad2",
+               .flags  = DA9034_LED_RAMP,
+       },
+       [2] = {
+               .name   = "littleton:vibra",
+               .flags  = 0,
+       },
+};
+
+static struct da903x_subdev_info littleton_da9034_subdevs[] = {
+       {
+               .name           = "da903x-led",
+               .id             = DA9034_ID_LED_1,
+               .platform_data  = &littleton_da9034_leds[0],
+       }, {
+               .name           = "da903x-led",
+               .id             = DA9034_ID_LED_2,
+               .platform_data  = &littleton_da9034_leds[1],
+       }, {
+               .name           = "da903x-led",
+               .id             = DA9034_ID_VIBRA,
+               .platform_data  = &littleton_da9034_leds[2],
+       }, {
+               .name           = "da903x-backlight",
+               .id             = DA9034_ID_WLED,
+       },
+};
+
+static struct da903x_platform_data littleton_da9034_info = {
+       .num_subdevs    = ARRAY_SIZE(littleton_da9034_subdevs),
+       .subdevs        = littleton_da9034_subdevs,
+};
+
+static struct max732x_platform_data littleton_max7320_info = {
+       .gpio_base      = EXT0_GPIO_BASE,
+};
+
+static struct i2c_board_info littleton_i2c_info[] = {
+       [0] = {
+               .type           = "da9034",
+               .addr           = 0x34,
+               .platform_data  = &littleton_da9034_info,
+               .irq            = gpio_to_irq(mfp_to_gpio(MFP_PIN_GPIO18)),
+       },
+       [1] = {
+               .type           = "max7320",
+               .addr           = 0x50,
+               .platform_data  = &littleton_max7320_info,
+       },
+};
+
+static void __init littleton_init_i2c(void)
+{
+       pxa_set_i2c_info(NULL);
+       i2c_register_board_info(0, ARRAY_AND_SIZE(littleton_i2c_info));
+}
+#else
+static inline void littleton_init_i2c(void) {}
+#endif /* CONFIG_I2C_PXA || CONFIG_I2C_PXA_MODULE */
+
 static void __init littleton_init(void)
 {
        /* initialize MFP configurations */
@@ -326,6 +398,7 @@ static void __init littleton_init(void)
        platform_device_register(&smc91x_device);
 
        littleton_init_spi();
+       littleton_init_i2c();
        littleton_init_lcd();
        littleton_init_keypad();
        littleton_init_nand();
index bf59cec27deff00a712bec60d699513f5a692e03..21b821e1a60d82bc3b2811523e5b164b1af7728d 100644 (file)
@@ -336,8 +336,7 @@ static struct pxafb_mach_info toppoly_info = {
        .modes           = toppoly_modes,
        .num_modes       = 1,
        .fixed_modes     = 1,
-       .lccr0           = LCCR0_Color | LCCR0_Sngl | LCCR0_Act,
-       .lccr3           = LCCR3_PixRsEdg,
+       .lcd_conn       = LCD_COLOR_TFT_16BPP,
        .pxafb_lcd_power = toppoly_lcd_power,
 };
 
@@ -345,8 +344,8 @@ static struct pxafb_mach_info samsung_info = {
        .modes           = samsung_modes,
        .num_modes       = 1,
        .fixed_modes     = 1,
-       .lccr0           = LCCR0_LDDALT | LCCR0_Color | LCCR0_Sngl | LCCR0_Act,
-       .lccr3           = LCCR3_PixFlEdg,
+       .lcd_conn        = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL |\
+                          LCD_ALTERNATE_MAPPING,
        .pxafb_lcd_power = samsung_lcd_power,
 };
 
index 3ea01e0eac6360a8fe8db8ea6b618d0e6646a505..34841c72815f6b15c2ffff1bbee04a03e32dd6bf 100644 (file)
@@ -104,8 +104,7 @@ static struct pxafb_mode_info fb_info_sharp_lq084v1dg21 = {
 static struct pxafb_mach_info pcm990_fbinfo __initdata = {
        .modes                  = &fb_info_sharp_lq084v1dg21,
        .num_modes              = 1,
-       .lccr0                  = LCCR0_PAS,
-       .lccr3                  = LCCR3_PCP,
+       .lcd_conn               = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
        .pxafb_lcd_power        = pcm990_lcd_power,
 };
 #elif defined(CONFIG_PCM990_DISPLAY_NEC)
@@ -127,8 +126,7 @@ struct pxafb_mode_info fb_info_nec_nl6448bc20_18d = {
 static struct pxafb_mach_info pcm990_fbinfo __initdata = {
        .modes                  = &fb_info_nec_nl6448bc20_18d,
        .num_modes              = 1,
-       .lccr0                  = LCCR0_Act,
-       .lccr3                  = LCCR3_PixFlEdg,
+       .lcd_conn               = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
        .pxafb_lcd_power        = pcm990_lcd_power,
 };
 #endif
index e7ea91ce7f02c8da83d78db74368068e6a04c578..5d02a7325586ab3b778cd8f8275fc9ad3774d218 100644 (file)
 #include <linux/platform_device.h>
 #include <linux/clk.h>
 #include <linux/gpio.h>
+#include <linux/delay.h>
+#include <linux/fb.h>
+#include <linux/i2c.h>
 #include <linux/smc91x.h>
+#include <linux/mfd/da903x.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <mach/hardware.h>
 #include <mach/pxa3xx-regs.h>
 #include <mach/mfp-pxa930.h>
+#include <mach/i2c.h>
+#include <mach/regs-lcd.h>
+#include <mach/pxafb.h>
 
 #include "devices.h"
 #include "generic.h"
 
+#define GPIO_LCD_RESET (16)
+
 /* SAAR MFP configurations */
 static mfp_cfg_t saar_mfp_cfg[] __initdata = {
+       /* LCD */
+       GPIO23_LCD_DD0,
+       GPIO24_LCD_DD1,
+       GPIO25_LCD_DD2,
+       GPIO26_LCD_DD3,
+       GPIO27_LCD_DD4,
+       GPIO28_LCD_DD5,
+       GPIO29_LCD_DD6,
+       GPIO44_LCD_DD7,
+       GPIO21_LCD_CS,
+       GPIO22_LCD_VSYNC,
+       GPIO17_LCD_FCLK_RD,
+       GPIO18_LCD_LCLK_A0,
+       GPIO19_LCD_PCLK_WR,
+       GPIO16_GPIO, /* LCD reset */
+
        /* Ethernet */
        DF_nCS1_nCS3,
        GPIO97_GPIO,
@@ -64,12 +89,408 @@ static struct platform_device smc91x_device = {
        },
 };
 
+#if defined(CONFIG_FB_PXA) || (CONFIG_FB_PXA_MODULE)
+static uint16_t lcd_power_on[] = {
+       /* single frame */
+       SMART_CMD_NOOP,
+       SMART_CMD(0x00),
+       SMART_DELAY(0),
+
+       SMART_CMD_NOOP,
+       SMART_CMD(0x00),
+       SMART_DELAY(0),
+
+       SMART_CMD_NOOP,
+       SMART_CMD(0x00),
+       SMART_DELAY(0),
+
+       SMART_CMD_NOOP,
+       SMART_CMD(0x00),
+       SMART_DELAY(10),
+
+       /* calibration control */
+       SMART_CMD(0x00),
+       SMART_CMD(0xA4),
+       SMART_DAT(0x80),
+       SMART_DAT(0x01),
+       SMART_DELAY(150),
+
+       /*Power-On Init sequence*/
+       SMART_CMD(0x00),        /* output ctrl */
+       SMART_CMD(0x01),
+       SMART_DAT(0x01),
+       SMART_DAT(0x00),
+       SMART_CMD(0x00),        /* wave ctrl */
+       SMART_CMD(0x02),
+       SMART_DAT(0x07),
+       SMART_DAT(0x00),
+       SMART_CMD(0x00),
+       SMART_CMD(0x03),        /* entry mode */
+       SMART_DAT(0xD0),
+       SMART_DAT(0x30),
+       SMART_CMD(0x00),
+       SMART_CMD(0x08),        /* display ctrl 2 */
+       SMART_DAT(0x08),
+       SMART_DAT(0x08),
+       SMART_CMD(0x00),
+       SMART_CMD(0x09),        /* display ctrl 3 */
+       SMART_DAT(0x04),
+       SMART_DAT(0x2F),
+       SMART_CMD(0x00),
+       SMART_CMD(0x0A),        /* display ctrl 4 */
+       SMART_DAT(0x00),
+       SMART_DAT(0x08),
+       SMART_CMD(0x00),
+       SMART_CMD(0x0D),        /* Frame Marker position */
+       SMART_DAT(0x00),
+       SMART_DAT(0x08),
+       SMART_CMD(0x00),
+       SMART_CMD(0x60),        /* Driver output control */
+       SMART_DAT(0x27),
+       SMART_DAT(0x00),
+       SMART_CMD(0x00),
+       SMART_CMD(0x61),        /* Base image display control */
+       SMART_DAT(0x00),
+       SMART_DAT(0x01),
+       SMART_CMD(0x00),
+       SMART_CMD(0x30),        /* Y settings 30h-3Dh */
+       SMART_DAT(0x07),
+       SMART_DAT(0x07),
+       SMART_CMD(0x00),
+       SMART_CMD(0x31),
+       SMART_DAT(0x00),
+       SMART_DAT(0x07),
+       SMART_CMD(0x00),
+       SMART_CMD(0x32),        /* Timing(3), ASW HOLD=0.5CLK */
+       SMART_DAT(0x04),
+       SMART_DAT(0x00),
+       SMART_CMD(0x00),
+       SMART_CMD(0x33),        /* Timing(4), CKV ST=0CLK, CKV ED=1CLK */
+       SMART_DAT(0x03),
+       SMART_DAT(0x03),
+       SMART_CMD(0x00),
+       SMART_CMD(0x34),
+       SMART_DAT(0x00),
+       SMART_DAT(0x00),
+       SMART_CMD(0x00),
+       SMART_CMD(0x35),
+       SMART_DAT(0x02),
+       SMART_DAT(0x05),
+       SMART_CMD(0x00),
+       SMART_CMD(0x36),
+       SMART_DAT(0x1F),
+       SMART_DAT(0x1F),
+       SMART_CMD(0x00),
+       SMART_CMD(0x37),
+       SMART_DAT(0x07),
+       SMART_DAT(0x07),
+       SMART_CMD(0x00),
+       SMART_CMD(0x38),
+       SMART_DAT(0x00),
+       SMART_DAT(0x07),
+       SMART_CMD(0x00),
+       SMART_CMD(0x39),
+       SMART_DAT(0x04),
+       SMART_DAT(0x00),
+       SMART_CMD(0x00),
+       SMART_CMD(0x3A),
+       SMART_DAT(0x03),
+       SMART_DAT(0x03),
+       SMART_CMD(0x00),
+       SMART_CMD(0x3B),
+       SMART_DAT(0x00),
+       SMART_DAT(0x00),
+       SMART_CMD(0x00),
+       SMART_CMD(0x3C),
+       SMART_DAT(0x02),
+       SMART_DAT(0x05),
+       SMART_CMD(0x00),
+       SMART_CMD(0x3D),
+       SMART_DAT(0x1F),
+       SMART_DAT(0x1F),
+       SMART_CMD(0x00),        /* Display control 1 */
+       SMART_CMD(0x07),
+       SMART_DAT(0x00),
+       SMART_DAT(0x01),
+       SMART_CMD(0x00),        /* Power control 5 */
+       SMART_CMD(0x17),
+       SMART_DAT(0x00),
+       SMART_DAT(0x01),
+       SMART_CMD(0x00),        /* Power control 1 */
+       SMART_CMD(0x10),
+       SMART_DAT(0x10),
+       SMART_DAT(0xB0),
+       SMART_CMD(0x00),        /* Power control 2 */
+       SMART_CMD(0x11),
+       SMART_DAT(0x01),
+       SMART_DAT(0x30),
+       SMART_CMD(0x00),        /* Power control 3 */
+       SMART_CMD(0x12),
+       SMART_DAT(0x01),
+       SMART_DAT(0x9E),
+       SMART_CMD(0x00),        /* Power control 4 */
+       SMART_CMD(0x13),
+       SMART_DAT(0x17),
+       SMART_DAT(0x00),
+       SMART_CMD(0x00),        /* Power control 3 */
+       SMART_CMD(0x12),
+       SMART_DAT(0x01),
+       SMART_DAT(0xBE),
+       SMART_DELAY(100),
+
+       /* display mode : 240*320 */
+       SMART_CMD(0x00),        /* RAM address set(H) 0*/
+       SMART_CMD(0x20),
+       SMART_DAT(0x00),
+       SMART_DAT(0x00),
+       SMART_CMD(0x00),        /* RAM address set(V)   4*/
+       SMART_CMD(0x21),
+       SMART_DAT(0x00),
+       SMART_DAT(0x00),
+       SMART_CMD(0x00),        /* Start of Window RAM address set(H) 8*/
+       SMART_CMD(0x50),
+       SMART_DAT(0x00),
+       SMART_DAT(0x00),
+       SMART_CMD(0x00),        /* End of Window RAM address set(H) 12*/
+       SMART_CMD(0x51),
+       SMART_DAT(0x00),
+       SMART_DAT(0xEF),
+       SMART_CMD(0x00),        /* Start of Window RAM address set(V) 16*/
+       SMART_CMD(0x52),
+       SMART_DAT(0x00),
+       SMART_DAT(0x00),
+       SMART_CMD(0x00),        /* End of Window RAM address set(V) 20*/
+       SMART_CMD(0x53),
+       SMART_DAT(0x01),
+       SMART_DAT(0x3F),
+       SMART_CMD(0x00),        /* Panel interface control 1 */
+       SMART_CMD(0x90),
+       SMART_DAT(0x00),
+       SMART_DAT(0x1A),
+       SMART_CMD(0x00),        /* Panel interface control 2 */
+       SMART_CMD(0x92),
+       SMART_DAT(0x04),
+       SMART_DAT(0x00),
+       SMART_CMD(0x00),        /* Panel interface control 3 */
+       SMART_CMD(0x93),
+       SMART_DAT(0x00),
+       SMART_DAT(0x05),
+       SMART_DELAY(20),
+};
+
+static uint16_t lcd_panel_on[] = {
+       SMART_CMD(0x00),
+       SMART_CMD(0x07),
+       SMART_DAT(0x00),
+       SMART_DAT(0x21),
+       SMART_DELAY(1),
+
+       SMART_CMD(0x00),
+       SMART_CMD(0x07),
+       SMART_DAT(0x00),
+       SMART_DAT(0x61),
+       SMART_DELAY(100),
+
+       SMART_CMD(0x00),
+       SMART_CMD(0x07),
+       SMART_DAT(0x01),
+       SMART_DAT(0x73),
+       SMART_DELAY(1),
+};
+
+static uint16_t lcd_panel_off[] = {
+       SMART_CMD(0x00),
+       SMART_CMD(0x07),
+       SMART_DAT(0x00),
+       SMART_DAT(0x72),
+       SMART_DELAY(40),
+
+       SMART_CMD(0x00),
+       SMART_CMD(0x07),
+       SMART_DAT(0x00),
+       SMART_DAT(0x01),
+       SMART_DELAY(1),
+
+       SMART_CMD(0x00),
+       SMART_CMD(0x07),
+       SMART_DAT(0x00),
+       SMART_DAT(0x00),
+       SMART_DELAY(1),
+};
+
+static uint16_t lcd_power_off[] = {
+       SMART_CMD(0x00),
+       SMART_CMD(0x10),
+       SMART_DAT(0x00),
+       SMART_DAT(0x80),
+
+       SMART_CMD(0x00),
+       SMART_CMD(0x11),
+       SMART_DAT(0x01),
+       SMART_DAT(0x60),
+
+       SMART_CMD(0x00),
+       SMART_CMD(0x12),
+       SMART_DAT(0x01),
+       SMART_DAT(0xAE),
+       SMART_DELAY(40),
+
+       SMART_CMD(0x00),
+       SMART_CMD(0x10),
+       SMART_DAT(0x00),
+       SMART_DAT(0x00),
+};
+
+static uint16_t update_framedata[] = {
+       /* set display ram: 240*320 */
+       SMART_CMD(0x00), /* RAM address set(H) 0*/
+       SMART_CMD(0x20),
+       SMART_DAT(0x00),
+       SMART_DAT(0x00),
+       SMART_CMD(0x00), /* RAM address set(V) 4*/
+       SMART_CMD(0x21),
+       SMART_DAT(0x00),
+       SMART_DAT(0x00),
+       SMART_CMD(0x00), /* Start of Window RAM address set(H) 8 */
+       SMART_CMD(0x50),
+       SMART_DAT(0x00),
+       SMART_DAT(0x00),
+       SMART_CMD(0x00), /* End of Window RAM address set(H) 12 */
+       SMART_CMD(0x51),
+       SMART_DAT(0x00),
+       SMART_DAT(0xEF),
+       SMART_CMD(0x00), /* Start of Window RAM address set(V) 16 */
+       SMART_CMD(0x52),
+       SMART_DAT(0x00),
+       SMART_DAT(0x00),
+       SMART_CMD(0x00), /* End of Window RAM address set(V) 20 */
+       SMART_CMD(0x53),
+       SMART_DAT(0x01),
+       SMART_DAT(0x3F),
+
+       /* wait for vsync cmd before transferring frame data */
+       SMART_CMD_WAIT_FOR_VSYNC,
+
+       /* write ram */
+       SMART_CMD(0x00),
+       SMART_CMD(0x22),
+
+       /* write frame data */
+       SMART_CMD_WRITE_FRAME,
+};
+
+static void ltm022a97a_lcd_power(int on, struct fb_var_screeninfo *var)
+{
+       static int pin_requested = 0;
+       struct fb_info *info = container_of(var, struct fb_info, var);
+       int err;
+
+       if (!pin_requested) {
+               err = gpio_request(GPIO_LCD_RESET, "lcd reset");
+               if (err) {
+                       pr_err("failed to request gpio for LCD reset\n");
+                       return;
+               }
+
+               gpio_direction_output(GPIO_LCD_RESET, 0);
+               pin_requested = 1;
+       }
+
+       if (on) {
+               gpio_set_value(GPIO_LCD_RESET, 0); msleep(100);
+               gpio_set_value(GPIO_LCD_RESET, 1); msleep(10);
+
+               pxafb_smart_queue(info, ARRAY_AND_SIZE(lcd_power_on));
+               pxafb_smart_queue(info, ARRAY_AND_SIZE(lcd_panel_on));
+       } else {
+               pxafb_smart_queue(info, ARRAY_AND_SIZE(lcd_panel_off));
+               pxafb_smart_queue(info, ARRAY_AND_SIZE(lcd_power_off));
+       }
+
+       err = pxafb_smart_flush(info);
+       if (err)
+               pr_err("%s: timed out\n", __func__);
+}
+
+static void ltm022a97a_update(struct fb_info *info)
+{
+       pxafb_smart_queue(info, ARRAY_AND_SIZE(update_framedata));
+       pxafb_smart_flush(info);
+}
+
+static struct pxafb_mode_info toshiba_ltm022a97a_modes[] = {
+       [0] = {
+               .xres                   = 240,
+               .yres                   = 320,
+               .bpp                    = 16,
+               .a0csrd_set_hld         = 30,
+               .a0cswr_set_hld         = 30,
+               .wr_pulse_width         = 30,
+               .rd_pulse_width         = 30,
+               .op_hold_time           = 30,
+               .cmd_inh_time           = 60,
+
+               /* L_LCLK_A0 and L_LCLK_RD active low */
+               .sync                   = FB_SYNC_HOR_HIGH_ACT |
+                                         FB_SYNC_VERT_HIGH_ACT,
+       },
+};
+
+static struct pxafb_mach_info saar_lcd_info = {
+       .modes                  = toshiba_ltm022a97a_modes,
+       .num_modes              = 1,
+       .lcd_conn               = LCD_SMART_PANEL_8BPP | LCD_PCLK_EDGE_FALL,
+       .pxafb_lcd_power        = ltm022a97a_lcd_power,
+       .smart_update           = ltm022a97a_update,
+};
+
+static void __init saar_init_lcd(void)
+{
+       set_pxa_fb_info(&saar_lcd_info);
+}
+#else
+static inline void saar_init_lcd(void) {}
+#endif
+
+#if defined(CONFIG_I2C_PXA) || defined(CONFIG_I2C_PXA_MODULE)
+static struct da903x_subdev_info saar_da9034_subdevs[] = {
+       [0] = {
+               .name           = "da903x-backlight",
+               .id             = DA9034_ID_WLED,
+       },
+};
+
+static struct da903x_platform_data saar_da9034_info = {
+       .num_subdevs    = ARRAY_SIZE(saar_da9034_subdevs),
+       .subdevs        = saar_da9034_subdevs,
+};
+
+static struct i2c_board_info saar_i2c_info[] = {
+       [0] = {
+               .type           = "da9034",
+               .addr           = 0x34,
+               .platform_data  = &saar_da9034_info,
+               .irq            = gpio_to_irq(mfp_to_gpio(MFP_PIN_GPIO83)),
+       },
+};
+
+static void __init saar_init_i2c(void)
+{
+       pxa_set_i2c_info(NULL);
+       i2c_register_board_info(0, ARRAY_AND_SIZE(saar_i2c_info));
+}
+#else
+static inline void saar_init_i2c(void) {}
+#endif
 static void __init saar_init(void)
 {
        /* initialize MFP configurations */
        pxa3xx_mfp_config(ARRAY_AND_SIZE(saar_mfp_cfg));
 
        platform_device_register(&smc91x_device);
+
+       saar_init_i2c();
+       saar_init_lcd();
 }
 
 MACHINE_START(SAAR, "PXA930 Handheld Platform (aka SAAR)")
index afe7a65c5603b1a88c4555edd559f47f50a10ed2..d0fd22e06737cedc4a3e05582315988c897120b9 100644 (file)
@@ -50,7 +50,6 @@
 #include <asm/irq.h>
 #include <asm/div64.h>
 #include <mach/pxa-regs.h>
-#include <mach/pxa2xx-gpio.h>
 #include <mach/bitfield.h>
 #include <mach/pxafb.h>
 
@@ -724,12 +723,19 @@ int pxafb_smart_queue(struct fb_info *info, uint16_t *cmds, int n_cmds)
        int i;
        struct pxafb_info *fbi = container_of(info, struct pxafb_info, fb);
 
-       /* leave 2 commands for INTERRUPT and WAIT_FOR_SYNC */
-       for (i = 0; i < n_cmds; i++) {
+       for (i = 0; i < n_cmds; i++, cmds++) {
+               /* if it is a software delay, flush and delay */
+               if ((*cmds & 0xff00) == SMART_CMD_DELAY) {
+                       pxafb_smart_flush(info);
+                       mdelay(*cmds & 0xff);
+                       continue;
+               }
+
+               /* leave 2 commands for INTERRUPT and WAIT_FOR_SYNC */
                if (fbi->n_smart_cmds == CMD_BUFF_SIZE - 8)
                        pxafb_smart_flush(info);
 
-               fbi->smart_cmds[fbi->n_smart_cmds++] = *cmds++;
+               fbi->smart_cmds[fbi->n_smart_cmds++] = *cmds;
        }
 
        return 0;
@@ -761,7 +767,9 @@ static void setup_smart_timing(struct pxafb_info *fbi,
                LCCR1_HorSnchWdth(__smart_timing(t3, lclk));
 
        fbi->reg_lccr2 = LCCR2_DisHght(var->yres);
-       fbi->reg_lccr3 = LCCR3_PixClkDiv(__smart_timing(t4, lclk));
+       fbi->reg_lccr3 = fbi->lccr3 | LCCR3_PixClkDiv(__smart_timing(t4, lclk));
+       fbi->reg_lccr3 |= (var->sync & FB_SYNC_HOR_HIGH_ACT) ? LCCR3_HSP : 0;
+       fbi->reg_lccr3 |= (var->sync & FB_SYNC_VERT_HIGH_ACT) ? LCCR3_VSP : 0;
 
        /* FIXME: make this configurable */
        fbi->reg_cmdcr = 1;
@@ -786,11 +794,15 @@ static int pxafb_smart_thread(void *arg)
                if (try_to_freeze())
                        continue;
 
+               mutex_lock(&fbi->ctrlr_lock);
+
                if (fbi->state == C_ENABLE) {
                        inf->smart_update(&fbi->fb);
                        complete(&fbi->refresh_done);
                }
 
+               mutex_unlock(&fbi->ctrlr_lock);
+
                set_current_state(TASK_INTERRUPTIBLE);
                schedule_timeout(30 * HZ / 1000);
        }
@@ -801,14 +813,19 @@ static int pxafb_smart_thread(void *arg)
 
 static int pxafb_smart_init(struct pxafb_info *fbi)
 {
-       if (!(fbi->lccr0 | LCCR0_LCDT))
+       if (!(fbi->lccr0 & LCCR0_LCDT))
                return 0;
 
+       fbi->smart_cmds = (uint16_t *) fbi->dma_buff->cmd_buff;
+       fbi->n_smart_cmds = 0;
+
+       init_completion(&fbi->command_done);
+       init_completion(&fbi->refresh_done);
+
        fbi->smart_thread = kthread_run(pxafb_smart_thread, fbi,
                                        "lcd_refresh");
        if (IS_ERR(fbi->smart_thread)) {
-               printk(KERN_ERR "%s: unable to create kernel thread\n",
-                               __func__);
+               pr_err("%s: unable to create kernel thread\n", __func__);
                return PTR_ERR(fbi->smart_thread);
        }
 
@@ -824,7 +841,9 @@ int pxafb_smart_flush(struct fb_info *info)
 {
        return 0;
 }
-#endif /* CONFIG_FB_SMART_PANEL */
+
+static inline int pxafb_smart_init(struct pxafb_info *fbi) { return 0; }
+#endif /* CONFIG_FB_PXA_SMARTPANEL */
 
 static void setup_parallel_timing(struct pxafb_info *fbi,
                                  struct fb_var_screeninfo *var)
@@ -986,57 +1005,6 @@ static inline void __pxafb_lcd_power(struct pxafb_info *fbi, int on)
                fbi->lcd_power(on, &fbi->fb.var);
 }
 
-static void pxafb_setup_gpio(struct pxafb_info *fbi)
-{
-       int gpio, ldd_bits;
-       unsigned int lccr0 = fbi->lccr0;
-
-       /*
-        * setup is based on type of panel supported
-        */
-
-       /* 4 bit interface */
-       if ((lccr0 & LCCR0_CMS) == LCCR0_Mono &&
-           (lccr0 & LCCR0_SDS) == LCCR0_Sngl &&
-           (lccr0 & LCCR0_DPD) == LCCR0_4PixMono)
-               ldd_bits = 4;
-
-       /* 8 bit interface */
-       else if (((lccr0 & LCCR0_CMS) == LCCR0_Mono &&
-                 ((lccr0 & LCCR0_SDS) == LCCR0_Dual ||
-                  (lccr0 & LCCR0_DPD) == LCCR0_8PixMono)) ||
-                ((lccr0 & LCCR0_CMS) == LCCR0_Color &&
-                 (lccr0 & LCCR0_PAS) == LCCR0_Pas &&
-                 (lccr0 & LCCR0_SDS) == LCCR0_Sngl))
-               ldd_bits = 8;
-
-       /* 16 bit interface */
-       else if ((lccr0 & LCCR0_CMS) == LCCR0_Color &&
-                ((lccr0 & LCCR0_SDS) == LCCR0_Dual ||
-                 (lccr0 & LCCR0_PAS) == LCCR0_Act))
-               ldd_bits = 16;
-
-       else {
-               printk(KERN_ERR "pxafb_setup_gpio: unable to determine "
-                              "bits per pixel\n");
-               return;
-       }
-
-       for (gpio = 58; ldd_bits; gpio++, ldd_bits--)
-               pxa_gpio_mode(gpio | GPIO_ALT_FN_2_OUT);
-       /* 18 bit interface */
-       if (fbi->fb.var.bits_per_pixel > 16) {
-               pxa_gpio_mode(86 | GPIO_ALT_FN_2_OUT);
-               pxa_gpio_mode(87 | GPIO_ALT_FN_2_OUT);
-       }
-       pxa_gpio_mode(GPIO74_LCD_FCLK_MD);
-       pxa_gpio_mode(GPIO75_LCD_LCLK_MD);
-       pxa_gpio_mode(GPIO76_LCD_PCLK_MD);
-
-       if ((lccr0 & LCCR0_PAS) == 0)
-               pxa_gpio_mode(GPIO77_LCD_ACBIAS_MD);
-}
-
 static void pxafb_enable_controller(struct pxafb_info *fbi)
 {
        pr_debug("pxafb: Enabling LCD controller\n");
@@ -1179,7 +1147,6 @@ static void set_ctrlr_state(struct pxafb_info *fbi, u_int state)
                if (old_state == C_ENABLE) {
                        __pxafb_lcd_power(fbi, 0);
                        pxafb_disable_controller(fbi);
-                       pxafb_setup_gpio(fbi);
                        pxafb_enable_controller(fbi);
                        __pxafb_lcd_power(fbi, 1);
                }
@@ -1202,7 +1169,6 @@ static void set_ctrlr_state(struct pxafb_info *fbi, u_int state)
                 */
                if (old_state != C_ENABLE) {
                        fbi->state = C_ENABLE;
-                       pxafb_setup_gpio(fbi);
                        pxafb_enable_controller(fbi);
                        __pxafb_lcd_power(fbi, 1);
                        __pxafb_backlight_power(fbi, 1);
@@ -1340,11 +1306,6 @@ static int __devinit pxafb_map_video_memory(struct pxafb_info *fbi)
                fbi->palette_cpu = (u16 *) fbi->dma_buff->palette;
 
                pr_debug("pxafb: palette_mem_size = 0x%08x\n", fbi->palette_size*sizeof(u16));
-
-#ifdef CONFIG_FB_PXA_SMARTPANEL
-               fbi->smart_cmds = (uint16_t *) fbi->dma_buff->cmd_buff;
-               fbi->n_smart_cmds = 0;
-#endif
        }
 
        return fbi->map_cpu ? 0 : -ENOMEM;
@@ -1466,10 +1427,6 @@ static struct pxafb_info * __devinit pxafb_init_fbinfo(struct device *dev)
        INIT_WORK(&fbi->task, pxafb_task);
        mutex_init(&fbi->ctrlr_lock);
        init_completion(&fbi->disable_done);
-#ifdef CONFIG_FB_PXA_SMARTPANEL
-       init_completion(&fbi->command_done);
-       init_completion(&fbi->refresh_done);
-#endif
 
        return fbi;
 }
@@ -1801,13 +1758,12 @@ static int __devinit pxafb_probe(struct platform_device *dev)
                goto failed_free_mem;
        }
 
-#ifdef CONFIG_FB_PXA_SMARTPANEL
        ret = pxafb_smart_init(fbi);
        if (ret) {
                dev_err(&dev->dev, "failed to initialize smartpanel\n");
                goto failed_free_irq;
        }
-#endif
+
        /*
         * This makes sure that our colour bitfield
         * descriptors are correctly initialised.