From d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 11 Dec 2023 02:45:28 +0000
Subject: [PATCH] add boot partition  size

---
 kernel/drivers/gpu/drm/bridge/lontium-lt9611.c |  119 ++++++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 96 insertions(+), 23 deletions(-)

diff --git a/kernel/drivers/gpu/drm/bridge/lontium-lt9611.c b/kernel/drivers/gpu/drm/bridge/lontium-lt9611.c
index 1908080..1dcc28a 100644
--- a/kernel/drivers/gpu/drm/bridge/lontium-lt9611.c
+++ b/kernel/drivers/gpu/drm/bridge/lontium-lt9611.c
@@ -11,13 +11,14 @@
 #include <linux/platform_device.h>
 #include <linux/regmap.h>
 #include <linux/regulator/consumer.h>
-#include <drm/drm_crtc_helper.h>
+
 #include <sound/hdmi-codec.h>
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge.h>
 #include <drm/drm_mipi_dsi.h>
 #include <drm/drm_print.h>
+#include <drm/drm_probe_helper.h>
 
 #define EDID_SEG_SIZE	256
 #define EDID_LEN	32
@@ -46,6 +47,7 @@
 	struct gpio_desc *enable_gpio;
 
 	bool power_on;
+	bool sleep;
 
 	struct regulator_bulk_data supplies[2];
 
@@ -93,8 +95,6 @@
 	{ 1920, 1080, 60, 4, 1 }, /* 1080P 24bit 60Hz 4lane 1port */
 	{ 1920, 1080, 30, 3, 1 }, /* 1080P 24bit 30Hz 3lane 1port */
 	{ 1920, 1080, 24, 3, 1 },
-	{ 1280, 720, 60, 4, 1 },
-	{ 1280, 720, 30, 4, 1 },
 	{ 720, 480, 60, 4, 1 },
 	{ 720, 576, 50, 2, 1 },
 	{ 640, 480, 60, 2, 1 },
@@ -230,14 +230,8 @@
 	case 640:
 		regmap_write(lt9611->regmap, 0x8326, 0x14);
 		break;
-	case 1280:
-		regmap_write(lt9611->regmap, 0x8326, 0x1c);
-		break;
 	case 1920:
-		if (drm_mode_vrefresh(mode) == 30)
-			regmap_write(lt9611->regmap, 0x8326, 0x1c);
-		else
-			regmap_write(lt9611->regmap, 0x8326, 0x37);
+		regmap_write(lt9611->regmap, 0x8326, 0x37);
 		break;
 	case 3840:
 		regmap_multi_reg_write(lt9611->regmap, reg_cfg2, ARRAY_SIZE(reg_cfg2));
@@ -443,6 +437,26 @@
 	regmap_write(lt9611->regmap, 0x8203, val);
 	regmap_write(lt9611->regmap, 0x8207, 0xff); /* clear */
 	regmap_write(lt9611->regmap, 0x8207, 0x3f);
+}
+
+static void lt9611_sleep_setup(struct lt9611 *lt9611)
+{
+	const struct reg_sequence sleep_setup[] = {
+		{ 0x8024, 0x76 },
+		{ 0x8023, 0x01 },
+		{ 0x8157, 0x03 }, /* set addr pin as output */
+		{ 0x8149, 0x0b },
+		{ 0x8151, 0x30 }, /* disable IRQ */
+		{ 0x8102, 0x48 }, /* MIPI Rx power down */
+		{ 0x8123, 0x80 },
+		{ 0x8130, 0x00 },
+		{ 0x8100, 0x01 }, /* bandgap power down */
+		{ 0x8101, 0x00 }, /* system clk power down */
+	};
+
+	regmap_multi_reg_write(lt9611->regmap,
+			       sleep_setup, ARRAY_SIZE(sleep_setup));
+	lt9611->sleep = true;
 }
 
 static int lt9611_power_on(struct lt9611 *lt9611)
@@ -762,7 +776,8 @@
 
 	dsi->lanes = 4;
 	dsi->format = MIPI_DSI_FMT_RGB888;
-	dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST;
+	dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
+			  MIPI_DSI_MODE_VIDEO_HSE;
 
 	ret = mipi_dsi_attach(dsi);
 	if (ret < 0) {
@@ -801,20 +816,28 @@
 
 	drm_connector_helper_add(&lt9611->connector,
 				 &lt9611_bridge_connector_helper_funcs);
-	drm_connector_attach_encoder(&lt9611->connector, bridge->encoder);
 
 	if (!bridge->encoder) {
 		DRM_ERROR("Parent encoder object not found");
 		return -ENODEV;
 	}
 
+	drm_connector_attach_encoder(&lt9611->connector, bridge->encoder);
+
 	return 0;
 }
 
-static int lt9611_bridge_attach(struct drm_bridge *bridge)
+static int lt9611_bridge_attach(struct drm_bridge *bridge,
+				enum drm_bridge_attach_flags flags)
 {
 	struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
 	int ret;
+
+	if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)) {
+		ret = lt9611_connector_init(bridge, lt9611);
+		if (ret < 0)
+			return ret;
+	}
 
 	/* Attach primary DSI */
 	lt9611->dsi0 = lt9611_attach_dsi(lt9611, lt9611->dsi0_node);
