Hi Andy, On 11/26/2012 02:45 PM, Andy Green wrote: > This adds regulators which are controlled by the OMAP4 PandaBoard (ES)'s > EHCI logical root hub existing. > > Without power control, the ULPI PHY + SMSC9614 on the Panda eats 700-900mW > all the time, which is around the same as the idle power of the SoC and > rest of the board. > > This allows us to start off with it depowered, and only power it if the > ehci-hcd module is inserted. When the module is removed, it's depowered > again. > > Signed-off-by: Andy Green <andy.green@xxxxxxxxxx> > --- > arch/arm/mach-omap2/Kconfig | 1 > arch/arm/mach-omap2/board-omap4panda.c | 90 +++++++++++++++++++++++++------- > 2 files changed, 72 insertions(+), 19 deletions(-) > > diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig > index d669e22..5105109 100644 > --- a/arch/arm/mach-omap2/Kconfig > +++ b/arch/arm/mach-omap2/Kconfig > @@ -368,6 +368,7 @@ config MACH_OMAP4_PANDA > select OMAP_PACKAGE_CBL > select OMAP_PACKAGE_CBS > select REGULATOR_FIXED_VOLTAGE if REGULATOR > + select USB_HUB_DEVICE_PATH_REGULATOR > > config OMAP3_EMU > bool "OMAP3 debugging peripherals" > diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c > index bfcd397..b032b6b 100644 > --- a/arch/arm/mach-omap2/board-omap4panda.c > +++ b/arch/arm/mach-omap2/board-omap4panda.c > @@ -154,11 +154,6 @@ static const struct usbhs_omap_board_data usbhs_bdata __initconst = { > .reset_gpio_port[2] = -EINVAL > }; > > -static struct gpio panda_ehci_gpios[] __initdata = { > - { GPIO_HUB_POWER, GPIOF_OUT_INIT_LOW, "hub_power" }, > - { GPIO_HUB_NRESET, GPIOF_OUT_INIT_LOW, "hub_nreset" }, > -}; > - > static void __init omap4_ehci_init(void) > { > int ret; > @@ -173,23 +168,76 @@ static void __init omap4_ehci_init(void) > clk_set_rate(phy_ref_clk, 19200000); > clk_prepare_enable(phy_ref_clk); > > - /* disable the power to the usb hub prior to init and reset phy+hub */ > - ret = gpio_request_array(panda_ehci_gpios, > - ARRAY_SIZE(panda_ehci_gpios)); > - if (ret) { > - pr_err("Unable to initialize EHCI power/reset\n"); > - return; > - } > + usbhs_init(&usbhs_bdata); > +} > > - gpio_export(GPIO_HUB_POWER, 0); > - gpio_export(GPIO_HUB_NRESET, 0); > - gpio_set_value(GPIO_HUB_NRESET, 1); > +/* > + * hub_nreset also resets the ULPI PHY and is required after powering SMSC chip > + * ULPI PHY is always powered... need to do reset once for both once > + * hub_power enables a 3.3V regulator for (hub + eth) chip > + * however there's no point having ULPI PHY in use alone > + * since it's only connected to the (hub + eth) chip > + */ > > - usbhs_init(&usbhs_bdata); > +static struct regulator_init_data panda_hub = { > + .constraints = { > + .name = "vhub", > + .valid_ops_mask = REGULATOR_CHANGE_STATUS, > + }, > +}; > > - /* enable power to hub */ > - gpio_set_value(GPIO_HUB_POWER, 1); > -} > +static struct fixed_voltage_config panda_vhub = { > + .supply_name = "vhub", > + .microvolts = 3300000, > + .gpio = GPIO_HUB_POWER, > + .startup_delay = 70000, /* 70msec */ > + .enable_high = 1, > + .enabled_at_boot = 0, > + .init_data = &panda_hub, > +}; > + > +static struct platform_device omap_vhub_device = { > + .name = "reg-fixed-voltage", > + .id = 2, > + .dev = { > + .platform_data = &panda_vhub, > + }, > +}; > + > +static struct regulator_init_data panda_ulpireset = { > + /* > + * idea is that when operating ulpireset, regulator api will make > + * sure that the hub+eth chip is powered, since it's the "parent" > + */ > + .supply_regulator = "vhub", /* we are a child of vhub */ > + .constraints = { > + /* > + * this magic string associates us with ehci-omap.0 root hub > + * when the root hub logical device is up, we will power > + * and reset [ ULPI PHY + [ HUB + ETH ] ] > + */ > + .name = "/platform/usbhs_omap/ehci-omap.0/usb*", > + .valid_ops_mask = REGULATOR_CHANGE_STATUS, > + }, > +}; > + > +static struct fixed_voltage_config panda_vulpireset = { > + .supply_name = "/platform/usbhs_omap/ehci-omap.0/usb*", Does this supply_name really needs to be the magic string? > + .microvolts = 3300000, > + .gpio = GPIO_HUB_NRESET, > + .startup_delay = 70000, /* 70msec */ > + .enable_high = 1, > + .enabled_at_boot = 0, > + .init_data = &panda_ulpireset, > +}; > + > +static struct platform_device omap_vulpireset_device = { > + .name = "reg-fixed-voltage", > + .id = 3, > + .dev = { > + .platform_data = &panda_vulpireset, > + }, > +}; > > static struct omap_musb_board_data musb_board_data = { > .interface_type = MUSB_INTERFACE_UTMI, > @@ -503,7 +551,11 @@ static void __init omap4_panda_init(void) > omap4_panda_init_rev(); > omap4_panda_i2c_init(); > platform_add_devices(panda_devices, ARRAY_SIZE(panda_devices)); > + /* let device_path api know anything matching this reports as this */ > + device_path_register_wildcard_path(panda_ulpireset.constraints.name); > platform_device_register(&omap_vwlan_device); > + platform_device_register(&omap_vhub_device); > + platform_device_register(&omap_vulpireset_device); > omap_serial_init(); > omap_sdrc_init(NULL, NULL); > omap4_twl6030_hsmmc_init(mmc); > -- cheers, -roger -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html