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