Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * Copyright (C) 2012 Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * Copyright (C) 2016 Hauke Mehrtens <hauke@hauke-m.de>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) #include <linux/mdio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #include <linux/phy.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #include <linux/of.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #define XWAY_MDIO_IMASK			0x19	/* interrupt mask */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #define XWAY_MDIO_ISTAT			0x1A	/* interrupt status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #define XWAY_MDIO_LED			0x1B	/* led control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) /* bit 15:12 are reserved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #define XWAY_MDIO_LED_LED3_EN		BIT(11)	/* Enable the integrated function of LED3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) #define XWAY_MDIO_LED_LED2_EN		BIT(10)	/* Enable the integrated function of LED2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #define XWAY_MDIO_LED_LED1_EN		BIT(9)	/* Enable the integrated function of LED1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) #define XWAY_MDIO_LED_LED0_EN		BIT(8)	/* Enable the integrated function of LED0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) /* bit 7:4 are reserved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) #define XWAY_MDIO_LED_LED3_DA		BIT(3)	/* Direct Access to LED3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) #define XWAY_MDIO_LED_LED2_DA		BIT(2)	/* Direct Access to LED2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) #define XWAY_MDIO_LED_LED1_DA		BIT(1)	/* Direct Access to LED1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) #define XWAY_MDIO_LED_LED0_DA		BIT(0)	/* Direct Access to LED0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) #define XWAY_MDIO_INIT_WOL		BIT(15)	/* Wake-On-LAN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) #define XWAY_MDIO_INIT_MSRE		BIT(14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) #define XWAY_MDIO_INIT_NPRX		BIT(13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) #define XWAY_MDIO_INIT_NPTX		BIT(12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) #define XWAY_MDIO_INIT_ANE		BIT(11)	/* Auto-Neg error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) #define XWAY_MDIO_INIT_ANC		BIT(10)	/* Auto-Neg complete */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) #define XWAY_MDIO_INIT_ADSC		BIT(5)	/* Link auto-downspeed detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) #define XWAY_MDIO_INIT_MPIPC		BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) #define XWAY_MDIO_INIT_MDIXC		BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) #define XWAY_MDIO_INIT_DXMC		BIT(2)	/* Duplex mode change */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) #define XWAY_MDIO_INIT_LSPC		BIT(1)	/* Link speed change */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) #define XWAY_MDIO_INIT_LSTC		BIT(0)	/* Link state change */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) #define XWAY_MDIO_INIT_MASK		(XWAY_MDIO_INIT_LSTC | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 					 XWAY_MDIO_INIT_ADSC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) #define ADVERTISED_MPD			BIT(10)	/* Multi-port device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) /* LED Configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) #define XWAY_MMD_LEDCH			0x01E0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) /* Inverse of SCAN Function */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) #define  XWAY_MMD_LEDCH_NACS_NONE	0x0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) #define  XWAY_MMD_LEDCH_NACS_LINK	0x0001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) #define  XWAY_MMD_LEDCH_NACS_PDOWN	0x0002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) #define  XWAY_MMD_LEDCH_NACS_EEE	0x0003
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) #define  XWAY_MMD_LEDCH_NACS_ANEG	0x0004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) #define  XWAY_MMD_LEDCH_NACS_ABIST	0x0005
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) #define  XWAY_MMD_LEDCH_NACS_CDIAG	0x0006
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) #define  XWAY_MMD_LEDCH_NACS_TEST	0x0007
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) /* Slow Blink Frequency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) #define  XWAY_MMD_LEDCH_SBF_F02HZ	0x0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) #define  XWAY_MMD_LEDCH_SBF_F04HZ	0x0010
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) #define  XWAY_MMD_LEDCH_SBF_F08HZ	0x0020
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) #define  XWAY_MMD_LEDCH_SBF_F16HZ	0x0030
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) /* Fast Blink Frequency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) #define  XWAY_MMD_LEDCH_FBF_F02HZ	0x0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) #define  XWAY_MMD_LEDCH_FBF_F04HZ	0x0040
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) #define  XWAY_MMD_LEDCH_FBF_F08HZ	0x0080
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) #define  XWAY_MMD_LEDCH_FBF_F16HZ	0x00C0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) /* LED Configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) #define XWAY_MMD_LEDCL			0x01E1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) /* Complex Blinking Configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) #define  XWAY_MMD_LEDCH_CBLINK_NONE	0x0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) #define  XWAY_MMD_LEDCH_CBLINK_LINK	0x0001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) #define  XWAY_MMD_LEDCH_CBLINK_PDOWN	0x0002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) #define  XWAY_MMD_LEDCH_CBLINK_EEE	0x0003
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) #define  XWAY_MMD_LEDCH_CBLINK_ANEG	0x0004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) #define  XWAY_MMD_LEDCH_CBLINK_ABIST	0x0005
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) #define  XWAY_MMD_LEDCH_CBLINK_CDIAG	0x0006
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) #define  XWAY_MMD_LEDCH_CBLINK_TEST	0x0007
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) /* Complex SCAN Configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) #define  XWAY_MMD_LEDCH_SCAN_NONE	0x0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) #define  XWAY_MMD_LEDCH_SCAN_LINK	0x0010
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) #define  XWAY_MMD_LEDCH_SCAN_PDOWN	0x0020
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) #define  XWAY_MMD_LEDCH_SCAN_EEE	0x0030
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) #define  XWAY_MMD_LEDCH_SCAN_ANEG	0x0040
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) #define  XWAY_MMD_LEDCH_SCAN_ABIST	0x0050
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) #define  XWAY_MMD_LEDCH_SCAN_CDIAG	0x0060
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) #define  XWAY_MMD_LEDCH_SCAN_TEST	0x0070
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) /* Configuration for LED Pin x */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) #define XWAY_MMD_LED0H			0x01E2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) /* Fast Blinking Configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) #define  XWAY_MMD_LEDxH_BLINKF_MASK	0x000F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) #define  XWAY_MMD_LEDxH_BLINKF_NONE	0x0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) #define  XWAY_MMD_LEDxH_BLINKF_LINK10	0x0001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) #define  XWAY_MMD_LEDxH_BLINKF_LINK100	0x0002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) #define  XWAY_MMD_LEDxH_BLINKF_LINK10X	0x0003
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) #define  XWAY_MMD_LEDxH_BLINKF_LINK1000	0x0004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) #define  XWAY_MMD_LEDxH_BLINKF_LINK10_0	0x0005
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) #define  XWAY_MMD_LEDxH_BLINKF_LINK100X	0x0006
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) #define  XWAY_MMD_LEDxH_BLINKF_LINK10XX	0x0007
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) #define  XWAY_MMD_LEDxH_BLINKF_PDOWN	0x0008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) #define  XWAY_MMD_LEDxH_BLINKF_EEE	0x0009
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) #define  XWAY_MMD_LEDxH_BLINKF_ANEG	0x000A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define  XWAY_MMD_LEDxH_BLINKF_ABIST	0x000B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define  XWAY_MMD_LEDxH_BLINKF_CDIAG	0x000C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) /* Constant On Configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define  XWAY_MMD_LEDxH_CON_MASK	0x00F0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define  XWAY_MMD_LEDxH_CON_NONE	0x0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define  XWAY_MMD_LEDxH_CON_LINK10	0x0010
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define  XWAY_MMD_LEDxH_CON_LINK100	0x0020
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #define  XWAY_MMD_LEDxH_CON_LINK10X	0x0030
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define  XWAY_MMD_LEDxH_CON_LINK1000	0x0040
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define  XWAY_MMD_LEDxH_CON_LINK10_0	0x0050
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define  XWAY_MMD_LEDxH_CON_LINK100X	0x0060
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define  XWAY_MMD_LEDxH_CON_LINK10XX	0x0070
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define  XWAY_MMD_LEDxH_CON_PDOWN	0x0080
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define  XWAY_MMD_LEDxH_CON_EEE		0x0090
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define  XWAY_MMD_LEDxH_CON_ANEG	0x00A0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define  XWAY_MMD_LEDxH_CON_ABIST	0x00B0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define  XWAY_MMD_LEDxH_CON_CDIAG	0x00C0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define  XWAY_MMD_LEDxH_CON_COPPER	0x00D0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #define  XWAY_MMD_LEDxH_CON_FIBER	0x00E0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) /* Configuration for LED Pin x */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define XWAY_MMD_LED0L			0x01E3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) /* Pulsing Configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define  XWAY_MMD_LEDxL_PULSE_MASK	0x000F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #define  XWAY_MMD_LEDxL_PULSE_NONE	0x0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define  XWAY_MMD_LEDxL_PULSE_TXACT	0x0001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) #define  XWAY_MMD_LEDxL_PULSE_RXACT	0x0002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #define  XWAY_MMD_LEDxL_PULSE_COL	0x0004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) /* Slow Blinking Configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #define  XWAY_MMD_LEDxL_BLINKS_MASK	0x00F0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) #define  XWAY_MMD_LEDxL_BLINKS_NONE	0x0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #define  XWAY_MMD_LEDxL_BLINKS_LINK10	0x0010
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #define  XWAY_MMD_LEDxL_BLINKS_LINK100	0x0020
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #define  XWAY_MMD_LEDxL_BLINKS_LINK10X	0x0030
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) #define  XWAY_MMD_LEDxL_BLINKS_LINK1000	0x0040
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #define  XWAY_MMD_LEDxL_BLINKS_LINK10_0	0x0050
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #define  XWAY_MMD_LEDxL_BLINKS_LINK100X	0x0060
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #define  XWAY_MMD_LEDxL_BLINKS_LINK10XX	0x0070
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #define  XWAY_MMD_LEDxL_BLINKS_PDOWN	0x0080
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #define  XWAY_MMD_LEDxL_BLINKS_EEE	0x0090
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define  XWAY_MMD_LEDxL_BLINKS_ANEG	0x00A0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #define  XWAY_MMD_LEDxL_BLINKS_ABIST	0x00B0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #define  XWAY_MMD_LEDxL_BLINKS_CDIAG	0x00C0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define XWAY_MMD_LED1H			0x01E4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) #define XWAY_MMD_LED1L			0x01E5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) #define XWAY_MMD_LED2H			0x01E6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) #define XWAY_MMD_LED2L			0x01E7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) #define XWAY_MMD_LED3H			0x01E8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #define XWAY_MMD_LED3L			0x01E9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #define PHY_ID_PHY11G_1_3		0x030260D1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #define PHY_ID_PHY22F_1_3		0x030260E1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #define PHY_ID_PHY11G_1_4		0xD565A400
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #define PHY_ID_PHY22F_1_4		0xD565A410
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #define PHY_ID_PHY11G_1_5		0xD565A401
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #define PHY_ID_PHY22F_1_5		0xD565A411
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #define PHY_ID_PHY11G_VR9_1_1		0xD565A408
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) #define PHY_ID_PHY22F_VR9_1_1		0xD565A418
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #define PHY_ID_PHY11G_VR9_1_2		0xD565A409
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) #define PHY_ID_PHY22F_VR9_1_2		0xD565A419
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) static int xway_gphy_config_init(struct phy_device *phydev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 	u32 ledxh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 	u32 ledxl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	/* Mask all interrupts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 	err = phy_write(phydev, XWAY_MDIO_IMASK, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 	/* Clear all pending interrupts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 	phy_read(phydev, XWAY_MDIO_ISTAT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 	/* Ensure that integrated led function is enabled for all leds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	err = phy_write(phydev, XWAY_MDIO_LED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 			XWAY_MDIO_LED_LED0_EN |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 			XWAY_MDIO_LED_LED1_EN |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 			XWAY_MDIO_LED_LED2_EN |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 			XWAY_MDIO_LED_LED3_EN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LEDCH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 		      XWAY_MMD_LEDCH_NACS_NONE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 		      XWAY_MMD_LEDCH_SBF_F02HZ |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 		      XWAY_MMD_LEDCH_FBF_F16HZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LEDCL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 		      XWAY_MMD_LEDCH_CBLINK_NONE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 		      XWAY_MMD_LEDCH_SCAN_NONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	/**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	 * In most cases only one LED is connected to this phy, so
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	 * configure them all to constant on and pulse mode. LED3 is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 	 * only available in some packages, leave it in its reset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 	 * configuration.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 	ledxh = XWAY_MMD_LEDxH_BLINKF_NONE | XWAY_MMD_LEDxH_CON_LINK10XX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 	ledxl = XWAY_MMD_LEDxL_PULSE_TXACT | XWAY_MMD_LEDxL_PULSE_RXACT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 		XWAY_MMD_LEDxL_BLINKS_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 	phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED0H, ledxh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 	phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED0L, ledxl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 	phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED1H, ledxh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 	phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED1L, ledxl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 	phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED2H, ledxh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 	phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED2L, ledxl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) static int xway_gphy14_config_aneg(struct phy_device *phydev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 	int reg, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	/* Advertise as multi-port device, see IEEE802.3-2002 40.5.1.1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 	/* This is a workaround for an errata in rev < 1.5 devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 	reg = phy_read(phydev, MII_CTRL1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 	reg |= ADVERTISED_MPD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 	err = phy_write(phydev, MII_CTRL1000, reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 	return genphy_config_aneg(phydev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) static int xway_gphy_ack_interrupt(struct phy_device *phydev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	int reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 	reg = phy_read(phydev, XWAY_MDIO_ISTAT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 	return (reg < 0) ? reg : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) static int xway_gphy_did_interrupt(struct phy_device *phydev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 	int reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 	reg = phy_read(phydev, XWAY_MDIO_ISTAT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 	return reg & XWAY_MDIO_INIT_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) static int xway_gphy_config_intr(struct phy_device *phydev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 	u16 mask = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 	if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 		mask = XWAY_MDIO_INIT_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 	return phy_write(phydev, XWAY_MDIO_IMASK, mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) static struct phy_driver xway_gphy[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 		.phy_id		= PHY_ID_PHY11G_1_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 		.phy_id_mask	= 0xffffffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 		.name		= "Intel XWAY PHY11G (PEF 7071/PEF 7072) v1.3",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 		/* PHY_GBIT_FEATURES */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 		.config_init	= xway_gphy_config_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 		.config_aneg	= xway_gphy14_config_aneg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 		.ack_interrupt	= xway_gphy_ack_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 		.did_interrupt	= xway_gphy_did_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 		.config_intr	= xway_gphy_config_intr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 		.suspend	= genphy_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 		.resume		= genphy_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 	}, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 		.phy_id		= PHY_ID_PHY22F_1_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 		.phy_id_mask	= 0xffffffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 		.name		= "Intel XWAY PHY22F (PEF 7061) v1.3",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 		/* PHY_BASIC_FEATURES */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 		.config_init	= xway_gphy_config_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 		.config_aneg	= xway_gphy14_config_aneg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 		.ack_interrupt	= xway_gphy_ack_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 		.did_interrupt	= xway_gphy_did_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 		.config_intr	= xway_gphy_config_intr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 		.suspend	= genphy_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 		.resume		= genphy_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 	}, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 		.phy_id		= PHY_ID_PHY11G_1_4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 		.phy_id_mask	= 0xffffffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 		.name		= "Intel XWAY PHY11G (PEF 7071/PEF 7072) v1.4",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 		/* PHY_GBIT_FEATURES */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 		.config_init	= xway_gphy_config_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 		.config_aneg	= xway_gphy14_config_aneg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 		.ack_interrupt	= xway_gphy_ack_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 		.did_interrupt	= xway_gphy_did_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 		.config_intr	= xway_gphy_config_intr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 		.suspend	= genphy_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 		.resume		= genphy_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 	}, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 		.phy_id		= PHY_ID_PHY22F_1_4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 		.phy_id_mask	= 0xffffffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 		.name		= "Intel XWAY PHY22F (PEF 7061) v1.4",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 		/* PHY_BASIC_FEATURES */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 		.config_init	= xway_gphy_config_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 		.config_aneg	= xway_gphy14_config_aneg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 		.ack_interrupt	= xway_gphy_ack_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 		.did_interrupt	= xway_gphy_did_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 		.config_intr	= xway_gphy_config_intr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 		.suspend	= genphy_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 		.resume		= genphy_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 	}, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 		.phy_id		= PHY_ID_PHY11G_1_5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 		.phy_id_mask	= 0xffffffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 		.name		= "Intel XWAY PHY11G (PEF 7071/PEF 7072) v1.5 / v1.6",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 		/* PHY_GBIT_FEATURES */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 		.config_init	= xway_gphy_config_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 		.ack_interrupt	= xway_gphy_ack_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 		.did_interrupt	= xway_gphy_did_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 		.config_intr	= xway_gphy_config_intr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 		.suspend	= genphy_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 		.resume		= genphy_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 	}, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 		.phy_id		= PHY_ID_PHY22F_1_5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 		.phy_id_mask	= 0xffffffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 		.name		= "Intel XWAY PHY22F (PEF 7061) v1.5 / v1.6",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 		/* PHY_BASIC_FEATURES */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 		.config_init	= xway_gphy_config_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 		.ack_interrupt	= xway_gphy_ack_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 		.did_interrupt	= xway_gphy_did_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 		.config_intr	= xway_gphy_config_intr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 		.suspend	= genphy_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 		.resume		= genphy_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 	}, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 		.phy_id		= PHY_ID_PHY11G_VR9_1_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 		.phy_id_mask	= 0xffffffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 		.name		= "Intel XWAY PHY11G (xRX v1.1 integrated)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 		/* PHY_GBIT_FEATURES */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 		.config_init	= xway_gphy_config_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 		.ack_interrupt	= xway_gphy_ack_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 		.did_interrupt	= xway_gphy_did_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 		.config_intr	= xway_gphy_config_intr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 		.suspend	= genphy_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 		.resume		= genphy_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 	}, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 		.phy_id		= PHY_ID_PHY22F_VR9_1_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 		.phy_id_mask	= 0xffffffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 		.name		= "Intel XWAY PHY22F (xRX v1.1 integrated)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 		/* PHY_BASIC_FEATURES */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 		.config_init	= xway_gphy_config_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 		.ack_interrupt	= xway_gphy_ack_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 		.did_interrupt	= xway_gphy_did_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 		.config_intr	= xway_gphy_config_intr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) 		.suspend	= genphy_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 		.resume		= genphy_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) 	}, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 		.phy_id		= PHY_ID_PHY11G_VR9_1_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 		.phy_id_mask	= 0xffffffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 		.name		= "Intel XWAY PHY11G (xRX v1.2 integrated)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 		/* PHY_GBIT_FEATURES */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) 		.config_init	= xway_gphy_config_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) 		.ack_interrupt	= xway_gphy_ack_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) 		.did_interrupt	= xway_gphy_did_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 		.config_intr	= xway_gphy_config_intr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 		.suspend	= genphy_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 		.resume		= genphy_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 	}, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 		.phy_id		= PHY_ID_PHY22F_VR9_1_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 		.phy_id_mask	= 0xffffffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 		.name		= "Intel XWAY PHY22F (xRX v1.2 integrated)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 		/* PHY_BASIC_FEATURES */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 		.config_init	= xway_gphy_config_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 		.ack_interrupt	= xway_gphy_ack_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 		.did_interrupt	= xway_gphy_did_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 		.config_intr	= xway_gphy_config_intr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 		.suspend	= genphy_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 		.resume		= genphy_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) module_phy_driver(xway_gphy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) static struct mdio_device_id __maybe_unused xway_gphy_tbl[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 	{ PHY_ID_PHY11G_1_3, 0xffffffff },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 	{ PHY_ID_PHY22F_1_3, 0xffffffff },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 	{ PHY_ID_PHY11G_1_4, 0xffffffff },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 	{ PHY_ID_PHY22F_1_4, 0xffffffff },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 	{ PHY_ID_PHY11G_1_5, 0xffffffff },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 	{ PHY_ID_PHY22F_1_5, 0xffffffff },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 	{ PHY_ID_PHY11G_VR9_1_1, 0xffffffff },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 	{ PHY_ID_PHY22F_VR9_1_1, 0xffffffff },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 	{ PHY_ID_PHY11G_VR9_1_2, 0xffffffff },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 	{ PHY_ID_PHY22F_VR9_1_2, 0xffffffff },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 	{ }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) MODULE_DEVICE_TABLE(mdio, xway_gphy_tbl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) MODULE_DESCRIPTION("Intel XWAY PHY driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) MODULE_LICENSE("GPL");