struct gpio_backlight *gbl)
 {
        struct device *dev = &pdev->dev;
-       enum gpiod_flags flags;
        int ret;
 
        gbl->def_value = device_property_read_bool(dev, "default-on");
-       flags = gbl->def_value ? GPIOD_OUT_HIGH : GPIOD_OUT_LOW;
 
-       gbl->gpiod = devm_gpiod_get(dev, NULL, flags);
+       gbl->gpiod = devm_gpiod_get(dev, NULL, GPIOD_ASIS);
        if (IS_ERR(gbl->gpiod)) {
                ret = PTR_ERR(gbl->gpiod);
 
        return 0;
 }
 
+static int gpio_backlight_initial_power_state(struct gpio_backlight *gbl)
+{
+       struct device_node *node = gbl->dev->of_node;
+
+       /* Not booted with device tree or no phandle link to the node */
+       if (!node || !node->phandle)
+               return gbl->def_value ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN;
+
+       /* if the enable GPIO is disabled, do not enable the backlight */
+       if (gpiod_get_value_cansleep(gbl->gpiod) == 0)
+               return FB_BLANK_POWERDOWN;
+
+       return FB_BLANK_UNBLANK;
+}
+
+
 static int gpio_backlight_probe(struct platform_device *pdev)
 {
        struct gpio_backlight_platform_data *pdata =
                return PTR_ERR(bl);
        }
 
-       bl->props.brightness = gbl->def_value;
+       bl->props.power = gpio_backlight_initial_power_state(gbl);
+       bl->props.brightness = 1;
+
        backlight_update_status(bl);
 
        platform_set_drvdata(pdev, bl);