From f743a7adbd6e230d66a6206fa115b59fec2d88eb Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Wed, 22 Nov 2023 01:07:42 +0000
Subject: [PATCH] disable pwm7

---
 u-boot/drivers/video/drm/dw_mipi_dsi2.c |  248 ++++++++++++++++++++++++++++++++-----------------
 1 files changed, 161 insertions(+), 87 deletions(-)

diff --git a/u-boot/drivers/video/drm/dw_mipi_dsi2.c b/u-boot/drivers/video/drm/dw_mipi_dsi2.c
index 1ee8652..42f3314 100644
--- a/u-boot/drivers/video/drm/dw_mipi_dsi2.c
+++ b/u-boot/drivers/video/drm/dw_mipi_dsi2.c
@@ -12,6 +12,7 @@
 #include <common.h>
 #include <errno.h>
 #include <asm/unaligned.h>
+#include <asm/gpio.h>
 #include <asm/io.h>
 #include <asm/hardware.h>
 #include <dm/device.h>
@@ -22,7 +23,6 @@
 #include <asm/arch-rockchip/clock.h>
 #include <linux/iopoll.h>
 
-#include "rockchip_bridge.h"
 #include "rockchip_display.h"
 #include "rockchip_crtc.h"
 #include "rockchip_connector.h"
@@ -289,6 +289,7 @@
 	struct drm_display_mode mode;
 	bool data_swap;
 
+	struct gpio_desc te_gpio;
 	struct mipi_dsi_device *device;
 	struct mipi_dphy_configure mipi_dphy_cfg;
 	const struct dw_mipi_dsi2_plat_data *pdata;
@@ -693,42 +694,79 @@
 static int dw_mipi_dsi2_connector_pre_init(struct rockchip_connector *conn,
 					   struct display_state *state)
 {
+	struct connector_state *conn_state = &state->conn_state;
 	struct dw_mipi_dsi2 *dsi2 = dev_get_priv(conn->dev);
 	struct mipi_dsi_host *host = dev_get_platdata(dsi2->dev);
 	struct mipi_dsi_device *device;
 	char name[20];
-	struct udevice *dev;
 
-	device = calloc(1, sizeof(struct dw_mipi_dsi2));
-	if (!device)
-		return -ENOMEM;
+	conn_state->type = DRM_MODE_CONNECTOR_DSI;
 
-	if (conn->bridge)
-		dev = conn->bridge->dev;
-	else if (conn->panel)
-		dev = conn->panel->dev;
-	else
-		return -ENODEV;
+	if (conn->bridge) {
+		device = dev_get_platdata(conn->bridge->dev);
+		if (!device)
+			return -ENODEV;
 
-	device->dev = dev;
-	device->host = host;
-	device->lanes = dev_read_u32_default(dev, "dsi,lanes", 4);
-	device->channel = dev_read_u32_default(dev, "reg", 0);
-	device->format = dev_read_u32_default(dev, "dsi,format",
-					      MIPI_DSI_FMT_RGB888);
-	device->mode_flags = dev_read_u32_default(dev, "dsi,flags",
-						  MIPI_DSI_MODE_VIDEO |
-						  MIPI_DSI_MODE_VIDEO_BURST |
-						  MIPI_DSI_MODE_VIDEO_HBP |
-						  MIPI_DSI_MODE_LPM |
-						  MIPI_DSI_MODE_EOT_PACKET);
+		device->host = host;
+		sprintf(name, "%s.%d", host->dev->name, device->channel);
+		device_set_name(conn->bridge->dev, name);
+		mipi_dsi_attach(device);
+	}
 
-	sprintf(name, "%s.%d", host->dev->name, device->channel);
-	device_set_name(dev, name);
-	dsi2->device = device;
-	dev->parent_platdata = device;
+	return 0;
+}
 
-	mipi_dsi_attach(dsi2->device);
+static int dw_mipi_dsi2_get_dsc_params_from_sink(struct dw_mipi_dsi2 *dsi2)
+{
+	struct udevice *dev = dsi2->device->dev;
+	struct rockchip_cmd_header *header;
+	struct drm_dsc_picture_parameter_set *pps = NULL;
+	u8 *dsc_packed_pps;
+	const void *data;
+	int len;
+
+	dsi2->c_option = dev_read_bool(dev, "phy-c-option");
+	dsi2->scrambling_en = dev_read_bool(dev, "scrambling-enable");
+	dsi2->dsc_enable = dev_read_bool(dev, "compressed-data");
+
+	if (dsi2->slave) {
+		dsi2->slave->c_option = dsi2->c_option;
+		dsi2->slave->scrambling_en = dsi2->scrambling_en;
+		dsi2->slave->dsc_enable = dsi2->dsc_enable;
+	}
+
+	dsi2->slice_width = dev_read_u32_default(dev, "slice-width", 0);
+	dsi2->slice_height = dev_read_u32_default(dev, "slice-height", 0);
+	dsi2->version_major = dev_read_u32_default(dev, "version-major", 0);
+	dsi2->version_minor = dev_read_u32_default(dev, "version-minor", 0);
+
+	data = dev_read_prop(dev, "panel-init-sequence", &len);
+	if (!data)
+		return -EINVAL;
+
+	while (len > sizeof(*header)) {
+		header = (struct rockchip_cmd_header *)data;
+		data += sizeof(*header);
+		len -= sizeof(*header);
+
+		if (header->payload_length > len)
+			return -EINVAL;
+
+		if (header->data_type == MIPI_DSI_PICTURE_PARAMETER_SET) {
+			dsc_packed_pps = calloc(1, header->payload_length);
+			if (!dsc_packed_pps)
+				return -ENOMEM;
+
+			memcpy(dsc_packed_pps, data, header->payload_length);
+			pps = (struct drm_dsc_picture_parameter_set *)dsc_packed_pps;
+			break;
+		}
+
+		data += header->payload_length;
+		len -= header->payload_length;
+	}
+
+	dsi2->pps = pps;
 
 	return 0;
 }
