| .. | .. |
|---|
| 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; |
|---|