| b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame] | 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 | } |