19082eeacSAndy Fleming /* 29082eeacSAndy Fleming * National Semiconductor PHY drivers 39082eeacSAndy Fleming * 49082eeacSAndy Fleming * This program is free software; you can redistribute it and/or 59082eeacSAndy Fleming * modify it under the terms of the GNU General Public License as 69082eeacSAndy Fleming * published by the Free Software Foundation; either version 2 of 79082eeacSAndy Fleming * the License, or (at your option) any later version. 89082eeacSAndy Fleming * 99082eeacSAndy Fleming * This program is distributed in the hope that it will be useful, 109082eeacSAndy Fleming * but WITHOUT ANY WARRANTY; without even the implied warranty of 119082eeacSAndy Fleming * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 129082eeacSAndy Fleming * GNU General Public License for more details. 139082eeacSAndy Fleming * 149082eeacSAndy Fleming * You should have received a copy of the GNU General Public License 159082eeacSAndy Fleming * along with this program; if not, write to the Free Software 169082eeacSAndy Fleming * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 179082eeacSAndy Fleming * MA 02111-1307 USA 189082eeacSAndy Fleming * 199082eeacSAndy Fleming * Copyright 2010-2011 Freescale Semiconductor, Inc. 209082eeacSAndy Fleming * author Andy Fleming 219082eeacSAndy Fleming * 229082eeacSAndy Fleming */ 239082eeacSAndy Fleming #include <phy.h> 249082eeacSAndy Fleming 25*96d0b9e1SHeiko Schocher /* NatSemi DP83630 */ 26*96d0b9e1SHeiko Schocher 27*96d0b9e1SHeiko Schocher #define DP83630_PHY_PAGESEL_REG 0x13 28*96d0b9e1SHeiko Schocher #define DP83630_PHY_PTP_COC_REG 0x14 29*96d0b9e1SHeiko Schocher #define DP83630_PHY_PTP_CLKOUT_EN (1<<15) 30*96d0b9e1SHeiko Schocher #define DP83630_PHY_RBR_REG 0x17 31*96d0b9e1SHeiko Schocher 32*96d0b9e1SHeiko Schocher static int dp83630_config(struct phy_device *phydev) 33*96d0b9e1SHeiko Schocher { 34*96d0b9e1SHeiko Schocher int ptp_coc_reg; 35*96d0b9e1SHeiko Schocher 36*96d0b9e1SHeiko Schocher phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET); 37*96d0b9e1SHeiko Schocher phy_write(phydev, MDIO_DEVAD_NONE, DP83630_PHY_PAGESEL_REG, 0x6); 38*96d0b9e1SHeiko Schocher ptp_coc_reg = phy_read(phydev, MDIO_DEVAD_NONE, 39*96d0b9e1SHeiko Schocher DP83630_PHY_PTP_COC_REG); 40*96d0b9e1SHeiko Schocher ptp_coc_reg &= ~DP83630_PHY_PTP_CLKOUT_EN; 41*96d0b9e1SHeiko Schocher phy_write(phydev, MDIO_DEVAD_NONE, DP83630_PHY_PTP_COC_REG, 42*96d0b9e1SHeiko Schocher ptp_coc_reg); 43*96d0b9e1SHeiko Schocher phy_write(phydev, MDIO_DEVAD_NONE, DP83630_PHY_PAGESEL_REG, 0); 44*96d0b9e1SHeiko Schocher 45*96d0b9e1SHeiko Schocher genphy_config_aneg(phydev); 46*96d0b9e1SHeiko Schocher 47*96d0b9e1SHeiko Schocher return 0; 48*96d0b9e1SHeiko Schocher } 49*96d0b9e1SHeiko Schocher 50*96d0b9e1SHeiko Schocher static struct phy_driver DP83630_driver = { 51*96d0b9e1SHeiko Schocher .name = "NatSemi DP83630", 52*96d0b9e1SHeiko Schocher .uid = 0x20005ce1, 53*96d0b9e1SHeiko Schocher .mask = 0xfffffff0, 54*96d0b9e1SHeiko Schocher .features = PHY_BASIC_FEATURES, 55*96d0b9e1SHeiko Schocher .config = &dp83630_config, 56*96d0b9e1SHeiko Schocher .startup = &genphy_startup, 57*96d0b9e1SHeiko Schocher .shutdown = &genphy_shutdown, 58*96d0b9e1SHeiko Schocher }; 59*96d0b9e1SHeiko Schocher 60*96d0b9e1SHeiko Schocher 619082eeacSAndy Fleming /* DP83865 Link and Auto-Neg Status Register */ 629082eeacSAndy Fleming #define MIIM_DP83865_LANR 0x11 639082eeacSAndy Fleming #define MIIM_DP83865_SPD_MASK 0x0018 649082eeacSAndy Fleming #define MIIM_DP83865_SPD_1000 0x0010 659082eeacSAndy Fleming #define MIIM_DP83865_SPD_100 0x0008 669082eeacSAndy Fleming #define MIIM_DP83865_DPX_FULL 0x0002 679082eeacSAndy Fleming 689082eeacSAndy Fleming 699082eeacSAndy Fleming /* NatSemi DP83865 */ 709082eeacSAndy Fleming static int dp83865_config(struct phy_device *phydev) 719082eeacSAndy Fleming { 729082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET); 739082eeacSAndy Fleming genphy_config_aneg(phydev); 749082eeacSAndy Fleming 759082eeacSAndy Fleming return 0; 769082eeacSAndy Fleming } 779082eeacSAndy Fleming 789082eeacSAndy Fleming static int dp83865_parse_status(struct phy_device *phydev) 799082eeacSAndy Fleming { 809082eeacSAndy Fleming int mii_reg; 819082eeacSAndy Fleming 829082eeacSAndy Fleming mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_DP83865_LANR); 839082eeacSAndy Fleming 849082eeacSAndy Fleming switch (mii_reg & MIIM_DP83865_SPD_MASK) { 859082eeacSAndy Fleming 869082eeacSAndy Fleming case MIIM_DP83865_SPD_1000: 879082eeacSAndy Fleming phydev->speed = SPEED_1000; 889082eeacSAndy Fleming break; 899082eeacSAndy Fleming 909082eeacSAndy Fleming case MIIM_DP83865_SPD_100: 919082eeacSAndy Fleming phydev->speed = SPEED_100; 929082eeacSAndy Fleming break; 939082eeacSAndy Fleming 949082eeacSAndy Fleming default: 959082eeacSAndy Fleming phydev->speed = SPEED_10; 969082eeacSAndy Fleming break; 979082eeacSAndy Fleming 989082eeacSAndy Fleming } 999082eeacSAndy Fleming 1009082eeacSAndy Fleming if (mii_reg & MIIM_DP83865_DPX_FULL) 1019082eeacSAndy Fleming phydev->duplex = DUPLEX_FULL; 1029082eeacSAndy Fleming else 1039082eeacSAndy Fleming phydev->duplex = DUPLEX_HALF; 1049082eeacSAndy Fleming 1059082eeacSAndy Fleming return 0; 1069082eeacSAndy Fleming } 1079082eeacSAndy Fleming 1089082eeacSAndy Fleming static int dp83865_startup(struct phy_device *phydev) 1099082eeacSAndy Fleming { 1109082eeacSAndy Fleming genphy_update_link(phydev); 1119082eeacSAndy Fleming dp83865_parse_status(phydev); 1129082eeacSAndy Fleming 1139082eeacSAndy Fleming return 0; 1149082eeacSAndy Fleming } 1159082eeacSAndy Fleming 1169082eeacSAndy Fleming 1179082eeacSAndy Fleming static struct phy_driver DP83865_driver = { 1189082eeacSAndy Fleming .name = "NatSemi DP83865", 1199082eeacSAndy Fleming .uid = 0x20005c70, 1209082eeacSAndy Fleming .mask = 0xfffffff0, 1219082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 1229082eeacSAndy Fleming .config = &dp83865_config, 1239082eeacSAndy Fleming .startup = &dp83865_startup, 1249082eeacSAndy Fleming .shutdown = &genphy_shutdown, 1259082eeacSAndy Fleming }; 1269082eeacSAndy Fleming 1279082eeacSAndy Fleming int phy_natsemi_init(void) 1289082eeacSAndy Fleming { 129*96d0b9e1SHeiko Schocher phy_register(&DP83630_driver); 1309082eeacSAndy Fleming phy_register(&DP83865_driver); 1319082eeacSAndy Fleming 1329082eeacSAndy Fleming return 0; 1339082eeacSAndy Fleming } 134