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/max96745.c | 105 +++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 87 insertions(+), 18 deletions(-)
diff --git a/u-boot/drivers/video/drm/max96745.c b/u-boot/drivers/video/drm/max96745.c
index c824e01..3750f4d 100644
--- a/u-boot/drivers/video/drm/max96745.c
+++ b/u-boot/drivers/video/drm/max96745.c
@@ -9,41 +9,111 @@
#include <i2c.h>
#include <max96745.h>
#include <video_bridge.h>
+#include <linux/iopoll.h>
#include "rockchip_bridge.h"
#include "rockchip_display.h"
#include "rockchip_panel.h"
-struct max96745_bridge_priv {
- struct gpio_desc lock_gpio;
-};
-
-static bool max96745_bridge_detect(struct rockchip_bridge *bridge)
+static bool max96745_bridge_link_locked(struct udevice *dev)
{
- struct max96745_bridge_priv *priv = dev_get_priv(bridge->dev);
+ int ret;
- if (!dm_gpio_get_value(&priv->lock_gpio))
+ ret = dm_i2c_reg_read(dev->parent, 0x002a);
+ if (ret < 0)
+ return false;
+
+ if (!FIELD_GET(LINK_LOCKED, ret))
return false;
return true;
}
+static bool max96745_bridge_detect(struct rockchip_bridge *bridge)
+{
+ return max96745_bridge_link_locked(bridge->dev);
+}
+
+static void max96745_bridge_enable(struct rockchip_bridge *bridge)
+{
+ struct udevice *dev = bridge->dev;
+ struct drm_display_mode *mode = &bridge->state->conn_state.mode;
+ u8 cxtp, tx_rate;
+ int ret;
+
+ ret = dm_i2c_reg_read(dev->parent, 0x0011);
+ if (ret < 0)
+ return;
+
+ cxtp = FIELD_GET(CXTP_A, ret);
+
+ ret = dm_i2c_reg_read(dev->parent, 0x0028);
+ if (ret < 0)
+ return;
+
+ tx_rate = FIELD_GET(TX_RATE, ret);
+
+ if (!cxtp && mode->clock > 95000 && tx_rate == 1) {
+ ret = dm_i2c_reg_clrset(dev->parent, 0x0028, TX_RATE,
+ FIELD_PREP(TX_RATE, 2));
+ if (ret < 0)
+ return;
+
+ ret = dm_i2c_reg_clrset(dev->parent, 0x0029, RESET_ONESHOT,
+ FIELD_PREP(RESET_ONESHOT, 1));
+ if (ret < 0)
+ return;
+
+ if (readx_poll_timeout(max96745_bridge_link_locked, dev, ret,
+ ret, 200000))
+ dev_err(dev, "%s: GMSL link not locked\n", __func__);
+ }
+}
+
+static void max96745_bridge_post_disable(struct rockchip_bridge *bridge)
+{
+ struct udevice *dev = bridge->dev;
+ u8 cxtp, tx_rate;
+ int ret;
+
+ ret = dm_i2c_reg_read(dev->parent, 0x0011);
+ if (ret < 0)
+ return;
+
+ cxtp = FIELD_GET(CXTP_A, ret);
+
+ ret = dm_i2c_reg_read(dev->parent, 0x0028);
+ if (ret < 0)
+ return;
+
+ tx_rate = FIELD_GET(TX_RATE, ret);
+
+ if (!cxtp && tx_rate == 2) {
+ ret = dm_i2c_reg_clrset(dev->parent, 0x0028, TX_RATE,
+ FIELD_PREP(TX_RATE, 1));
+ if (ret < 0)
+ return;
+
+ ret = dm_i2c_reg_clrset(dev->parent, 0x0029, RESET_ONESHOT,
+ FIELD_PREP(RESET_ONESHOT, 1));
+ if (ret < 0)
+ return;
+
+ if (readx_poll_timeout(max96745_bridge_link_locked, dev, ret,
+ ret, 200000))
+ dev_err(dev, "%s: GMSL link not locked\n", __func__);
+ }
+}
+
static const struct rockchip_bridge_funcs max96745_bridge_funcs = {
- .detect = max96745_bridge_detect,
+ .detect = max96745_bridge_detect,
+ .enable = max96745_bridge_enable,
+ .post_disable = max96745_bridge_post_disable,
};
static int max96745_bridge_probe(struct udevice *dev)
{
- struct max96745_bridge_priv *priv = dev_get_priv(dev);
struct rockchip_bridge *bridge;
- int ret;
-
- ret = gpio_request_by_name(dev, "lock-gpios", 0, &priv->lock_gpio,
- GPIOD_IS_IN);
- if (ret) {
- dev_err(dev, "failed to get lock GPIO: %d\n", ret);
- return ret;
- }
bridge = calloc(1, sizeof(*bridge));
if (!bridge)
@@ -66,5 +136,4 @@
.id = UCLASS_VIDEO_BRIDGE,
.of_match = max96745_bridge_of_match,
.probe = max96745_bridge_probe,
- .priv_auto_alloc_size = sizeof(struct max96745_bridge_priv),
};
--
Gitblit v1.6.2