.. | .. |
---|
13 | 13 | struct max96745_priv { |
---|
14 | 14 | struct udevice *dev; |
---|
15 | 15 | struct gpio_desc enable_gpio; |
---|
| 16 | + struct gpio_desc pwdnb_gpio; |
---|
| 17 | + bool idle_disc; |
---|
16 | 18 | }; |
---|
17 | 19 | |
---|
18 | 20 | static int max96745_select(struct udevice *mux, struct udevice *bus, |
---|
19 | 21 | uint channel) |
---|
20 | 22 | { |
---|
| 23 | + struct max96745_priv *priv = dev_get_priv(mux); |
---|
| 24 | + |
---|
| 25 | + if (!priv->idle_disc) |
---|
| 26 | + return 0; |
---|
| 27 | + |
---|
21 | 28 | if (channel == 1) |
---|
22 | 29 | dm_i2c_reg_clrset(mux, 0x0086, DIS_REM_CC, |
---|
23 | 30 | FIELD_PREP(DIS_REM_CC, 0)); |
---|
.. | .. |
---|
31 | 38 | static int max96745_deselect(struct udevice *mux, struct udevice *bus, |
---|
32 | 39 | uint channel) |
---|
33 | 40 | { |
---|
| 41 | + struct max96745_priv *priv = dev_get_priv(mux); |
---|
| 42 | + |
---|
| 43 | + if (!priv->idle_disc) |
---|
| 44 | + return 0; |
---|
| 45 | + |
---|
34 | 46 | if (channel == 1) |
---|
35 | 47 | dm_i2c_reg_clrset(mux, 0x0086, DIS_REM_CC, |
---|
36 | 48 | FIELD_PREP(DIS_REM_CC, 1)); |
---|
.. | .. |
---|
55 | 67 | mdelay(200); |
---|
56 | 68 | } |
---|
57 | 69 | |
---|
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); |
---|
60 | 77 | if (ret < 0) |
---|
61 | 78 | return ret; |
---|
62 | 79 | |
---|
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 | + } |
---|
67 | 91 | |
---|
68 | 92 | return 0; |
---|
69 | 93 | } |
---|
.. | .. |
---|
78 | 102 | return ret; |
---|
79 | 103 | |
---|
80 | 104 | priv->dev = dev; |
---|
| 105 | + priv->idle_disc = dev_read_bool(dev, "i2c-mux-idle-disconnect"); |
---|
81 | 106 | |
---|
82 | 107 | ret = gpio_request_by_name(dev, "enable-gpios", 0, |
---|
83 | 108 | &priv->enable_gpio, GPIOD_IS_OUT); |
---|
.. | .. |
---|
86 | 111 | return ret; |
---|
87 | 112 | } |
---|
88 | 113 | |
---|
| 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 | + |
---|
89 | 121 | max96745_power_on(priv); |
---|
90 | 122 | |
---|
91 | 123 | return 0; |
---|