hc
2023-11-06 9df731a176aab8e03b984b681b1bea01ccff6644
u-boot/drivers/i2c/muxes/max96745.c
....@@ -13,11 +13,18 @@
1313 struct max96745_priv {
1414 struct udevice *dev;
1515 struct gpio_desc enable_gpio;
16
+ struct gpio_desc pwdnb_gpio;
17
+ bool idle_disc;
1618 };
1719
1820 static int max96745_select(struct udevice *mux, struct udevice *bus,
1921 uint channel)
2022 {
23
+ struct max96745_priv *priv = dev_get_priv(mux);
24
+
25
+ if (!priv->idle_disc)
26
+ return 0;
27
+
2128 if (channel == 1)
2229 dm_i2c_reg_clrset(mux, 0x0086, DIS_REM_CC,
2330 FIELD_PREP(DIS_REM_CC, 0));
....@@ -31,6 +38,11 @@
3138 static int max96745_deselect(struct udevice *mux, struct udevice *bus,
3239 uint channel)
3340 {
41
+ struct max96745_priv *priv = dev_get_priv(mux);
42
+
43
+ if (!priv->idle_disc)
44
+ return 0;
45
+
3446 if (channel == 1)
3547 dm_i2c_reg_clrset(mux, 0x0086, DIS_REM_CC,
3648 FIELD_PREP(DIS_REM_CC, 1));
....@@ -55,15 +67,27 @@
5567 mdelay(200);
5668 }
5769
58
- ret = dm_i2c_reg_clrset(priv->dev, 0x0076, DIS_REM_CC,
59
- FIELD_PREP(DIS_REM_CC, 1));
70
+ if (dm_gpio_is_valid(&priv->pwdnb_gpio)) {
71
+ dm_gpio_set_value(&priv->pwdnb_gpio, 0);
72
+ mdelay(30);
73
+ }
74
+
75
+ /* Set for I2C Fast-mode speed */
76
+ ret = dm_i2c_reg_write(priv->dev, 0x0070, 0x16);
6077 if (ret < 0)
6178 return ret;
6279
63
- ret = dm_i2c_reg_clrset(priv->dev, 0x0086, DIS_REM_CC,
64
- FIELD_PREP(DIS_REM_CC, 1));
65
- if (ret < 0)
66
- return ret;
80
+ if (priv->idle_disc) {
81
+ ret = dm_i2c_reg_clrset(priv->dev, 0x0076, DIS_REM_CC,
82
+ FIELD_PREP(DIS_REM_CC, 1));
83
+ if (ret < 0)
84
+ return ret;
85
+
86
+ ret = dm_i2c_reg_clrset(priv->dev, 0x0086, DIS_REM_CC,
87
+ FIELD_PREP(DIS_REM_CC, 1));
88
+ if (ret < 0)
89
+ return ret;
90
+ }
6791
6892 return 0;
6993 }
....@@ -78,6 +102,7 @@
78102 return ret;
79103
80104 priv->dev = dev;
105
+ priv->idle_disc = dev_read_bool(dev, "i2c-mux-idle-disconnect");
81106
82107 ret = gpio_request_by_name(dev, "enable-gpios", 0,
83108 &priv->enable_gpio, GPIOD_IS_OUT);
....@@ -86,6 +111,13 @@
86111 return ret;
87112 }
88113
114
+ ret = gpio_request_by_name(dev, "pwdnb-gpios", 0,
115
+ &priv->pwdnb_gpio, GPIOD_IS_OUT);
116
+ if (ret && ret != -ENOENT) {
117
+ dev_err(dev, "%s: failed to get pwdnb GPIO: %d\n", __func__, ret);
118
+ return ret;
119
+ }
120
+
89121 max96745_power_on(priv);
90122
91123 return 0;