Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

phy: marvell: Add support for 88E3016 FastEthernet PHY

Marvell 88E3016 is a FastEthernet PHY that also can be found in Marvell
Berlin SoCs as integrated PHY.

Tested-by: Antoine Ténart <antoine.tenart@free-electrons.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Sebastian Hesselbarth and committed by
David S. Miller
6b358aed d4c3363e

+47
+46
drivers/net/phy/marvell.c
··· 118 118 119 119 #define MII_M1116R_CONTROL_REG_MAC 21 120 120 121 + #define MII_88E3016_PHY_SPEC_CTRL 0x10 122 + #define MII_88E3016_DISABLE_SCRAMBLER 0x0200 123 + #define MII_88E3016_AUTO_MDIX_CROSSOVER 0x0030 121 124 122 125 MODULE_DESCRIPTION("Marvell PHY driver"); 123 126 MODULE_AUTHOR("Andy Fleming"); ··· 433 430 return err; 434 431 435 432 mdelay(500); 433 + 434 + return 0; 435 + } 436 + 437 + static int m88e3016_config_init(struct phy_device *phydev) 438 + { 439 + int reg; 440 + 441 + /* Enable Scrambler and Auto-Crossover */ 442 + reg = phy_read(phydev, MII_88E3016_PHY_SPEC_CTRL); 443 + if (reg < 0) 444 + return reg; 445 + 446 + reg &= ~MII_88E3016_DISABLE_SCRAMBLER; 447 + reg |= MII_88E3016_AUTO_MDIX_CROSSOVER; 448 + 449 + reg = phy_write(phydev, MII_88E3016_PHY_SPEC_CTRL, reg); 450 + if (reg < 0) 451 + return reg; 436 452 437 453 return 0; 438 454 } ··· 792 770 return 0; 793 771 } 794 772 773 + static int marvell_aneg_done(struct phy_device *phydev) 774 + { 775 + int retval = phy_read(phydev, MII_M1011_PHY_STATUS); 776 + return (retval < 0) ? retval : (retval & MII_M1011_PHY_STATUS_RESOLVED); 777 + } 778 + 795 779 static int m88e1121_did_interrupt(struct phy_device *phydev) 796 780 { 797 781 int imask; ··· 1078 1050 .suspend = &genphy_suspend, 1079 1051 .driver = { .owner = THIS_MODULE }, 1080 1052 }, 1053 + { 1054 + .phy_id = MARVELL_PHY_ID_88E3016, 1055 + .phy_id_mask = MARVELL_PHY_ID_MASK, 1056 + .name = "Marvell 88E3016", 1057 + .features = PHY_BASIC_FEATURES, 1058 + .flags = PHY_HAS_INTERRUPT, 1059 + .config_aneg = &genphy_config_aneg, 1060 + .config_init = &m88e3016_config_init, 1061 + .aneg_done = &marvell_aneg_done, 1062 + .read_status = &marvell_read_status, 1063 + .ack_interrupt = &marvell_ack_interrupt, 1064 + .config_intr = &marvell_config_intr, 1065 + .did_interrupt = &m88e1121_did_interrupt, 1066 + .resume = &genphy_resume, 1067 + .suspend = &genphy_suspend, 1068 + .driver = { .owner = THIS_MODULE }, 1069 + }, 1081 1070 }; 1082 1071 1083 1072 static int __init marvell_init(void) ··· 1124 1079 { MARVELL_PHY_ID_88E1318S, MARVELL_PHY_ID_MASK }, 1125 1080 { MARVELL_PHY_ID_88E1116R, MARVELL_PHY_ID_MASK }, 1126 1081 { MARVELL_PHY_ID_88E1510, MARVELL_PHY_ID_MASK }, 1082 + { MARVELL_PHY_ID_88E3016, MARVELL_PHY_ID_MASK }, 1127 1083 { } 1128 1084 }; 1129 1085
+1
include/linux/marvell_phy.h
··· 16 16 #define MARVELL_PHY_ID_88E1318S 0x01410e90 17 17 #define MARVELL_PHY_ID_88E1116R 0x01410e40 18 18 #define MARVELL_PHY_ID_88E1510 0x01410dd0 19 + #define MARVELL_PHY_ID_88E3016 0x01410e60 19 20 20 21 /* struct phy_device dev_flags definitions */ 21 22 #define MARVELL_PHY_M1145_FLAGS_RESISTANCE 0x00000001