drm/tilcdc: panel: Fix backlight devicetree support
authorEzequiel Garcia <ezequiel@vanguardiasur.com.ar>
Tue, 2 Sep 2014 12:51:20 +0000 (09:51 -0300)
committerDave Airlie <airlied@redhat.com>
Wed, 17 Sep 2014 00:55:10 +0000 (10:55 +1000)
The current backlight support is broken; the driver expects a backlight-class
in the panel devicetree node. Fix this by implementing it properly, getting
an optional backlight from a phandle.

This shouldn't cause any backward-compatibility DT issue because the current
implementation doesn't work and is not even documented.

Tested-by: Darren Etheridge <detheridge@ti.com>
Tested-by: Johannes Pointner <johannes.pointner@br-automation.com>
Signed-off-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Documentation/devicetree/bindings/drm/tilcdc/panel.txt
drivers/gpu/drm/tilcdc/tilcdc_panel.c

index 9301c330d1a64513116e43c6e010a7de17b74ce7..10a06e826b4abd8c5d720cc59aafda285c91800e 100644 (file)
@@ -18,6 +18,9 @@ Required properties:
    Documentation/devicetree/bindings/video/display-timing.txt for display
    timing binding details.
 
+Optional properties:
+- backlight: phandle of the backlight device attached to the panel
+
 Recommended properties:
  - pinctrl-names, pinctrl-0: the pincontrol settings to configure
    muxing properly for pins that connect to TFP410 device
@@ -29,6 +32,8 @@ Example:
                compatible = "ti,tilcdc,panel";
                pinctrl-names = "default";
                pinctrl-0 = <&bone_lcd3_cape_lcd_pins>;
+               backlight = <&backlight>;
+
                panel-info {
                        ac-bias           = <255>;
                        ac-bias-intrpt    = <0>;
index c716c128ded26c94e5e55344468047cc84afc884..3dcf08e4dc910dda14e44aa3d05dcd6290462e3f 100644 (file)
@@ -342,7 +342,7 @@ static struct tilcdc_panel_info *of_get_panel_info(struct device_node *np)
 
 static int panel_probe(struct platform_device *pdev)
 {
-       struct device_node *node = pdev->dev.of_node;
+       struct device_node *bl_node, *node = pdev->dev.of_node;
        struct panel_module *panel_mod;
        struct tilcdc_module *mod;
        struct pinctrl *pinctrl;
@@ -358,6 +358,17 @@ static int panel_probe(struct platform_device *pdev)
        if (!panel_mod)
                return -ENOMEM;
 
+       bl_node = of_parse_phandle(node, "backlight", 0);
+       if (bl_node) {
+               panel_mod->backlight = of_find_backlight_by_node(bl_node);
+               of_node_put(bl_node);
+
+               if (!panel_mod->backlight)
+                       return -EPROBE_DEFER;
+
+               dev_info(&pdev->dev, "found backlight\n");
+       }
+
        mod = &panel_mod->base;
        pdev->dev.platform_data = mod;
 
@@ -381,10 +392,6 @@ static int panel_probe(struct platform_device *pdev)
 
        mod->preferred_bpp = panel_mod->info->bpp;
 
-       panel_mod->backlight = of_find_backlight_by_node(node);
-       if (panel_mod->backlight)
-               dev_info(&pdev->dev, "found backlight\n");
-
        return 0;
 
 fail_timings:
@@ -392,6 +399,8 @@ fail_timings:
 
 fail_free:
        tilcdc_module_cleanup(mod);
+       if (panel_mod->backlight)
+               put_device(&panel_mod->backlight->dev);
        return ret;
 }
 
@@ -399,6 +408,10 @@ static int panel_remove(struct platform_device *pdev)
 {
        struct tilcdc_module *mod = dev_get_platdata(&pdev->dev);
        struct panel_module *panel_mod = to_panel_module(mod);
+       struct backlight_device *backlight = panel_mod->backlight;
+
+       if (backlight)
+               put_device(&backlight->dev);
 
        display_timings_release(panel_mod->timings);