2009-03-24 02:29:29 +03:00
/*
* Hardware definitions for Palm Tungsten | E2
*
* Author :
* Carlos Eduardo Medaglia Dyonisio < cadu @ nerdfeliz . com >
*
* Rewrite for mainline :
* Marek Vasut < marek . vasut @ gmail . com >
*
* 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>
2009-03-24 23:23:39 +03:00
# include <linux/pda_power.h>
2015-10-05 11:49:51 +03:00
# include <linux/pwm.h>
2009-03-24 02:29:29 +03:00
# include <linux/pwm_backlight.h>
# include <linux/gpio.h>
2010-06-04 05:07:33 +04:00
# include <linux/wm97xx.h>
2009-03-24 23:23:39 +03:00
# include <linux/power_supply.h>
2009-04-23 13:12:37 +04:00
# include <linux/usb/gpio_vbus.h>
2009-03-24 02:29:29 +03:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include <asm/mach/map.h>
2015-01-30 12:45:33 +03:00
# include "pxa25x.h"
2009-03-24 02:29:29 +03:00
# include <mach/audio.h>
2015-01-30 12:45:33 +03:00
# include "palmte2.h"
2012-08-24 17:16:48 +04:00
# include <linux/platform_data/mmc-pxamci.h>
# include <linux/platform_data/video-pxafb.h>
# include <linux/platform_data/irda-pxaficp.h>
2015-01-30 12:45:33 +03:00
# include "udc.h"
2012-08-24 17:16:48 +04:00
# include <linux/platform_data/asoc-palm27x.h>
2009-03-24 02:29:29 +03:00
# include "generic.h"
# include "devices.h"
/******************************************************************************
* Pin configuration
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static unsigned long palmte2_pin_config [ ] __initdata = {
/* MMC */
GPIO6_MMC_CLK ,
GPIO8_MMC_CS0 ,
GPIO10_GPIO , /* SD detect */
GPIO55_GPIO , /* SD power */
GPIO51_GPIO , /* SD r/o switch */
/* AC97 */
GPIO28_AC97_BITCLK ,
GPIO29_AC97_SDATA_IN_0 ,
GPIO30_AC97_SDATA_OUT ,
GPIO31_AC97_SYNC ,
/* PWM */
GPIO16_PWM0_OUT ,
2009-03-24 23:23:39 +03:00
/* USB */
GPIO15_GPIO , /* usb detect */
GPIO53_GPIO , /* usb power */
/* IrDA */
GPIO48_GPIO , /* ir disable */
GPIO46_FICP_RXD ,
GPIO47_FICP_TXD ,
2009-03-24 02:29:29 +03:00
/* LCD */
2010-01-04 06:25:10 +03:00
GPIOxx_LCD_TFT_16BPP ,
2009-03-24 02:29:29 +03:00
/* GPIO KEYS */
GPIO5_GPIO , /* notes */
GPIO7_GPIO , /* tasks */
GPIO11_GPIO , /* calendar */
GPIO13_GPIO , /* contacts */
GPIO14_GPIO , /* center */
GPIO19_GPIO , /* left */
GPIO20_GPIO , /* right */
GPIO21_GPIO , /* down */
GPIO22_GPIO , /* up */
/* MISC */
GPIO1_RST , /* reset */
2009-03-24 23:23:39 +03:00
GPIO4_GPIO , /* Hotsync button */
GPIO9_GPIO , /* power detect */
2009-04-23 13:27:11 +04:00
GPIO15_GPIO , /* earphone detect */
2009-03-24 23:23:39 +03:00
GPIO37_GPIO , /* LCD power */
GPIO56_GPIO , /* Backlight power */
2009-03-24 02:29:29 +03:00
} ;
/******************************************************************************
* SD / MMC card controller
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct pxamci_platform_data palmte2_mci_platform_data = {
2009-07-07 00:16:42 +04:00
. ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34 ,
. gpio_card_detect = GPIO_NR_PALMTE2_SD_DETECT_N ,
. gpio_card_ro = GPIO_NR_PALMTE2_SD_READONLY ,
. gpio_power = GPIO_NR_PALMTE2_SD_POWER ,
2009-03-24 02:29:29 +03:00
} ;
2012-04-30 20:05:28 +04:00
# if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
2009-03-24 02:29:29 +03:00
/******************************************************************************
* GPIO keys
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct gpio_keys_button palmte2_pxa_buttons [ ] = {
{ KEY_F1 , GPIO_NR_PALMTE2_KEY_CONTACTS , 1 , " Contacts " } ,
{ KEY_F2 , GPIO_NR_PALMTE2_KEY_CALENDAR , 1 , " Calendar " } ,
{ KEY_F3 , GPIO_NR_PALMTE2_KEY_TASKS , 1 , " Tasks " } ,
{ KEY_F4 , GPIO_NR_PALMTE2_KEY_NOTES , 1 , " Notes " } ,
{ KEY_ENTER , GPIO_NR_PALMTE2_KEY_CENTER , 1 , " Center " } ,
{ KEY_LEFT , GPIO_NR_PALMTE2_KEY_LEFT , 1 , " Left " } ,
{ KEY_RIGHT , GPIO_NR_PALMTE2_KEY_RIGHT , 1 , " Right " } ,
{ KEY_DOWN , GPIO_NR_PALMTE2_KEY_DOWN , 1 , " Down " } ,
{ KEY_UP , GPIO_NR_PALMTE2_KEY_UP , 1 , " Up " } ,
} ;
static struct gpio_keys_platform_data palmte2_pxa_keys_data = {
. buttons = palmte2_pxa_buttons ,
. nbuttons = ARRAY_SIZE ( palmte2_pxa_buttons ) ,
} ;
static struct platform_device palmte2_pxa_keys = {
. name = " gpio-keys " ,
. id = - 1 ,
. dev = {
. platform_data = & palmte2_pxa_keys_data ,
} ,
} ;
2012-04-30 20:05:28 +04:00
# endif
2009-03-24 02:29:29 +03:00
/******************************************************************************
* Backlight
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2015-10-05 11:49:51 +03:00
static struct pwm_lookup palmte2_pwm_lookup [ ] = {
PWM_LOOKUP ( " pxa25x-pwm.0 " , 0 , " pwm-backlight.0 " , NULL ,
PALMTE2_PERIOD_NS , PWM_POLARITY_NORMAL ) ,
} ;
2011-01-15 19:55:45 +03:00
static struct gpio palmte_bl_gpios [ ] = {
{ GPIO_NR_PALMTE2_BL_POWER , GPIOF_INIT_LOW , " Backlight power " } ,
{ GPIO_NR_PALMTE2_LCD_POWER , GPIOF_INIT_LOW , " LCD power " } ,
} ;
2009-03-24 23:23:39 +03:00
static int palmte2_backlight_init ( struct device * dev )
{
2011-01-15 19:55:45 +03:00
return gpio_request_array ( ARRAY_AND_SIZE ( palmte_bl_gpios ) ) ;
2009-03-24 23:23:39 +03:00
}
2010-01-04 06:42:01 +03:00
static int palmte2_backlight_notify ( struct device * dev , int brightness )
2009-03-24 23:23:39 +03:00
{
gpio_set_value ( GPIO_NR_PALMTE2_BL_POWER , brightness ) ;
gpio_set_value ( GPIO_NR_PALMTE2_LCD_POWER , brightness ) ;
return brightness ;
}
static void palmte2_backlight_exit ( struct device * dev )
{
2011-01-15 19:55:45 +03:00
gpio_free_array ( ARRAY_AND_SIZE ( palmte_bl_gpios ) ) ;
2009-03-24 23:23:39 +03:00
}
2009-03-24 02:29:29 +03:00
static struct platform_pwm_backlight_data palmte2_backlight_data = {
. max_brightness = PALMTE2_MAX_INTENSITY ,
. dft_brightness = PALMTE2_MAX_INTENSITY ,
2013-08-30 14:15:24 +04:00
. enable_gpio = - 1 ,
2009-03-24 23:23:39 +03:00
. init = palmte2_backlight_init ,
. notify = palmte2_backlight_notify ,
. exit = palmte2_backlight_exit ,
2009-03-24 02:29:29 +03:00
} ;
static struct platform_device palmte2_backlight = {
. name = " pwm-backlight " ,
. dev = {
. parent = & pxa25x_device_pwm0 . dev ,
. platform_data = & palmte2_backlight_data ,
} ,
} ;
2009-03-24 23:23:39 +03:00
/******************************************************************************
* IrDA
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct pxaficp_platform_data palmte2_ficp_platform_data = {
2009-07-17 14:50:43 +04:00
. gpio_pwdown = GPIO_NR_PALMTE2_IR_DISABLE ,
. transceiver_cap = IR_SIRMODE | IR_OFF ,
2009-03-24 23:23:39 +03:00
} ;
/******************************************************************************
* UDC
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-04-23 13:12:37 +04:00
static struct gpio_vbus_mach_info palmte2_udc_info = {
2009-03-24 23:23:39 +03:00
. gpio_vbus = GPIO_NR_PALMTE2_USB_DETECT_N ,
. gpio_vbus_inverted = 1 ,
. gpio_pullup = GPIO_NR_PALMTE2_USB_PULLUP ,
2009-04-23 13:12:37 +04:00
} ;
static struct platform_device palmte2_gpio_vbus = {
. name = " gpio-vbus " ,
. id = - 1 ,
. dev = {
. platform_data = & palmte2_udc_info ,
} ,
2009-03-24 23:23:39 +03:00
} ;
/******************************************************************************
* Power supply
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static int power_supply_init ( struct device * dev )
{
int ret ;
ret = gpio_request ( GPIO_NR_PALMTE2_POWER_DETECT , " CABLE_STATE_AC " ) ;
if ( ret )
goto err1 ;
ret = gpio_direction_input ( GPIO_NR_PALMTE2_POWER_DETECT ) ;
if ( ret )
goto err2 ;
return 0 ;
err2 :
gpio_free ( GPIO_NR_PALMTE2_POWER_DETECT ) ;
err1 :
return ret ;
}
static int palmte2_is_ac_online ( void )
{
return gpio_get_value ( GPIO_NR_PALMTE2_POWER_DETECT ) ;
}
static void power_supply_exit ( struct device * dev )
{
gpio_free ( GPIO_NR_PALMTE2_POWER_DETECT ) ;
}
static char * palmte2_supplicants [ ] = {
" main-battery " ,
} ;
static struct pda_power_pdata power_supply_info = {
. init = power_supply_init ,
. is_ac_online = palmte2_is_ac_online ,
. exit = power_supply_exit ,
. supplied_to = palmte2_supplicants ,
. num_supplicants = ARRAY_SIZE ( palmte2_supplicants ) ,
} ;
static struct platform_device power_supply = {
. name = " pda-power " ,
. id = - 1 ,
. dev = {
. platform_data = & power_supply_info ,
} ,
} ;
/******************************************************************************
2010-06-04 05:07:33 +04:00
* WM97xx audio , battery
2009-03-24 23:23:39 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2010-06-04 05:07:33 +04:00
static struct wm97xx_batt_pdata palmte2_batt_pdata = {
2009-03-24 23:23:39 +03:00
. batt_aux = WM97XX_AUX_ID3 ,
. temp_aux = WM97XX_AUX_ID2 ,
. charge_gpio = - 1 ,
. max_voltage = PALMTE2_BAT_MAX_VOLTAGE ,
. min_voltage = PALMTE2_BAT_MIN_VOLTAGE ,
. batt_mult = 1000 ,
. batt_div = 414 ,
. temp_mult = 1 ,
. temp_div = 1 ,
. batt_tech = POWER_SUPPLY_TECHNOLOGY_LIPO ,
. batt_name = " main-batt " ,
} ;
2010-06-04 05:07:33 +04:00
static struct wm97xx_pdata palmte2_wm97xx_pdata = {
. batt_pdata = & palmte2_batt_pdata ,
} ;
static pxa2xx_audio_ops_t palmte2_ac97_pdata = {
. codec_pdata = { & palmte2_wm97xx_pdata , } ,
} ;
2009-04-23 13:27:11 +04:00
static struct palm27x_asoc_info palmte2_asoc_pdata = {
. jack_gpio = GPIO_NR_PALMTE2_EARPHONE_DETECT ,
} ;
static struct platform_device palmte2_asoc = {
. name = " palm27x-asoc " ,
. id = - 1 ,
. dev = {
. platform_data = & palmte2_asoc_pdata ,
} ,
} ;
2009-03-24 02:29:29 +03:00
/******************************************************************************
* Framebuffer
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct pxafb_mode_info palmte2_lcd_modes [ ] = {
{
. pixclock = 77757 ,
. xres = 320 ,
. yres = 320 ,
. bpp = 16 ,
. left_margin = 28 ,
. right_margin = 7 ,
. upper_margin = 7 ,
. lower_margin = 5 ,
. hsync_len = 4 ,
. vsync_len = 1 ,
} ,
} ;
static struct pxafb_mach_info palmte2_lcd_screen = {
. modes = palmte2_lcd_modes ,
. num_modes = ARRAY_SIZE ( palmte2_lcd_modes ) ,
. lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL ,
} ;
/******************************************************************************
* Machine init
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct platform_device * devices [ ] __initdata = {
# if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
& palmte2_pxa_keys ,
# endif
& palmte2_backlight ,
2009-03-24 23:23:39 +03:00
& power_supply ,
2009-04-23 13:27:11 +04:00
& palmte2_asoc ,
2009-04-23 13:12:37 +04:00
& palmte2_gpio_vbus ,
2009-03-24 02:29:29 +03:00
} ;
2009-03-24 23:23:39 +03:00
/* setup udc GPIOs initial state */
static void __init palmte2_udc_init ( void )
{
if ( ! gpio_request ( GPIO_NR_PALMTE2_USB_PULLUP , " UDC Vbus " ) ) {
gpio_direction_output ( GPIO_NR_PALMTE2_USB_PULLUP , 1 ) ;
gpio_free ( GPIO_NR_PALMTE2_USB_PULLUP ) ;
}
}
2009-03-24 02:29:29 +03:00
static void __init palmte2_init ( void )
{
pxa2xx_mfp_config ( ARRAY_AND_SIZE ( palmte2_pin_config ) ) ;
2009-11-09 08:34:08 +03:00
pxa_set_ffuart_info ( NULL ) ;
pxa_set_btuart_info ( NULL ) ;
pxa_set_stuart_info ( NULL ) ;
2011-02-15 10:37:30 +03:00
pxa_set_fb_info ( NULL , & palmte2_lcd_screen ) ;
2009-03-24 02:29:29 +03:00
pxa_set_mci_info ( & palmte2_mci_platform_data ) ;
2009-03-24 23:23:39 +03:00
palmte2_udc_init ( ) ;
2010-06-04 05:07:33 +04:00
pxa_set_ac97_info ( & palmte2_ac97_pdata ) ;
2009-03-24 23:23:39 +03:00
pxa_set_ficp_info ( & palmte2_ficp_platform_data ) ;
2009-03-24 02:29:29 +03:00
2015-10-05 11:49:51 +03:00
pwm_add_table ( palmte2_pwm_lookup , ARRAY_SIZE ( palmte2_pwm_lookup ) ) ;
2009-03-24 02:29:29 +03:00
platform_add_devices ( devices , ARRAY_SIZE ( devices ) ) ;
}
MACHINE_START ( PALMTE2 , " Palm Tungsten|E2 " )
2011-07-06 06:38:15 +04:00
. atag_offset = 0x100 ,
2010-10-11 04:20:19 +04:00
. map_io = pxa25x_map_io ,
2012-01-04 02:53:48 +04:00
. nr_irqs = PXA_NR_IRQS ,
2009-03-24 02:29:29 +03:00
. init_irq = pxa25x_init_irq ,
2011-05-18 17:30:04 +04:00
. handle_irq = pxa25x_handle_irq ,
2012-11-08 23:40:59 +04:00
. init_time = pxa_timer_init ,
2011-11-04 18:15:53 +04:00
. init_machine = palmte2_init ,
. restart = pxa_restart ,
2009-03-24 02:29:29 +03:00
MACHINE_END