From: Vincent Palatin Date: Tue, 5 Mar 2013 02:22:41 +0000 (-0800) Subject: CHROMIUM: drm/bridge: control LCD and backlight FETs X-Git-Url: http://git.cascardo.eti.br/?a=commitdiff_plain;h=2d360e2d84bb21aed3c6eac61465a79c1554f7bb;p=cascardo%2Flinux.git CHROMIUM: drm/bridge: control LCD and backlight FETs Ensure we are powering on and off the FETs controlling the backlight and the LCD VDD. Signed-off-by: Vincent Palatin BUG=chrome-os-partner:18122 TEST=on Spring, use "powerd_suspend" to suspend the machine, and check the state of the TPS65090 FETs by using the "pmu" on the EC command line. Change-Id: I3a0d03fdac18b4d13de2d33de6ba2e0429dd0daf Reviewed-on: https://gerrit.chromium.org/gerrit/44599 Reviewed-by: Todd Broch Reviewed-by: Stéphane Marchesin Commit-Queue: Vincent Palatin Tested-by: Vincent Palatin --- diff --git a/drivers/gpu/drm/bridge/ps8622.c b/drivers/gpu/drm/bridge/ps8622.c index 0f89ec0fa6ce..88266f6976b9 100644 --- a/drivers/gpu/drm/bridge/ps8622.c +++ b/drivers/gpu/drm/bridge/ps8622.c @@ -34,6 +34,8 @@ struct ps8622_bridge { struct i2c_client *client; struct regulator *v12; + struct regulator *bck_fet; + struct regulator *lcd_fet; struct backlight_device *bl; int gpio_slp_n; @@ -169,6 +171,10 @@ static void ps8622_power_up(struct ps8622_bridge *bridge) if (bridge->v12) regulator_enable(bridge->v12); + if (bridge->bck_fet) + regulator_enable(bridge->bck_fet); + if (bridge->lcd_fet) + regulator_enable(bridge->lcd_fet); if (gpio_is_valid(bridge->gpio_slp_n)) gpio_set_value(bridge->gpio_slp_n, 1); @@ -199,6 +205,10 @@ static void ps8622_power_down(struct ps8622_bridge *bridge) if (gpio_is_valid(bridge->gpio_slp_n)) gpio_set_value(bridge->gpio_slp_n, 0); + if (bridge->lcd_fet) + regulator_disable(bridge->lcd_fet); + if (bridge->bck_fet) + regulator_disable(bridge->bck_fet); if (bridge->v12) regulator_disable(bridge->v12); } @@ -254,6 +264,10 @@ void ps8622_destroy(struct drm_bridge *dbridge) drm_bridge_cleanup(dbridge); if (bridge->bl) backlight_device_unregister(bridge->bl); + if (bridge->lcd_fet) + regulator_put(bridge->lcd_fet); + if (bridge->bck_fet) + regulator_put(bridge->bck_fet); if (bridge->v12) regulator_put(bridge->v12); if (gpio_is_valid(bridge->gpio_slp_n)) @@ -284,6 +298,16 @@ int ps8622_init(struct drm_device *dev, struct i2c_client *client, DRM_ERROR("no 1.2v regulator found for PS8622\n"); bridge->v12 = NULL; } + bridge->bck_fet = regulator_get(&client->dev, "vcd_led"); + if (IS_ERR(bridge->bck_fet)) { + DRM_ERROR("no regulator found for backlight FET\n"); + bridge->bck_fet = NULL; + } + bridge->lcd_fet = regulator_get(&client->dev, "lcd_vdd"); + if (IS_ERR(bridge->lcd_fet)) { + DRM_ERROR("no regulator found for LCD FET\n"); + bridge->lcd_fet = NULL; + } bridge->gpio_slp_n = of_get_named_gpio(node, "sleep-gpio", 0); if (gpio_is_valid(bridge->gpio_slp_n)) { @@ -338,6 +362,10 @@ err_gpio: if (gpio_is_valid(bridge->gpio_slp_n)) gpio_free(bridge->gpio_slp_n); err_reg: + if (bridge->bck_fet) + regulator_put(bridge->bck_fet); + if (bridge->lcd_fet) + regulator_put(bridge->lcd_fet); if (bridge->v12) regulator_put(bridge->v12); DRM_ERROR("device probe failed : %d\n", ret);