CHROMIUM: drm/bridge: control LCD and backlight FETs
authorVincent Palatin <vpalatin@chromium.org>
Tue, 5 Mar 2013 02:22:41 +0000 (18:22 -0800)
committerChromeBot <chrome-bot@google.com>
Tue, 5 Mar 2013 19:44:43 +0000 (11:44 -0800)
Ensure we are powering on and off the FETs controlling the backlight and
the LCD VDD.

Signed-off-by: Vincent Palatin <vpalatin@chromium.org>
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 <tbroch@chromium.org>
Reviewed-by: Stéphane Marchesin <marcheu@chromium.org>
Commit-Queue: Vincent Palatin <vpalatin@chromium.org>
Tested-by: Vincent Palatin <vpalatin@chromium.org>
drivers/gpu/drm/bridge/ps8622.c

index 0f89ec0..88266f6 100644 (file)
@@ -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);