18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) 2012 Daniel Schwierzeck <daniel.schwierzeck@googlemail.com> 48c2ecf20Sopenharmony_ci * Copyright (C) 2016 Hauke Mehrtens <hauke@hauke-m.de> 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include <linux/mdio.h> 88c2ecf20Sopenharmony_ci#include <linux/module.h> 98c2ecf20Sopenharmony_ci#include <linux/phy.h> 108c2ecf20Sopenharmony_ci#include <linux/of.h> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#define XWAY_MDIO_IMASK 0x19 /* interrupt mask */ 138c2ecf20Sopenharmony_ci#define XWAY_MDIO_ISTAT 0x1A /* interrupt status */ 148c2ecf20Sopenharmony_ci#define XWAY_MDIO_LED 0x1B /* led control */ 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci/* bit 15:12 are reserved */ 178c2ecf20Sopenharmony_ci#define XWAY_MDIO_LED_LED3_EN BIT(11) /* Enable the integrated function of LED3 */ 188c2ecf20Sopenharmony_ci#define XWAY_MDIO_LED_LED2_EN BIT(10) /* Enable the integrated function of LED2 */ 198c2ecf20Sopenharmony_ci#define XWAY_MDIO_LED_LED1_EN BIT(9) /* Enable the integrated function of LED1 */ 208c2ecf20Sopenharmony_ci#define XWAY_MDIO_LED_LED0_EN BIT(8) /* Enable the integrated function of LED0 */ 218c2ecf20Sopenharmony_ci/* bit 7:4 are reserved */ 228c2ecf20Sopenharmony_ci#define XWAY_MDIO_LED_LED3_DA BIT(3) /* Direct Access to LED3 */ 238c2ecf20Sopenharmony_ci#define XWAY_MDIO_LED_LED2_DA BIT(2) /* Direct Access to LED2 */ 248c2ecf20Sopenharmony_ci#define XWAY_MDIO_LED_LED1_DA BIT(1) /* Direct Access to LED1 */ 258c2ecf20Sopenharmony_ci#define XWAY_MDIO_LED_LED0_DA BIT(0) /* Direct Access to LED0 */ 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci#define XWAY_MDIO_INIT_WOL BIT(15) /* Wake-On-LAN */ 288c2ecf20Sopenharmony_ci#define XWAY_MDIO_INIT_MSRE BIT(14) 298c2ecf20Sopenharmony_ci#define XWAY_MDIO_INIT_NPRX BIT(13) 308c2ecf20Sopenharmony_ci#define XWAY_MDIO_INIT_NPTX BIT(12) 318c2ecf20Sopenharmony_ci#define XWAY_MDIO_INIT_ANE BIT(11) /* Auto-Neg error */ 328c2ecf20Sopenharmony_ci#define XWAY_MDIO_INIT_ANC BIT(10) /* Auto-Neg complete */ 338c2ecf20Sopenharmony_ci#define XWAY_MDIO_INIT_ADSC BIT(5) /* Link auto-downspeed detect */ 348c2ecf20Sopenharmony_ci#define XWAY_MDIO_INIT_MPIPC BIT(4) 358c2ecf20Sopenharmony_ci#define XWAY_MDIO_INIT_MDIXC BIT(3) 368c2ecf20Sopenharmony_ci#define XWAY_MDIO_INIT_DXMC BIT(2) /* Duplex mode change */ 378c2ecf20Sopenharmony_ci#define XWAY_MDIO_INIT_LSPC BIT(1) /* Link speed change */ 388c2ecf20Sopenharmony_ci#define XWAY_MDIO_INIT_LSTC BIT(0) /* Link state change */ 398c2ecf20Sopenharmony_ci#define XWAY_MDIO_INIT_MASK (XWAY_MDIO_INIT_LSTC | \ 408c2ecf20Sopenharmony_ci XWAY_MDIO_INIT_ADSC) 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci#define ADVERTISED_MPD BIT(10) /* Multi-port device */ 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci/* LED Configuration */ 458c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH 0x01E0 468c2ecf20Sopenharmony_ci/* Inverse of SCAN Function */ 478c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_NACS_NONE 0x0000 488c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_NACS_LINK 0x0001 498c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_NACS_PDOWN 0x0002 508c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_NACS_EEE 0x0003 518c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_NACS_ANEG 0x0004 528c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_NACS_ABIST 0x0005 538c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_NACS_CDIAG 0x0006 548c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_NACS_TEST 0x0007 558c2ecf20Sopenharmony_ci/* Slow Blink Frequency */ 568c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_SBF_F02HZ 0x0000 578c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_SBF_F04HZ 0x0010 588c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_SBF_F08HZ 0x0020 598c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_SBF_F16HZ 0x0030 608c2ecf20Sopenharmony_ci/* Fast Blink Frequency */ 618c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_FBF_F02HZ 0x0000 628c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_FBF_F04HZ 0x0040 638c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_FBF_F08HZ 0x0080 648c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_FBF_F16HZ 0x00C0 658c2ecf20Sopenharmony_ci/* LED Configuration */ 668c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCL 0x01E1 678c2ecf20Sopenharmony_ci/* Complex Blinking Configuration */ 688c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_CBLINK_NONE 0x0000 698c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_CBLINK_LINK 0x0001 708c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_CBLINK_PDOWN 0x0002 718c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_CBLINK_EEE 0x0003 728c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_CBLINK_ANEG 0x0004 738c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_CBLINK_ABIST 0x0005 748c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_CBLINK_CDIAG 0x0006 758c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_CBLINK_TEST 0x0007 768c2ecf20Sopenharmony_ci/* Complex SCAN Configuration */ 778c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_SCAN_NONE 0x0000 788c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_SCAN_LINK 0x0010 798c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_SCAN_PDOWN 0x0020 808c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_SCAN_EEE 0x0030 818c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_SCAN_ANEG 0x0040 828c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_SCAN_ABIST 0x0050 838c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_SCAN_CDIAG 0x0060 848c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDCH_SCAN_TEST 0x0070 858c2ecf20Sopenharmony_ci/* Configuration for LED Pin x */ 868c2ecf20Sopenharmony_ci#define XWAY_MMD_LED0H 0x01E2 878c2ecf20Sopenharmony_ci/* Fast Blinking Configuration */ 888c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_BLINKF_MASK 0x000F 898c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_BLINKF_NONE 0x0000 908c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_BLINKF_LINK10 0x0001 918c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_BLINKF_LINK100 0x0002 928c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_BLINKF_LINK10X 0x0003 938c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_BLINKF_LINK1000 0x0004 948c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_BLINKF_LINK10_0 0x0005 958c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_BLINKF_LINK100X 0x0006 968c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_BLINKF_LINK10XX 0x0007 978c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_BLINKF_PDOWN 0x0008 988c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_BLINKF_EEE 0x0009 998c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_BLINKF_ANEG 0x000A 1008c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_BLINKF_ABIST 0x000B 1018c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_BLINKF_CDIAG 0x000C 1028c2ecf20Sopenharmony_ci/* Constant On Configuration */ 1038c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_CON_MASK 0x00F0 1048c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_CON_NONE 0x0000 1058c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_CON_LINK10 0x0010 1068c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_CON_LINK100 0x0020 1078c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_CON_LINK10X 0x0030 1088c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_CON_LINK1000 0x0040 1098c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_CON_LINK10_0 0x0050 1108c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_CON_LINK100X 0x0060 1118c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_CON_LINK10XX 0x0070 1128c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_CON_PDOWN 0x0080 1138c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_CON_EEE 0x0090 1148c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_CON_ANEG 0x00A0 1158c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_CON_ABIST 0x00B0 1168c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_CON_CDIAG 0x00C0 1178c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_CON_COPPER 0x00D0 1188c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxH_CON_FIBER 0x00E0 1198c2ecf20Sopenharmony_ci/* Configuration for LED Pin x */ 1208c2ecf20Sopenharmony_ci#define XWAY_MMD_LED0L 0x01E3 1218c2ecf20Sopenharmony_ci/* Pulsing Configuration */ 1228c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxL_PULSE_MASK 0x000F 1238c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxL_PULSE_NONE 0x0000 1248c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxL_PULSE_TXACT 0x0001 1258c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxL_PULSE_RXACT 0x0002 1268c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxL_PULSE_COL 0x0004 1278c2ecf20Sopenharmony_ci/* Slow Blinking Configuration */ 1288c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxL_BLINKS_MASK 0x00F0 1298c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxL_BLINKS_NONE 0x0000 1308c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxL_BLINKS_LINK10 0x0010 1318c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxL_BLINKS_LINK100 0x0020 1328c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxL_BLINKS_LINK10X 0x0030 1338c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxL_BLINKS_LINK1000 0x0040 1348c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxL_BLINKS_LINK10_0 0x0050 1358c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxL_BLINKS_LINK100X 0x0060 1368c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxL_BLINKS_LINK10XX 0x0070 1378c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxL_BLINKS_PDOWN 0x0080 1388c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxL_BLINKS_EEE 0x0090 1398c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxL_BLINKS_ANEG 0x00A0 1408c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxL_BLINKS_ABIST 0x00B0 1418c2ecf20Sopenharmony_ci#define XWAY_MMD_LEDxL_BLINKS_CDIAG 0x00C0 1428c2ecf20Sopenharmony_ci#define XWAY_MMD_LED1H 0x01E4 1438c2ecf20Sopenharmony_ci#define XWAY_MMD_LED1L 0x01E5 1448c2ecf20Sopenharmony_ci#define XWAY_MMD_LED2H 0x01E6 1458c2ecf20Sopenharmony_ci#define XWAY_MMD_LED2L 0x01E7 1468c2ecf20Sopenharmony_ci#define XWAY_MMD_LED3H 0x01E8 1478c2ecf20Sopenharmony_ci#define XWAY_MMD_LED3L 0x01E9 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_ci#define PHY_ID_PHY11G_1_3 0x030260D1 1508c2ecf20Sopenharmony_ci#define PHY_ID_PHY22F_1_3 0x030260E1 1518c2ecf20Sopenharmony_ci#define PHY_ID_PHY11G_1_4 0xD565A400 1528c2ecf20Sopenharmony_ci#define PHY_ID_PHY22F_1_4 0xD565A410 1538c2ecf20Sopenharmony_ci#define PHY_ID_PHY11G_1_5 0xD565A401 1548c2ecf20Sopenharmony_ci#define PHY_ID_PHY22F_1_5 0xD565A411 1558c2ecf20Sopenharmony_ci#define PHY_ID_PHY11G_VR9_1_1 0xD565A408 1568c2ecf20Sopenharmony_ci#define PHY_ID_PHY22F_VR9_1_1 0xD565A418 1578c2ecf20Sopenharmony_ci#define PHY_ID_PHY11G_VR9_1_2 0xD565A409 1588c2ecf20Sopenharmony_ci#define PHY_ID_PHY22F_VR9_1_2 0xD565A419 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_cistatic int xway_gphy_config_init(struct phy_device *phydev) 1618c2ecf20Sopenharmony_ci{ 1628c2ecf20Sopenharmony_ci int err; 1638c2ecf20Sopenharmony_ci u32 ledxh; 1648c2ecf20Sopenharmony_ci u32 ledxl; 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_ci /* Mask all interrupts */ 1678c2ecf20Sopenharmony_ci err = phy_write(phydev, XWAY_MDIO_IMASK, 0); 1688c2ecf20Sopenharmony_ci if (err) 1698c2ecf20Sopenharmony_ci return err; 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_ci /* Clear all pending interrupts */ 1728c2ecf20Sopenharmony_ci phy_read(phydev, XWAY_MDIO_ISTAT); 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_ci /* Ensure that integrated led function is enabled for all leds */ 1758c2ecf20Sopenharmony_ci err = phy_write(phydev, XWAY_MDIO_LED, 1768c2ecf20Sopenharmony_ci XWAY_MDIO_LED_LED0_EN | 1778c2ecf20Sopenharmony_ci XWAY_MDIO_LED_LED1_EN | 1788c2ecf20Sopenharmony_ci XWAY_MDIO_LED_LED2_EN | 1798c2ecf20Sopenharmony_ci XWAY_MDIO_LED_LED3_EN); 1808c2ecf20Sopenharmony_ci if (err) 1818c2ecf20Sopenharmony_ci return err; 1828c2ecf20Sopenharmony_ci 1838c2ecf20Sopenharmony_ci phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LEDCH, 1848c2ecf20Sopenharmony_ci XWAY_MMD_LEDCH_NACS_NONE | 1858c2ecf20Sopenharmony_ci XWAY_MMD_LEDCH_SBF_F02HZ | 1868c2ecf20Sopenharmony_ci XWAY_MMD_LEDCH_FBF_F16HZ); 1878c2ecf20Sopenharmony_ci phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LEDCL, 1888c2ecf20Sopenharmony_ci XWAY_MMD_LEDCH_CBLINK_NONE | 1898c2ecf20Sopenharmony_ci XWAY_MMD_LEDCH_SCAN_NONE); 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_ci /** 1928c2ecf20Sopenharmony_ci * In most cases only one LED is connected to this phy, so 1938c2ecf20Sopenharmony_ci * configure them all to constant on and pulse mode. LED3 is 1948c2ecf20Sopenharmony_ci * only available in some packages, leave it in its reset 1958c2ecf20Sopenharmony_ci * configuration. 1968c2ecf20Sopenharmony_ci */ 1978c2ecf20Sopenharmony_ci ledxh = XWAY_MMD_LEDxH_BLINKF_NONE | XWAY_MMD_LEDxH_CON_LINK10XX; 1988c2ecf20Sopenharmony_ci ledxl = XWAY_MMD_LEDxL_PULSE_TXACT | XWAY_MMD_LEDxL_PULSE_RXACT | 1998c2ecf20Sopenharmony_ci XWAY_MMD_LEDxL_BLINKS_NONE; 2008c2ecf20Sopenharmony_ci phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED0H, ledxh); 2018c2ecf20Sopenharmony_ci phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED0L, ledxl); 2028c2ecf20Sopenharmony_ci phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED1H, ledxh); 2038c2ecf20Sopenharmony_ci phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED1L, ledxl); 2048c2ecf20Sopenharmony_ci phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED2H, ledxh); 2058c2ecf20Sopenharmony_ci phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED2L, ledxl); 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_ci return 0; 2088c2ecf20Sopenharmony_ci} 2098c2ecf20Sopenharmony_ci 2108c2ecf20Sopenharmony_cistatic int xway_gphy14_config_aneg(struct phy_device *phydev) 2118c2ecf20Sopenharmony_ci{ 2128c2ecf20Sopenharmony_ci int reg, err; 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_ci /* Advertise as multi-port device, see IEEE802.3-2002 40.5.1.1 */ 2158c2ecf20Sopenharmony_ci /* This is a workaround for an errata in rev < 1.5 devices */ 2168c2ecf20Sopenharmony_ci reg = phy_read(phydev, MII_CTRL1000); 2178c2ecf20Sopenharmony_ci reg |= ADVERTISED_MPD; 2188c2ecf20Sopenharmony_ci err = phy_write(phydev, MII_CTRL1000, reg); 2198c2ecf20Sopenharmony_ci if (err) 2208c2ecf20Sopenharmony_ci return err; 2218c2ecf20Sopenharmony_ci 2228c2ecf20Sopenharmony_ci return genphy_config_aneg(phydev); 2238c2ecf20Sopenharmony_ci} 2248c2ecf20Sopenharmony_ci 2258c2ecf20Sopenharmony_cistatic int xway_gphy_ack_interrupt(struct phy_device *phydev) 2268c2ecf20Sopenharmony_ci{ 2278c2ecf20Sopenharmony_ci int reg; 2288c2ecf20Sopenharmony_ci 2298c2ecf20Sopenharmony_ci reg = phy_read(phydev, XWAY_MDIO_ISTAT); 2308c2ecf20Sopenharmony_ci return (reg < 0) ? reg : 0; 2318c2ecf20Sopenharmony_ci} 2328c2ecf20Sopenharmony_ci 2338c2ecf20Sopenharmony_cistatic int xway_gphy_did_interrupt(struct phy_device *phydev) 2348c2ecf20Sopenharmony_ci{ 2358c2ecf20Sopenharmony_ci int reg; 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci reg = phy_read(phydev, XWAY_MDIO_ISTAT); 2388c2ecf20Sopenharmony_ci return reg & XWAY_MDIO_INIT_MASK; 2398c2ecf20Sopenharmony_ci} 2408c2ecf20Sopenharmony_ci 2418c2ecf20Sopenharmony_cistatic int xway_gphy_config_intr(struct phy_device *phydev) 2428c2ecf20Sopenharmony_ci{ 2438c2ecf20Sopenharmony_ci u16 mask = 0; 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_ci if (phydev->interrupts == PHY_INTERRUPT_ENABLED) 2468c2ecf20Sopenharmony_ci mask = XWAY_MDIO_INIT_MASK; 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_ci return phy_write(phydev, XWAY_MDIO_IMASK, mask); 2498c2ecf20Sopenharmony_ci} 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_cistatic struct phy_driver xway_gphy[] = { 2528c2ecf20Sopenharmony_ci { 2538c2ecf20Sopenharmony_ci .phy_id = PHY_ID_PHY11G_1_3, 2548c2ecf20Sopenharmony_ci .phy_id_mask = 0xffffffff, 2558c2ecf20Sopenharmony_ci .name = "Intel XWAY PHY11G (PEF 7071/PEF 7072) v1.3", 2568c2ecf20Sopenharmony_ci /* PHY_GBIT_FEATURES */ 2578c2ecf20Sopenharmony_ci .config_init = xway_gphy_config_init, 2588c2ecf20Sopenharmony_ci .config_aneg = xway_gphy14_config_aneg, 2598c2ecf20Sopenharmony_ci .ack_interrupt = xway_gphy_ack_interrupt, 2608c2ecf20Sopenharmony_ci .did_interrupt = xway_gphy_did_interrupt, 2618c2ecf20Sopenharmony_ci .config_intr = xway_gphy_config_intr, 2628c2ecf20Sopenharmony_ci .suspend = genphy_suspend, 2638c2ecf20Sopenharmony_ci .resume = genphy_resume, 2648c2ecf20Sopenharmony_ci }, { 2658c2ecf20Sopenharmony_ci .phy_id = PHY_ID_PHY22F_1_3, 2668c2ecf20Sopenharmony_ci .phy_id_mask = 0xffffffff, 2678c2ecf20Sopenharmony_ci .name = "Intel XWAY PHY22F (PEF 7061) v1.3", 2688c2ecf20Sopenharmony_ci /* PHY_BASIC_FEATURES */ 2698c2ecf20Sopenharmony_ci .config_init = xway_gphy_config_init, 2708c2ecf20Sopenharmony_ci .config_aneg = xway_gphy14_config_aneg, 2718c2ecf20Sopenharmony_ci .ack_interrupt = xway_gphy_ack_interrupt, 2728c2ecf20Sopenharmony_ci .did_interrupt = xway_gphy_did_interrupt, 2738c2ecf20Sopenharmony_ci .config_intr = xway_gphy_config_intr, 2748c2ecf20Sopenharmony_ci .suspend = genphy_suspend, 2758c2ecf20Sopenharmony_ci .resume = genphy_resume, 2768c2ecf20Sopenharmony_ci }, { 2778c2ecf20Sopenharmony_ci .phy_id = PHY_ID_PHY11G_1_4, 2788c2ecf20Sopenharmony_ci .phy_id_mask = 0xffffffff, 2798c2ecf20Sopenharmony_ci .name = "Intel XWAY PHY11G (PEF 7071/PEF 7072) v1.4", 2808c2ecf20Sopenharmony_ci /* PHY_GBIT_FEATURES */ 2818c2ecf20Sopenharmony_ci .config_init = xway_gphy_config_init, 2828c2ecf20Sopenharmony_ci .config_aneg = xway_gphy14_config_aneg, 2838c2ecf20Sopenharmony_ci .ack_interrupt = xway_gphy_ack_interrupt, 2848c2ecf20Sopenharmony_ci .did_interrupt = xway_gphy_did_interrupt, 2858c2ecf20Sopenharmony_ci .config_intr = xway_gphy_config_intr, 2868c2ecf20Sopenharmony_ci .suspend = genphy_suspend, 2878c2ecf20Sopenharmony_ci .resume = genphy_resume, 2888c2ecf20Sopenharmony_ci }, { 2898c2ecf20Sopenharmony_ci .phy_id = PHY_ID_PHY22F_1_4, 2908c2ecf20Sopenharmony_ci .phy_id_mask = 0xffffffff, 2918c2ecf20Sopenharmony_ci .name = "Intel XWAY PHY22F (PEF 7061) v1.4", 2928c2ecf20Sopenharmony_ci /* PHY_BASIC_FEATURES */ 2938c2ecf20Sopenharmony_ci .config_init = xway_gphy_config_init, 2948c2ecf20Sopenharmony_ci .config_aneg = xway_gphy14_config_aneg, 2958c2ecf20Sopenharmony_ci .ack_interrupt = xway_gphy_ack_interrupt, 2968c2ecf20Sopenharmony_ci .did_interrupt = xway_gphy_did_interrupt, 2978c2ecf20Sopenharmony_ci .config_intr = xway_gphy_config_intr, 2988c2ecf20Sopenharmony_ci .suspend = genphy_suspend, 2998c2ecf20Sopenharmony_ci .resume = genphy_resume, 3008c2ecf20Sopenharmony_ci }, { 3018c2ecf20Sopenharmony_ci .phy_id = PHY_ID_PHY11G_1_5, 3028c2ecf20Sopenharmony_ci .phy_id_mask = 0xffffffff, 3038c2ecf20Sopenharmony_ci .name = "Intel XWAY PHY11G (PEF 7071/PEF 7072) v1.5 / v1.6", 3048c2ecf20Sopenharmony_ci /* PHY_GBIT_FEATURES */ 3058c2ecf20Sopenharmony_ci .config_init = xway_gphy_config_init, 3068c2ecf20Sopenharmony_ci .ack_interrupt = xway_gphy_ack_interrupt, 3078c2ecf20Sopenharmony_ci .did_interrupt = xway_gphy_did_interrupt, 3088c2ecf20Sopenharmony_ci .config_intr = xway_gphy_config_intr, 3098c2ecf20Sopenharmony_ci .suspend = genphy_suspend, 3108c2ecf20Sopenharmony_ci .resume = genphy_resume, 3118c2ecf20Sopenharmony_ci }, { 3128c2ecf20Sopenharmony_ci .phy_id = PHY_ID_PHY22F_1_5, 3138c2ecf20Sopenharmony_ci .phy_id_mask = 0xffffffff, 3148c2ecf20Sopenharmony_ci .name = "Intel XWAY PHY22F (PEF 7061) v1.5 / v1.6", 3158c2ecf20Sopenharmony_ci /* PHY_BASIC_FEATURES */ 3168c2ecf20Sopenharmony_ci .config_init = xway_gphy_config_init, 3178c2ecf20Sopenharmony_ci .ack_interrupt = xway_gphy_ack_interrupt, 3188c2ecf20Sopenharmony_ci .did_interrupt = xway_gphy_did_interrupt, 3198c2ecf20Sopenharmony_ci .config_intr = xway_gphy_config_intr, 3208c2ecf20Sopenharmony_ci .suspend = genphy_suspend, 3218c2ecf20Sopenharmony_ci .resume = genphy_resume, 3228c2ecf20Sopenharmony_ci }, { 3238c2ecf20Sopenharmony_ci .phy_id = PHY_ID_PHY11G_VR9_1_1, 3248c2ecf20Sopenharmony_ci .phy_id_mask = 0xffffffff, 3258c2ecf20Sopenharmony_ci .name = "Intel XWAY PHY11G (xRX v1.1 integrated)", 3268c2ecf20Sopenharmony_ci /* PHY_GBIT_FEATURES */ 3278c2ecf20Sopenharmony_ci .config_init = xway_gphy_config_init, 3288c2ecf20Sopenharmony_ci .ack_interrupt = xway_gphy_ack_interrupt, 3298c2ecf20Sopenharmony_ci .did_interrupt = xway_gphy_did_interrupt, 3308c2ecf20Sopenharmony_ci .config_intr = xway_gphy_config_intr, 3318c2ecf20Sopenharmony_ci .suspend = genphy_suspend, 3328c2ecf20Sopenharmony_ci .resume = genphy_resume, 3338c2ecf20Sopenharmony_ci }, { 3348c2ecf20Sopenharmony_ci .phy_id = PHY_ID_PHY22F_VR9_1_1, 3358c2ecf20Sopenharmony_ci .phy_id_mask = 0xffffffff, 3368c2ecf20Sopenharmony_ci .name = "Intel XWAY PHY22F (xRX v1.1 integrated)", 3378c2ecf20Sopenharmony_ci /* PHY_BASIC_FEATURES */ 3388c2ecf20Sopenharmony_ci .config_init = xway_gphy_config_init, 3398c2ecf20Sopenharmony_ci .ack_interrupt = xway_gphy_ack_interrupt, 3408c2ecf20Sopenharmony_ci .did_interrupt = xway_gphy_did_interrupt, 3418c2ecf20Sopenharmony_ci .config_intr = xway_gphy_config_intr, 3428c2ecf20Sopenharmony_ci .suspend = genphy_suspend, 3438c2ecf20Sopenharmony_ci .resume = genphy_resume, 3448c2ecf20Sopenharmony_ci }, { 3458c2ecf20Sopenharmony_ci .phy_id = PHY_ID_PHY11G_VR9_1_2, 3468c2ecf20Sopenharmony_ci .phy_id_mask = 0xffffffff, 3478c2ecf20Sopenharmony_ci .name = "Intel XWAY PHY11G (xRX v1.2 integrated)", 3488c2ecf20Sopenharmony_ci /* PHY_GBIT_FEATURES */ 3498c2ecf20Sopenharmony_ci .config_init = xway_gphy_config_init, 3508c2ecf20Sopenharmony_ci .ack_interrupt = xway_gphy_ack_interrupt, 3518c2ecf20Sopenharmony_ci .did_interrupt = xway_gphy_did_interrupt, 3528c2ecf20Sopenharmony_ci .config_intr = xway_gphy_config_intr, 3538c2ecf20Sopenharmony_ci .suspend = genphy_suspend, 3548c2ecf20Sopenharmony_ci .resume = genphy_resume, 3558c2ecf20Sopenharmony_ci }, { 3568c2ecf20Sopenharmony_ci .phy_id = PHY_ID_PHY22F_VR9_1_2, 3578c2ecf20Sopenharmony_ci .phy_id_mask = 0xffffffff, 3588c2ecf20Sopenharmony_ci .name = "Intel XWAY PHY22F (xRX v1.2 integrated)", 3598c2ecf20Sopenharmony_ci /* PHY_BASIC_FEATURES */ 3608c2ecf20Sopenharmony_ci .config_init = xway_gphy_config_init, 3618c2ecf20Sopenharmony_ci .ack_interrupt = xway_gphy_ack_interrupt, 3628c2ecf20Sopenharmony_ci .did_interrupt = xway_gphy_did_interrupt, 3638c2ecf20Sopenharmony_ci .config_intr = xway_gphy_config_intr, 3648c2ecf20Sopenharmony_ci .suspend = genphy_suspend, 3658c2ecf20Sopenharmony_ci .resume = genphy_resume, 3668c2ecf20Sopenharmony_ci }, 3678c2ecf20Sopenharmony_ci}; 3688c2ecf20Sopenharmony_cimodule_phy_driver(xway_gphy); 3698c2ecf20Sopenharmony_ci 3708c2ecf20Sopenharmony_cistatic struct mdio_device_id __maybe_unused xway_gphy_tbl[] = { 3718c2ecf20Sopenharmony_ci { PHY_ID_PHY11G_1_3, 0xffffffff }, 3728c2ecf20Sopenharmony_ci { PHY_ID_PHY22F_1_3, 0xffffffff }, 3738c2ecf20Sopenharmony_ci { PHY_ID_PHY11G_1_4, 0xffffffff }, 3748c2ecf20Sopenharmony_ci { PHY_ID_PHY22F_1_4, 0xffffffff }, 3758c2ecf20Sopenharmony_ci { PHY_ID_PHY11G_1_5, 0xffffffff }, 3768c2ecf20Sopenharmony_ci { PHY_ID_PHY22F_1_5, 0xffffffff }, 3778c2ecf20Sopenharmony_ci { PHY_ID_PHY11G_VR9_1_1, 0xffffffff }, 3788c2ecf20Sopenharmony_ci { PHY_ID_PHY22F_VR9_1_1, 0xffffffff }, 3798c2ecf20Sopenharmony_ci { PHY_ID_PHY11G_VR9_1_2, 0xffffffff }, 3808c2ecf20Sopenharmony_ci { PHY_ID_PHY22F_VR9_1_2, 0xffffffff }, 3818c2ecf20Sopenharmony_ci { } 3828c2ecf20Sopenharmony_ci}; 3838c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(mdio, xway_gphy_tbl); 3848c2ecf20Sopenharmony_ci 3858c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("Intel XWAY PHY driver"); 3868c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL"); 387