123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445 |
- #include <miiphy.h>
- #define MIIM_CIS82xx_AUX_CONSTAT 0x1c
- #define MIIM_CIS82xx_AUXCONSTAT_INIT 0x0004
- #define MIIM_CIS82xx_AUXCONSTAT_DUPLEX 0x0020
- #define MIIM_CIS82xx_AUXCONSTAT_SPEED 0x0018
- #define MIIM_CIS82xx_AUXCONSTAT_GBIT 0x0010
- #define MIIM_CIS82xx_AUXCONSTAT_100 0x0008
- #define MIIM_CIS82xx_EXT_CON1 0x17
- #define MIIM_CIS8201_EXTCON1_INIT 0x0000
- #define MIIM_CIS8204_EPHY_CON 0x17
- #define MIIM_CIS8204_EPHYCON_INIT 0x0006
- #define MIIM_CIS8204_EPHYCON_RGMII 0x1100
- #define MIIM_CIS8204_SLED_CON 0x1b
- #define MIIM_CIS8204_SLEDCON_INIT 0x1115
- #define MII_VSC8601_EPHY_CTL 0x17
- #define MII_VSC8601_EPHY_CTL_RGMII_SKEW (1 << 8)
- #define PHY_EXT_PAGE_ACCESS 0x1f
- #define PHY_EXT_PAGE_ACCESS_GENERAL 0x10
- #define PHY_EXT_PAGE_ACCESS_EXTENDED3 0x3
- #define MIIM_VSC8574_MAC_SERDES_CON 0x10
- #define MIIM_VSC8574_MAC_SERDES_ANEG 0x80
- #define MIIM_VSC8574_GENERAL18 0x12
- #define MIIM_VSC8574_GENERAL19 0x13
- #define MIIM_VSC8574_18G_SGMII 0x80f0
- #define MIIM_VSC8574_18G_QSGMII 0x80e0
- #define MIIM_VSC8574_18G_CMDSTAT 0x8000
- #define MIIM_VSC8514_MAC_SERDES_CON 0x10
- #define MIIM_VSC8514_GENERAL18 0x12
- #define MIIM_VSC8514_GENERAL19 0x13
- #define MIIM_VSC8514_GENERAL23 0x17
- #define MIIM_VSC8514_18G_QSGMII 0x80e0
- #define MIIM_VSC8514_18G_CMDSTAT 0x8000
- #define MIIM_VSC8664_SERDES_AND_SIGDET 0x13
- #define MIIM_VSC8664_ADDITIONAL_DEV 0x16
- #define MIIM_VSC8664_EPHY_CON 0x17
- #define MIIM_VSC8664_LED_CON 0x1E
- #define PHY_EXT_PAGE_ACCESS_EXTENDED 0x0001
- static int vitesse_config(struct phy_device *phydev)
- {
-
- phy_write(phydev, MDIO_DEVAD_NONE, MIIM_CIS82xx_AUX_CONSTAT,
- MIIM_CIS82xx_AUXCONSTAT_INIT);
-
- phy_write(phydev, MDIO_DEVAD_NONE, MIIM_CIS82xx_EXT_CON1,
- MIIM_CIS8201_EXTCON1_INIT);
- genphy_config_aneg(phydev);
- return 0;
- }
- static int vitesse_parse_status(struct phy_device *phydev)
- {
- int speed;
- int mii_reg;
- mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_CIS82xx_AUX_CONSTAT);
- if (mii_reg & MIIM_CIS82xx_AUXCONSTAT_DUPLEX)
- phydev->duplex = DUPLEX_FULL;
- else
- phydev->duplex = DUPLEX_HALF;
- speed = mii_reg & MIIM_CIS82xx_AUXCONSTAT_SPEED;
- switch (speed) {
- case MIIM_CIS82xx_AUXCONSTAT_GBIT:
- phydev->speed = SPEED_1000;
- break;
- case MIIM_CIS82xx_AUXCONSTAT_100:
- phydev->speed = SPEED_100;
- break;
- default:
- phydev->speed = SPEED_10;
- break;
- }
- return 0;
- }
- static int vitesse_startup(struct phy_device *phydev)
- {
- int ret;
- ret = genphy_update_link(phydev);
- if (ret)
- return ret;
- return vitesse_parse_status(phydev);
- }
- static int cis8204_config(struct phy_device *phydev)
- {
-
- phy_write(phydev, MDIO_DEVAD_NONE, MIIM_CIS82xx_AUX_CONSTAT,
- MIIM_CIS82xx_AUXCONSTAT_INIT);
- genphy_config_aneg(phydev);
- if ((phydev->interface == PHY_INTERFACE_MODE_RGMII) ||
- (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) ||
- (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID))
- phy_write(phydev, MDIO_DEVAD_NONE, MIIM_CIS8204_EPHY_CON,
- MIIM_CIS8204_EPHYCON_INIT |
- MIIM_CIS8204_EPHYCON_RGMII);
- else
- phy_write(phydev, MDIO_DEVAD_NONE, MIIM_CIS8204_EPHY_CON,
- MIIM_CIS8204_EPHYCON_INIT);
- return 0;
- }
- static int vsc8601_add_skew(struct phy_device *phydev)
- {
- int ret;
- ret = phy_read(phydev, MDIO_DEVAD_NONE, MII_VSC8601_EPHY_CTL);
- if (ret < 0)
- return ret;
- ret |= MII_VSC8601_EPHY_CTL_RGMII_SKEW;
- return phy_write(phydev, MDIO_DEVAD_NONE, MII_VSC8601_EPHY_CTL, ret);
- }
- static int vsc8601_config(struct phy_device *phydev)
- {
- int ret = 0;
- if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
- ret = vsc8601_add_skew(phydev);
- if (ret < 0)
- return ret;
- return genphy_config_aneg(phydev);
- }
- static int vsc8574_config(struct phy_device *phydev)
- {
- u32 val;
-
- phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS,
- PHY_EXT_PAGE_ACCESS_GENERAL);
- val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_GENERAL19);
- if (phydev->interface == PHY_INTERFACE_MODE_QSGMII) {
-
- val = (val & 0x3fff) | (1 << 14);
- phy_write(phydev, MDIO_DEVAD_NONE,
- MIIM_VSC8574_GENERAL19, val);
-
- phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_GENERAL18,
- MIIM_VSC8574_18G_QSGMII);
- } else {
-
- val = val & 0x3fff;
- phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_GENERAL19, val);
-
- phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_GENERAL18,
- MIIM_VSC8574_18G_SGMII);
- }
- val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_GENERAL18);
-
- while (val & MIIM_VSC8574_18G_CMDSTAT)
- val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_GENERAL18);
-
- phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS,
- PHY_EXT_PAGE_ACCESS_EXTENDED3);
- val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_MAC_SERDES_CON);
- val = val | MIIM_VSC8574_MAC_SERDES_ANEG;
- phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_MAC_SERDES_CON, val);
- phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0);
- genphy_config_aneg(phydev);
- return 0;
- }
- static int vsc8514_config(struct phy_device *phydev)
- {
- u32 val;
- int timeout = 1000000;
-
- phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS,
- PHY_EXT_PAGE_ACCESS_GENERAL);
- val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL19);
- if (phydev->interface == PHY_INTERFACE_MODE_QSGMII) {
-
- val = (val & 0x3fff) | (1 << 14);
- phy_write(phydev, MDIO_DEVAD_NONE,
- MIIM_VSC8514_GENERAL19, val);
-
- phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL18,
- MIIM_VSC8514_18G_QSGMII);
- } else {
-
- }
- val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL18);
-
- while ((val & MIIM_VSC8514_18G_CMDSTAT) && timeout--)
- val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL18);
- if (0 == timeout) {
- printf("PHY 8514 config failed\n");
- return -1;
- }
- phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0);
-
- val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL23);
-
- val = (val & 0xf8ff);
- phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL23, val);
-
- phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS,
- PHY_EXT_PAGE_ACCESS_EXTENDED3);
- val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_MAC_SERDES_CON);
- val = val | MIIM_VSC8574_MAC_SERDES_ANEG;
- phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_MAC_SERDES_CON, val);
- phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0);
- genphy_config_aneg(phydev);
- return 0;
- }
- static int vsc8664_config(struct phy_device *phydev)
- {
- u32 val;
-
- phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0);
- val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_EPHY_CON);
- val |= (1 << 13);
- phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_EPHY_CON, val);
- phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS,
- PHY_EXT_PAGE_ACCESS_EXTENDED);
- val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_SERDES_AND_SIGDET);
- val |= (1 << 11);
- phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_SERDES_AND_SIGDET, val);
- phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0);
-
- val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_LED_CON);
- val &= ~(1 << 2);
- phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_LED_CON, val);
- genphy_config_aneg(phydev);
- return 0;
- }
- static struct phy_driver VSC8211_driver = {
- .name = "Vitesse VSC8211",
- .uid = 0xfc4b0,
- .mask = 0xffff0,
- .features = PHY_GBIT_FEATURES,
- .config = &vitesse_config,
- .startup = &vitesse_startup,
- .shutdown = &genphy_shutdown,
- };
- static struct phy_driver VSC8221_driver = {
- .name = "Vitesse VSC8221",
- .uid = 0xfc550,
- .mask = 0xffff0,
- .features = PHY_GBIT_FEATURES,
- .config = &genphy_config_aneg,
- .startup = &vitesse_startup,
- .shutdown = &genphy_shutdown,
- };
- static struct phy_driver VSC8244_driver = {
- .name = "Vitesse VSC8244",
- .uid = 0xfc6c0,
- .mask = 0xffff0,
- .features = PHY_GBIT_FEATURES,
- .config = &genphy_config_aneg,
- .startup = &vitesse_startup,
- .shutdown = &genphy_shutdown,
- };
- static struct phy_driver VSC8234_driver = {
- .name = "Vitesse VSC8234",
- .uid = 0xfc620,
- .mask = 0xffff0,
- .features = PHY_GBIT_FEATURES,
- .config = &genphy_config_aneg,
- .startup = &vitesse_startup,
- .shutdown = &genphy_shutdown,
- };
- static struct phy_driver VSC8574_driver = {
- .name = "Vitesse VSC8574",
- .uid = 0x704a0,
- .mask = 0xffff0,
- .features = PHY_GBIT_FEATURES,
- .config = &vsc8574_config,
- .startup = &vitesse_startup,
- .shutdown = &genphy_shutdown,
- };
- static struct phy_driver VSC8514_driver = {
- .name = "Vitesse VSC8514",
- .uid = 0x70670,
- .mask = 0xffff0,
- .features = PHY_GBIT_FEATURES,
- .config = &vsc8514_config,
- .startup = &vitesse_startup,
- .shutdown = &genphy_shutdown,
- };
- static struct phy_driver VSC8584_driver = {
- .name = "Vitesse VSC8584",
- .uid = 0x707c0,
- .mask = 0xffff0,
- .features = PHY_GBIT_FEATURES,
- .config = &vsc8574_config,
- .startup = &vitesse_startup,
- .shutdown = &genphy_shutdown,
- };
- static struct phy_driver VSC8601_driver = {
- .name = "Vitesse VSC8601",
- .uid = 0x70420,
- .mask = 0xffff0,
- .features = PHY_GBIT_FEATURES,
- .config = &vsc8601_config,
- .startup = &vitesse_startup,
- .shutdown = &genphy_shutdown,
- };
- static struct phy_driver VSC8641_driver = {
- .name = "Vitesse VSC8641",
- .uid = 0x70430,
- .mask = 0xffff0,
- .features = PHY_GBIT_FEATURES,
- .config = &genphy_config_aneg,
- .startup = &vitesse_startup,
- .shutdown = &genphy_shutdown,
- };
- static struct phy_driver VSC8662_driver = {
- .name = "Vitesse VSC8662",
- .uid = 0x70660,
- .mask = 0xffff0,
- .features = PHY_GBIT_FEATURES,
- .config = &genphy_config_aneg,
- .startup = &vitesse_startup,
- .shutdown = &genphy_shutdown,
- };
- static struct phy_driver VSC8664_driver = {
- .name = "Vitesse VSC8664",
- .uid = 0x70660,
- .mask = 0xffff0,
- .features = PHY_GBIT_FEATURES,
- .config = &vsc8664_config,
- .startup = &vitesse_startup,
- .shutdown = &genphy_shutdown,
- };
- static struct phy_driver cis8201_driver = {
- .name = "CIS8201",
- .uid = 0xfc410,
- .mask = 0xffff0,
- .features = PHY_GBIT_FEATURES,
- .config = &vitesse_config,
- .startup = &vitesse_startup,
- .shutdown = &genphy_shutdown,
- };
- static struct phy_driver cis8204_driver = {
- .name = "Cicada Cis8204",
- .uid = 0xfc440,
- .mask = 0xffff0,
- .features = PHY_GBIT_FEATURES,
- .config = &cis8204_config,
- .startup = &vitesse_startup,
- .shutdown = &genphy_shutdown,
- };
- int phy_vitesse_init(void)
- {
- phy_register(&VSC8641_driver);
- phy_register(&VSC8601_driver);
- phy_register(&VSC8234_driver);
- phy_register(&VSC8244_driver);
- phy_register(&VSC8211_driver);
- phy_register(&VSC8221_driver);
- phy_register(&VSC8574_driver);
- phy_register(&VSC8584_driver);
- phy_register(&VSC8514_driver);
- phy_register(&VSC8662_driver);
- phy_register(&VSC8664_driver);
- phy_register(&cis8201_driver);
- phy_register(&cis8204_driver);
- return 0;
- }
|