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