diff options
Diffstat (limited to 'arch/arm/mach-omap2/board-omap4panda.c')
| -rw-r--r-- | arch/arm/mach-omap2/board-omap4panda.c | 89 | 
1 files changed, 82 insertions, 7 deletions
diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index e944025d5ef..a94ce07be72 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c @@ -26,6 +26,8 @@  #include <linux/usb/otg.h>  #include <linux/i2c/twl.h>  #include <linux/regulator/machine.h> +#include <linux/regulator/fixed.h> +#include <linux/wl12xx.h>  #include <mach/hardware.h>  #include <mach/omap4-common.h> @@ -45,6 +47,18 @@  #define GPIO_HUB_POWER		1  #define GPIO_HUB_NRESET		62 +#define GPIO_WIFI_PMENA		43 +#define GPIO_WIFI_IRQ		53 + +/* wl127x BT, FM, GPS connectivity chip */ +static int wl1271_gpios[] = {46, -1, -1}; +static struct platform_device wl1271_device = { +	.name	= "kim", +	.id	= -1, +	.dev	= { +		.platform_data	= &wl1271_gpios, +	}, +};  static struct gpio_led gpio_leds[] = {  	{ @@ -74,13 +88,13 @@ static struct platform_device leds_gpio = {  static struct platform_device *panda_devices[] __initdata = {  	&leds_gpio, +	&wl1271_device,  }; -static void __init omap4_panda_init_irq(void) +static void __init omap4_panda_init_early(void)  {  	omap2_init_common_infrastructure();  	omap2_init_common_devices(NULL, NULL); -	gic_init_irq();  }  static const struct ehci_hcd_omap_platform_data ehci_pdata __initconst = { @@ -162,16 +176,62 @@ static struct omap2_hsmmc_info mmc[] = {  		.gpio_wp	= -EINVAL,  		.gpio_cd	= -EINVAL,  	}, +	{ +		.name		= "wl1271", +		.mmc		= 5, +		.caps		= MMC_CAP_4_BIT_DATA | MMC_CAP_POWER_OFF_CARD, +		.gpio_wp	= -EINVAL, +		.gpio_cd	= -EINVAL, +		.ocr_mask	= MMC_VDD_165_195, +		.nonremovable	= true, +	},  	{}	/* Terminator */  };  static struct regulator_consumer_supply omap4_panda_vmmc_supply[] = {  	{  		.supply = "vmmc", -		.dev_name = "mmci-omap-hs.0", +		.dev_name = "omap_hsmmc.0", +	}, +}; + +static struct regulator_consumer_supply omap4_panda_vmmc5_supply = { +	.supply = "vmmc", +	.dev_name = "omap_hsmmc.4", +}; + +static struct regulator_init_data panda_vmmc5 = { +	.constraints = { +		.valid_ops_mask = REGULATOR_CHANGE_STATUS, +	}, +	.num_consumer_supplies = 1, +	.consumer_supplies = &omap4_panda_vmmc5_supply, +}; + +static struct fixed_voltage_config panda_vwlan = { +	.supply_name = "vwl1271", +	.microvolts = 1800000, /* 1.8V */ +	.gpio = GPIO_WIFI_PMENA, +	.startup_delay = 70000, /* 70msec */ +	.enable_high = 1, +	.enabled_at_boot = 0, +	.init_data = &panda_vmmc5, +}; + +static struct platform_device omap_vwlan_device = { +	.name		= "reg-fixed-voltage", +	.id		= 1, +	.dev = { +		.platform_data = &panda_vwlan,  	},  }; +struct wl12xx_platform_data omap_panda_wlan_data  __initdata = { +	.irq = OMAP_GPIO_IRQ(GPIO_WIFI_IRQ), +	/* PANDA ref clock is 38.4 MHz */ +	.board_ref_clock = 2, +}; +  static int omap4_twl6030_hsmmc_late_init(struct device *dev)  {  	int ret = 0; @@ -305,7 +365,6 @@ static struct regulator_init_data omap4_panda_vana = {  	.constraints = {  		.min_uV			= 2100000,  		.max_uV			= 2100000, -		.apply_uV		= true,  		.valid_modes_mask	= REGULATOR_MODE_NORMAL  					| REGULATOR_MODE_STANDBY,  		.valid_ops_mask	 = REGULATOR_CHANGE_MODE @@ -317,7 +376,6 @@ static struct regulator_init_data omap4_panda_vcxio = {  	.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 @@ -329,7 +387,6 @@ static struct regulator_init_data omap4_panda_vdac = {  	.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 @@ -391,6 +448,19 @@ static int __init omap4_panda_i2c_init(void)  #ifdef CONFIG_OMAP_MUX  static struct omap_board_mux board_mux[] __initdata = { +	/* WLAN IRQ - GPIO 53 */ +	OMAP4_MUX(GPMC_NCS3, OMAP_MUX_MODE3 | OMAP_PIN_INPUT), +	/* WLAN POWER ENABLE - GPIO 43 */ +	OMAP4_MUX(GPMC_A19, OMAP_MUX_MODE3 | OMAP_PIN_OUTPUT), +	/* WLAN SDIO: MMC5 CMD */ +	OMAP4_MUX(SDMMC5_CMD, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP), +	/* WLAN SDIO: MMC5 CLK */ +	OMAP4_MUX(SDMMC5_CLK, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP), +	/* WLAN SDIO: MMC5 DAT[0-3] */ +	OMAP4_MUX(SDMMC5_DAT0, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP), +	OMAP4_MUX(SDMMC5_DAT1, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP), +	OMAP4_MUX(SDMMC5_DAT2, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP), +	OMAP4_MUX(SDMMC5_DAT3, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP),  	{ .reg_offset = OMAP_MUX_TERMINATOR },  };  #else @@ -405,8 +475,12 @@ static void __init omap4_panda_init(void)  		package = OMAP_PACKAGE_CBL;  	omap4_mux_init(board_mux, package); +	if (wl12xx_set_platform_data(&omap_panda_wlan_data)) +		pr_err("error setting wl12xx data\n"); +  	omap4_panda_i2c_init();  	platform_add_devices(panda_devices, ARRAY_SIZE(panda_devices)); +	platform_device_register(&omap_vwlan_device);  	omap_serial_init();  	omap4_twl6030_hsmmc_init(mmc);  	omap4_ehci_init(); @@ -424,7 +498,8 @@ MACHINE_START(OMAP4_PANDA, "OMAP4 Panda board")  	.boot_params	= 0x80000100,  	.reserve	= omap_reserve,  	.map_io		= omap4_panda_map_io, -	.init_irq	= omap4_panda_init_irq, +	.init_early	= omap4_panda_init_early, +	.init_irq	= gic_init_irq,  	.init_machine	= omap4_panda_init,  	.timer		= &omap_timer,  MACHINE_END  |