Merge branch 'for-rmk' of git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6 into devel
Conflicts: arch/arm/mach-pxa/am200epd.c arch/arm/mach-pxa/ezx.c
This commit is contained in:
commit
40321fd21c
@ -27,15 +27,26 @@ endmenu
|
||||
endif
|
||||
|
||||
config ARCH_GUMSTIX
|
||||
bool "Gumstix XScale boards"
|
||||
help
|
||||
Say Y here if you intend to run this kernel on a
|
||||
Gumstix Full Function Minature Computer.
|
||||
|
||||
config MACH_GUMSTIX_F
|
||||
bool "Basix, Connex, ws-200ax, ws-400ax systems"
|
||||
depends on ARCH_GUMSTIX
|
||||
bool "Gumstix XScale 255 boards"
|
||||
select PXA25x
|
||||
help
|
||||
Say Y here if you intend to run this kernel on
|
||||
Basix, Connex, ws-200ax, ws-400ax systems
|
||||
|
||||
choice
|
||||
prompt "Gumstix Carrier/Expansion Board"
|
||||
depends on ARCH_GUMSTIX
|
||||
|
||||
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
|
||||
|
@ -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
|
||||
|
@ -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");
|
||||
|
@ -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,
|
||||
};
|
||||
|
@ -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,
|
||||
};
|
||||
|
@ -16,12 +16,14 @@
|
||||
#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,
|
||||
};
|
||||
|
||||
static void __init ezx_init(void)
|
||||
#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 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);
|
||||
|
||||
set_pxa_fb_info(&ezx_fb_info_1);
|
||||
|
||||
pxa_set_keypad_info(&a780_keypad_platform_data);
|
||||
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
#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
|
||||
|
@ -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")
|
||||
|
575
arch/arm/mach-pxa/imote2.c
Normal file
575
arch/arm/mach-pxa/imote2.c
Normal file
@ -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
|
@ -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);
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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 */
|
||||
|
@ -177,4 +177,11 @@
|
||||
|
||||
#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 */
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -23,6 +23,10 @@
|
||||
#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();
|
||||
|
@ -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,
|
||||
};
|
||||
|
||||
|
@ -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
|
||||
|
@ -17,19 +17,44 @@
|
||||
#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)")
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user