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/rockchip_panel.c |  222 +++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 191 insertions(+), 31 deletions(-)

diff --git a/u-boot/drivers/video/drm/rockchip_panel.c b/u-boot/drivers/video/drm/rockchip_panel.c
old mode 100644
new mode 100755
index de7e5e2..5203371
--- a/u-boot/drivers/video/drm/rockchip_panel.c
+++ b/u-boot/drivers/video/drm/rockchip_panel.c
@@ -12,6 +12,7 @@
 #include <malloc.h>
 #include <video.h>
 #include <backlight.h>
+#include <spi.h>
 #include <asm/gpio.h>
 #include <dm/device.h>
 #include <dm/read.h>
@@ -45,6 +46,7 @@
 	bool power_invert;
 	u32 bus_format;
 	unsigned int bpc;
+	unsigned int lvds_index;
 
 	struct {
 		unsigned int prepare;
@@ -64,8 +66,18 @@
 	bool enabled;
 	struct udevice *power_supply;
 	struct udevice *backlight;
+	struct spi_slave *spi_slave;
 	struct gpio_desc enable_gpio;
 	struct gpio_desc reset_gpio;
+	struct gpio_desc edp_bl_on;
+	struct gpio_desc edp_bl_en;
+	struct gpio_desc vcc_5v;
+	struct gpio_desc vddio_mipi;
+
+	struct gpio_desc lvds_gpio0;
+	struct gpio_desc lvds_gpio1;
+	struct gpio_desc lvds_gpio2;
+	struct gpio_desc lvds_gpio3;
 
 	int cmd_type;
 	struct gpio_desc spi_sdi_gpio;
@@ -187,24 +199,48 @@
 {
 	struct rockchip_panel_priv *priv = dev_get_priv(panel->dev);
 	int i;
+	int ret;
 
 	if (!cmds)
 		return -EINVAL;
 
+	if (priv->spi_slave) {
+		ret = spi_claim_bus(priv->spi_slave);
+		if (ret) {
+			printf("%s: Failed to claim spi bus: %d\n", __func__, ret);
+			return -EINVAL;
+		}
+	}
+
 	for (i = 0; i < cmds->cmd_cnt; i++) {
 		struct rockchip_cmd_desc *desc = &cmds->cmds[i];
 		int value = 0;
+		u16 mask = 0;
+		u16 data = 0;
 
-		if (desc->header.payload_length == 2)
-			value = (desc->payload[0] << 8) | desc->payload[1];
-		else
-			value = desc->payload[0];
-		rockchip_panel_write_spi_cmds(priv,
-					      desc->header.data_type, value);
+		if (priv->spi_slave) {
+			mask = desc->header.data_type ? 0x100 : 0;
+			data = (mask | desc->payload[0]) << 7;;
+			data = ((data & 0xff) << 8) | (data >> 8);
+			value = mask | desc->payload[0];
+			ret = spi_xfer(priv->spi_slave, 9, &data, NULL, SPI_XFER_ONCE);
+			if (ret)
+				printf("%s: Failed to xfer spi cmd 0x%x: %d\n",
+				       __func__, desc->payload[0], ret);
+		} else {
+			if (desc->header.payload_length == 2)
+				value = (desc->payload[0] << 8) | desc->payload[1];
+			else
+				value = desc->payload[0];
+			rockchip_panel_write_spi_cmds(priv, desc->header.data_type, value);
+		}
 
 		if (desc->header.delay_ms)
 			mdelay(desc->header.delay_ms);
 	}
+
+	if (priv->spi_slave)
+		spi_release_bus(priv->spi_slave);
 
 	return 0;
 }
@@ -275,9 +311,57 @@
 
 	if (priv->prepared)
 		return;
+	/*mipi */
+	if (dm_gpio_is_valid(&priv->vddio_mipi))
+               dm_gpio_set_value(&priv->vddio_mipi, 1);
+        mdelay(20);
+
+        if (dm_gpio_is_valid(&priv->vcc_5v))
+                dm_gpio_set_value(&priv->vcc_5v, 1);
+
+        ret = dm_gpio_get_value(&priv->vcc_5v);
+                printf("troy test get vcc_5v : %d \n",ret);
+        ret = dm_gpio_get_value(&priv->vddio_mipi);
+                printf("troy test get vddio-mipi : %d \n",ret);
+        /*mipi end*/
+	
+	/*7511 LVDS IO Control start*/
+	printk("nodka_lvds_index = %d\n",plat->lvds_index);
+	
+	ret = plat->lvds_index  & 1;
+	if (dm_gpio_is_valid(&priv->lvds_gpio0))
+	dm_gpio_set_value(&priv->lvds_gpio0, ret);
+	ret = dm_gpio_get_value(&priv->lvds_gpio0);
+	printf("lvds_gpio0 : %d\n",ret);
+
+	ret = plat->lvds_index >> 1 & 1;
+	if (dm_gpio_is_valid(&priv->lvds_gpio1))
+	dm_gpio_set_value(&priv->lvds_gpio1, ret);
+	ret = dm_gpio_get_value(&priv->lvds_gpio1);
+	printf("lvds_gpio1 : %d\n",ret);
+	
+	ret = plat->lvds_index >> 2 & 1;
+	if (dm_gpio_is_valid(&priv->lvds_gpio2))
+	dm_gpio_set_value(&priv->lvds_gpio2, ret);
+	ret = dm_gpio_get_value(&priv->lvds_gpio2);
+	printf("lvds_gpio2 : %d\n",ret);
+	
+	ret = plat->lvds_index >> 3 & 1;
+	if (dm_gpio_is_valid(&priv->lvds_gpio3))
+	dm_gpio_set_value(&priv->lvds_gpio3, ret);
+	ret = dm_gpio_get_value(&priv->lvds_gpio3);
+	printf("lvds_gpio3 : %d\n",ret);
+	mdelay(100);
+/*7511 LVDS IO Control end*/
 
 	if (priv->power_supply)
 		regulator_set_enable(priv->power_supply, !plat->power_invert);
+	
+	if (dm_gpio_is_valid(&priv->edp_bl_on))
+		dm_gpio_set_value(&priv->edp_bl_on, 1);
+		
+	if (dm_gpio_is_valid(&priv->edp_bl_en))
+		dm_gpio_set_value(&priv->edp_bl_en, 1);
 
 	if (dm_gpio_is_valid(&priv->enable_gpio))
 		dm_gpio_set_value(&priv->enable_gpio, 1);
@@ -290,10 +374,12 @@
 
 	if (plat->delay.reset)
 		mdelay(plat->delay.reset);
-
+	mdelay(50);
 	if (dm_gpio_is_valid(&priv->reset_gpio))
 		dm_gpio_set_value(&priv->reset_gpio, 0);
 
+	mdelay(200);
+	
 	if (plat->delay.init)
 		mdelay(plat->delay.init);
 
@@ -407,6 +493,7 @@
 	plat->delay.disable = dev_read_u32_default(dev, "disable-delay-ms", 0);
 	plat->delay.init = dev_read_u32_default(dev, "init-delay-ms", 0);
 	plat->delay.reset = dev_read_u32_default(dev, "reset-delay-ms", 0);
+	plat->lvds_index = dev_read_u32_default(dev, "nodka-lvds", 0);
 
 	plat->bus_format = dev_read_u32_default(dev, "bus-format",
 						MEDIA_BUS_FMT_RBG888_1X24);
@@ -457,6 +544,34 @@
 	int ret;
 	const char *cmd_type;
 
+	ret = gpio_request_by_name(dev, "vcc-5v-gpio", 0,
+                                   &priv->vcc_5v, GPIOD_IS_OUT);
+        if (ret && ret != -ENOENT) {
+                printf("%s: Cannot get vcc-5v-gpio: %d\n", __func__, ret);
+                return ret;
+        }
+
+        ret = gpio_request_by_name(dev, "vddio-mipi", 0,
+                                   &priv->vddio_mipi, GPIOD_IS_OUT);
+        if (ret && ret != -ENOENT) {
+                printf("%s: Cannot get vddio-mipi: %d\n", __func__, ret);
+                return ret;
+	}
+
+	ret = gpio_request_by_name(dev, "edp-bl-gpios", 0,
+				   &priv->edp_bl_on, GPIOD_IS_OUT);
+	if (ret && ret != -ENOENT) {
+		printf("%s: Cannot get enable GPIO: %d\n", __func__, ret);
+		return ret;
+	}
+
+	ret = gpio_request_by_name(dev, "edp-bl-en", 0,
+				   &priv->edp_bl_en, GPIOD_IS_OUT);
+	if (ret && ret != -ENOENT) {
+		printf("%s: Cannot get enable GPIO: %d\n", __func__, ret);
+		return ret;
+	}
+	
 	ret = gpio_request_by_name(dev, "enable-gpios", 0,
 				   &priv->enable_gpio, GPIOD_IS_OUT);
 	if (ret && ret != -ENOENT) {
@@ -468,6 +583,34 @@
 				   &priv->reset_gpio, GPIOD_IS_OUT);
 	if (ret && ret != -ENOENT) {
 		printf("%s: Cannot get reset GPIO: %d\n", __func__, ret);
+		return ret;
+	}
+	
+	ret = gpio_request_by_name(dev, "lvds-gpio0", 0,
+				   &priv->lvds_gpio0, GPIOD_IS_OUT);
+	if (ret && ret != -ENOENT) {
+		printf("%s: Cannot get lvds-gpio0: %d\n", __func__, ret);
+		return ret;
+	}
+
+	ret = gpio_request_by_name(dev, "lvds-gpio1", 0,
+				   &priv->lvds_gpio1, GPIOD_IS_OUT);
+	if (ret && ret != -ENOENT) {
+		printf("%s: Cannot get lvds-gpio1: %d\n", __func__, ret);
+		return ret;
+	}
+	
+	ret = gpio_request_by_name(dev, "lvds-gpio2", 0,
+				   &priv->lvds_gpio2, GPIOD_IS_OUT);
+	if (ret && ret != -ENOENT) {
+		printf("%s: Cannot get lvds-gpio2: %d\n", __func__, ret);
+		return ret;
+	}
+	
+	ret = gpio_request_by_name(dev, "lvds-gpio3", 0,
+				   &priv->lvds_gpio3, GPIOD_IS_OUT);
+	if (ret && ret != -ENOENT) {
+		printf("%s: Cannot get lvds-gpio3: %d\n", __func__, ret);
 		return ret;
 	}
 
@@ -492,31 +635,47 @@
 		priv->cmd_type = get_panel_cmd_type(cmd_type);
 
 	if (priv->cmd_type == CMD_TYPE_SPI) {
-		ret = gpio_request_by_name(dev, "spi-sdi-gpios", 0,
-					   &priv->spi_sdi_gpio, GPIOD_IS_OUT);
-		if (ret && ret != -ENOENT) {
-			printf("%s: Cannot get spi sdi GPIO: %d\n",
-			       __func__, ret);
-			return ret;
+		ofnode parent = ofnode_get_parent(dev->node);
+
+		if (ofnode_valid(parent)) {
+			struct dm_spi_slave_platdata *plat = dev_get_parent_platdata(dev);
+			struct udevice *spi = dev_get_parent(dev);
+
+			if (spi->seq < 0) {
+				printf("%s: Failed to get spi bus num\n", __func__);
+				return -EINVAL;
+			}
+
+			priv->spi_slave = spi_setup_slave(spi->seq, plat->cs, plat->max_hz,
+							  plat->mode);
+			if (!priv->spi_slave) {
+				printf("%s: Failed to setup spi slave: %d\n", __func__, ret);
+				return -EINVAL;
+			}
+		} else {
+			ret = gpio_request_by_name(dev, "spi-sdi-gpios", 0,
+						   &priv->spi_sdi_gpio, GPIOD_IS_OUT);
+			if (ret && ret != -ENOENT) {
+				printf("%s: Cannot get spi sdi GPIO: %d\n", __func__, ret);
+				return ret;
+			}
+			ret = gpio_request_by_name(dev, "spi-scl-gpios", 0,
+						   &priv->spi_scl_gpio, GPIOD_IS_OUT);
+			if (ret && ret != -ENOENT) {
+				printf("%s: Cannot get spi scl GPIO: %d\n", __func__, ret);
+				return ret;
+			}
+			ret = gpio_request_by_name(dev, "spi-cs-gpios", 0,
+						   &priv->spi_cs_gpio, GPIOD_IS_OUT);
+			if (ret && ret != -ENOENT) {
+				printf("%s: Cannot get spi cs GPIO: %d\n", __func__, ret);
+				return ret;
+			}
+			dm_gpio_set_value(&priv->spi_sdi_gpio, 1);
+			dm_gpio_set_value(&priv->spi_scl_gpio, 1);
+			dm_gpio_set_value(&priv->spi_cs_gpio, 1);
+			dm_gpio_set_value(&priv->reset_gpio, 0);
 		}
-		ret = gpio_request_by_name(dev, "spi-scl-gpios", 0,
-					   &priv->spi_scl_gpio, GPIOD_IS_OUT);
-		if (ret && ret != -ENOENT) {
-			printf("%s: Cannot get spi scl GPIO: %d\n",
-			       __func__, ret);
-			return ret;
-		}
-		ret = gpio_request_by_name(dev, "spi-cs-gpios", 0,
-					   &priv->spi_cs_gpio, GPIOD_IS_OUT);
-		if (ret && ret != -ENOENT) {
-			printf("%s: Cannot get spi cs GPIO: %d\n",
-			       __func__, ret);
-			return ret;
-		}
-		dm_gpio_set_value(&priv->spi_sdi_gpio, 1);
-		dm_gpio_set_value(&priv->spi_scl_gpio, 1);
-		dm_gpio_set_value(&priv->spi_cs_gpio, 1);
-		dm_gpio_set_value(&priv->reset_gpio, 0);
 	}
 
 	panel = calloc(1, sizeof(*panel));
@@ -535,6 +694,7 @@
 static const struct udevice_id rockchip_panel_ids[] = {
 	{ .compatible = "simple-panel", },
 	{ .compatible = "simple-panel-dsi", },
+	{ .compatible = "simple-panel-spi", },
 	{}
 };
 

--
Gitblit v1.6.2