Lines Matching refs:phydev

126 static int vsc85xx_phy_page_set(struct phy_device *phydev, u16 page)  in vsc85xx_phy_page_set()  argument
130 rc = phy_write(phydev, MSCC_EXT_PAGE_ACCESS, page); in vsc85xx_phy_page_set()
134 static int vsc85xx_led_cntl_set(struct phy_device *phydev, in vsc85xx_led_cntl_set() argument
141 mutex_lock(&phydev->lock); in vsc85xx_led_cntl_set()
142 reg_val = phy_read(phydev, MSCC_PHY_LED_MODE_SEL); in vsc85xx_led_cntl_set()
151 rc = phy_write(phydev, MSCC_PHY_LED_MODE_SEL, reg_val); in vsc85xx_led_cntl_set()
152 mutex_unlock(&phydev->lock); in vsc85xx_led_cntl_set()
157 static int vsc85xx_mdix_get(struct phy_device *phydev, u8 *mdix) in vsc85xx_mdix_get() argument
161 reg_val = phy_read(phydev, MSCC_PHY_DEV_AUX_CNTL); in vsc85xx_mdix_get()
170 static int vsc85xx_mdix_set(struct phy_device *phydev, u8 mdix) in vsc85xx_mdix_set() argument
175 reg_val = phy_read(phydev, MSCC_PHY_BYPASS_CONTROL); in vsc85xx_mdix_set()
185 rc = phy_write(phydev, MSCC_PHY_BYPASS_CONTROL, reg_val); in vsc85xx_mdix_set()
189 rc = vsc85xx_phy_page_set(phydev, MSCC_PHY_PAGE_EXTENDED); in vsc85xx_mdix_set()
193 reg_val = phy_read(phydev, MSCC_PHY_EXT_MODE_CNTL); in vsc85xx_mdix_set()
199 rc = phy_write(phydev, MSCC_PHY_EXT_MODE_CNTL, reg_val); in vsc85xx_mdix_set()
203 rc = vsc85xx_phy_page_set(phydev, MSCC_PHY_PAGE_STANDARD); in vsc85xx_mdix_set()
207 return genphy_restart_aneg(phydev); in vsc85xx_mdix_set()
210 static int vsc85xx_downshift_get(struct phy_device *phydev, u8 *count) in vsc85xx_downshift_get() argument
215 rc = vsc85xx_phy_page_set(phydev, MSCC_PHY_PAGE_EXTENDED); in vsc85xx_downshift_get()
219 reg_val = phy_read(phydev, MSCC_PHY_ACTIPHY_CNTL); in vsc85xx_downshift_get()
225 rc = vsc85xx_phy_page_set(phydev, MSCC_PHY_PAGE_STANDARD); in vsc85xx_downshift_get()
231 static int vsc85xx_downshift_set(struct phy_device *phydev, u8 count) in vsc85xx_downshift_set() argument
240 phydev_err(phydev, "Downshift count should be 2,3,4 or 5\n"); in vsc85xx_downshift_set()
247 rc = vsc85xx_phy_page_set(phydev, MSCC_PHY_PAGE_EXTENDED); in vsc85xx_downshift_set()
251 reg_val = phy_read(phydev, MSCC_PHY_ACTIPHY_CNTL); in vsc85xx_downshift_set()
254 rc = phy_write(phydev, MSCC_PHY_ACTIPHY_CNTL, reg_val); in vsc85xx_downshift_set()
258 rc = vsc85xx_phy_page_set(phydev, MSCC_PHY_PAGE_STANDARD); in vsc85xx_downshift_set()
264 static int vsc85xx_wol_set(struct phy_device *phydev, in vsc85xx_wol_set() argument
272 u8 *mac_addr = phydev->attached_dev->dev_addr; in vsc85xx_wol_set()
274 mutex_lock(&phydev->lock); in vsc85xx_wol_set()
275 rc = vsc85xx_phy_page_set(phydev, MSCC_PHY_PAGE_EXTENDED_2); in vsc85xx_wol_set()
284 phy_write(phydev, MSCC_PHY_WOL_LOWER_MAC_ADDR, pwd[0]); in vsc85xx_wol_set()
285 phy_write(phydev, MSCC_PHY_WOL_MID_MAC_ADDR, pwd[1]); in vsc85xx_wol_set()
286 phy_write(phydev, MSCC_PHY_WOL_UPPER_MAC_ADDR, pwd[2]); in vsc85xx_wol_set()
288 phy_write(phydev, MSCC_PHY_WOL_LOWER_MAC_ADDR, 0); in vsc85xx_wol_set()
289 phy_write(phydev, MSCC_PHY_WOL_MID_MAC_ADDR, 0); in vsc85xx_wol_set()
290 phy_write(phydev, MSCC_PHY_WOL_UPPER_MAC_ADDR, 0); in vsc85xx_wol_set()
297 phy_write(phydev, MSCC_PHY_WOL_LOWER_PASSWD, pwd[0]); in vsc85xx_wol_set()
298 phy_write(phydev, MSCC_PHY_WOL_MID_PASSWD, pwd[1]); in vsc85xx_wol_set()
299 phy_write(phydev, MSCC_PHY_WOL_UPPER_PASSWD, pwd[2]); in vsc85xx_wol_set()
301 phy_write(phydev, MSCC_PHY_WOL_LOWER_PASSWD, 0); in vsc85xx_wol_set()
302 phy_write(phydev, MSCC_PHY_WOL_MID_PASSWD, 0); in vsc85xx_wol_set()
303 phy_write(phydev, MSCC_PHY_WOL_UPPER_PASSWD, 0); in vsc85xx_wol_set()
306 reg_val = phy_read(phydev, MSCC_PHY_WOL_MAC_CONTROL); in vsc85xx_wol_set()
311 phy_write(phydev, MSCC_PHY_WOL_MAC_CONTROL, reg_val); in vsc85xx_wol_set()
313 rc = vsc85xx_phy_page_set(phydev, MSCC_PHY_PAGE_STANDARD); in vsc85xx_wol_set()
319 reg_val = phy_read(phydev, MII_VSC85XX_INT_MASK); in vsc85xx_wol_set()
321 rc = phy_write(phydev, MII_VSC85XX_INT_MASK, reg_val); in vsc85xx_wol_set()
326 reg_val = phy_read(phydev, MII_VSC85XX_INT_MASK); in vsc85xx_wol_set()
328 rc = phy_write(phydev, MII_VSC85XX_INT_MASK, reg_val); in vsc85xx_wol_set()
333 reg_val = phy_read(phydev, MII_VSC85XX_INT_STATUS); in vsc85xx_wol_set()
336 mutex_unlock(&phydev->lock); in vsc85xx_wol_set()
341 static void vsc85xx_wol_get(struct phy_device *phydev, in vsc85xx_wol_get() argument
350 mutex_lock(&phydev->lock); in vsc85xx_wol_get()
351 rc = vsc85xx_phy_page_set(phydev, MSCC_PHY_PAGE_EXTENDED_2); in vsc85xx_wol_get()
355 reg_val = phy_read(phydev, MSCC_PHY_WOL_MAC_CONTROL); in vsc85xx_wol_get()
359 pwd[0] = phy_read(phydev, MSCC_PHY_WOL_LOWER_PASSWD); in vsc85xx_wol_get()
360 pwd[1] = phy_read(phydev, MSCC_PHY_WOL_MID_PASSWD); in vsc85xx_wol_get()
361 pwd[2] = phy_read(phydev, MSCC_PHY_WOL_UPPER_PASSWD); in vsc85xx_wol_get()
369 rc = vsc85xx_phy_page_set(phydev, MSCC_PHY_PAGE_STANDARD); in vsc85xx_wol_get()
372 mutex_unlock(&phydev->lock); in vsc85xx_wol_get()
376 static int vsc85xx_edge_rate_magic_get(struct phy_device *phydev) in vsc85xx_edge_rate_magic_get() argument
381 struct device *dev = &phydev->mdio.dev; in vsc85xx_edge_rate_magic_get()
405 static int vsc85xx_dt_led_mode_get(struct phy_device *phydev, in vsc85xx_dt_led_mode_get() argument
409 struct device *dev = &phydev->mdio.dev; in vsc85xx_dt_led_mode_get()
420 phydev_err(phydev, "DT %s invalid\n", led); in vsc85xx_dt_led_mode_get()
428 static int vsc85xx_edge_rate_magic_get(struct phy_device *phydev) in vsc85xx_edge_rate_magic_get() argument
433 static int vsc85xx_dt_led_mode_get(struct phy_device *phydev, in vsc85xx_dt_led_mode_get() argument
441 static int vsc85xx_edge_rate_cntl_set(struct phy_device *phydev, u8 edge_rate) in vsc85xx_edge_rate_cntl_set() argument
446 mutex_lock(&phydev->lock); in vsc85xx_edge_rate_cntl_set()
447 rc = vsc85xx_phy_page_set(phydev, MSCC_PHY_PAGE_EXTENDED_2); in vsc85xx_edge_rate_cntl_set()
450 reg_val = phy_read(phydev, MSCC_PHY_WOL_MAC_CONTROL); in vsc85xx_edge_rate_cntl_set()
453 rc = phy_write(phydev, MSCC_PHY_WOL_MAC_CONTROL, reg_val); in vsc85xx_edge_rate_cntl_set()
456 rc = vsc85xx_phy_page_set(phydev, MSCC_PHY_PAGE_STANDARD); in vsc85xx_edge_rate_cntl_set()
459 mutex_unlock(&phydev->lock); in vsc85xx_edge_rate_cntl_set()
464 static int vsc85xx_mac_if_set(struct phy_device *phydev, in vsc85xx_mac_if_set() argument
470 mutex_lock(&phydev->lock); in vsc85xx_mac_if_set()
471 reg_val = phy_read(phydev, MSCC_PHY_EXT_PHY_CNTL_1); in vsc85xx_mac_if_set()
488 rc = phy_write(phydev, MSCC_PHY_EXT_PHY_CNTL_1, reg_val); in vsc85xx_mac_if_set()
492 rc = genphy_soft_reset(phydev); in vsc85xx_mac_if_set()
495 mutex_unlock(&phydev->lock); in vsc85xx_mac_if_set()
500 static int vsc85xx_default_config(struct phy_device *phydev) in vsc85xx_default_config() argument
505 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in vsc85xx_default_config()
506 mutex_lock(&phydev->lock); in vsc85xx_default_config()
507 rc = vsc85xx_phy_page_set(phydev, MSCC_PHY_PAGE_EXTENDED_2); in vsc85xx_default_config()
511 reg_val = phy_read(phydev, MSCC_PHY_RGMII_CNTL); in vsc85xx_default_config()
514 phy_write(phydev, MSCC_PHY_RGMII_CNTL, reg_val); in vsc85xx_default_config()
515 rc = vsc85xx_phy_page_set(phydev, MSCC_PHY_PAGE_STANDARD); in vsc85xx_default_config()
518 mutex_unlock(&phydev->lock); in vsc85xx_default_config()
523 static int vsc85xx_get_tunable(struct phy_device *phydev, in vsc85xx_get_tunable() argument
528 return vsc85xx_downshift_get(phydev, (u8 *)data); in vsc85xx_get_tunable()
534 static int vsc85xx_set_tunable(struct phy_device *phydev, in vsc85xx_set_tunable() argument
540 return vsc85xx_downshift_set(phydev, *(u8 *)data); in vsc85xx_set_tunable()
546 static int vsc85xx_config_init(struct phy_device *phydev) in vsc85xx_config_init() argument
549 struct vsc8531_private *vsc8531 = phydev->priv; in vsc85xx_config_init()
551 rc = vsc85xx_default_config(phydev); in vsc85xx_config_init()
555 rc = vsc85xx_mac_if_set(phydev, phydev->interface); in vsc85xx_config_init()
559 rc = vsc85xx_edge_rate_cntl_set(phydev, vsc8531->rate_magic); in vsc85xx_config_init()
563 rc = vsc85xx_led_cntl_set(phydev, 1, vsc8531->led_1_mode); in vsc85xx_config_init()
567 rc = vsc85xx_led_cntl_set(phydev, 0, vsc8531->led_0_mode); in vsc85xx_config_init()
571 rc = genphy_config_init(phydev); in vsc85xx_config_init()
576 static int vsc85xx_ack_interrupt(struct phy_device *phydev) in vsc85xx_ack_interrupt() argument
580 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) in vsc85xx_ack_interrupt()
581 rc = phy_read(phydev, MII_VSC85XX_INT_STATUS); in vsc85xx_ack_interrupt()
586 static int vsc85xx_config_intr(struct phy_device *phydev) in vsc85xx_config_intr() argument
590 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in vsc85xx_config_intr()
591 rc = phy_write(phydev, MII_VSC85XX_INT_MASK, in vsc85xx_config_intr()
594 rc = phy_write(phydev, MII_VSC85XX_INT_MASK, 0); in vsc85xx_config_intr()
597 rc = phy_read(phydev, MII_VSC85XX_INT_STATUS); in vsc85xx_config_intr()
603 static int vsc85xx_config_aneg(struct phy_device *phydev) in vsc85xx_config_aneg() argument
607 rc = vsc85xx_mdix_set(phydev, phydev->mdix_ctrl); in vsc85xx_config_aneg()
611 return genphy_config_aneg(phydev); in vsc85xx_config_aneg()
614 static int vsc85xx_read_status(struct phy_device *phydev) in vsc85xx_read_status() argument
618 rc = vsc85xx_mdix_get(phydev, &phydev->mdix); in vsc85xx_read_status()
622 return genphy_read_status(phydev); in vsc85xx_read_status()
625 static int vsc85xx_probe(struct phy_device *phydev) in vsc85xx_probe() argument
631 rate_magic = vsc85xx_edge_rate_magic_get(phydev); in vsc85xx_probe()
635 vsc8531 = devm_kzalloc(&phydev->mdio.dev, sizeof(*vsc8531), GFP_KERNEL); in vsc85xx_probe()
639 phydev->priv = vsc8531; in vsc85xx_probe()
644 led_mode = vsc85xx_dt_led_mode_get(phydev, "vsc8531,led-0-mode", in vsc85xx_probe()
650 led_mode = vsc85xx_dt_led_mode_get(phydev, "vsc8531,led-1-mode", in vsc85xx_probe()