1 // SPDX-License-Identifier: GPL-2.0+
5 * Copyright 2011, 2013 Freescale Semiconductor, Inc.
11 #define AR803x_PHY_DEBUG_ADDR_REG 0x1d
12 #define AR803x_PHY_DEBUG_DATA_REG 0x1e
14 #define AR803x_DEBUG_REG_5 0x5
15 #define AR803x_RGMII_TX_CLK_DLY BIT(8)
17 #define AR803x_DEBUG_REG_0 0x0
18 #define AR803x_RGMII_RX_CLK_DLY BIT(15)
20 /* CLK_25M register is at MMD 7, address 0x8016 */
21 #define AR803x_CLK_25M_SEL_REG 0x8016
22 /* AR8035: Select frequency on CLK_25M pin through bits 4:3 */
23 #define AR8035_CLK_25M_FREQ_25M (0 | 0)
24 #define AR8035_CLK_25M_FREQ_50M (0 | BIT(3))
25 #define AR8035_CLK_25M_FREQ_62M (BIT(4) | 0)
26 #define AR8035_CLK_25M_FREQ_125M (BIT(4) | BIT(3))
27 #define AR8035_CLK_25M_MASK GENMASK(4, 3)
29 static void ar803x_enable_rx_delay(struct phy_device *phydev, bool on)
33 phy_write(phydev, MDIO_DEVAD_NONE, AR803x_PHY_DEBUG_ADDR_REG,
35 regval = phy_read(phydev, MDIO_DEVAD_NONE, AR803x_PHY_DEBUG_DATA_REG);
37 regval |= AR803x_RGMII_RX_CLK_DLY;
39 regval &= ~AR803x_RGMII_RX_CLK_DLY;
40 phy_write(phydev, MDIO_DEVAD_NONE, AR803x_PHY_DEBUG_DATA_REG, regval);
43 static void ar803x_enable_tx_delay(struct phy_device *phydev, bool on)
47 phy_write(phydev, MDIO_DEVAD_NONE, AR803x_PHY_DEBUG_ADDR_REG,
49 regval = phy_read(phydev, MDIO_DEVAD_NONE, AR803x_PHY_DEBUG_DATA_REG);
51 regval |= AR803x_RGMII_TX_CLK_DLY;
53 regval &= ~AR803x_RGMII_TX_CLK_DLY;
54 phy_write(phydev, MDIO_DEVAD_NONE, AR803x_PHY_DEBUG_DATA_REG, regval);
57 static int ar8021_config(struct phy_device *phydev)
59 phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR,
60 BMCR_ANENABLE | BMCR_ANRESTART);
62 ar803x_enable_tx_delay(phydev, true);
64 phydev->supported = phydev->drv->features;
68 static int ar8031_config(struct phy_device *phydev)
70 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID ||
71 phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
72 ar803x_enable_tx_delay(phydev, true);
74 ar803x_enable_tx_delay(phydev, false);
76 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID ||
77 phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
78 ar803x_enable_rx_delay(phydev, true);
80 ar803x_enable_rx_delay(phydev, false);
82 phydev->supported = phydev->drv->features;
84 genphy_config_aneg(phydev);
85 genphy_restart_aneg(phydev);
90 static int ar8035_config(struct phy_device *phydev)
94 /* Configure CLK_25M output clock at 125 MHz */
95 regval = phy_read_mmd(phydev, MDIO_MMD_AN, AR803x_CLK_25M_SEL_REG);
96 regval &= ~AR8035_CLK_25M_MASK; /* No surprises */
97 regval |= AR8035_CLK_25M_FREQ_125M;
98 phy_write_mmd(phydev, MDIO_MMD_AN, AR803x_CLK_25M_SEL_REG, regval);
100 if ((phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) ||
101 (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID))
102 ar803x_enable_tx_delay(phydev, true);
104 ar803x_enable_tx_delay(phydev, false);
106 if ((phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) ||
107 (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID))
108 ar803x_enable_rx_delay(phydev, true);
110 ar803x_enable_rx_delay(phydev, false);
112 phydev->supported = phydev->drv->features;
114 genphy_config_aneg(phydev);
115 genphy_restart_aneg(phydev);
120 static struct phy_driver AR8021_driver = {
124 .features = PHY_GBIT_FEATURES,
125 .config = ar8021_config,
126 .startup = genphy_startup,
127 .shutdown = genphy_shutdown,
130 static struct phy_driver AR8031_driver = {
131 .name = "AR8031/AR8033",
134 .features = PHY_GBIT_FEATURES,
135 .config = ar8031_config,
136 .startup = genphy_startup,
137 .shutdown = genphy_shutdown,
140 static struct phy_driver AR8035_driver = {
144 .features = PHY_GBIT_FEATURES,
145 .config = ar8035_config,
146 .startup = genphy_startup,
147 .shutdown = genphy_shutdown,
150 int phy_atheros_init(void)
152 phy_register(&AR8021_driver);
153 phy_register(&AR8031_driver);
154 phy_register(&AR8035_driver);