video: fbdev: pxafb: Add support for lcd-supply regulator
[linux-2.6-microblaze.git] / drivers / video / fbdev / pxafb.c
index 68459b0..bbed039 100644 (file)
@@ -56,6 +56,7 @@
 #include <linux/freezer.h>
 #include <linux/console.h>
 #include <linux/of_graph.h>
+#include <linux/regulator/consumer.h>
 #include <video/of_display_timing.h>
 #include <video/videomode.h>
 
@@ -1423,6 +1424,21 @@ static inline void __pxafb_lcd_power(struct pxafb_info *fbi, int on)
 
        if (fbi->lcd_power)
                fbi->lcd_power(on, &fbi->fb.var);
+
+       if (fbi->lcd_supply && fbi->lcd_supply_enabled != on) {
+               int ret;
+
+               if (on)
+                       ret = regulator_enable(fbi->lcd_supply);
+               else
+                       ret = regulator_disable(fbi->lcd_supply);
+
+               if (ret < 0)
+                       pr_warn("Unable to %s LCD supply regulator: %d\n",
+                               on ? "enable" : "disable", ret);
+               else
+                       fbi->lcd_supply_enabled = on;
+       }
 }
 
 static void pxafb_enable_controller(struct pxafb_info *fbi)
@@ -2299,6 +2315,14 @@ static int pxafb_probe(struct platform_device *dev)
        fbi->backlight_power = inf->pxafb_backlight_power;
        fbi->lcd_power = inf->pxafb_lcd_power;
 
+       fbi->lcd_supply = devm_regulator_get_optional(&dev->dev, "lcd");
+       if (IS_ERR(fbi->lcd_supply)) {
+               if (PTR_ERR(fbi->lcd_supply) == -EPROBE_DEFER)
+                       return -EPROBE_DEFER;
+
+               fbi->lcd_supply = NULL;
+       }
+
        r = platform_get_resource(dev, IORESOURCE_MEM, 0);
        if (r == NULL) {
                dev_err(&dev->dev, "no I/O memory resource defined\n");