Lines Matching refs:phydev

87 static int at803x_debug_reg_read(struct phy_device *phydev, u16 reg)  in at803x_debug_reg_read()  argument
91 ret = phy_write(phydev, AT803X_DEBUG_ADDR, reg); in at803x_debug_reg_read()
95 return phy_read(phydev, AT803X_DEBUG_DATA); in at803x_debug_reg_read()
98 static int at803x_debug_reg_mask(struct phy_device *phydev, u16 reg, in at803x_debug_reg_mask() argument
104 ret = at803x_debug_reg_read(phydev, reg); in at803x_debug_reg_mask()
112 return phy_write(phydev, AT803X_DEBUG_DATA, val); in at803x_debug_reg_mask()
115 static int at803x_enable_rx_delay(struct phy_device *phydev) in at803x_enable_rx_delay() argument
117 return at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_0, 0, in at803x_enable_rx_delay()
121 static int at803x_enable_tx_delay(struct phy_device *phydev) in at803x_enable_tx_delay() argument
123 return at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_5, 0, in at803x_enable_tx_delay()
127 static int at803x_disable_rx_delay(struct phy_device *phydev) in at803x_disable_rx_delay() argument
129 return at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_0, in at803x_disable_rx_delay()
133 static int at803x_disable_tx_delay(struct phy_device *phydev) in at803x_disable_tx_delay() argument
135 return at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_5, in at803x_disable_tx_delay()
140 static void at803x_context_save(struct phy_device *phydev, in at803x_context_save() argument
143 context->bmcr = phy_read(phydev, MII_BMCR); in at803x_context_save()
144 context->advertise = phy_read(phydev, MII_ADVERTISE); in at803x_context_save()
145 context->control1000 = phy_read(phydev, MII_CTRL1000); in at803x_context_save()
146 context->int_enable = phy_read(phydev, AT803X_INTR_ENABLE); in at803x_context_save()
147 context->smart_speed = phy_read(phydev, AT803X_SMART_SPEED); in at803x_context_save()
148 context->led_control = phy_read(phydev, AT803X_LED_CONTROL); in at803x_context_save()
152 static void at803x_context_restore(struct phy_device *phydev, in at803x_context_restore() argument
155 phy_write(phydev, MII_BMCR, context->bmcr); in at803x_context_restore()
156 phy_write(phydev, MII_ADVERTISE, context->advertise); in at803x_context_restore()
157 phy_write(phydev, MII_CTRL1000, context->control1000); in at803x_context_restore()
158 phy_write(phydev, AT803X_INTR_ENABLE, context->int_enable); in at803x_context_restore()
159 phy_write(phydev, AT803X_SMART_SPEED, context->smart_speed); in at803x_context_restore()
160 phy_write(phydev, AT803X_LED_CONTROL, context->led_control); in at803x_context_restore()
163 static int at803x_set_wol(struct phy_device *phydev, in at803x_set_wol() argument
166 struct net_device *ndev = phydev->attached_dev; in at803x_set_wol()
186 phy_write_mmd(phydev, AT803X_DEVICE_ADDR, offsets[i], in at803x_set_wol()
189 value = phy_read(phydev, AT803X_INTR_ENABLE); in at803x_set_wol()
191 ret = phy_write(phydev, AT803X_INTR_ENABLE, value); in at803x_set_wol()
194 value = phy_read(phydev, AT803X_INTR_STATUS); in at803x_set_wol()
196 value = phy_read(phydev, AT803X_INTR_ENABLE); in at803x_set_wol()
198 ret = phy_write(phydev, AT803X_INTR_ENABLE, value); in at803x_set_wol()
201 value = phy_read(phydev, AT803X_INTR_STATUS); in at803x_set_wol()
207 static void at803x_get_wol(struct phy_device *phydev, in at803x_get_wol() argument
215 value = phy_read(phydev, AT803X_INTR_ENABLE); in at803x_get_wol()
220 static int at803x_suspend(struct phy_device *phydev) in at803x_suspend() argument
225 value = phy_read(phydev, AT803X_INTR_ENABLE); in at803x_suspend()
233 phy_modify(phydev, MII_BMCR, 0, value); in at803x_suspend()
238 static int at803x_resume(struct phy_device *phydev) in at803x_resume() argument
240 return phy_modify(phydev, MII_BMCR, BMCR_PDOWN | BMCR_ISOLATE, 0); in at803x_resume()
243 static int at803x_probe(struct phy_device *phydev) in at803x_probe() argument
245 struct device *dev = &phydev->mdio.dev; in at803x_probe()
252 phydev->priv = priv; in at803x_probe()
257 static int at803x_config_init(struct phy_device *phydev) in at803x_config_init() argument
266 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID || in at803x_config_init()
267 phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) in at803x_config_init()
268 ret = at803x_enable_rx_delay(phydev); in at803x_config_init()
270 ret = at803x_disable_rx_delay(phydev); in at803x_config_init()
274 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID || in at803x_config_init()
275 phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) in at803x_config_init()
276 ret = at803x_enable_tx_delay(phydev); in at803x_config_init()
278 ret = at803x_disable_tx_delay(phydev); in at803x_config_init()
283 static int at803x_ack_interrupt(struct phy_device *phydev) in at803x_ack_interrupt() argument
287 err = phy_read(phydev, AT803X_INTR_STATUS); in at803x_ack_interrupt()
292 static int at803x_config_intr(struct phy_device *phydev) in at803x_config_intr() argument
297 value = phy_read(phydev, AT803X_INTR_ENABLE); in at803x_config_intr()
299 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in at803x_config_intr()
306 err = phy_write(phydev, AT803X_INTR_ENABLE, value); in at803x_config_intr()
309 err = phy_write(phydev, AT803X_INTR_ENABLE, 0); in at803x_config_intr()
314 static void at803x_link_change_notify(struct phy_device *phydev) in at803x_link_change_notify() argument
323 if (phydev->state == PHY_NOLINK && phydev->mdio.reset_gpio) { in at803x_link_change_notify()
326 at803x_context_save(phydev, &context); in at803x_link_change_notify()
328 phy_device_reset(phydev, 1); in at803x_link_change_notify()
330 phy_device_reset(phydev, 0); in at803x_link_change_notify()
333 at803x_context_restore(phydev, &context); in at803x_link_change_notify()
335 phydev_dbg(phydev, "%s(): phy was reset\n", __func__); in at803x_link_change_notify()
339 static int at803x_aneg_done(struct phy_device *phydev) in at803x_aneg_done() argument
343 int aneg_done = genphy_aneg_done(phydev); in at803x_aneg_done()
351 ccr = phy_read(phydev, AT803X_REG_CHIP_CONFIG); in at803x_aneg_done()
356 phy_write(phydev, AT803X_REG_CHIP_CONFIG, ccr & ~AT803X_BT_BX_REG_SEL); in at803x_aneg_done()
359 if (!(phy_read(phydev, AT803X_PSSR) & AT803X_PSSR_MR_AN_COMPLETE)) { in at803x_aneg_done()
360 phydev_warn(phydev, "803x_aneg_done: SGMII link is not ok\n"); in at803x_aneg_done()
364 phy_write(phydev, AT803X_REG_CHIP_CONFIG, ccr | AT803X_BT_BX_REG_SEL); in at803x_aneg_done()
369 static int at803x_read_status(struct phy_device *phydev) in at803x_read_status() argument
371 int ss, err, old_link = phydev->link; in at803x_read_status()
374 err = genphy_update_link(phydev); in at803x_read_status()
379 if (phydev->autoneg == AUTONEG_ENABLE && old_link && phydev->link) in at803x_read_status()
382 phydev->speed = SPEED_UNKNOWN; in at803x_read_status()
383 phydev->duplex = DUPLEX_UNKNOWN; in at803x_read_status()
384 phydev->pause = 0; in at803x_read_status()
385 phydev->asym_pause = 0; in at803x_read_status()
387 err = genphy_read_lpa(phydev); in at803x_read_status()
395 ss = phy_read(phydev, AT803X_SPECIFIC_STATUS); in at803x_read_status()
402 phydev->speed = SPEED_10; in at803x_read_status()
405 phydev->speed = SPEED_100; in at803x_read_status()
408 phydev->speed = SPEED_1000; in at803x_read_status()
412 phydev->duplex = DUPLEX_FULL; in at803x_read_status()
414 phydev->duplex = DUPLEX_HALF; in at803x_read_status()
416 phydev->mdix = ETH_TP_MDI_X; in at803x_read_status()
418 phydev->mdix = ETH_TP_MDI; in at803x_read_status()
421 if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) in at803x_read_status()
422 phy_resolve_aneg_pause(phydev); in at803x_read_status()