1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * LXT PHY drivers 4 * 5 * Copyright 2010-2011 Freescale Semiconductor, Inc. 6 * author Andy Fleming 7 */ 8 #include <common.h> 9 #include <phy.h> 10 11 /* LXT971 Status 2 registers */ 12 #define MIIM_LXT971_SR2 0x11 /* Status Register 2 */ 13 #define MIIM_LXT971_SR2_SPEED_MASK 0x4200 14 #define MIIM_LXT971_SR2_10HDX 0x0000 /* 10 Mbit half duplex selected */ 15 #define MIIM_LXT971_SR2_10FDX 0x0200 /* 10 Mbit full duplex selected */ 16 #define MIIM_LXT971_SR2_100HDX 0x4000 /* 100 Mbit half duplex selected */ 17 #define MIIM_LXT971_SR2_100FDX 0x4200 /* 100 Mbit full duplex selected */ 18 19 20 /* LXT971 */ 21 static int lxt971_parse_status(struct phy_device *phydev) 22 { 23 int mii_reg; 24 int speed; 25 26 mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_LXT971_SR2); 27 speed = mii_reg & MIIM_LXT971_SR2_SPEED_MASK; 28 29 switch (speed) { 30 case MIIM_LXT971_SR2_10HDX: 31 phydev->speed = SPEED_10; 32 phydev->duplex = DUPLEX_HALF; 33 break; 34 case MIIM_LXT971_SR2_10FDX: 35 phydev->speed = SPEED_10; 36 phydev->duplex = DUPLEX_FULL; 37 break; 38 case MIIM_LXT971_SR2_100HDX: 39 phydev->speed = SPEED_100; 40 phydev->duplex = DUPLEX_HALF; 41 break; 42 default: 43 phydev->speed = SPEED_100; 44 phydev->duplex = DUPLEX_FULL; 45 } 46 47 return 0; 48 } 49 50 static int lxt971_startup(struct phy_device *phydev) 51 { 52 int ret; 53 54 ret = genphy_update_link(phydev); 55 if (ret) 56 return ret; 57 58 return lxt971_parse_status(phydev); 59 } 60 61 static struct phy_driver LXT971_driver = { 62 .name = "LXT971", 63 .uid = 0x1378e0, 64 .mask = 0xfffff0, 65 .features = PHY_BASIC_FEATURES, 66 .config = &genphy_config_aneg, 67 .startup = &lxt971_startup, 68 .shutdown = &genphy_shutdown, 69 }; 70 71 int phy_lxt_init(void) 72 { 73 phy_register(&LXT971_driver); 74 75 return 0; 76 } 77