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>
2010-09-16 03:32:09 +04:00
# include <linux/regulator/fixed.h>
2010-09-16 03:32:30 +04:00
# include <linux/wl12xx.h>
2010-09-15 18:49:23 +04:00
# include <linux/mmc/host.h>
2012-08-31 02:37:24 +04:00
# include <linux/platform_data/gpio-omap.h>
2012-12-05 18:39:35 +04:00
# include <linux/platform_data/omap-twl4030.h>
2009-11-22 21:11:30 +03:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include <asm/mach/map.h>
2011-11-11 01:45:17 +04:00
# include "common.h"
2009-11-22 21:11:30 +03:00
2012-10-08 20:11:22 +04:00
# include "board-zoom.h"
2010-09-23 20:11:54 +04:00
2010-02-15 21:03:35 +03:00
# include "mux.h"
2010-02-15 21:03:34 +03:00
# include "hsmmc.h"
2011-04-25 02:09:06 +04:00
# include "common-board-devices.h"
2009-11-22 21:11:30 +03:00
2010-09-16 03:32:09 +04:00
# define OMAP_ZOOM_WLAN_PMENA_GPIO (101)
2012-12-05 14:35:32 +04:00
# define OMAP_ZOOM_TSC2004_IRQ_GPIO (153)
2010-09-16 03:32:30 +04:00
# define OMAP_ZOOM_WLAN_IRQ_GPIO (162)
2010-09-16 03:32:09 +04:00
2010-11-15 09:09:03 +03:00
# define LCD_PANEL_ENABLE_GPIO (7 + OMAP_MAX_GPIO_LINES)
2009-11-22 21:11:30 +03:00
/* Zoom2 has Qwerty keyboard*/
2010-10-08 21:01:13 +04:00
static uint32_t board_keymap [ ] = {
2009-11-22 21:11:30 +03:00
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 ,
} ;
2011-06-06 22:57:07 +04:00
static struct regulator_consumer_supply zoom_vmmc1_supply [ ] = {
REGULATOR_SUPPLY ( " vmmc " , " omap_hsmmc.0 " ) ,
2009-11-22 21:11:30 +03:00
} ;
2011-06-06 22:57:07 +04:00
static struct regulator_consumer_supply zoom_vsim_supply [ ] = {
REGULATOR_SUPPLY ( " vmmc_aux " , " omap_hsmmc.0 " ) ,
2009-11-22 21:11:30 +03:00
} ;
2011-06-06 22:57:07 +04:00
static struct regulator_consumer_supply zoom_vmmc2_supply [ ] = {
REGULATOR_SUPPLY ( " vmmc " , " omap_hsmmc.1 " ) ,
2009-11-22 21:11:30 +03:00
} ;
2011-06-06 22:57:07 +04:00
static struct regulator_consumer_supply zoom_vmmc3_supply [ ] = {
REGULATOR_SUPPLY ( " vmmc " , " omap_hsmmc.2 " ) ,
2010-09-16 03:32:09 +04:00
} ;
2009-11-22 21:11:30 +03:00
/* 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 ,
} ,
2011-06-06 22:57:07 +04:00
. num_consumer_supplies = ARRAY_SIZE ( zoom_vmmc1_supply ) ,
. 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 ,
} ,
2011-06-06 22:57:07 +04:00
. num_consumer_supplies = ARRAY_SIZE ( zoom_vmmc2_supply ) ,
. 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 ,
} ,
2011-06-06 22:57:07 +04:00
. num_consumer_supplies = ARRAY_SIZE ( zoom_vsim_supply ) ,
. consumer_supplies = zoom_vsim_supply ,
2009-11-22 21:11:30 +03:00
} ;
2010-09-16 03:32:09 +04:00
static struct regulator_init_data zoom_vmmc3 = {
. constraints = {
. valid_ops_mask = REGULATOR_CHANGE_STATUS ,
} ,
2011-06-06 22:57:07 +04:00
. num_consumer_supplies = ARRAY_SIZE ( zoom_vmmc3_supply ) ,
. consumer_supplies = zoom_vmmc3_supply ,
2010-09-16 03:32:09 +04:00
} ;
static struct fixed_voltage_config zoom_vwlan = {
. supply_name = " vwl1271 " ,
. microvolts = 1800000 , /* 1.8V */
. gpio = OMAP_ZOOM_WLAN_PMENA_GPIO ,
. startup_delay = 70000 , /* 70msec */
. enable_high = 1 ,
. enabled_at_boot = 0 ,
. init_data = & zoom_vmmc3 ,
} ;
static struct platform_device omap_vwlan_device = {
. name = " reg-fixed-voltage " ,
. id = 1 ,
. dev = {
. platform_data = & zoom_vwlan ,
} ,
} ;
2011-01-07 06:49:29 +03:00
static struct wl12xx_platform_data omap_zoom_wlan_data __initdata = {
2012-09-26 20:42:22 +04:00
. board_ref_clock = WL12XX_REFCLOCK_26 , /* 26 MHz */
2010-09-16 03:32:30 +04:00
} ;
omap: kill all section mismatch warning for omap2plus_defconfig
This patch will kill following section mismatch warnings:
WARNING: vmlinux.o(.text+0x24a00): Section mismatch in reference from the function zoom_twl_gpio_setup() to the (unknown reference) .init.data:(unknown)
The function zoom_twl_gpio_setup() references
the (unknown reference) __initdata (unknown).
This is often because zoom_twl_gpio_setup lacks a __initdata
annotation or the annotation of (unknown) is wrong.
WARNING: vmlinux.o(.text+0x24bfc): Section mismatch in reference from the function cm_t35_twl_gpio_setup() to the (unknown reference) .init.data:(unknown)
The function cm_t35_twl_gpio_setup() references
the (unknown reference) __initdata (unknown).
This is often because cm_t35_twl_gpio_setup lacks a __initdata
annotation or the annotation of (unknown) is wrong.
WARNING: vmlinux.o(.data+0x1d3e0): Section mismatch in reference from the variable h4_config to the (unknown reference) .init.data:(unknown)
The variable h4_config references
the (unknown reference) __initdata (unknown)
If the reference is valid then annotate the
variable with __init* or __refdata (see linux/init.h) or name the variable:
*_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console,
WARNING: vmlinux.o(.data+0x1dc08): Section mismatch in reference from the variable sdp2430_config to the (unknown reference) .init.data:(unknown)
The variable sdp2430_config references
the (unknown reference) __initdata (unknown)
If the reference is valid then annotate the
variable with __init* or __refdata (see linux/init.h) or name the variable:
*_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console,
WARNING: vmlinux.o(.data+0x1e1d8): Section mismatch in reference from the variable apollon_config to the (unknown reference) .init.data:(unknown)
The variable apollon_config references
the (unknown reference) __initdata (unknown)
If the reference is valid then annotate the
variable with __init* or __refdata (see linux/init.h) or name the variable:
*_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console,
Signed-off-by: Bryan Wu <bryan.wu@canonical.com>
Cc: Paul Walmsley <paul@pwsan.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2010-12-08 05:41:25 +03:00
static struct omap2_hsmmc_info mmc [ ] = {
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 ,
2010-09-15 18:49:23 +04:00
. caps = MMC_CAP_4_BIT_DATA ,
2009-11-22 21:11:30 +03:00
. gpio_wp = - EINVAL ,
2009-12-12 03:16:37 +03:00
. power_saving = true ,
2012-02-20 21:43:29 +04:00
. deferred = 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 ,
2010-09-15 18:49:23 +04:00
. caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA ,
2009-12-12 03:16:37 +03:00
. 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
} ,
2010-09-16 03:32:30 +04:00
{
. name = " wl1271 " ,
. mmc = 3 ,
2010-11-27 02:59:24 +03:00
. caps = MMC_CAP_4_BIT_DATA | MMC_CAP_POWER_OFF_CARD ,
2010-09-16 03:32:30 +04:00
. gpio_wp = - EINVAL ,
. gpio_cd = - EINVAL ,
. nonremovable = true ,
} ,
2009-11-22 21:11:30 +03:00
{ } /* Terminator */
} ;
2012-12-05 18:39:35 +04:00
static struct omap_tw4030_pdata omap_twl4030_audio_data = {
. voice_connected = true ,
. custom_routing = true ,
. has_hs = OMAP_TWL4030_LEFT | OMAP_TWL4030_RIGHT ,
. has_hf = OMAP_TWL4030_LEFT | OMAP_TWL4030_RIGHT ,
. has_mainmic = true ,
. has_submic = true ,
. has_hsmic = true ,
. has_linein = OMAP_TWL4030_LEFT | OMAP_TWL4030_RIGHT ,
} ;
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 )
{
2010-11-15 09:09:03 +03:00
int ret ;
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 ;
2012-02-20 21:43:29 +04:00
omap_hsmmc_late_init ( mmc ) ;
2009-11-22 21:11:30 +03:00
2011-05-03 19:22:09 +04:00
ret = gpio_request_one ( LCD_PANEL_ENABLE_GPIO , GPIOF_OUT_INIT_LOW ,
" lcd enable " ) ;
if ( ret )
2010-11-15 09:09:03 +03:00
pr_err ( " Failed to get LCD_PANEL_ENABLE_GPIO (gpio%d). \n " ,
LCD_PANEL_ENABLE_GPIO ) ;
2012-12-05 18:39:35 +04:00
/* Audio setup */
omap_twl4030_audio_data . jack_detect = gpio + 2 ;
omap_twl4030_audio_init ( " Zoom2 " , & omap_twl4030_audio_data ) ;
2010-11-15 09:09:03 +03:00
return ret ;
2009-11-22 21:11:30 +03:00
}
2009-11-22 21:11:31 +03:00
static struct twl4030_gpio_platform_data zoom_gpio_data = {
. setup = zoom_twl_gpio_setup ,
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
/* platform_data for children goes here */
2009-11-22 21:11:31 +03:00
. gpio = & zoom_gpio_data ,
. keypad = & zoom_kp_twl4030_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
} ;
static int __init omap_i2c_init ( void )
{
2011-06-07 11:28:54 +04:00
omap3_pmic_get_config ( & zoom_twldata ,
2011-06-07 12:38:24 +04:00
TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_BCI |
TWL_COMMON_PDATA_MADC | TWL_COMMON_PDATA_AUDIO ,
TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2 ) ;
2011-06-07 11:28:54 +04:00
2012-12-05 14:35:32 +04:00
if ( machine_is_omap_zoom2 ( ) )
zoom_twldata . audio - > codec - > ramp_delay_value = 3 ; /* 161 ms */
2011-06-07 11:28:54 +04:00
2012-08-28 04:43:01 +04:00
omap_pmic_init ( 1 , 2400 , " twl5030 " , 7 + OMAP_INTC_START , & zoom_twldata ) ;
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-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 )
{
2012-03-29 19:41:01 +04:00
int ret ;
omap_zoom_wlan_data . irq = gpio_to_irq ( OMAP_ZOOM_WLAN_IRQ_GPIO ) ;
ret = wl12xx_set_platform_data ( & omap_zoom_wlan_data ) ;
2012-02-07 15:03:23 +04:00
if ( ret )
pr_err ( " error setting wl12xx data: %d \n " , ret ) ;
2010-09-16 03:32:30 +04:00
2012-02-20 21:43:29 +04:00
omap_hsmmc_init ( mmc ) ;
2009-11-22 21:11:30 +03:00
omap_i2c_init ( ) ;
2010-09-16 03:32:09 +04:00
platform_device_register ( & omap_vwlan_device ) ;
2011-04-27 12:56:12 +04:00
usb_musb_init ( NULL ) ;
2010-02-15 21:03:35 +03:00
enable_board_wakeup_source ( ) ;
2010-09-27 18:51:05 +04:00
omap_serial_init ( ) ;
2009-11-22 21:11:30 +03:00
}