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 */ 21static 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 50static int lxt971_startup(struct phy_device *phydev) 51{ 52 genphy_update_link(phydev); 53 lxt971_parse_status(phydev); 54 55 return 0; 56} 57 58static 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 68int phy_lxt_init(void) 69{ 70 phy_register(&LXT971_driver); 71 72 return 0; 73} 74