1 /* 2 * LXT PHY drivers 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 * 6 * Copyright 2010-2011 Freescale Semiconductor, Inc. 7 * author Andy Fleming 8 */ 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 genphy_update_link(phydev); 53 lxt971_parse_status(phydev); 54 55 return 0; 56 } 57 58 static struct phy_driver LXT971_driver = { 59 .name = "LXT971", 60 .uid = 0x1378e0, 61 .mask = 0xfffff0, 62 .features = PHY_BASIC_FEATURES, 63 .config = &genphy_config_aneg, 64 .startup = &lxt971_startup, 65 .shutdown = &genphy_shutdown, 66 }; 67 68 int phy_lxt_init(void) 69 { 70 phy_register(&LXT971_driver); 71 72 return 0; 73 } 74