From 9df731a176aab8e03b984b681b1bea01ccff6644 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 06 Nov 2023 07:23:06 +0000
Subject: [PATCH] rk3568 rt uboot init

---
 u-boot/drivers/i2c/muxes/max96745.c |   44 ++++++++++++++++++++++++++++++++++++++------
 1 files changed, 38 insertions(+), 6 deletions(-)

diff --git a/u-boot/drivers/i2c/muxes/max96745.c b/u-boot/drivers/i2c/muxes/max96745.c
index 1a76c3f..5c85cb5 100644
--- a/u-boot/drivers/i2c/muxes/max96745.c
+++ b/u-boot/drivers/i2c/muxes/max96745.c
@@ -13,11 +13,18 @@
 struct max96745_priv {
 	struct udevice *dev;
 	struct gpio_desc enable_gpio;
+	struct gpio_desc pwdnb_gpio;
+	bool idle_disc;
 };
 
 static int max96745_select(struct udevice *mux, struct udevice *bus,
 			   uint channel)
 {
+	struct max96745_priv *priv = dev_get_priv(mux);
+
+	if (!priv->idle_disc)
+		return 0;
+
 	if (channel == 1)
 		dm_i2c_reg_clrset(mux, 0x0086, DIS_REM_CC,
 				  FIELD_PREP(DIS_REM_CC, 0));
@@ -31,6 +38,11 @@
 static int max96745_deselect(struct udevice *mux, struct udevice *bus,
 			     uint channel)
 {
+	struct max96745_priv *priv = dev_get_priv(mux);
+
+	if (!priv->idle_disc)
+		return 0;
+
 	if (channel == 1)
 		dm_i2c_reg_clrset(mux, 0x0086, DIS_REM_CC,
 				  FIELD_PREP(DIS_REM_CC, 1));
@@ -55,15 +67,27 @@
 		mdelay(200);
 	}
 
-	ret = dm_i2c_reg_clrset(priv->dev, 0x0076, DIS_REM_CC,
-				FIELD_PREP(DIS_REM_CC, 1));
+	if (dm_gpio_is_valid(&priv->pwdnb_gpio)) {
+		dm_gpio_set_value(&priv->pwdnb_gpio, 0);
+		mdelay(30);
+	}
+
+	/* Set for I2C Fast-mode speed */
+	ret = dm_i2c_reg_write(priv->dev, 0x0070, 0x16);
 	if (ret < 0)
 		return ret;
 
-	ret = dm_i2c_reg_clrset(priv->dev, 0x0086, DIS_REM_CC,
-				FIELD_PREP(DIS_REM_CC, 1));
-	if (ret < 0)
-		return ret;
+	if (priv->idle_disc) {
+		ret = dm_i2c_reg_clrset(priv->dev, 0x0076, DIS_REM_CC,
+					FIELD_PREP(DIS_REM_CC, 1));
+		if (ret < 0)
+			return ret;
+
+		ret = dm_i2c_reg_clrset(priv->dev, 0x0086, DIS_REM_CC,
+					FIELD_PREP(DIS_REM_CC, 1));
+		if (ret < 0)
+			return ret;
+	}
 
 	return 0;
 }
@@ -78,6 +102,7 @@
 		return ret;
 
 	priv->dev = dev;
+	priv->idle_disc = dev_read_bool(dev, "i2c-mux-idle-disconnect");
 
 	ret = gpio_request_by_name(dev, "enable-gpios", 0,
 				   &priv->enable_gpio, GPIOD_IS_OUT);
@@ -86,6 +111,13 @@
 		return ret;
 	}
 
+	ret = gpio_request_by_name(dev, "pwdnb-gpios", 0,
+				   &priv->pwdnb_gpio, GPIOD_IS_OUT);
+	if (ret && ret != -ENOENT) {
+		dev_err(dev, "%s: failed to get pwdnb GPIO: %d\n", __func__, ret);
+		return ret;
+	}
+
 	max96745_power_on(priv);
 
 	return 0;

--
Gitblit v1.6.2