@@ -792,6 +830,13 @@
 		dsi2->slave->dcphy.phy = phy;
 		if (phy->funcs && phy->funcs->init)
 			return phy->funcs->init(phy);
+	}
+
+	dw_mipi_dsi2_get_dsc_params_from_sink(dsi2);
+
+	if (dm_gpio_is_valid(&dsi2->te_gpio)) {
+		cstate->soft_te = true;
+		conn_state->te_gpio = &dsi2->te_gpio;
 	}
 
 	if (dsi2->dsc_enable) {
@@ -905,7 +950,7 @@
 
 static void dw_mipi_dsi2_phy_clk_mode_cfg(struct dw_mipi_dsi2 *dsi2)
 {
-	u32 sys_clk = SYS_CLK / MSEC_PER_SEC;
+	u32 sys_clk = SYS_CLK / USEC_PER_SEC;
 	u32 esc_clk_div;
 	u32 val = 0;
 
@@ -913,7 +958,7 @@
 		val |= NON_CONTINUOUS_CLK;
 
 	/* The Escape clock ranges from 1MHz to 20MHz. */
-	esc_clk_div = DIV_ROUND_UP(sys_clk, 10 * 2);
+	esc_clk_div = DIV_ROUND_UP(sys_clk, 20 * 2);
 	val |= PHY_LPTX_CLK_DIV(esc_clk_div);
 
 	dsi_write(dsi2, DSI2_PHY_CLK_CFG, val);
@@ -1102,6 +1147,41 @@
 	return 0;
 }
 
+static int dw_mipi_dsi2_connector_mode_valid(struct rockchip_connector *conn,
+					     struct display_state *state)
+{
+	struct dw_mipi_dsi2 *dsi2 = dev_get_priv(conn->dev);
+	struct connector_state *conn_state = &state->conn_state;
+	u8 min_pixels = dsi2->slave ? 8 : 4;
+	struct videomode vm;
+
+	drm_display_mode_to_videomode(&conn_state->mode, &vm);
+
+	/*
+	 * the minimum region size (HSA,HBP,HACT,HFP) is 4 pixels
+	 * which is the ip known issues and limitations.
+	 */
+	if (!(vm.hsync_len < min_pixels || vm.hback_porch < min_pixels ||
+	    vm.hfront_porch < min_pixels || vm.hactive < min_pixels))
+		return MODE_OK;
+
+	if (vm.hsync_len < min_pixels)
+		vm.hsync_len = min_pixels;
+
+	if (vm.hback_porch < min_pixels)
+		vm.hback_porch = min_pixels;
+
+	if (vm.hfront_porch < min_pixels)
+		vm.hfront_porch = min_pixels;
+
+	if (vm.hactive < min_pixels)
+		vm.hactive = min_pixels;
+
+	drm_display_mode_from_videomode(&vm, &conn_state->mode);
+
+	return MODE_OK;
+}
+
 static const struct rockchip_connector_funcs dw_mipi_dsi2_connector_funcs = {
 	.pre_init = dw_mipi_dsi2_connector_pre_init,
 	.init = dw_mipi_dsi2_connector_init,
@@ -1109,6 +1189,7 @@
 	.unprepare = dw_mipi_dsi2_connector_unprepare,
 	.enable = dw_mipi_dsi2_connector_enable,
 	.disable = dw_mipi_dsi2_connector_disable,
+	.mode_valid = dw_mipi_dsi2_connector_mode_valid,
 };
 
 static int dw_mipi_dsi2_probe(struct udevice *dev)
@@ -1132,6 +1213,13 @@
 	id = of_alias_get_id(ofnode_to_np(dev->node), "dsi");
 	if (id < 0)
 		id = 0;
+
+	ret = gpio_request_by_name(dev, "te-gpios", 0,
+				   &dsi2->te_gpio, GPIOD_IS_IN);
+	if (ret && ret != -ENOENT) {
+		printf("%s: Cannot get TE GPIO: %d\n", __func__, ret);
+		return ret;
+	}
 
 	dsi2->dev = dev;
 	dsi2->pdata = pdata;
@@ -1185,61 +1273,6 @@
 	return dw_mipi_dsi2_transfer(dsi2, msg);
 }
 
