From c3c5a46136cec454460e4bfceddf37507d245ed4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20H=C3=B6ppner?= <jonas.hoeppner@garz-fricke.com>
Date: Tue, 26 Sep 2023 17:21:32 +0200
Subject: [PATCH] gpu:drm:panel-lvds: Add sel6/8 gpio support

The sel6/8 gpio is needed to toggle between 18bpp and 24bpp. This allow
to specify the gpio in the devicetree.

(cherry picked from commit b6581905c9c020fd28f6f788a60aa170a1ceb031)
---
 drivers/gpu/drm/panel/panel-lvds.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/drivers/gpu/drm/panel/panel-lvds.c b/drivers/gpu/drm/panel/panel-lvds.c
index 66c7d765b8f78..fdb63ec317a3a 100644
--- a/drivers/gpu/drm/panel/panel-lvds.c
+++ b/drivers/gpu/drm/panel/panel-lvds.c
@@ -37,6 +37,7 @@ struct panel_lvds {
 
 	struct gpio_desc *enable_gpio;
 	struct gpio_desc *reset_gpio;
+	struct gpio_desc *sel6_8_gpio;
 
 	enum drm_panel_orientation orientation;
 };
@@ -63,6 +64,12 @@ static int panel_lvds_prepare(struct drm_panel *panel)
 {
 	struct panel_lvds *lvds = to_panel_lvds(panel);
 
+	/* The sel6_8_gpio configures some displays to use 6 or 8 bit per color
+	 */
+	if (lvds->sel6_8_gpio)
+		gpiod_set_value_cansleep(lvds->sel6_8_gpio,
+			(lvds->bus_format != MEDIA_BUS_FMT_RGB666_1X7X3_SPWG ));
+
 	if (lvds->supply) {
 		int err;
 
@@ -221,6 +228,15 @@ static int panel_lvds_probe(struct platform_device *pdev)
 		return ret;
 	}
 
+	lvds->sel6_8_gpio = devm_gpiod_get_optional(lvds->dev, "sel6_8",
+						     GPIOD_OUT_LOW);
+	if (IS_ERR(lvds->sel6_8_gpio)) {
+		ret = PTR_ERR(lvds->sel6_8_gpio);
+		dev_info(lvds->dev, "failed to request %s GPIO: %d\n",
+			"sel6_8", ret);
+		return ret;
+	}
+
 	/*
 	 * TODO: Handle all power supplies specified in the DT node in a generic
 	 * way for panels that don't care about power supply ordering. LVDS
-- 
GitLab