| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435 | /* * Board support file for OMAP4430 SDP. * * Copyright (C) 2009 Texas Instruments * * Author: Santosh Shilimkar <santosh.shilimkar@ti.com> * * Based on mach-omap2/board-3430sdp.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/io.h>#include <linux/gpio.h>#include <linux/usb/otg.h>#include <linux/spi/spi.h>#include <linux/i2c/twl.h>#include <linux/mfd/twl6040.h>#include <linux/gpio_keys.h>#include <linux/regulator/machine.h>#include <linux/regulator/fixed.h>#include <linux/leds.h>#include <linux/leds_pwm.h>#include <linux/platform_data/omap4-keypad.h>#include <linux/usb/musb.h>#include <asm/hardware/gic.h>#include <asm/mach-types.h>#include <asm/mach/arch.h>#include <asm/mach/map.h>#include "common.h"#include "omap4-keypad.h"#include <linux/wl12xx.h>#include <linux/platform_data/omap-abe-twl6040.h>#include "soc.h"#include "mux.h"#include "mmc.h"#include "hsmmc.h"#include "control.h"#include "common-board-devices.h"#include "dss-common.h"#define ETH_KS8851_IRQ			34#define ETH_KS8851_POWER_ON		48#define ETH_KS8851_QUART		138#define OMAP4_SFH7741_SENSOR_OUTPUT_GPIO	184#define OMAP4_SFH7741_ENABLE_GPIO		188#define GPIO_WIFI_PMENA		54#define GPIO_WIFI_IRQ		53static const int sdp4430_keymap[] = {	KEY(0, 0, KEY_E),	KEY(0, 1, KEY_R),	KEY(0, 2, KEY_T),	KEY(0, 3, KEY_HOME),	KEY(0, 4, KEY_F5),	KEY(0, 5, KEY_UNKNOWN),	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, 4, KEY_F6),	KEY(1, 5, KEY_UNKNOWN),	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, 4, KEY_F7),	KEY(2, 5, KEY_UNKNOWN),	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, 4, KEY_F8),	KEY(3, 5, KEY_UNKNOWN),	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, 5, KEY_UNKNOWN),	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),	KEY(5, 4, KEY_F9),	KEY(5, 5, KEY_VOLUMEDOWN),	KEY(5, 6, KEY_M),	KEY(5, 7, KEY_RIGHT),	KEY(6, 0, KEY_Q),	KEY(6, 1, KEY_A),	KEY(6, 2, KEY_N),	KEY(6, 3, KEY_BACK),	KEY(6, 4, KEY_BACKSPACE),	KEY(6, 5, KEY_UNKNOWN),	KEY(6, 6, KEY_P),	KEY(6, 7, KEY_UP),	KEY(7, 0, KEY_PROG1),	KEY(7, 1, KEY_PROG2),	KEY(7, 2, KEY_PROG3),	KEY(7, 3, KEY_PROG4),	KEY(7, 4, KEY_F4),	KEY(7, 5, KEY_UNKNOWN),	KEY(7, 6, KEY_OK),	KEY(7, 7, KEY_DOWN),};static struct omap_device_pad keypad_pads[] = {	{	.name   = "kpd_col1.kpd_col1",		.enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1,	},	{	.name   = "kpd_col1.kpd_col1",		.enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1,	},	{	.name   = "kpd_col2.kpd_col2",		.enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1,	},	{	.name   = "kpd_col3.kpd_col3",		.enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1,	},	{	.name   = "kpd_col4.kpd_col4",		.enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1,	},	{	.name   = "kpd_col5.kpd_col5",		.enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1,	},	{	.name   = "gpmc_a23.kpd_col7",		.enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1,	},	{	.name   = "gpmc_a22.kpd_col6",		.enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1,	},	{	.name   = "kpd_row0.kpd_row0",		.enable = OMAP_PULL_ENA | OMAP_PULL_UP | OMAP_WAKEUP_EN |			OMAP_MUX_MODE1 | OMAP_INPUT_EN,	},	{	.name   = "kpd_row1.kpd_row1",		.enable = OMAP_PULL_ENA | OMAP_PULL_UP | OMAP_WAKEUP_EN |			OMAP_MUX_MODE1 | OMAP_INPUT_EN,	},	{	.name   = "kpd_row2.kpd_row2",		.enable = OMAP_PULL_ENA | OMAP_PULL_UP | OMAP_WAKEUP_EN |			OMAP_MUX_MODE1 | OMAP_INPUT_EN,	},	{	.name   = "kpd_row3.kpd_row3",		.enable = OMAP_PULL_ENA | OMAP_PULL_UP | OMAP_WAKEUP_EN |			OMAP_MUX_MODE1 | OMAP_INPUT_EN,	},	{	.name   = "kpd_row4.kpd_row4",		.enable = OMAP_PULL_ENA | OMAP_PULL_UP | OMAP_WAKEUP_EN |			OMAP_MUX_MODE1 | OMAP_INPUT_EN,	},	{	.name   = "kpd_row5.kpd_row5",		.enable = OMAP_PULL_ENA | OMAP_PULL_UP | OMAP_WAKEUP_EN |			OMAP_MUX_MODE1 | OMAP_INPUT_EN,	},	{	.name   = "gpmc_a18.kpd_row6",		.enable = OMAP_PULL_ENA | OMAP_PULL_UP | OMAP_WAKEUP_EN |			OMAP_MUX_MODE1 | OMAP_INPUT_EN,	},	{	.name   = "gpmc_a19.kpd_row7",		.enable = OMAP_PULL_ENA | OMAP_PULL_UP | OMAP_WAKEUP_EN |			OMAP_MUX_MODE1 | OMAP_INPUT_EN,	},};static struct matrix_keymap_data sdp4430_keymap_data = {	.keymap			= sdp4430_keymap,	.keymap_size		= ARRAY_SIZE(sdp4430_keymap),};static struct omap4_keypad_platform_data sdp4430_keypad_data = {	.keymap_data		= &sdp4430_keymap_data,	.rows			= 8,	.cols			= 8,};static struct omap_board_data keypad_data = {	.id	    		= 1,	.pads	 		= keypad_pads,	.pads_cnt       	= ARRAY_SIZE(keypad_pads),};static struct gpio_led sdp4430_gpio_leds[] = {	{		.name	= "omap4:green:debug0",		.gpio	= 61,	},	{		.name	= "omap4:green:debug1",		.gpio	= 30,	},	{		.name	= "omap4:green:debug2",		.gpio	= 7,	},	{		.name	= "omap4:green:debug3",		.gpio	= 8,	},	{		.name	= "omap4:green:debug4",		.gpio	= 50,	},	{		.name	= "omap4:blue:user",		.gpio	= 169,	},	{		.name	= "omap4:red:user",		.gpio	= 170,	},	{		.name	= "omap4:green:user",		.gpio	= 139,	},};static struct gpio_keys_button sdp4430_gpio_keys[] = {	{		.desc			= "Proximity Sensor",		.type			= EV_SW,		.code			= SW_FRONT_PROXIMITY,		.gpio			= OMAP4_SFH7741_SENSOR_OUTPUT_GPIO,		.active_low		= 0,	}};static struct gpio_led_platform_data sdp4430_led_data = {	.leds	= sdp4430_gpio_leds,	.num_leds	= ARRAY_SIZE(sdp4430_gpio_leds),};static struct led_pwm sdp4430_pwm_leds[] = {	{		.name		= "omap4:green:chrg",		.pwm_id		= 1,		.max_brightness	= 255,		.pwm_period_ns	= 7812500,	},};static struct led_pwm_platform_data sdp4430_pwm_data = {	.num_leds	= ARRAY_SIZE(sdp4430_pwm_leds),	.leds		= sdp4430_pwm_leds,};static struct platform_device sdp4430_leds_pwm = {	.name	= "leds_pwm",	.id	= -1,	.dev	= {		.platform_data = &sdp4430_pwm_data,	},};static int omap_prox_activate(struct device *dev){	gpio_set_value(OMAP4_SFH7741_ENABLE_GPIO , 1);	return 0;}static void omap_prox_deactivate(struct device *dev){	gpio_set_value(OMAP4_SFH7741_ENABLE_GPIO , 0);}static struct gpio_keys_platform_data sdp4430_gpio_keys_data = {	.buttons	= sdp4430_gpio_keys,	.nbuttons	= ARRAY_SIZE(sdp4430_gpio_keys),	.enable		= omap_prox_activate,	.disable	= omap_prox_deactivate,};static struct platform_device sdp4430_gpio_keys_device = {	.name	= "gpio-keys",	.id	= -1,	.dev	= {		.platform_data	= &sdp4430_gpio_keys_data,	},};static struct platform_device sdp4430_leds_gpio = {	.name	= "leds-gpio",	.id	= -1,	.dev	= {		.platform_data = &sdp4430_led_data,	},};static struct spi_board_info sdp4430_spi_board_info[] __initdata = {	{		.modalias               = "ks8851",		.bus_num                = 1,		.chip_select            = 0,		.max_speed_hz           = 24000000,		/*		 * .irq is set to gpio_to_irq(ETH_KS8851_IRQ)		 * in omap_4430sdp_init		 */	},};static struct gpio sdp4430_eth_gpios[] __initdata = {	{ ETH_KS8851_POWER_ON,	GPIOF_OUT_INIT_HIGH,	"eth_power"	},	{ ETH_KS8851_QUART,	GPIOF_OUT_INIT_HIGH,	"quart"		},	{ ETH_KS8851_IRQ,	GPIOF_IN,		"eth_irq"	},};static int __init omap_ethernet_init(void){	int status;	/* Request of GPIO lines */	status = gpio_request_array(sdp4430_eth_gpios,				    ARRAY_SIZE(sdp4430_eth_gpios));	if (status)		pr_err("Cannot request ETH GPIOs\n");	return status;}static struct regulator_consumer_supply sdp4430_vbat_supply[] = {	REGULATOR_SUPPLY("vddvibl", "twl6040-vibra"),	REGULATOR_SUPPLY("vddvibr", "twl6040-vibra"),};static struct regulator_init_data sdp4430_vbat_data = {	.constraints = {		.always_on	= 1,	},	.num_consumer_supplies	= ARRAY_SIZE(sdp4430_vbat_supply),	.consumer_supplies	= sdp4430_vbat_supply,};static struct fixed_voltage_config sdp4430_vbat_pdata = {	.supply_name	= "VBAT",	.microvolts	= 3750000,	.init_data	= &sdp4430_vbat_data,	.gpio		= -EINVAL,};static struct platform_device sdp4430_vbat = {	.name		= "reg-fixed-voltage",	.id		= -1,	.dev = {		.platform_data = &sdp4430_vbat_pdata,	},};static struct platform_device sdp4430_dmic_codec = {	.name	= "dmic-codec",	.id	= -1,};static struct platform_device sdp4430_hdmi_audio_codec = {	.name	= "hdmi-audio-codec",	.id	= -1,};static struct omap_abe_twl6040_data sdp4430_abe_audio_data = {	.card_name = "SDP4430",	.has_hs		= ABE_TWL6040_LEFT | ABE_TWL6040_RIGHT,	.has_hf		= ABE_TWL6040_LEFT | ABE_TWL6040_RIGHT,	.has_ep		= 1,	.has_aux	= ABE_TWL6040_LEFT | ABE_TWL6040_RIGHT,	.has_vibra	= ABE_TWL6040_LEFT | ABE_TWL6040_RIGHT,	.has_dmic	= 1,	.has_hsmic	= 1,	.has_mainmic	= 1,	.has_submic	= 1,	.has_afm	= ABE_TWL6040_LEFT | ABE_TWL6040_RIGHT,	.jack_detection = 1,	/* MCLK input is 38.4MHz */	.mclk_freq	= 38400000,};static struct platform_device sdp4430_abe_audio = {	.name		= "omap-abe-twl6040",	.id		= -1,	.dev = {		.platform_data = &sdp4430_abe_audio_data,	},};static struct platform_device *sdp4430_devices[] __initdata = {	&sdp4430_gpio_keys_device,	&sdp4430_leds_gpio,	&sdp4430_leds_pwm,	&sdp4430_vbat,	&sdp4430_dmic_codec,	&sdp4430_abe_audio,	&sdp4430_hdmi_audio_codec,};static struct omap_musb_board_data musb_board_data = {	.interface_type		= MUSB_INTERFACE_UTMI,	.mode			= MUSB_OTG,	.power			= 100,};static struct omap2_hsmmc_info mmc[] = {	{		.mmc		= 2,		.caps		=  MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,		.gpio_cd	= -EINVAL,		.gpio_wp	= -EINVAL,		.nonremovable   = true,		.ocr_mask	= MMC_VDD_29_30,		.no_off_init	= true,
 |