2009-11-22 21:11:30 +03:00
/*
* Copyright ( C ) 2009 Texas Instruments Inc .
*
* Modified from mach - omap2 / board - zoom2 . 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 .
*/
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/platform_device.h>
# include <linux/input.h>
# include <linux/input/matrix_keypad.h>
# include <linux/gpio.h>
2009-12-15 17:39:02 +03:00
# include <linux/i2c/twl.h>
2009-11-22 21:11:30 +03:00
# include <linux/regulator/machine.h>
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include <asm/mach/map.h>
# include <plat/common.h>
# include <plat/usb.h>
2010-02-15 21:03:35 +03:00
# include "mux.h"
2010-02-15 21:03:34 +03:00
# include "hsmmc.h"
2009-11-22 21:11:30 +03:00
/* Zoom2 has Qwerty keyboard*/
static int board_keymap [ ] = {
KEY ( 0 , 0 , KEY_E ) ,
KEY ( 0 , 1 , KEY_R ) ,
KEY ( 0 , 2 , KEY_T ) ,
KEY ( 0 , 3 , KEY_HOME ) ,
KEY ( 0 , 6 , KEY_I ) ,
KEY ( 0 , 7 , KEY_LEFTSHIFT ) ,
KEY ( 1 , 0 , KEY_D ) ,
KEY ( 1 , 1 , KEY_F ) ,
KEY ( 1 , 2 , KEY_G ) ,
KEY ( 1 , 3 , KEY_SEND ) ,
KEY ( 1 , 6 , KEY_K ) ,
KEY ( 1 , 7 , KEY_ENTER ) ,
KEY ( 2 , 0 , KEY_X ) ,
KEY ( 2 , 1 , KEY_C ) ,
KEY ( 2 , 2 , KEY_V ) ,
KEY ( 2 , 3 , KEY_END ) ,
KEY ( 2 , 6 , KEY_DOT ) ,
KEY ( 2 , 7 , KEY_CAPSLOCK ) ,
KEY ( 3 , 0 , KEY_Z ) ,
KEY ( 3 , 1 , KEY_KPPLUS ) ,
KEY ( 3 , 2 , KEY_B ) ,
KEY ( 3 , 3 , KEY_F1 ) ,
KEY ( 3 , 6 , KEY_O ) ,
KEY ( 3 , 7 , KEY_SPACE ) ,
KEY ( 4 , 0 , KEY_W ) ,
KEY ( 4 , 1 , KEY_Y ) ,
KEY ( 4 , 2 , KEY_U ) ,
KEY ( 4 , 3 , KEY_F2 ) ,
KEY ( 4 , 4 , KEY_VOLUMEUP ) ,
KEY ( 4 , 6 , KEY_L ) ,
KEY ( 4 , 7 , KEY_LEFT ) ,
KEY ( 5 , 0 , KEY_S ) ,
KEY ( 5 , 1 , KEY_H ) ,
KEY ( 5 , 2 , KEY_J ) ,
KEY ( 5 , 3 , KEY_F3 ) ,
2010-01-08 21:29:07 +03:00
KEY ( 5 , 4 , KEY_UNKNOWN ) ,
2009-11-22 21:11:30 +03:00
KEY ( 5 , 5 , KEY_VOLUMEDOWN ) ,
KEY ( 5 , 6 , KEY_M ) ,
2010-01-08 21:29:07 +03:00
KEY ( 5 , 7 , KEY_RIGHT ) ,
2009-11-22 21:11:30 +03:00
KEY ( 6 , 0 , KEY_Q ) ,
KEY ( 6 , 1 , KEY_A ) ,
KEY ( 6 , 2 , KEY_N ) ,
KEY ( 6 , 3 , KEY_BACKSPACE ) ,
KEY ( 6 , 6 , KEY_P ) ,
2010-01-08 21:29:07 +03:00
KEY ( 6 , 7 , KEY_UP ) ,
2009-11-22 21:11:30 +03:00
KEY ( 7 , 0 , KEY_PROG1 ) , /*MACRO 1 <User defined> */
KEY ( 7 , 1 , KEY_PROG2 ) , /*MACRO 2 <User defined> */
KEY ( 7 , 2 , KEY_PROG3 ) , /*MACRO 3 <User defined> */
KEY ( 7 , 3 , KEY_PROG4 ) , /*MACRO 4 <User defined> */
2010-01-08 21:29:07 +03:00
KEY ( 7 , 6 , KEY_SELECT ) ,
2009-11-22 21:11:30 +03:00
KEY ( 7 , 7 , KEY_DOWN )
} ;
static struct matrix_keymap_data board_map_data = {
. keymap = board_keymap ,
. keymap_size = ARRAY_SIZE ( board_keymap ) ,
} ;
2009-11-22 21:11:31 +03:00
static struct twl4030_keypad_data zoom_kp_twl4030_data = {
2009-11-22 21:11:30 +03:00
. keymap_data = & board_map_data ,
. rows = 8 ,
. cols = 8 ,
. rep = 1 ,
} ;
2009-11-22 21:11:31 +03:00
static struct regulator_consumer_supply zoom_vmmc1_supply = {
2009-11-22 21:11:30 +03:00
. supply = " vmmc " ,
} ;
2009-11-22 21:11:31 +03:00
static struct regulator_consumer_supply zoom_vsim_supply = {
2009-11-22 21:11:30 +03:00
. supply = " vmmc_aux " ,
} ;
2009-11-22 21:11:31 +03:00
static struct regulator_consumer_supply zoom_vmmc2_supply = {
2009-11-22 21:11:30 +03:00
. supply = " vmmc " ,
} ;
/* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */
2009-11-22 21:11:31 +03:00
static struct regulator_init_data zoom_vmmc1 = {
2009-11-22 21:11:30 +03:00
. 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 ,
} ,
. num_consumer_supplies = 1 ,
2009-11-22 21:11:31 +03:00
. consumer_supplies = & zoom_vmmc1_supply ,
2009-11-22 21:11:30 +03:00
} ;
/* VMMC2 for MMC2 card */
2009-11-22 21:11:31 +03:00
static struct regulator_init_data zoom_vmmc2 = {
2009-11-22 21:11:30 +03:00
. constraints = {
. min_uV = 1850000 ,
. max_uV = 1850000 ,
. apply_uV = true ,
. valid_modes_mask = REGULATOR_MODE_NORMAL
| REGULATOR_MODE_STANDBY ,
. valid_ops_mask = REGULATOR_CHANGE_MODE
| REGULATOR_CHANGE_STATUS ,
} ,
. num_consumer_supplies = 1 ,
2009-11-22 21:11:31 +03:00
. consumer_supplies = & zoom_vmmc2_supply ,
2009-11-22 21:11:30 +03:00
} ;
/* VSIM for OMAP VDD_MMC1A (i/o for DAT4..DAT7) */
2009-11-22 21:11:31 +03:00
static struct regulator_init_data zoom_vsim = {
2009-11-22 21:11:30 +03:00
. constraints = {
. min_uV = 1800000 ,
. max_uV = 3000000 ,
. valid_modes_mask = REGULATOR_MODE_NORMAL
| REGULATOR_MODE_STANDBY ,
. valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
| REGULATOR_CHANGE_MODE
| REGULATOR_CHANGE_STATUS ,
} ,
. num_consumer_supplies = 1 ,
2009-11-22 21:11:31 +03:00
. consumer_supplies = & zoom_vsim_supply ,
2009-11-22 21:11:30 +03:00
} ;
2010-02-15 21:03:34 +03:00
static struct omap2_hsmmc_info mmc [ ] __initdata = {
2009-11-22 21:11:30 +03:00
{
2009-12-12 03:16:37 +03:00
. name = " external " ,
2009-11-22 21:11:30 +03:00
. mmc = 1 ,
. wires = 4 ,
. gpio_wp = - EINVAL ,
2009-12-12 03:16:37 +03:00
. power_saving = true ,
2009-11-22 21:11:30 +03:00
} ,
{
2009-12-12 03:16:37 +03:00
. name = " internal " ,
2009-11-22 21:11:30 +03:00
. mmc = 2 ,
2009-12-12 03:16:37 +03:00
. wires = 8 ,
. gpio_cd = - EINVAL ,
2009-11-22 21:11:30 +03:00
. gpio_wp = - EINVAL ,
2009-12-12 03:16:37 +03:00
. nonremovable = true ,
. power_saving = true ,
2009-11-22 21:11:30 +03:00
} ,
{ } /* Terminator */
} ;
2009-11-22 21:11:31 +03:00
static int zoom_twl_gpio_setup ( struct device * dev ,
2009-11-22 21:11:30 +03:00
unsigned gpio , unsigned ngpio )
{
2009-12-12 03:16:37 +03:00
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
2009-11-22 21:11:30 +03:00
mmc [ 0 ] . gpio_cd = gpio + 0 ;
2010-02-15 21:03:34 +03:00
omap2_hsmmc_init ( mmc ) ;
2009-11-22 21:11:30 +03:00
/* link regulators to MMC adapters ... we "know" the
* regulators will be set up only * after * we return .
*/
2009-11-22 21:11:31 +03:00
zoom_vmmc1_supply . dev = mmc [ 0 ] . dev ;
zoom_vsim_supply . dev = mmc [ 0 ] . dev ;
zoom_vmmc2_supply . dev = mmc [ 1 ] . dev ;
2009-11-22 21:11:30 +03:00
return 0 ;
}
2009-11-22 21:11:31 +03:00
static int zoom_batt_table [ ] = {
2009-11-22 21:11:30 +03:00
/* 0 C*/
30800 , 29500 , 28300 , 27100 ,
26000 , 24900 , 23900 , 22900 , 22000 , 21100 , 20300 , 19400 , 18700 , 17900 ,
17200 , 16500 , 15900 , 15300 , 14700 , 14100 , 13600 , 13100 , 12600 , 12100 ,
11600 , 11200 , 10800 , 10400 , 10000 , 9630 , 9280 , 8950 , 8620 , 8310 ,
8020 , 7730 , 7460 , 7200 , 6950 , 6710 , 6470 , 6250 , 6040 , 5830 ,
5640 , 5450 , 5260 , 5090 , 4920 , 4760 , 4600 , 4450 , 4310 , 4170 ,
4040 , 3910 , 3790 , 3670 , 3550
} ;
2009-11-22 21:11:31 +03:00
static struct twl4030_bci_platform_data zoom_bci_data = {
. battery_tmp_tbl = zoom_batt_table ,
. tblsize = ARRAY_SIZE ( zoom_batt_table ) ,
2009-11-22 21:11:30 +03:00
} ;
2009-11-22 21:11:31 +03:00
static struct twl4030_usb_data zoom_usb_data = {
2009-11-22 21:11:30 +03:00
. usb_mode = T2_USB_MODE_ULPI ,
} ;
2009-11-22 21:11:31 +03:00
static struct twl4030_gpio_platform_data zoom_gpio_data = {
2009-11-22 21:11:30 +03:00
. gpio_base = OMAP_MAX_GPIO_LINES ,
. irq_base = TWL4030_GPIO_IRQ_BASE ,
. irq_end = TWL4030_GPIO_IRQ_END ,
2009-11-22 21:11:31 +03:00
. setup = zoom_twl_gpio_setup ,
2009-11-22 21:11:30 +03:00
} ;
2009-11-22 21:11:31 +03:00
static struct twl4030_madc_platform_data zoom_madc_data = {
2009-11-22 21:11:30 +03:00
. irq_line = 1 ,
} ;
2009-11-22 21:11:31 +03:00
static struct twl4030_codec_audio_data zoom_audio_data = {
2009-11-22 21:11:30 +03:00
. audio_mclk = 26000000 ,
} ;
2009-11-22 21:11:31 +03:00
static struct twl4030_codec_data zoom_codec_data = {
2009-11-22 21:11:30 +03:00
. audio_mclk = 26000000 ,
2009-11-22 21:11:31 +03:00
. audio = & zoom_audio_data ,
2009-11-22 21:11:30 +03:00
} ;
2009-11-22 21:11:31 +03:00
static struct twl4030_platform_data zoom_twldata = {
2009-11-22 21:11:30 +03:00
. irq_base = TWL4030_IRQ_BASE ,
. irq_end = TWL4030_IRQ_END ,
/* platform_data for children goes here */
2009-11-22 21:11:31 +03:00
. bci = & zoom_bci_data ,
. madc = & zoom_madc_data ,
. usb = & zoom_usb_data ,
. gpio = & zoom_gpio_data ,
. keypad = & zoom_kp_twl4030_data ,
. codec = & zoom_codec_data ,
2009-12-12 03:16:36 +03:00
. vmmc1 = & zoom_vmmc1 ,
2009-11-22 21:11:31 +03:00
. vmmc2 = & zoom_vmmc2 ,
. vsim = & zoom_vsim ,
2009-11-22 21:11:30 +03:00
} ;
2009-11-22 21:11:31 +03:00
static struct i2c_board_info __initdata zoom_i2c_boardinfo [ ] = {
2009-11-22 21:11:30 +03:00
{
2009-11-22 21:11:31 +03:00
I2C_BOARD_INFO ( " twl5030 " , 0x48 ) ,
2009-11-22 21:11:30 +03:00
. flags = I2C_CLIENT_WAKE ,
. irq = INT_34XX_SYS_NIRQ ,
2009-11-22 21:11:31 +03:00
. platform_data = & zoom_twldata ,
2009-11-22 21:11:30 +03:00
} ,
} ;
static int __init omap_i2c_init ( void )
{
2009-11-22 21:11:31 +03:00
omap_register_i2c_bus ( 1 , 2400 , zoom_i2c_boardinfo ,
2009-11-22 21:11:31 +03:00
ARRAY_SIZE ( zoom_i2c_boardinfo ) ) ;
2009-11-22 21:11:30 +03:00
omap_register_i2c_bus ( 2 , 400 , NULL , 0 ) ;
omap_register_i2c_bus ( 3 , 400 , NULL , 0 ) ;
return 0 ;
}
2010-02-18 01:09:30 +03:00
static struct omap_musb_board_data musb_board_data = {
. interface_type = MUSB_INTERFACE_ULPI ,
. mode = MUSB_OTG ,
. power = 100 ,
} ;
2010-02-15 21:03:35 +03:00
static void enable_board_wakeup_source ( void )
{
/* T2 interrupt line (keypad) */
omap_mux_init_signal ( " sys_nirq " ,
OMAP_WAKEUP_EN | OMAP_PIN_INPUT_PULLUP ) ;
}
2009-11-22 21:11:30 +03:00
void __init zoom_peripherals_init ( void )
{
omap_i2c_init ( ) ;
2010-02-18 01:09:30 +03:00
usb_musb_init ( & musb_board_data ) ;
2010-02-15 21:03:35 +03:00
enable_board_wakeup_source ( ) ;
2009-11-22 21:11:30 +03:00
}