From 04dd17822334871b23ea2862f7798fb0e0007777 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Sat, 11 May 2024 08:53:19 +0000
Subject: [PATCH] change otg to host mode
---
u-boot/drivers/video/drm/rockchip_panel.c | 149 +++++++++++++++++++++++++++++++++++++------------
1 files changed, 112 insertions(+), 37 deletions(-)
diff --git a/u-boot/drivers/video/drm/rockchip_panel.c b/u-boot/drivers/video/drm/rockchip_panel.c
index 652e748..5203371 100755
--- 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>
@@ -65,10 +66,13 @@
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;
@@ -195,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;
}
@@ -283,6 +311,19 @@
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);
@@ -321,21 +362,24 @@
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);
-
+
if (plat->delay.prepare)
mdelay(plat->delay.prepare);
-
+
if (dm_gpio_is_valid(&priv->reset_gpio))
dm_gpio_set_value(&priv->reset_gpio, 1);
+
+ 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);
+ mdelay(200);
+
if (plat->delay.init)
mdelay(plat->delay.init);
@@ -500,6 +544,20 @@
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) {
@@ -527,7 +585,7 @@
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) {
@@ -555,7 +613,7 @@
printf("%s: Cannot get lvds-gpio3: %d\n", __func__, ret);
return ret;
}
-
+
ret = uclass_get_device_by_phandle(UCLASS_PANEL_BACKLIGHT, dev,
"backlight", &priv->backlight);
if (ret && ret != -ENOENT) {
@@ -577,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));
@@ -620,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