2008-10-10 11:28:23 +03:00
/*
* linux / arch / arm / mach - omap2 / board - ldp . c
*
* Copyright ( C ) 2008 Texas Instruments Inc .
* Nishant Kamat < nskamat @ ti . com >
*
* Modified from mach - omap2 / board - 3430 sdp . c
*
* 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 .
*/
2011-07-26 10:53:52 +01:00
# include <linux/gpio.h>
2008-10-10 11:28:23 +03:00
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/platform_device.h>
# include <linux/delay.h>
# include <linux/input.h>
2009-10-22 14:43:17 -07:00
# include <linux/input/matrix_keypad.h>
2009-05-28 14:04:00 -07:00
# include <linux/gpio_keys.h>
2008-10-10 11:28:23 +03:00
# include <linux/workqueue.h>
# include <linux/err.h>
# include <linux/clk.h>
# include <linux/spi/spi.h>
2012-03-23 02:21:37 -07:00
# include <linux/regulator/fixed.h>
2009-05-28 14:04:00 -07:00
# include <linux/regulator/machine.h>
2009-12-13 20:05:51 +01:00
# include <linux/i2c/twl.h>
2009-03-25 10:21:35 +00:00
# include <linux/io.h>
2009-01-23 17:09:13 +00:00
# include <linux/smsc911x.h>
2010-09-15 14:49:23 +00:00
# include <linux/mmc/host.h>
2013-02-06 18:58:50 +05:30
# include <linux/usb/phy.h>
2012-08-24 15:21:06 +02:00
# include <linux/platform_data/spi-omap2-mcspi.h>
2008-10-10 11:28:23 +03: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"
2012-10-24 15:05:45 -07:00
# include "gpmc.h"
2012-09-20 11:41:46 -07:00
# include "gpmc-smsc911x.h"
2008-10-10 11:28:23 +03:00
2011-05-09 10:11:51 +03:00
# include <video/omapdss.h>
2013-02-12 16:46:46 +05:30
# include <video/omap-panel-data.h>
2011-05-09 10:11:51 +03:00
2010-10-08 09:58:35 -07:00
# include "board-flash.h"
2009-12-11 16:16:32 -08:00
# include "mux.h"
2010-02-15 10:03:34 -08:00
# include "hsmmc.h"
2010-10-08 11:40:20 -06:00
# include "control.h"
2011-04-25 01:09:05 +03:00
# include "common-board-devices.h"
2008-12-10 17:37:17 -08:00
2009-01-23 17:09:13 +00:00
# define LDP_SMSC911X_CS 1
# define LDP_SMSC911X_GPIO 152
2009-03-23 18:07:37 -07:00
# define DEBUG_BASE 0x08000000
# define LDP_ETHR_START DEBUG_BASE
2008-12-10 17:36:53 -08:00
2010-10-08 10:01:13 -07:00
static uint32_t board_keymap [ ] = {
2009-05-28 14:04:00 -07:00
KEY ( 0 , 0 , KEY_1 ) ,
KEY ( 1 , 0 , KEY_2 ) ,
KEY ( 2 , 0 , KEY_3 ) ,
KEY ( 0 , 1 , KEY_4 ) ,
KEY ( 1 , 1 , KEY_5 ) ,
KEY ( 2 , 1 , KEY_6 ) ,
KEY ( 3 , 1 , KEY_F5 ) ,
KEY ( 0 , 2 , KEY_7 ) ,
KEY ( 1 , 2 , KEY_8 ) ,
KEY ( 2 , 2 , KEY_9 ) ,
KEY ( 3 , 2 , KEY_F6 ) ,
KEY ( 0 , 3 , KEY_F7 ) ,
KEY ( 1 , 3 , KEY_0 ) ,
KEY ( 2 , 3 , KEY_F8 ) ,
PERSISTENT_KEY ( 4 , 5 ) ,
KEY ( 4 , 4 , KEY_VOLUMEUP ) ,
KEY ( 5 , 5 , KEY_VOLUMEDOWN ) ,
0
} ;
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:04:00 -07:00
static struct twl4030_keypad_data ldp_kp_twl4030_data = {
2009-09-24 16:23:16 -07:00
. keymap_data = & board_map_data ,
2009-05-28 14:04:00 -07:00
. rows = 6 ,
. cols = 6 ,
. rep = 1 ,
} ;
static struct gpio_keys_button ldp_gpio_keys_buttons [ ] = {
[ 0 ] = {
. code = KEY_ENTER ,
. gpio = 101 ,
. desc = " enter sw " ,
. active_low = 1 ,
. debounce_interval = 30 ,
} ,
[ 1 ] = {
. code = KEY_F1 ,
. gpio = 102 ,
. desc = " func 1 " ,
. active_low = 1 ,
. debounce_interval = 30 ,
} ,
[ 2 ] = {
. code = KEY_F2 ,
. gpio = 103 ,
. desc = " func 2 " ,
. active_low = 1 ,
. debounce_interval = 30 ,
} ,
[ 3 ] = {
. code = KEY_F3 ,
. gpio = 104 ,
. desc = " func 3 " ,
. active_low = 1 ,
. debounce_interval = 30 ,
} ,
[ 4 ] = {
. code = KEY_F4 ,
. gpio = 105 ,
. desc = " func 4 " ,
. active_low = 1 ,
. debounce_interval = 30 ,
} ,
[ 5 ] = {
. code = KEY_LEFT ,
. gpio = 106 ,
. desc = " left sw " ,
. active_low = 1 ,
. debounce_interval = 30 ,
} ,
[ 6 ] = {
. code = KEY_RIGHT ,
. gpio = 107 ,
. desc = " right sw " ,
. active_low = 1 ,
. debounce_interval = 30 ,
} ,
[ 7 ] = {
. code = KEY_UP ,
. gpio = 108 ,
. desc = " up sw " ,
. active_low = 1 ,
. debounce_interval = 30 ,
} ,
[ 8 ] = {
. code = KEY_DOWN ,
. gpio = 109 ,
. desc = " down sw " ,
. active_low = 1 ,
. debounce_interval = 30 ,
} ,
} ;
static struct gpio_keys_platform_data ldp_gpio_keys = {
. buttons = ldp_gpio_keys_buttons ,
. nbuttons = ARRAY_SIZE ( ldp_gpio_keys_buttons ) ,
. rep = 1 ,
} ;
static struct platform_device ldp_gpio_keys_device = {
. name = " gpio-keys " ,
. id = - 1 ,
. dev = {
. platform_data = & ldp_gpio_keys ,
} ,
} ;
2011-04-16 22:29:30 +00:00
static struct omap_smsc911x_platform_data smsc911x_cfg = {
. cs = LDP_SMSC911X_CS ,
. gpio_irq = LDP_SMSC911X_GPIO ,
. gpio_reset = - EINVAL ,
. flags = SMSC911X_USE_32BIT ,
} ;
2009-01-23 17:09:13 +00:00
static inline void __init ldp_init_smsc911x ( void )
2008-12-10 17:36:53 -08:00
{
2011-04-16 22:29:30 +00:00
gpmc_smsc911x_init ( & smsc911x_cfg ) ;
2008-12-10 17:36:53 -08:00
}
2011-05-09 10:11:51 +03:00
/* LCD */
# define LCD_PANEL_RESET_GPIO 55
# define LCD_PANEL_QVGA_GPIO 56
2013-05-31 11:38:50 +03:00
static const struct display_timing ldp_lcd_videomode = {
. pixelclock = { 0 , 5400000 , 0 } ,
. hactive = { 0 , 240 , 0 } ,
. hfront_porch = { 0 , 3 , 0 } ,
. hback_porch = { 0 , 39 , 0 } ,
. hsync_len = { 0 , 3 , 0 } ,
. vactive = { 0 , 320 , 0 } ,
. vfront_porch = { 0 , 2 , 0 } ,
. vback_porch = { 0 , 7 , 0 } ,
. vsync_len = { 0 , 1 , 0 } ,
. flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE ,
2009-05-28 14:04:00 -07:00
} ;
2013-05-31 11:38:50 +03:00
static struct panel_dpi_platform_data ldp_lcd_pdata = {
. name = " lcd " ,
. source = " dpi.0 " ,
. data_lines = 18 ,
. display_timing = & ldp_lcd_videomode ,
. enable_gpio = - 1 , /* filled in code */
. backlight_gpio = - 1 , /* filled in code */
2011-05-09 10:11:51 +03:00
} ;
2013-05-31 11:38:50 +03:00
static struct platform_device ldp_lcd_device = {
. name = " panel-dpi " ,
. id = 0 ,
. dev . platform_data = & ldp_lcd_pdata ,
2009-05-28 14:04:00 -07:00
} ;
2011-05-09 10:11:51 +03:00
static struct omap_dss_board_info ldp_dss_data = {
2013-05-31 11:38:50 +03:00
. default_display_name = " lcd " ,
2008-10-10 11:28:23 +03:00
} ;
2011-05-09 10:11:51 +03:00
static void __init ldp_display_init ( void )
{
2013-05-31 11:38:50 +03:00
int r ;
static struct gpio gpios [ ] __initdata = {
{ LCD_PANEL_RESET_GPIO , GPIOF_OUT_INIT_HIGH , " LCD RESET " } ,
{ LCD_PANEL_QVGA_GPIO , GPIOF_OUT_INIT_HIGH , " LCD QVGA " } ,
} ;
r = gpio_request_array ( gpios , ARRAY_SIZE ( gpios ) ) ;
if ( r ) {
pr_err ( " Cannot request LCD GPIOs, error %d \n " , r ) ;
return ;
}
2011-05-09 10:11:51 +03:00
omap_display_init ( & ldp_dss_data ) ;
}
static int ldp_twl_gpio_setup ( struct device * dev , unsigned gpio , unsigned ngpio )
{
2013-12-27 09:33:27 -08:00
int res ;
2013-05-31 11:38:50 +03:00
/* LCD enable GPIO */
ldp_lcd_pdata . enable_gpio = gpio + 7 ;
2011-05-09 10:11:51 +03:00
2013-05-31 11:38:50 +03:00
/* Backlight enable GPIO */
ldp_lcd_pdata . backlight_gpio = gpio + 15 ;
2011-05-09 10:11:51 +03:00
2013-12-27 09:33:27 -08:00
res = platform_device_register ( & ldp_lcd_device ) ;
if ( res )
pr_err ( " Unable to register LCD: %d \n " , res ) ;
2011-05-09 10:11:51 +03:00
return 0 ;
}
2008-12-10 17:37:17 -08:00
static struct twl4030_gpio_platform_data ldp_gpio_data = {
2011-05-09 10:11:51 +03:00
. setup = ldp_twl_gpio_setup ,
2008-12-10 17:37:17 -08:00
} ;
2011-06-06 18:57:07 +00:00
static struct regulator_consumer_supply ldp_vmmc1_supply [ ] = {
REGULATOR_SUPPLY ( " vmmc " , " omap_hsmmc.0 " ) ,
2009-05-28 14:04:00 -07:00
} ;
/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
static struct regulator_init_data ldp_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 ( ldp_vmmc1_supply ) ,
. consumer_supplies = ldp_vmmc1_supply ,
2009-05-28 14:04:00 -07:00
} ;
2011-02-24 12:56:42 +00:00
/* ads7846 on SPI */
static struct regulator_consumer_supply ldp_vaux1_supplies [ ] = {
REGULATOR_SUPPLY ( " vcc " , " spi1.0 " ) ,
} ;
/* VAUX1 */
static struct regulator_init_data ldp_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 ,
} ,
. num_consumer_supplies = ARRAY_SIZE ( ldp_vaux1_supplies ) ,
. consumer_supplies = ldp_vaux1_supplies ,
} ;
2011-05-09 10:11:51 +03:00
static struct regulator_consumer_supply ldp_vpll2_supplies [ ] = {
REGULATOR_SUPPLY ( " vdds_dsi " , " omapdss " ) ,
2013-05-31 10:37:53 +03:00
REGULATOR_SUPPLY ( " vdds_dsi " , " omapdss_dpi.0 " ) ,
2013-05-31 10:37:52 +03:00
REGULATOR_SUPPLY ( " vdds_dsi " , " omapdss_dsi.0 " ) ,
2011-05-09 10:11:51 +03:00
} ;
static struct regulator_init_data ldp_vpll2 = {
. constraints = {
. name = " VDVI " ,
. 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 ,
} ,
. num_consumer_supplies = ARRAY_SIZE ( ldp_vpll2_supplies ) ,
. consumer_supplies = ldp_vpll2_supplies ,
} ;
2008-12-10 17:37:17 -08:00
static struct twl4030_platform_data ldp_twldata = {
/* platform_data for children goes here */
2009-05-28 14:04:00 -07:00
. vmmc1 = & ldp_vmmc1 ,
2011-02-24 12:56:42 +00:00
. vaux1 = & ldp_vaux1 ,
2011-05-09 10:11:51 +03:00
. vpll2 = & ldp_vpll2 ,
2008-12-10 17:37:17 -08:00
. gpio = & ldp_gpio_data ,
2009-05-28 14:04:00 -07:00
. keypad = & ldp_kp_twl4030_data ,
2008-12-10 17:37:17 -08:00
} ;
2008-10-10 11:28:23 +03:00
static int __init omap_i2c_init ( void )
{
2011-06-07 10:28:54 +03:00
omap3_pmic_get_config ( & ldp_twldata ,
TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_MADC , 0 ) ;
2011-04-25 01:09:06 +03:00
omap3_pmic_init ( " twl4030 " , & ldp_twldata ) ;
2008-10-10 11:28:23 +03:00
omap_register_i2c_bus ( 2 , 400 , NULL , 0 ) ;
omap_register_i2c_bus ( 3 , 400 , NULL , 0 ) ;
return 0 ;
}
2010-02-15 10:03:34 -08:00
static struct omap2_hsmmc_info mmc [ ] __initdata = {
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 = - EINVAL ,
} ,
{ } /* Terminator */
} ;
2009-05-28 14:04:00 -07:00
static struct platform_device * ldp_devices [ ] __initdata = {
2009-05-28 14:04:00 -07:00
& ldp_gpio_keys_device ,
2009-05-28 14:04:00 -07:00
} ;
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
2010-07-09 14:27:51 +00:00
static struct mtd_partition ldp_nand_partitions [ ] = {
/* All the partition sizes are listed in terms of NAND block size */
{
. name = " X-Loader-NAND " ,
. offset = 0 ,
. size = 4 * ( 64 * 2048 ) , /* 512KB, 0x80000 */
. mask_flags = MTD_WRITEABLE , /* force read-only */
} ,
{
. name = " U-Boot-NAND " ,
. offset = MTDPART_OFS_APPEND , /* Offset = 0x80000 */
. size = 10 * ( 64 * 2048 ) , /* 1.25MB, 0x140000 */
. mask_flags = MTD_WRITEABLE , /* force read-only */
} ,
{
. name = " Boot Env-NAND " ,
. offset = MTDPART_OFS_APPEND , /* Offset = 0x1c0000 */
. size = 2 * ( 64 * 2048 ) , /* 256KB, 0x40000 */
} ,
{
. name = " Kernel-NAND " ,
. offset = MTDPART_OFS_APPEND , /* Offset = 0x0200000*/
. size = 240 * ( 64 * 2048 ) , /* 30M, 0x1E00000 */
} ,
{
. name = " File System - NAND " ,
. offset = MTDPART_OFS_APPEND , /* Offset = 0x2000000 */
. size = MTDPART_SIZ_FULL , /* 96MB, 0x6000000 */
} ,
} ;
2012-03-23 02:21:37 -07:00
static struct regulator_consumer_supply dummy_supplies [ ] = {
REGULATOR_SUPPLY ( " vddvario " , " smsc911x.0 " ) ,
REGULATOR_SUPPLY ( " vdd33a " , " smsc911x.0 " ) ,
} ;
2008-10-10 11:28:23 +03:00
static void __init omap_ldp_init ( void )
{
2012-03-23 02:21:37 -07:00
regulator_register_fixed ( 0 , dummy_supplies , ARRAY_SIZE ( dummy_supplies ) ) ;
2009-12-11 16:16:32 -08:00
omap3_mux_init ( board_mux , OMAP_PACKAGE_CBB ) ;
2010-12-07 16:26:55 -08:00
ldp_init_smsc911x ( ) ;
2008-10-10 11:28:23 +03:00
omap_i2c_init ( ) ;
2008-12-10 17:36:53 -08:00
platform_add_devices ( ldp_devices , ARRAY_SIZE ( ldp_devices ) ) ;
2011-04-25 01:09:05 +03:00
omap_ads7846_init ( 1 , 54 , 310 , NULL ) ;
2008-10-10 11:28:23 +03:00
omap_serial_init ( ) ;
2011-08-22 23:57:23 -07:00
omap_sdrc_init ( NULL , NULL ) ;
2013-02-06 18:58:50 +05:30
usb_bind_phy ( " musb-hdrc.0.auto " , 0 , " twl4030_usb " ) ;
2011-04-27 11:56:12 +03:00
usb_musb_init ( NULL ) ;
2012-02-29 18:11:56 +05:30
board_nand_init ( ldp_nand_partitions , ARRAY_SIZE ( ldp_nand_partitions ) ,
2013-10-14 11:31:44 -07:00
0 , 0 , nand_default_timings ) ;
2009-05-28 14:04:00 -07:00
2012-02-20 09:43:29 -08:00
omap_hsmmc_init ( mmc ) ;
2011-05-09 10:11:51 +03:00
ldp_display_init ( ) ;
2008-10-10 11:28:23 +03:00
}
MACHINE_START ( OMAP_LDP , " OMAP LDP board " )
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 = omap3430_init_early ,
2011-05-17 03:51:26 -07:00
. init_irq = omap3_init_irq ,
2008-10-10 11:28:23 +03:00
. init_machine = omap_ldp_init ,
2012-04-26 16:06:50 +08:00
. init_late = omap3430_init_late ,
2012-11-08 12:40:59 -07:00
. init_time = omap3_sync32k_timer_init ,
2012-10-29 20:56:12 -06:00
. restart = omap3xxx_restart ,
2008-10-10 11:28:23 +03:00
MACHINE_END