@@ -830,9 +853,7 @@
 		}
 	}
 
-	ret = lt9611_connector_init(bridge, lt9611);
-
-	return ret;
+	return 0;
 
 err_unregister_dsi0:
 	lt9611_bridge_detach(bridge);
@@ -843,30 +864,43 @@
 }
 
 static enum drm_mode_status lt9611_bridge_mode_valid(struct drm_bridge *bridge,
+						     const struct drm_display_info *info,
 						     const struct drm_display_mode *mode)
 {
 	struct lt9611_mode *lt9611_mode = lt9611_find_mode(mode);
+	struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
 
-	return lt9611_mode ? MODE_OK : MODE_BAD;
+	if (!lt9611_mode)
+		return MODE_BAD;
+	else if (lt9611_mode->intfs > 1 && !lt9611->dsi1)
+		return MODE_PANEL;
+	else
+		return MODE_OK;
 }
 
 static void lt9611_bridge_pre_enable(struct drm_bridge *bridge)
 {
 	struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
 
+	if (!lt9611->sleep)
+		return;
+
 	lt9611_reset(lt9611);
 	regmap_write(lt9611->regmap, 0x80ee, 0x01);
-	lt9611_enable_hpd_interrupts(lt9611);
 
+	lt9611->sleep = false;
 }
 
 static void lt9611_bridge_post_disable(struct drm_bridge *bridge)
 {
+	struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
+
+	lt9611_sleep_setup(lt9611);
 }
 
 static void lt9611_bridge_mode_set(struct drm_bridge *bridge,
-				   struct drm_display_mode *mode,
-				   struct drm_display_mode *adj_mode)
+				   const struct drm_display_mode *mode,
+				   const struct drm_display_mode *adj_mode)
 {
 	struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
 	struct hdmi_avi_infoframe avi_frame;
@@ -879,9 +913,42 @@
 	lt9611_mipi_video_setup(lt9611, mode);
 	lt9611_pcr_setup(lt9611, mode);
 
-	ret = drm_hdmi_avi_infoframe_from_display_mode(&avi_frame, mode, false);
+	ret = drm_hdmi_avi_infoframe_from_display_mode(&avi_frame,
+						       &lt9611->connector,
+						       mode);
 	if (!ret)
 		lt9611->vic = avi_frame.video_code;
+}
+
+static enum drm_connector_status lt9611_bridge_detect(struct drm_bridge *bridge)
+{
+	struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
+	unsigned int reg_val = 0;
+	int connected;
+
+	regmap_read(lt9611->regmap, 0x825e, &reg_val);
+	connected  = reg_val & BIT(2);
+
+	lt9611->status = connected ?  connector_status_connected :
+				connector_status_disconnected;
+
+	return lt9611->status;
+}
+
+static struct edid *lt9611_bridge_get_edid(struct drm_bridge *bridge,
+					   struct drm_connector *connector)
+{
+	struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
+
+	lt9611_power_on(lt9611);
+	return drm_do_get_edid(connector, lt9611_get_edid_block, lt9611);
+}
+
+static void lt9611_bridge_hpd_enable(struct drm_bridge *bridge)
+{
+	struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
+
+	lt9611_enable_hpd_interrupts(lt9611);
 }
 
 static const struct drm_bridge_funcs lt9611_bridge_funcs = {
@@ -892,6 +959,9 @@
 	.disable = lt9611_bridge_disable,
 	.post_disable = lt9611_bridge_post_disable,
 	.mode_set = lt9611_bridge_mode_set,
+	.detect = lt9611_bridge_detect,
+	.get_edid = lt9611_bridge_get_edid,
+	.hpd_enable = lt9611_bridge_hpd_enable,
 };
 
 static int lt9611_parse_dt(struct device *dev,
@@ -1058,6 +1128,7 @@
 
 	lt9611->dev = &client->dev;
 	lt9611->client = client;
+	lt9611->sleep = false;
 
 	lt9611->regmap = devm_regmap_init_i2c(client, &lt9611_regmap_config);
 	if (IS_ERR(lt9611->regmap)) {
@@ -1095,8 +1166,7 @@
 
 	ret = devm_request_threaded_irq(dev, client->irq, NULL,
 					lt9611_irq_thread_handler,
-					IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
-					"lt9611", lt9611);
+					IRQF_ONESHOT, "lt9611", lt9611);
 	if (ret) {
 		dev_err(dev, "failed to request irq\n");
 		goto err_disable_regulators;
@@ -1106,6 +1176,9 @@
 
 	lt9611->bridge.funcs = &lt9611_bridge_funcs;
 	lt9611->bridge.of_node = client->dev.of_node;
+	lt9611->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID |
+			     DRM_BRIDGE_OP_HPD | DRM_BRIDGE_OP_MODES;
+	lt9611->bridge.type = DRM_MODE_CONNECTOR_HDMIA;
 
 	drm_bridge_add(&lt9611->bridge);
 

--
Gitblit v1.6.2