Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a271c6cd authored by Enric Balletbo i Serra's avatar Enric Balletbo i Serra Committed by Tony Lindgren
Browse files

omap3: igep3: Fix IGEP module second MMC channel power supply



The second MMC channel (used by the WLAN/BT module) is not linked to
power regulator. This causes the WLAN/BT module to fail being detected if
CONFIG_REGULATOR_DUMMY is not set.

This patch adds the two regulators that actually feed the WLAN/BT module
(1v8 from the TWL4030 VIO LDO, and a fixed 3v3). With that patch, the
second channel is properly detected.

Also change vmmc1 to use symbolic names instead of direct device
reference.

Signed-off-by: default avatarEnric Balletbo i Serra <eballetbo@gmail.com>
Acked-by: default avatarMarc Zyngier <maz@misterjones.org>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 7b0d4b71
Loading
Loading
Loading
Loading
+55 −10
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include <linux/interrupt.h>

#include <linux/regulator/machine.h>
#include <linux/regulator/fixed.h>
#include <linux/i2c/twl.h>
#include <linux/mmc/host.h>

@@ -140,9 +141,8 @@ static void __init igep3_flash_init(void)
static void __init igep3_flash_init(void) {}
#endif

static struct regulator_consumer_supply igep3_vmmc1_supply = {
	.supply		= "vmmc",
};
static struct regulator_consumer_supply igep3_vmmc1_supply =
	REGULATOR_SUPPLY("vmmc", "mmci-omap-hs.0");

/* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */
static struct regulator_init_data igep3_vmmc1 = {
@@ -159,6 +159,52 @@ static struct regulator_init_data igep3_vmmc1 = {
	.consumer_supplies      = &igep3_vmmc1_supply,
};

static struct regulator_consumer_supply igep3_vio_supply =
	REGULATOR_SUPPLY("vmmc_aux", "mmci-omap-hs.1");

static struct regulator_init_data igep3_vio = {
	.constraints = {
		.min_uV			= 1800000,
		.max_uV			= 1800000,
		.apply_uV		= 1,
		.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,
	.consumer_supplies	= &igep3_vio_supply,
};

static struct regulator_consumer_supply igep3_vmmc2_supply =
	REGULATOR_SUPPLY("vmmc", "mmci-omap-hs.1");

static struct regulator_init_data igep3_vmmc2 = {
	.constraints	= {
		.valid_modes_mask	= REGULATOR_MODE_NORMAL,
		.always_on		= 1,
	},
	.num_consumer_supplies	= 1,
	.consumer_supplies	= &igep3_vmmc2_supply,
};

static struct fixed_voltage_config igep3_vwlan = {
	.supply_name		= "vwlan",
	.microvolts		= 3300000,
	.gpio			= -EINVAL,
	.enabled_at_boot	= 1,
	.init_data		= &igep3_vmmc2,
};

static struct platform_device igep3_vwlan_device = {
	.name	= "reg-fixed-voltage",
	.id	= 0,
	.dev	= {
		.platform_data = &igep3_vwlan,
	},
};

static struct omap2_hsmmc_info mmc[] = {
	[0] = {
		.mmc		= 1,
@@ -254,12 +300,6 @@ static int igep3_twl4030_gpio_setup(struct device *dev,
	mmc[0].gpio_cd = gpio + 0;
	omap2_hsmmc_init(mmc);

	/*
	 * link regulators to MMC adapters ... we "know" the
	 * regulators will be set up only *after* we return.
	 */
	igep3_vmmc1_supply.dev = mmc[0].dev;

	/* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */
#if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE)
	if ((gpio_request(gpio+TWL4030_GPIO_MAX+1, "gpio-led:green:d1") == 0)
@@ -287,6 +327,10 @@ static struct twl4030_usb_data igep3_twl4030_usb_data = {
	.usb_mode	= T2_USB_MODE_ULPI,
};

static struct platform_device *igep3_devices[] __initdata = {
	&igep3_vwlan_device,
};

static void __init igep3_init_irq(void)
{
	omap2_init_common_infrastructure();
@@ -303,6 +347,7 @@ static struct twl4030_platform_data igep3_twl4030_pdata = {
	.usb		= &igep3_twl4030_usb_data,
	.gpio		= &igep3_twl4030_gpio_pdata,
	.vmmc1		= &igep3_vmmc1,
	.vio		= &igep3_vio,
};

static struct i2c_board_info __initdata igep3_i2c_boardinfo[] = {
@@ -387,7 +432,7 @@ static void __init igep3_init(void)

	/* Register I2C busses and drivers */
	igep3_i2c_init();

	platform_add_devices(igep3_devices, ARRAY_SIZE(igep3_devices));
	omap_serial_init();
	usb_musb_init(&musb_board_data);
	usb_ehci_init(&ehci_pdata);