-static int dw_mipi_dsi2_get_dsc_params_from_sink(struct dw_mipi_dsi2 *dsi2)
-{
-	struct udevice *dev = dsi2->device->dev;
-	struct rockchip_cmd_header *header;
-	struct drm_dsc_picture_parameter_set *pps = NULL;
-	u8 *dsc_packed_pps;
-	const void *data;
-	int len;
-
-	dsi2->c_option = dev_read_bool(dev, "phy-c-option");
-	dsi2->scrambling_en = dev_read_bool(dev, "scrambling-enable");
-	dsi2->dsc_enable = dev_read_bool(dev, "compressed-data");
-
-	if (dsi2->slave) {
-		dsi2->slave->c_option = dsi2->c_option;
-		dsi2->slave->scrambling_en = dsi2->scrambling_en;
-		dsi2->slave->dsc_enable = dsi2->dsc_enable;
-	}
-
-	dsi2->slice_width = dev_read_u32_default(dev, "slice-width", 0);
-	dsi2->slice_height = dev_read_u32_default(dev, "slice-height", 0);
-	dsi2->version_major = dev_read_u32_default(dev, "version-major", 0);
-	dsi2->version_minor = dev_read_u32_default(dev, "version-minor", 0);
-
-	data = dev_read_prop(dev, "panel-init-sequence", &len);
-	if (!data)
-		return -EINVAL;
-
-	while (len > sizeof(*header)) {
-		header = (struct rockchip_cmd_header *)data;
-		data += sizeof(*header);
-		len -= sizeof(*header);
-
-		if (header->payload_length > len)
-			return -EINVAL;
-
-		if (header->data_type == MIPI_DSI_PICTURE_PARAMETER_SET) {
-			dsc_packed_pps = calloc(1, header->payload_length);
-			if (!dsc_packed_pps)
-				return -ENOMEM;
-
-			memcpy(dsc_packed_pps, data, header->payload_length);
-			pps = (struct drm_dsc_picture_parameter_set *)dsc_packed_pps;
-			break;
-		}
-
-		data += header->payload_length;
-		len -= header->payload_length;
-	}
-
-	dsi2->pps = pps;
-
-	return 0;
-}
-
 static int dw_mipi_dsi2_host_attach(struct mipi_dsi_host *host,
 				   struct mipi_dsi_device *device)
 {
@@ -1252,8 +1285,7 @@
 	dsi2->channel = device->channel;
 	dsi2->format = device->format;
 	dsi2->mode_flags = device->mode_flags;
-
-	dw_mipi_dsi2_get_dsc_params_from_sink(dsi2);
+	dsi2->device = device;
 
 	return 0;
 }
@@ -1273,6 +1305,45 @@
 	return dm_scan_fdt_dev(dev);
 }
 
+static int dw_mipi_dsi2_child_post_bind(struct udevice *dev)
+{
+	struct mipi_dsi_host *host = dev_get_platdata(dev->parent);
+	struct mipi_dsi_device *device = dev_get_parent_platdata(dev);
+	char name[20];
+
+	sprintf(name, "%s.%d", host->dev->name, device->channel);
+	device_set_name(dev, name);
+
+	device->dev = dev;
+	device->host = host;
+	device->lanes = dev_read_u32_default(dev, "dsi,lanes", 4);
+	device->format = dev_read_u32_default(dev, "dsi,format",
+					      MIPI_DSI_FMT_RGB888);
+	device->mode_flags = dev_read_u32_default(dev, "dsi,flags",
+						  MIPI_DSI_MODE_VIDEO |
+						  MIPI_DSI_MODE_VIDEO_BURST |
+						  MIPI_DSI_MODE_VIDEO_HBP |
+						  MIPI_DSI_MODE_LPM |
+						  MIPI_DSI_MODE_EOT_PACKET);
+	device->channel = dev_read_u32_default(dev, "reg", 0);
+
+	return 0;
+}
+
+static int dw_mipi_dsi2_child_pre_probe(struct udevice *dev)
+{
+	struct mipi_dsi_device *device = dev_get_parent_platdata(dev);
+	int ret;
+
+	ret = mipi_dsi_attach(device);
+	if (ret) {
+		dev_err(dev, "mipi_dsi_attach() failed: %d\n", ret);
+		return ret;
+	}
+
+	return 0;
+}
+
 U_BOOT_DRIVER(dw_mipi_dsi2) = {
 	.name = "dw_mipi_dsi2",
 	.id = UCLASS_DISPLAY,
@@ -1280,5 +1351,8 @@
 	.probe = dw_mipi_dsi2_probe,
 	.bind = dw_mipi_dsi2_bind,
 	.priv_auto_alloc_size = sizeof(struct dw_mipi_dsi2),
+	.per_child_platdata_auto_alloc_size = sizeof(struct mipi_dsi_device),
 	.platdata_auto_alloc_size = sizeof(struct mipi_dsi_host),
+	.child_post_bind = dw_mipi_dsi2_child_post_bind,
+	.child_pre_probe = dw_mipi_dsi2_child_pre_probe,
 };

--
Gitblit v1.6.2