2008-11-20 22:50:46 +01:00
/*
* Hardware definitions for Palm LifeDrive
*
* Author : Marek Vasut < marek . vasut @ gmail . com >
*
* Based on work of :
* Alex Osborne < ato @ meshy . org >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*
* ( find more info at www . hackndev . com )
*
*/
# include <linux/platform_device.h>
# include <linux/delay.h>
# include <linux/irq.h>
# include <linux/gpio_keys.h>
# include <linux/input.h>
# include <linux/pda_power.h>
# include <linux/pwm_backlight.h>
# include <linux/gpio.h>
2010-06-04 03:07:33 +02:00
# include <linux/wm97xx.h>
2008-11-20 22:50:46 +01:00
# include <linux/power_supply.h>
2009-07-17 19:46:58 +02:00
# include <linux/mtd/mtd.h>
# include <linux/mtd/partitions.h>
# include <linux/mtd/physmap.h>
2008-11-20 22:50:46 +01:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include <asm/mach/map.h>
2009-01-02 23:17:22 +08:00
# include <mach/pxa27x.h>
2008-11-20 22:50:46 +01:00
# include <mach/audio.h>
# include <mach/palmld.h>
# include <mach/mmc.h>
# include <mach/pxafb.h>
# include <mach/irda.h>
2010-09-03 18:28:06 -04:00
# include <plat/pxa27x_keypad.h>
2008-11-20 22:50:46 +01:00
# include <mach/palmasoc.h>
2010-07-13 08:16:45 +02:00
# include <mach/palm27x.h>
2008-11-20 22:50:46 +01:00
# include "generic.h"
# include "devices.h"
/******************************************************************************
* Pin configuration
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static unsigned long palmld_pin_config [ ] __initdata = {
/* MMC */
GPIO32_MMC_CLK ,
GPIO92_MMC_DAT_0 ,
GPIO109_MMC_DAT_1 ,
GPIO110_MMC_DAT_2 ,
GPIO111_MMC_DAT_3 ,
GPIO112_MMC_CMD ,
GPIO14_GPIO , /* SD detect */
GPIO114_GPIO , /* SD power */
GPIO116_GPIO , /* SD r/o switch */
/* AC97 */
GPIO28_AC97_BITCLK ,
GPIO29_AC97_SDATA_IN_0 ,
GPIO30_AC97_SDATA_OUT ,
GPIO31_AC97_SYNC ,
2009-05-22 01:39:10 +02:00
GPIO89_AC97_SYSCLK ,
GPIO95_AC97_nRESET ,
2008-11-20 22:50:46 +01:00
/* IrDA */
GPIO108_GPIO , /* ir disable */
GPIO46_FICP_RXD ,
GPIO47_FICP_TXD ,
/* MATRIX KEYPAD */
2009-03-28 12:37:42 +01:00
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 ,
2008-11-20 22:50:46 +01:00
GPIO103_KP_MKOUT_0 ,
GPIO104_KP_MKOUT_1 ,
GPIO105_KP_MKOUT_2 ,
/* LCD */
2010-01-04 11:37:14 +08:00
GPIOxx_LCD_TFT_16BPP ,
2008-11-20 22:50:46 +01:00
/* PWM */
GPIO16_PWM0_OUT ,
/* GPIO KEYS */
GPIO10_GPIO , /* hotsync button */
GPIO12_GPIO , /* power switch */
GPIO15_GPIO , /* lock switch */
/* LEDs */
GPIO52_GPIO , /* green led */
GPIO94_GPIO , /* orange led */
/* PCMCIA */
GPIO48_nPOE ,
GPIO49_nPWE ,
GPIO50_nPIOR ,
GPIO51_nPIOW ,
GPIO85_nPCE_1 ,
GPIO54_nPCE_2 ,
GPIO79_PSKTSEL ,
GPIO55_nPREG ,
GPIO56_nPWAIT ,
GPIO57_nIOIS16 ,
GPIO36_GPIO , /* wifi power */
GPIO38_GPIO , /* wifi ready */
GPIO81_GPIO , /* wifi reset */
2009-07-16 19:37:29 +02:00
/* FFUART */
GPIO34_FFUART_RXD ,
GPIO39_FFUART_TXD ,
2008-11-20 22:50:46 +01:00
/* HDD */
2009-05-21 13:11:05 +01:00
GPIO98_GPIO , /* HDD reset */
2008-11-20 22:50:46 +01:00
GPIO115_GPIO , /* HDD power */
/* MISC */
GPIO13_GPIO , /* earphone detect */
} ;
2009-07-17 19:46:58 +02:00
/******************************************************************************
* NOR Flash
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2010-07-13 08:16:45 +02:00
# if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
2009-07-17 19:46:58 +02:00
static struct mtd_partition palmld_partitions [ ] = {
{
. name = " Flash " ,
. offset = 0x00000000 ,
. size = MTDPART_SIZ_FULL ,
. mask_flags = 0
}
} ;
static struct physmap_flash_data palmld_flash_data [ ] = {
{
. width = 2 , /* bankwidth in bytes */
. parts = palmld_partitions ,
. nr_parts = ARRAY_SIZE ( palmld_partitions )
}
} ;
static struct resource palmld_flash_resource = {
. start = PXA_CS0_PHYS ,
. end = PXA_CS0_PHYS + SZ_4M - 1 ,
. flags = IORESOURCE_MEM ,
} ;
static struct platform_device palmld_flash = {
. name = " physmap-flash " ,
. id = 0 ,
. resource = & palmld_flash_resource ,
. num_resources = 1 ,
. dev = {
. platform_data = palmld_flash_data ,
} ,
} ;
2010-07-13 08:16:45 +02:00
static void __init palmld_nor_init ( void )
{
platform_device_register ( & palmld_flash ) ;
}
# else
static inline void palmld_nor_init ( void ) { }
# endif
2008-11-20 22:50:46 +01:00
/******************************************************************************
* GPIO keyboard
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2010-07-13 08:16:45 +02:00
# if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
2008-11-20 22:50:46 +01:00
static unsigned int palmld_matrix_keys [ ] = {
KEY ( 0 , 1 , KEY_F2 ) ,
KEY ( 0 , 2 , KEY_UP ) ,
KEY ( 1 , 0 , KEY_F3 ) ,
KEY ( 1 , 1 , KEY_F4 ) ,
KEY ( 1 , 2 , KEY_RIGHT ) ,
KEY ( 2 , 0 , KEY_F1 ) ,
KEY ( 2 , 1 , KEY_F5 ) ,
KEY ( 2 , 2 , KEY_DOWN ) ,
KEY ( 3 , 0 , KEY_F6 ) ,
KEY ( 3 , 1 , KEY_ENTER ) ,
KEY ( 3 , 2 , KEY_LEFT ) ,
} ;
static struct pxa27x_keypad_platform_data palmld_keypad_platform_data = {
. matrix_key_rows = 4 ,
. matrix_key_cols = 3 ,
. matrix_key_map = palmld_matrix_keys ,
. matrix_key_map_size = ARRAY_SIZE ( palmld_matrix_keys ) ,
. debounce_interval = 30 ,
} ;
2010-07-13 08:16:45 +02:00
static void __init palmld_kpc_init ( void )
{
pxa_set_keypad_info ( & palmld_keypad_platform_data ) ;
}
# else
static inline void palmld_kpc_init ( void ) { }
# endif
2008-11-20 22:50:46 +01:00
/******************************************************************************
* GPIO keys
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2010-07-13 08:16:45 +02:00
# if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
2008-11-20 22:50:46 +01:00
static struct gpio_keys_button palmld_pxa_buttons [ ] = {
{ KEY_F8 , GPIO_NR_PALMLD_HOTSYNC_BUTTON_N , 1 , " HotSync Button " } ,
{ KEY_F9 , GPIO_NR_PALMLD_LOCK_SWITCH , 0 , " Lock Switch " } ,
{ KEY_POWER , GPIO_NR_PALMLD_POWER_SWITCH , 0 , " Power Switch " } ,
} ;
static struct gpio_keys_platform_data palmld_pxa_keys_data = {
. buttons = palmld_pxa_buttons ,
. nbuttons = ARRAY_SIZE ( palmld_pxa_buttons ) ,
} ;
static struct platform_device palmld_pxa_keys = {
. name = " gpio-keys " ,
. id = - 1 ,
. dev = {
. platform_data = & palmld_pxa_keys_data ,
} ,
} ;
2010-07-13 08:16:45 +02:00
static void __init palmld_keys_init ( void )
2008-11-20 22:50:46 +01:00
{
2010-07-13 08:16:45 +02:00
platform_device_register ( & palmld_pxa_keys ) ;
2008-11-20 22:50:46 +01:00
}
2010-07-13 08:16:45 +02:00
# else
static inline void palmld_keys_init ( void ) { }
# endif
2008-11-20 22:50:46 +01:00
/******************************************************************************
* LEDs
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2010-07-13 08:16:45 +02:00
# if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
2008-11-20 22:50:46 +01:00
struct gpio_led gpio_leds [ ] = {
{
. name = " palmld:green:led " ,
. default_trigger = " none " ,
. gpio = GPIO_NR_PALMLD_LED_GREEN ,
} , {
. name = " palmld:amber:led " ,
. default_trigger = " none " ,
. gpio = GPIO_NR_PALMLD_LED_AMBER ,
} ,
} ;
static struct gpio_led_platform_data gpio_led_info = {
. leds = gpio_leds ,
. num_leds = ARRAY_SIZE ( gpio_leds ) ,
} ;
static struct platform_device palmld_leds = {
. name = " leds-gpio " ,
. id = - 1 ,
. dev = {
. platform_data = & gpio_led_info ,
}
} ;
2010-07-13 08:16:45 +02:00
static void __init palmld_leds_init ( void )
2008-11-20 22:50:46 +01:00
{
2010-07-13 08:16:45 +02:00
platform_device_register ( & palmld_leds ) ;
2008-11-20 22:50:46 +01:00
}
2010-07-13 08:16:45 +02:00
# else
static inline void palmld_leds_init ( void ) { }
# endif
2009-04-17 11:37:35 +02:00
2009-05-21 13:11:05 +01:00
/******************************************************************************
* HDD
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2010-07-13 08:16:45 +02:00
# if defined(CONFIG_PATA_PALMLD) || defined(CONFIG_PATA_PALMLD_MODULE)
static struct platform_device palmld_ide_device = {
2009-05-21 13:11:05 +01:00
. name = " pata_palmld " ,
. id = - 1 ,
} ;
2010-07-13 08:16:45 +02:00
static void __init palmld_ide_init ( void )
2009-03-28 12:37:42 +01:00
{
2010-07-13 08:16:45 +02:00
platform_device_register ( & palmld_ide_device ) ;
2009-03-28 12:37:42 +01:00
}
2010-07-13 08:16:45 +02:00
# else
static inline void palmld_ide_init ( void ) { }
# endif
2009-03-28 12:37:42 +01:00
2008-11-20 22:50:46 +01:00
/******************************************************************************
* Machine init
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct map_desc palmld_io_desc [ ] __initdata = {
{
. virtual = PALMLD_IDE_VIRT ,
. pfn = __phys_to_pfn ( PALMLD_IDE_PHYS ) ,
. length = PALMLD_IDE_SIZE ,
. type = MT_DEVICE
} ,
{
. virtual = PALMLD_USB_VIRT ,
. pfn = __phys_to_pfn ( PALMLD_USB_PHYS ) ,
. length = PALMLD_USB_SIZE ,
. type = MT_DEVICE
} ,
} ;
static void __init palmld_map_io ( void )
{
2010-10-11 02:20:19 +02:00
pxa27x_map_io ( ) ;
2008-11-20 22:50:46 +01:00
iotable_init ( palmld_io_desc , ARRAY_SIZE ( palmld_io_desc ) ) ;
}
static void __init palmld_init ( void )
{
pxa2xx_mfp_config ( ARRAY_AND_SIZE ( palmld_pin_config ) ) ;
2009-11-09 13:34:08 +08:00
pxa_set_ffuart_info ( NULL ) ;
pxa_set_btuart_info ( NULL ) ;
pxa_set_stuart_info ( NULL ) ;
2010-07-13 08:16:45 +02:00
palm27x_mmc_init ( GPIO_NR_PALMLD_SD_DETECT_N , GPIO_NR_PALMLD_SD_READONLY ,
GPIO_NR_PALMLD_SD_POWER , 0 ) ;
palm27x_pm_init ( PALMLD_STR_BASE ) ;
palm27x_lcd_init ( - 1 , & palm_320x480_lcd_mode ) ;
palm27x_irda_init ( GPIO_NR_PALMLD_IR_DISABLE ) ;
palm27x_ac97_init ( PALMLD_BAT_MIN_VOLTAGE , PALMLD_BAT_MAX_VOLTAGE ,
GPIO_NR_PALMLD_EARPHONE_DETECT , 95 ) ;
palm27x_pwm_init ( GPIO_NR_PALMLD_BL_POWER , GPIO_NR_PALMLD_LCD_POWER ) ;
palm27x_power_init ( GPIO_NR_PALMLD_POWER_DETECT ,
GPIO_NR_PALMLD_USB_DETECT_N ) ;
palm27x_pmic_init ( ) ;
palmld_kpc_init ( ) ;
palmld_keys_init ( ) ;
palmld_nor_init ( ) ;
palmld_leds_init ( ) ;
palmld_ide_init ( ) ;
2008-11-20 22:50:46 +01:00
}
MACHINE_START ( PALMLD , " Palm LifeDrive " )
. boot_params = 0xa0000100 ,
. map_io = palmld_map_io ,
. init_irq = pxa27x_init_irq ,
2011-05-18 21:30:04 +08:00
. handle_irq = pxa27x_handle_irq ,
2008-11-20 22:50:46 +01:00
. timer = & pxa_timer ,
. init_machine = palmld_init
MACHINE_END