From ee930fffee469d076998274a2ca55e13dc1efb67 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Fri, 10 May 2024 08:50:54 +0000
Subject: [PATCH] enable tun/tap/iptables

---
 u-boot/drivers/video/drm/max96755f.c |   47 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 46 insertions(+), 1 deletions(-)

diff --git a/u-boot/drivers/video/drm/max96755f.c b/u-boot/drivers/video/drm/max96755f.c
index e09849f..1e0ec08 100644
--- a/u-boot/drivers/video/drm/max96755f.c
+++ b/u-boot/drivers/video/drm/max96755f.c
@@ -9,6 +9,7 @@
 #include <i2c.h>
 #include <max96755f.h>
 #include <video_bridge.h>
+#include <drm/drm_mipi_dsi.h>
 #include <dm/of_access.h>
 #include <linux/media-bus-format.h>
 
@@ -21,9 +22,18 @@
 	struct drm_display_mode *mode = &priv->mode;
 	u32 hfp, hsa, hbp, hact;
 	u32 vact, vsa, vfp, vbp;
+	u8 lane_map;
 
 	dm_i2c_reg_clrset(priv->dev, 0x0331, NUM_LANES,
 			  FIELD_PREP(NUM_LANES, priv->num_lanes - 1));
+
+	lane_map = (priv->dsi_lane_map[0] & 0xff) << 4 |
+		   (priv->dsi_lane_map[1] & 0xff) << 6 |
+		   (priv->dsi_lane_map[2] & 0xff) << 0 |
+		   (priv->dsi_lane_map[3] & 0xff) << 2;
+
+	dm_i2c_reg_write(priv->dev, 0x0332, lane_map);
+
 	if (!priv->dpi_deskew_en)
 		return;
 
@@ -148,11 +158,26 @@
 	.detect = max96755f_bridge_detect,
 };
 
+static int max96755f_bridge_bind(struct udevice *dev)
+{
+	struct mipi_dsi_device *device = dev_get_platdata(dev);
+
+	device->dev = dev;
+	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 = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE;
+	device->channel = dev_read_u32_default(dev, "reg", 0);
+
+	return 0;
+}
+
 static int max96755f_bridge_probe(struct udevice *dev)
 {
 	struct rockchip_bridge *bridge;
 	struct max96755f_priv *priv = dev_get_priv(dev->parent);
-	int ret;
+	const struct device_node *np = ofnode_to_np(dev->node);
+	int i, len, ret;
 
 	bridge = calloc(1, sizeof(*bridge));
 	if (!bridge)
@@ -165,6 +190,24 @@
 	priv->num_lanes = dev_read_u32_default(dev, "dsi,lanes", 4);
 	priv->dv_swp_ab = dev_read_bool(dev, "vd-swap-ab");
 	priv->dpi_deskew_en = dev_read_bool(dev, "dpi-deskew-en");
+
+	for ( i = 0; i < priv->num_lanes; i++)
+		priv->dsi_lane_map[i] = i;
+
+	if (of_find_property(np, "maxim,dsi-lane-map", &len)) {
+		len /= sizeof(u32);
+		if (priv->num_lanes != len) {
+			printf("invalid number of lane map\n");
+			return -EINVAL;
+		}
+	}
+
+	ret = of_read_u32_array(np, "maxim,dsi-lane-map",
+				priv->dsi_lane_map, priv->num_lanes);
+	if (ret) {
+		printf("get dsi lane map failed\n");
+		return -EINVAL;
+	}
 
 	ret = gpio_request_by_name(dev, "lock-gpios", 0, &priv->lock_gpio,
 				   GPIOD_IS_IN);
@@ -186,4 +229,6 @@
 	.id = UCLASS_VIDEO_BRIDGE,
 	.of_match = max96755f_bridge_of_match,
 	.probe = max96755f_bridge_probe,
+	.bind = max96755f_bridge_bind,
+	.platdata_auto_alloc_size = sizeof(struct mipi_dsi_device),
 };

--
Gitblit v1.6.2