| 109 | #define WR4(res, o, v) bus_write_4(res, (o), (v)) |
| 110 | |
| 111 | static int |
| 112 | awusb3phy_phy_enable(struct phynode *phynode, bool enable) |
| 113 | { |
| 114 | struct awusb3phy_softc *sc; |
| 115 | device_t dev; |
| 116 | uint32_t val; |
| 117 | int error = 0; |
| 118 | |
| 119 | dev = phynode_get_device(phynode); |
| 120 | sc = device_get_softc(dev); |
| 121 | |
| 122 | device_printf(dev, "%s: called\n", __func__); |
| 123 | |
| 124 | if (enable) { |
| 125 | val = RD4(sc->res, USB3PHY_PHY_EXTERNAL_CONTROL); |
| 126 | device_printf(dev, "EXTERNAL_CONTROL: %x\n", val); |
| 127 | val |= PEC_EXTERN_VBUS; |
| 128 | val |= PEC_SSC_EN; |
| 129 | val |= PEC_REF_SSP_EN; |
| 130 | device_printf(dev, "EXTERNAL_CONTROL: %x\n", val); |
| 131 | WR4(sc->res, USB3PHY_PHY_EXTERNAL_CONTROL, val); |
| 132 | |
| 133 | val = RD4(sc->res, USB3PHY_PIPE_CLOCK_CONTROL); |
| 134 | device_printf(dev, "PIPE_CONTROL: %x\n", val); |
| 135 | val |= PCC_PIPE_CLK_OPEN; |
| 136 | device_printf(dev, "PIPE_CONTROL: %x\n", val); |
| 137 | WR4(sc->res, USB3PHY_PIPE_CLOCK_CONTROL, val); |
| 138 | |
| 139 | val = RD4(sc->res, USB3PHY_APP); |
| 140 | device_printf(dev, "APP: %x\n", val); |
| 141 | val |= APP_FORCE_VBUS; |
| 142 | device_printf(dev, "APP: %x\n", val); |
| 143 | WR4(sc->res, USB3PHY_APP, val); |
| 144 | |
| 145 | WR4(sc->res, USB3PHY_PHY_TUNE_LOW, PTL_MAGIC); |
| 146 | |
| 147 | val = RD4(sc->res, USB3PHY_PHY_TUNE_HIGH); |
| 148 | device_printf(dev, "PHY_TUNE_HIGH: %x\n", val); |
| 149 | val |= PTH_TX_BOOST_LVL; |
| 150 | val |= PTH_LOS_BIAS; |
| 151 | val &= ~PTH_TX_SWING_FULL; |
| 152 | val |= __SHIFTIN(0x55, PTH_TX_SWING_FULL); |
| 153 | val &= ~PTH_TX_DEEMPH_6DB; |
| 154 | val |= __SHIFTIN(0x20, PTH_TX_DEEMPH_6DB); |
| 155 | val &= ~PTH_TX_DEEMPH_3P5DB; |
| 156 | val |= __SHIFTIN(0x15, PTH_TX_DEEMPH_3P5DB); |
| 157 | device_printf(dev, "PHY_TUNE_HIGH: %x\n", val); |
| 158 | WR4(sc->res, USB3PHY_PHY_TUNE_HIGH, val); |
| 159 | |
| 160 | if (sc->reg) |
| 161 | error = regulator_enable(sc->reg); |
| 162 | } else { |
| 163 | if (sc->reg) |
| 164 | error = regulator_disable(sc->reg); |
| 165 | } |
| 166 | |
| 167 | if (error != 0) { |
| 168 | device_printf(dev, |
nothing calls this directly
no test coverage detected