Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 18c44db8 authored by Ezequiel Garcia's avatar Ezequiel Garcia Committed by Dave Airlie
Browse files

drm/tilcdc: panel: Fix backlight devicetree support



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: default avatarDarren Etheridge <detheridge@ti.com>
Tested-by: default avatarJohannes Pointner <johannes.pointner@br-automation.com>
Signed-off-by: default avatarEzequiel Garcia <ezequiel@vanguardiasur.com.ar>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 971645d1
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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>;
+18 −5
Original line number Diff line number Diff line
@@ -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 @@ static int panel_probe(struct platform_device *pdev)

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);