2008-12-10 17:36:54 -08:00
/*
* board - omap3pandora . c ( Pandora Handheld Console )
*
* 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 .
*
* This program is distributed in the hope that it will be useful , but
* WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin St , Fifth Floor , Boston , MA
* 02110 - 1301 USA
*
*/
# include <linux/init.h>
# include <linux/kernel.h>
# include <linux/platform_device.h>
# include <linux/spi/spi.h>
2009-05-28 14:04:04 -07:00
# include <linux/regulator/machine.h>
2009-12-13 20:05:51 +01:00
# include <linux/i2c/twl.h>
2010-09-16 13:16:02 +02:00
# include <linux/wl12xx.h>
2010-08-02 13:18:01 +03:00
# include <linux/mtd/partitions.h>
# include <linux/mtd/nand.h>
2009-05-28 14:15:44 -07:00
# include <linux/leds.h>
# include <linux/input.h>
2009-10-22 14:43:17 -07:00
# include <linux/input/matrix_keypad.h>
2011-05-31 20:55:44 +08:00
# include <linux/gpio.h>
2009-05-28 14:15:44 -07:00
# include <linux/gpio_keys.h>
2010-09-15 14:49:23 +00:00
# include <linux/mmc/host.h>
2010-08-10 18:01:52 -07:00
# include <linux/mmc/card.h>
2010-10-01 16:35:25 -07:00
# include <linux/regulator/fixed.h>
2012-08-24 15:21:06 +02:00
# include <linux/platform_data/spi-omap2-mcspi.h>
2008-12-10 17:36:54 -08:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include <asm/mach/map.h>
2011-11-10 22:45:17 +01:00
# include "common.h"
2011-05-11 14:05:07 +03:00
# include <video/omapdss.h>
2012-08-24 15:21:06 +02:00
# include <linux/platform_data/mtd-nand-omap2.h>
2008-12-10 17:36:54 -08:00
2009-12-11 16:16:32 -08:00
# include "mux.h"
2009-05-28 14:03:59 -07:00
# include "sdram-micron-mt46h32m32lf-6.h"
2010-02-15 10:03:34 -08:00
# include "hsmmc.h"
2011-04-25 01:09:05 +03:00
# include "common-board-devices.h"
2012-09-29 12:26:13 +05:30
# include "gpmc-nand.h"
2008-12-10 17:37:17 -08:00
2010-08-02 13:18:01 +03:00
# define PANDORA_WIFI_IRQ_GPIO 21
# define PANDORA_WIFI_NRESET_GPIO 23
2008-12-10 17:36:54 -08:00
# define OMAP3_PANDORA_TS_GPIO 94
2010-08-02 13:18:01 +03:00
static struct mtd_partition omap3pandora_nand_partitions [ ] = {
{
. name = " xloader " ,
. offset = 0 ,
. size = 4 * NAND_BLOCK_SIZE ,
. mask_flags = MTD_WRITEABLE
} , {
. name = " uboot " ,
. offset = MTDPART_OFS_APPEND ,
. size = 15 * NAND_BLOCK_SIZE ,
} , {
. name = " uboot-env " ,
. offset = MTDPART_OFS_APPEND ,
. size = 1 * NAND_BLOCK_SIZE ,
} , {
. name = " boot " ,
. offset = MTDPART_OFS_APPEND ,
. size = 80 * NAND_BLOCK_SIZE ,
} , {
. name = " rootfs " ,
. offset = MTDPART_OFS_APPEND ,
. size = MTDPART_SIZ_FULL ,
} ,
} ;
static struct omap_nand_platform_data pandora_nand_data = {
. cs = 0 ,
2011-06-03 20:24:03 +00:00
. devsize = NAND_BUSWIDTH_16 ,
. xfer_type = NAND_OMAP_PREFETCH_DMA ,
2010-08-02 13:18:01 +03:00
. parts = omap3pandora_nand_partitions ,
. nr_parts = ARRAY_SIZE ( omap3pandora_nand_partitions ) ,
} ;
2009-05-28 14:15:44 -07:00
static struct gpio_led pandora_gpio_leds [ ] = {
{
. name = " pandora::sd1 " ,
. default_trigger = " mmc0 " ,
. gpio = 128 ,
} , {
. name = " pandora::sd2 " ,
. default_trigger = " mmc1 " ,
. gpio = 129 ,
} , {
. name = " pandora::bluetooth " ,
. gpio = 158 ,
} , {
. name = " pandora::wifi " ,
. gpio = 159 ,
} ,
} ;
static struct gpio_led_platform_data pandora_gpio_led_data = {
. leds = pandora_gpio_leds ,
. num_leds = ARRAY_SIZE ( pandora_gpio_leds ) ,
} ;
static struct platform_device pandora_leds_gpio = {
. name = " leds-gpio " ,
. id = - 1 ,
. dev = {
. platform_data = & pandora_gpio_led_data ,
} ,
} ;
2012-03-05 11:08:37 -08:00
static struct platform_device pandora_backlight = {
. name = " pandora-backlight " ,
. id = - 1 ,
} ;
2009-05-28 14:15:44 -07:00
# define GPIO_BUTTON(gpio_num, ev_type, ev_code, act_low, descr) \
{ \
. gpio = gpio_num , \
. type = ev_type , \
. code = ev_code , \
. active_low = act_low , \
2010-08-02 13:18:01 +03:00
. debounce_interval = 4 , \
2009-05-28 14:15:44 -07:00
. desc = " btn " descr , \
}
# define GPIO_BUTTON_LOW(gpio_num, event_code, description) \
GPIO_BUTTON ( gpio_num , EV_KEY , event_code , 1 , description )
static struct gpio_keys_button pandora_gpio_keys [ ] = {
GPIO_BUTTON_LOW ( 110 , KEY_UP , " up " ) ,
GPIO_BUTTON_LOW ( 103 , KEY_DOWN , " down " ) ,
GPIO_BUTTON_LOW ( 96 , KEY_LEFT , " left " ) ,
GPIO_BUTTON_LOW ( 98 , KEY_RIGHT , " right " ) ,
2010-08-02 13:18:01 +03:00
GPIO_BUTTON_LOW ( 109 , KEY_PAGEUP , " game 1 " ) ,
GPIO_BUTTON_LOW ( 111 , KEY_END , " game 2 " ) ,
GPIO_BUTTON_LOW ( 106 , KEY_PAGEDOWN , " game 3 " ) ,
GPIO_BUTTON_LOW ( 101 , KEY_HOME , " game 4 " ) ,
GPIO_BUTTON_LOW ( 102 , KEY_RIGHTSHIFT , " l " ) ,
GPIO_BUTTON_LOW ( 97 , KEY_KPPLUS , " l2 " ) ,
GPIO_BUTTON_LOW ( 105 , KEY_RIGHTCTRL , " r " ) ,
GPIO_BUTTON_LOW ( 107 , KEY_KPMINUS , " r2 " ) ,
2009-05-28 14:15:44 -07:00
GPIO_BUTTON_LOW ( 104 , KEY_LEFTCTRL , " ctrl " ) ,
GPIO_BUTTON_LOW ( 99 , KEY_MENU , " menu " ) ,
GPIO_BUTTON_LOW ( 176 , KEY_COFFEE , " hold " ) ,
GPIO_BUTTON ( 100 , EV_KEY , KEY_LEFTALT , 0 , " alt " ) ,
GPIO_BUTTON ( 108 , EV_SW , SW_LID , 1 , " lid " ) ,
} ;
static struct gpio_keys_platform_data pandora_gpio_key_info = {
. buttons = pandora_gpio_keys ,
. nbuttons = ARRAY_SIZE ( pandora_gpio_keys ) ,
} ;
static struct platform_device pandora_keys_gpio = {
. name = " gpio-keys " ,
. id = - 1 ,
. dev = {
. platform_data = & pandora_gpio_key_info ,
} ,
} ;
2010-08-02 13:18:01 +03:00
static const uint32_t board_keymap [ ] = {
2009-11-11 11:00:35 -08:00
/* row, col, code */
2009-05-28 14:15:44 -07:00
KEY ( 0 , 0 , KEY_9 ) ,
2009-11-11 11:00:35 -08:00
KEY ( 0 , 1 , KEY_8 ) ,
KEY ( 0 , 2 , KEY_I ) ,
KEY ( 0 , 3 , KEY_J ) ,
KEY ( 0 , 4 , KEY_N ) ,
KEY ( 0 , 5 , KEY_M ) ,
KEY ( 1 , 0 , KEY_0 ) ,
2009-05-28 14:15:44 -07:00
KEY ( 1 , 1 , KEY_7 ) ,
2009-11-11 11:00:35 -08:00
KEY ( 1 , 2 , KEY_U ) ,
KEY ( 1 , 3 , KEY_H ) ,
KEY ( 1 , 4 , KEY_B ) ,
KEY ( 1 , 5 , KEY_SPACE ) ,
KEY ( 2 , 0 , KEY_BACKSPACE ) ,
KEY ( 2 , 1 , KEY_6 ) ,
2009-05-28 14:15:44 -07:00
KEY ( 2 , 2 , KEY_Y ) ,
2009-11-11 11:00:35 -08:00
KEY ( 2 , 3 , KEY_G ) ,
KEY ( 2 , 4 , KEY_V ) ,
KEY ( 2 , 5 , KEY_FN ) ,
KEY ( 3 , 0 , KEY_O ) ,
KEY ( 3 , 1 , KEY_5 ) ,
KEY ( 3 , 2 , KEY_T ) ,
2009-05-28 14:15:44 -07:00
KEY ( 3 , 3 , KEY_F ) ,
2009-11-11 11:00:35 -08:00
KEY ( 3 , 4 , KEY_C ) ,
KEY ( 4 , 0 , KEY_P ) ,
KEY ( 4 , 1 , KEY_4 ) ,
KEY ( 4 , 2 , KEY_R ) ,
KEY ( 4 , 3 , KEY_D ) ,
2009-05-28 14:15:44 -07:00
KEY ( 4 , 4 , KEY_X ) ,
2009-11-11 11:00:35 -08:00
KEY ( 5 , 0 , KEY_K ) ,
KEY ( 5 , 1 , KEY_3 ) ,
KEY ( 5 , 2 , KEY_E ) ,
KEY ( 5 , 3 , KEY_S ) ,
KEY ( 5 , 4 , KEY_Z ) ,
KEY ( 6 , 0 , KEY_L ) ,
KEY ( 6 , 1 , KEY_2 ) ,
KEY ( 6 , 2 , KEY_W ) ,
KEY ( 6 , 3 , KEY_A ) ,
KEY ( 6 , 4 , KEY_DOT ) ,
KEY ( 7 , 0 , KEY_ENTER ) ,
KEY ( 7 , 1 , KEY_1 ) ,
KEY ( 7 , 2 , KEY_Q ) ,
KEY ( 7 , 3 , KEY_LEFTSHIFT ) ,
KEY ( 7 , 4 , KEY_COMMA ) ,
2009-05-28 14:15:44 -07:00
} ;
2009-09-24 16:23:16 -07:00
static struct matrix_keymap_data board_map_data = {
. keymap = board_keymap ,
. keymap_size = ARRAY_SIZE ( board_keymap ) ,
} ;
2009-05-28 14:15:44 -07:00
static struct twl4030_keypad_data pandora_kp_data = {
2009-09-24 16:23:16 -07:00
. keymap_data = & board_map_data ,
2009-05-28 14:15:44 -07:00
. rows = 8 ,
. cols = 6 ,
. rep = 1 ,
} ;
2010-02-17 14:09:24 -08:00
static struct omap_dss_device pandora_lcd_device = {
. name = " lcd " ,
. driver_name = " tpo_td043mtea1_panel " ,
. type = OMAP_DISPLAY_TYPE_DPI ,
. phy . dpi . data_lines = 24 ,
. reset_gpio = 157 ,
} ;
static struct omap_dss_device pandora_tv_device = {
. name = " tv " ,
. driver_name = " venc " ,
. type = OMAP_DISPLAY_TYPE_VENC ,
. phy . venc . type = OMAP_DSS_VENC_TYPE_SVIDEO ,
} ;
static struct omap_dss_device * pandora_dss_devices [ ] = {
& pandora_lcd_device ,
& pandora_tv_device ,
} ;
static struct omap_dss_board_info pandora_dss_data = {
. num_devices = ARRAY_SIZE ( pandora_dss_devices ) ,
. devices = pandora_dss_devices ,
. default_device = & pandora_lcd_device ,
} ;
2010-08-10 18:01:52 -07:00
static void pandora_wl1251_init_card ( struct mmc_card * card )
{
/*
* We have TI wl1251 attached to MMC3 . Pass this information to
* SDIO core because it can ' t be probed by normal methods .
*/
card - > quirks | = MMC_QUIRK_NONSTD_SDIO ;
card - > cccr . wide_bus = 1 ;
card - > cis . vendor = 0x104c ;
card - > cis . device = 0x9066 ;
card - > cis . blksize = 512 ;
card - > cis . max_dtr = 20000000 ;
}
2010-02-15 10:03:34 -08:00
static struct omap2_hsmmc_info omap3pandora_mmc [ ] = {
2008-12-10 17:37:17 -08:00
{
. mmc = 1 ,
2010-09-15 14:49:23 +00:00
. caps = MMC_CAP_4_BIT_DATA ,
2008-12-10 17:37:17 -08:00
. gpio_cd = - EINVAL ,
. gpio_wp = 126 ,
. ext_clock = 0 ,
2012-02-20 09:43:29 -08:00
. deferred = true ,
2008-12-10 17:37:17 -08:00
} ,
{
. mmc = 2 ,
2010-09-15 14:49:23 +00:00
. caps = MMC_CAP_4_BIT_DATA ,
2008-12-10 17:37:17 -08:00
. gpio_cd = - EINVAL ,
. gpio_wp = 127 ,
. ext_clock = 1 ,
2009-03-23 18:23:47 -07:00
. transceiver = true ,
2012-02-20 09:43:29 -08:00
. deferred = true ,
2008-12-10 17:37:17 -08:00
} ,
2009-03-23 18:23:47 -07:00
{
. mmc = 3 ,
2010-12-19 22:33:36 +00:00
. caps = MMC_CAP_4_BIT_DATA | MMC_CAP_POWER_OFF_CARD ,
2009-03-23 18:23:47 -07:00
. gpio_cd = - EINVAL ,
. gpio_wp = - EINVAL ,
2010-08-10 18:01:52 -07:00
. init_card = pandora_wl1251_init_card ,
2009-03-23 18:23:47 -07:00
} ,
2008-12-10 17:37:17 -08:00
{ } /* Terminator */
} ;
static int omap3pandora_twl_gpio_setup ( struct device * dev ,
unsigned gpio , unsigned ngpio )
{
2010-08-02 13:18:01 +03:00
int ret , gpio_32khz ;
2008-12-10 17:37:17 -08:00
/* gpio + {0,1} is "mmc{0,1}_cd" (input/IRQ) */
omap3pandora_mmc [ 0 ] . gpio_cd = gpio + 0 ;
omap3pandora_mmc [ 1 ] . gpio_cd = gpio + 1 ;
2012-02-20 09:43:29 -08:00
omap_hsmmc_late_init ( omap3pandora_mmc ) ;
2008-12-10 17:37:17 -08:00
2010-08-02 13:18:01 +03:00
/* gpio + 13 drives 32kHz buffer for wifi module */
gpio_32khz = gpio + 13 ;
2011-05-03 18:22:09 +03:00
ret = gpio_request_one ( gpio_32khz , GPIOF_OUT_INIT_HIGH , " wifi 32kHz " ) ;
2010-08-02 13:18:01 +03:00
if ( ret < 0 ) {
pr_err ( " Cannot get GPIO line %d, ret=%d \n " , gpio_32khz , ret ) ;
2011-05-03 18:22:09 +03:00
return - ENODEV ;
2010-08-02 13:18:01 +03:00
}
2008-12-10 17:37:17 -08:00
return 0 ;
}
2008-12-10 17:36:54 -08:00
static struct twl4030_gpio_platform_data omap3pandora_gpio_data = {
2008-12-10 17:37:17 -08:00
. setup = omap3pandora_twl_gpio_setup ,
2008-12-10 17:36:54 -08:00
} ;
2011-06-06 18:57:07 +00:00
static struct regulator_consumer_supply pandora_vmmc1_supply [ ] = {
REGULATOR_SUPPLY ( " vmmc " , " omap_hsmmc.0 " ) ,
} ;
2010-02-17 14:09:25 -08:00
2011-06-06 18:57:07 +00:00
static struct regulator_consumer_supply pandora_vmmc2_supply [ ] = {
REGULATOR_SUPPLY ( " vmmc " , " omap_hsmmc.1 " )
} ;
2010-02-17 14:09:25 -08:00
2011-06-06 18:57:07 +00:00
static struct regulator_consumer_supply pandora_vmmc3_supply [ ] = {
REGULATOR_SUPPLY ( " vmmc " , " omap_hsmmc.2 " ) ,
} ;
2010-10-01 16:35:25 -07:00
2010-02-17 14:09:25 -08:00
static struct regulator_consumer_supply pandora_vdds_supplies [ ] = {
REGULATOR_SUPPLY ( " vdds_sdi " , " omapdss " ) ,
REGULATOR_SUPPLY ( " vdds_dsi " , " omapdss " ) ,
2011-08-03 14:00:57 +03:00
REGULATOR_SUPPLY ( " vdds_dsi " , " omapdss_dsi.0 " ) ,
2010-02-17 14:09:25 -08:00
} ;
2011-06-06 18:57:07 +00:00
static struct regulator_consumer_supply pandora_vcc_lcd_supply [ ] = {
REGULATOR_SUPPLY ( " vcc " , " display0 " ) ,
} ;
2010-02-17 14:09:25 -08:00
2011-06-06 18:57:07 +00:00
static struct regulator_consumer_supply pandora_usb_phy_supply [ ] = {
2012-03-05 16:11:02 -08:00
REGULATOR_SUPPLY ( " hsusb1 " , " ehci-omap.0 " ) ,
2011-06-06 18:57:07 +00:00
} ;
2010-02-17 14:09:25 -08:00
/* ads7846 on SPI and 2 nub controllers on I2C */
static struct regulator_consumer_supply pandora_vaux4_supplies [ ] = {
REGULATOR_SUPPLY ( " vcc " , " spi1.0 " ) ,
REGULATOR_SUPPLY ( " vcc " , " 3-0066 " ) ,
REGULATOR_SUPPLY ( " vcc " , " 3-0067 " ) ,
} ;
2011-06-06 18:57:07 +00:00
static struct regulator_consumer_supply pandora_adac_supply [ ] = {
REGULATOR_SUPPLY ( " vcc " , " soc-audio " ) ,
} ;
2010-02-17 14:09:25 -08:00
2009-05-28 14:04:04 -07:00
/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
static struct regulator_init_data pandora_vmmc1 = {
. constraints = {
. min_uV = 1850000 ,
. max_uV = 3150000 ,
. valid_modes_mask = REGULATOR_MODE_NORMAL
| REGULATOR_MODE_STANDBY ,
. valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
| REGULATOR_CHANGE_MODE
| REGULATOR_CHANGE_STATUS ,
} ,
2011-06-06 18:57:07 +00:00
. num_consumer_supplies = ARRAY_SIZE ( pandora_vmmc1_supply ) ,
. consumer_supplies = pandora_vmmc1_supply ,
2009-05-28 14:04:04 -07:00
} ;
/* VMMC2 for MMC2 pins CMD, CLK, DAT0..DAT3 (max 100 mA) */
static struct regulator_init_data pandora_vmmc2 = {
. constraints = {
. min_uV = 1850000 ,
. max_uV = 3150000 ,
. valid_modes_mask = REGULATOR_MODE_NORMAL
| REGULATOR_MODE_STANDBY ,
. valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
| REGULATOR_CHANGE_MODE
| REGULATOR_CHANGE_STATUS ,
} ,
2011-06-06 18:57:07 +00:00
. num_consumer_supplies = ARRAY_SIZE ( pandora_vmmc2_supply ) ,
. consumer_supplies = pandora_vmmc2_supply ,
2009-05-28 14:04:04 -07:00
} ;
2010-02-17 14:09:24 -08:00
/* VAUX1 for LCD */
static struct regulator_init_data pandora_vaux1 = {
. constraints = {
. min_uV = 3000000 ,
. max_uV = 3000000 ,
. apply_uV = true ,
. valid_modes_mask = REGULATOR_MODE_NORMAL
| REGULATOR_MODE_STANDBY ,
. valid_ops_mask = REGULATOR_CHANGE_MODE
| REGULATOR_CHANGE_STATUS ,
} ,
2011-06-06 18:57:07 +00:00
. num_consumer_supplies = ARRAY_SIZE ( pandora_vcc_lcd_supply ) ,
. consumer_supplies = pandora_vcc_lcd_supply ,
2010-02-17 14:09:24 -08:00
} ;
2010-02-17 14:09:25 -08:00
/* VAUX2 for USB host PHY */
static struct regulator_init_data pandora_vaux2 = {
. constraints = {
. min_uV = 1800000 ,
. max_uV = 1800000 ,
. apply_uV = true ,
. valid_modes_mask = REGULATOR_MODE_NORMAL
| REGULATOR_MODE_STANDBY ,
. valid_ops_mask = REGULATOR_CHANGE_MODE
| REGULATOR_CHANGE_STATUS ,
} ,
2011-06-06 18:57:07 +00:00
. num_consumer_supplies = ARRAY_SIZE ( pandora_usb_phy_supply ) ,
. consumer_supplies = pandora_usb_phy_supply ,
2010-02-17 14:09:25 -08:00
} ;
/* VAUX4 for ads7846 and nubs */
static struct regulator_init_data pandora_vaux4 = {
. constraints = {
. min_uV = 2800000 ,
. max_uV = 2800000 ,
. apply_uV = true ,
. valid_modes_mask = REGULATOR_MODE_NORMAL
| REGULATOR_MODE_STANDBY ,
. valid_ops_mask = REGULATOR_CHANGE_MODE
| REGULATOR_CHANGE_STATUS ,
} ,
. num_consumer_supplies = ARRAY_SIZE ( pandora_vaux4_supplies ) ,
. consumer_supplies = pandora_vaux4_supplies ,
} ;
/* VSIM for audio DAC */
static struct regulator_init_data pandora_vsim = {
. constraints = {
. min_uV = 2800000 ,
. max_uV = 2800000 ,
. apply_uV = true ,
. valid_modes_mask = REGULATOR_MODE_NORMAL
| REGULATOR_MODE_STANDBY ,
. valid_ops_mask = REGULATOR_CHANGE_MODE
| REGULATOR_CHANGE_STATUS ,
} ,
2011-06-06 18:57:07 +00:00
. num_consumer_supplies = ARRAY_SIZE ( pandora_adac_supply ) ,
. consumer_supplies = pandora_adac_supply ,
2010-02-17 14:09:25 -08:00
} ;
2010-10-01 16:35:25 -07:00
/* Fixed regulator internal to Wifi module */
static struct regulator_init_data pandora_vmmc3 = {
. constraints = {
. valid_ops_mask = REGULATOR_CHANGE_STATUS ,
} ,
2011-06-06 18:57:07 +00:00
. num_consumer_supplies = ARRAY_SIZE ( pandora_vmmc3_supply ) ,
. consumer_supplies = pandora_vmmc3_supply ,
2010-10-01 16:35:25 -07:00
} ;
static struct fixed_voltage_config pandora_vwlan = {
. supply_name = " vwlan " ,
. microvolts = 1800000 , /* 1.8V */
. gpio = PANDORA_WIFI_NRESET_GPIO ,
. startup_delay = 50000 , /* 50ms */
. enable_high = 1 ,
. enabled_at_boot = 0 ,
. init_data = & pandora_vmmc3 ,
} ;
static struct platform_device pandora_vwlan_device = {
. name = " reg-fixed-voltage " ,
. id = 1 ,
. dev = {
. platform_data = & pandora_vwlan ,
} ,
} ;
2010-10-01 16:35:25 -07:00
static struct twl4030_bci_platform_data pandora_bci_data ;
2012-03-05 11:08:37 -08:00
static struct twl4030_power_data pandora_power_data = {
. use_poweroff = true ,
} ;
2008-12-10 17:36:54 -08:00
static struct twl4030_platform_data omap3pandora_twldata = {
. gpio = & omap3pandora_gpio_data ,
2009-05-28 14:04:04 -07:00
. vmmc1 = & pandora_vmmc1 ,
. vmmc2 = & pandora_vmmc2 ,
2010-02-17 14:09:24 -08:00
. vaux1 = & pandora_vaux1 ,
2010-02-17 14:09:25 -08:00
. vaux2 = & pandora_vaux2 ,
. vaux4 = & pandora_vaux4 ,
. vsim = & pandora_vsim ,
2009-05-28 14:15:44 -07:00
. keypad = & pandora_kp_data ,
2010-10-01 16:35:25 -07:00
. bci = & pandora_bci_data ,
2012-03-05 11:08:37 -08:00
. power = & pandora_power_data ,
2008-12-10 17:36:54 -08:00
} ;
2010-03-10 11:13:53 +00:00
static struct i2c_board_info __initdata omap3pandora_i2c3_boardinfo [ ] = {
{
I2C_BOARD_INFO ( " bq27500 " , 0x55 ) ,
. flags = I2C_CLIENT_WAKE ,
} ,
} ;
2008-12-10 17:36:54 -08:00
static int __init omap3pandora_i2c_init ( void )
{
2011-06-07 10:28:54 +03:00
omap3_pmic_get_config ( & omap3pandora_twldata ,
2011-06-07 11:38:24 +03:00
TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_AUDIO ,
TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2 ) ;
omap3pandora_twldata . vdac - > constraints . apply_uV = true ;
omap3pandora_twldata . vpll2 - > constraints . apply_uV = true ;
omap3pandora_twldata . vpll2 - > num_consumer_supplies =
ARRAY_SIZE ( pandora_vdds_supplies ) ;
omap3pandora_twldata . vpll2 - > consumer_supplies = pandora_vdds_supplies ;
2011-04-25 01:09:06 +03:00
omap3_pmic_init ( " tps65950 " , & omap3pandora_twldata ) ;
2008-12-10 17:36:54 -08:00
/* i2c2 pins are not connected */
2010-03-10 11:13:53 +00:00
omap_register_i2c_bus ( 3 , 100 , omap3pandora_i2c3_boardinfo ,
ARRAY_SIZE ( omap3pandora_i2c3_boardinfo ) ) ;
2008-12-10 17:36:54 -08:00
return 0 ;
}
static struct spi_board_info omap3pandora_spi_board_info [ ] __initdata = {
{
2010-02-17 14:09:24 -08:00
. modalias = " tpo_td043mtea1_panel_spi " ,
. bus_num = 1 ,
. chip_select = 1 ,
. max_speed_hz = 375000 ,
. platform_data = & pandora_lcd_device ,
2008-12-10 17:36:54 -08:00
}
} ;
2010-11-04 00:13:49 +02:00
static void __init pandora_wl1251_init ( void )
2010-08-02 13:18:01 +03:00
{
2010-11-04 00:13:49 +02:00
struct wl12xx_platform_data pandora_wl1251_pdata ;
2010-08-02 13:18:01 +03:00
int ret ;
2010-11-04 00:13:49 +02:00
memset ( & pandora_wl1251_pdata , 0 , sizeof ( pandora_wl1251_pdata ) ) ;
2011-05-03 18:22:09 +03:00
ret = gpio_request_one ( PANDORA_WIFI_IRQ_GPIO , GPIOF_IN , " wl1251 irq " ) ;
2010-08-02 13:18:01 +03:00
if ( ret < 0 )
goto fail ;
pandora_wl1251_pdata . irq = gpio_to_irq ( PANDORA_WIFI_IRQ_GPIO ) ;
if ( pandora_wl1251_pdata . irq < 0 )
goto fail_irq ;
2010-11-04 00:13:49 +02:00
pandora_wl1251_pdata . use_eeprom = true ;
ret = wl12xx_set_platform_data ( & pandora_wl1251_pdata ) ;
if ( ret < 0 )
goto fail_irq ;
2010-08-02 13:18:01 +03:00
return ;
fail_irq :
gpio_free ( PANDORA_WIFI_IRQ_GPIO ) ;
fail :
printk ( KERN_ERR " wl1251 board initialisation failed \n " ) ;
}
2008-12-10 17:36:54 -08:00
static struct platform_device * omap3pandora_devices [ ] __initdata = {
2009-05-28 14:15:44 -07:00
& pandora_leds_gpio ,
& pandora_keys_gpio ,
2010-10-01 16:35:25 -07:00
& pandora_vwlan_device ,
2012-03-05 11:08:37 -08:00
& pandora_backlight ,
2008-12-10 17:36:54 -08:00
} ;
2011-03-01 20:08:16 +05:30
static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
2009-11-22 10:11:01 -08:00
2012-03-05 16:11:02 -08:00
. port_mode [ 0 ] = OMAP_USBHS_PORT_MODE_UNUSED ,
. port_mode [ 1 ] = OMAP_EHCI_PORT_MODE_PHY ,
2011-03-01 20:08:16 +05:30
. port_mode [ 2 ] = OMAP_USBHS_PORT_MODE_UNUSED ,
2009-11-22 10:11:01 -08:00
. phy_reset = true ,
2012-03-05 16:11:02 -08:00
. reset_gpio_port [ 0 ] = - EINVAL ,
. reset_gpio_port [ 1 ] = 16 ,
2009-11-22 10:11:01 -08:00
. reset_gpio_port [ 2 ] = - EINVAL
} ;
2009-12-11 16:16:32 -08:00
# ifdef CONFIG_OMAP_MUX
static struct omap_board_mux board_mux [ ] __initdata = {
{ . reg_offset = OMAP_MUX_TERMINATOR } ,
} ;
# endif
2008-12-10 17:36:54 -08:00
static void __init omap3pandora_init ( void )
{
2009-12-11 16:16:32 -08:00
omap3_mux_init ( board_mux , OMAP_PACKAGE_CBB ) ;
2012-02-20 09:43:29 -08:00
omap_hsmmc_init ( omap3pandora_mmc ) ;
2008-12-10 17:36:54 -08:00
omap3pandora_i2c_init ( ) ;
2010-08-02 13:18:01 +03:00
pandora_wl1251_init ( ) ;
2008-12-10 17:36:54 -08:00
platform_add_devices ( omap3pandora_devices ,
ARRAY_SIZE ( omap3pandora_devices ) ) ;
2011-02-22 11:24:50 +02:00
omap_display_init ( & pandora_dss_data ) ;
2008-12-10 17:36:54 -08:00
omap_serial_init ( ) ;
2011-08-22 23:57:23 -07:00
omap_sdrc_init ( mt46h32m32lf6_sdrc_params ,
mt46h32m32lf6_sdrc_params ) ;
2008-12-10 17:36:54 -08:00
spi_register_board_info ( omap3pandora_spi_board_info ,
ARRAY_SIZE ( omap3pandora_spi_board_info ) ) ;
2011-04-25 01:09:05 +03:00
omap_ads7846_init ( 1 , OMAP3_PANDORA_TS_GPIO , 0 , NULL ) ;
2011-03-01 20:08:19 +05:30
usbhs_init ( & usbhs_bdata ) ;
2011-04-27 11:56:12 +03:00
usb_musb_init ( NULL ) ;
2012-09-29 12:26:13 +05:30
gpmc_nand_init ( & pandora_nand_data , NULL ) ;
2009-07-24 19:43:25 -06:00
/* Ensure SDRC pins are mux'd for self-refresh */
2009-12-11 16:16:32 -08:00
omap_mux_init_signal ( " sdrc_cke0 " , OMAP_PIN_OUTPUT ) ;
omap_mux_init_signal ( " sdrc_cke1 " , OMAP_PIN_OUTPUT ) ;
2008-12-10 17:36:54 -08:00
}
MACHINE_START ( OMAP3_PANDORA , " Pandora Handheld Console " )
2011-07-05 22:38:15 -04:00
. atag_offset = 0x100 ,
2010-05-23 10:18:16 +01:00
. reserve = omap_reserve ,
2011-02-14 15:40:20 -08:00
. map_io = omap3_map_io ,
2011-08-22 23:57:24 -07:00
. init_early = omap35xx_init_early ,
2011-05-17 03:51:26 -07:00
. init_irq = omap3_init_irq ,
2011-09-06 10:23:45 +01:00
. handle_irq = omap3_intc_handle_irq ,
2008-12-10 17:36:54 -08:00
. init_machine = omap3pandora_init ,
2012-04-26 16:06:50 +08:00
. init_late = omap35xx_init_late ,
2011-03-29 15:54:48 -07:00
. timer = & omap3_timer ,
2012-10-29 20:56:12 -06:00
. restart = omap3xxx_restart ,
2008-12-10 17:36:54 -08:00
MACHINE_END