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