xref: /linux/drivers/net/phy/air_en8811h.c (revision d44646fc9eeb423ad50f3043f11f66f491d908a7)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Driver for the Airoha EN8811H and AN8811HB 2.5 Gigabit PHYs.
4  *
5  * Limitations:
6  * - Only full duplex supported
7  * - Forced speed (AN off) is not supported by hardware (100Mbps)
8  *
9  * Source originated from airoha's en8811h.c and en8811h.h v1.2.1
10  * with AN8811HB bits from air_an8811hb.c v0.0.4
11  *
12  * Copyright (C) 2023, 2026 Airoha Technology Corp.
13  */
14 
15 #include <linux/clk.h>
16 #include <linux/clk-provider.h>
17 #include <linux/phy.h>
18 #include <linux/phy/phy-common-props.h>
19 #include <linux/firmware.h>
20 #include <linux/bitfield.h>
21 #include <linux/property.h>
22 #include <linux/wordpart.h>
23 #include <linux/unaligned.h>
24 
25 #include "air_phy_lib.h"
26 
27 #define EN8811H_PHY_ID		0x03a2a411
28 #define AN8811HB_PHY_ID		0xc0ff04a0
29 
30 #define EN8811H_MD32_DM		"airoha/EthMD32.dm.bin"
31 #define EN8811H_MD32_DSP	"airoha/EthMD32.DSP.bin"
32 #define AN8811HB_MD32_DM	"airoha/an8811hb/EthMD32_CRC.DM.bin"
33 #define AN8811HB_MD32_DSP	"airoha/an8811hb/EthMD32_CRC.DSP.bin"
34 
35 #define AIR_FW_ADDR_DM	0x00000000
36 #define AIR_FW_ADDR_DSP	0x00100000
37 
38 /* MII Registers */
39 #define AIR_AUX_CTRL_STATUS		0x1d
40 #define   AIR_AUX_CTRL_STATUS_SPEED_MASK	GENMASK(4, 2)
41 #define   AIR_AUX_CTRL_STATUS_SPEED_10		0x0
42 #define   AIR_AUX_CTRL_STATUS_SPEED_100		0x4
43 #define   AIR_AUX_CTRL_STATUS_SPEED_1000	0x8
44 #define   AIR_AUX_CTRL_STATUS_SPEED_2500	0xc
45 
46 /* Registers on MDIO_MMD_VEND1 */
47 #define EN8811H_PHY_FW_STATUS		0x8009
48 #define   EN8811H_PHY_READY			0x02
49 
50 #define AIR_PHY_MCU_CMD_0		0x800b
51 #define AIR_PHY_MCU_CMD_1		0x800c
52 #define AIR_PHY_MCU_CMD_1_MODE1			0x0
53 #define AIR_PHY_MCU_CMD_2		0x800d
54 #define AIR_PHY_MCU_CMD_2_MODE1			0x0
55 #define AIR_PHY_MCU_CMD_3		0x800e
56 #define AIR_PHY_MCU_CMD_3_MODE1			0x1101
57 #define AIR_PHY_MCU_CMD_3_DOCMD			0x1100
58 #define AIR_PHY_MCU_CMD_4		0x800f
59 #define AIR_PHY_MCU_CMD_4_MODE1			0x0002
60 #define AIR_PHY_MCU_CMD_4_CABLE_PAIR_A		0x00d7
61 #define AIR_PHY_MCU_CMD_4_CABLE_PAIR_B		0x00d8
62 #define AIR_PHY_MCU_CMD_4_CABLE_PAIR_C		0x00d9
63 #define AIR_PHY_MCU_CMD_4_CABLE_PAIR_D		0x00da
64 #define AIR_PHY_MCU_CMD_4_INTCLR		0x00e4
65 
66 /* Registers on MDIO_MMD_VEND2 */
67 #define AIR_PHY_LED_BCR			0x021
68 #define   AIR_PHY_LED_BCR_MODE_MASK		GENMASK(1, 0)
69 #define   AIR_PHY_LED_BCR_TIME_TEST		BIT(2)
70 #define   AIR_PHY_LED_BCR_CLK_EN		BIT(3)
71 #define   AIR_PHY_LED_BCR_EXT_CTRL		BIT(15)
72 
73 #define AIR_PHY_LED_DUR_ON		0x022
74 
75 #define AIR_PHY_LED_DUR_BLINK		0x023
76 
77 #define AIR_PHY_LED_ON(i)	       (0x024 + ((i) * 2))
78 #define   AIR_PHY_LED_ON_MASK			(GENMASK(6, 0) | BIT(8))
79 #define   AIR_PHY_LED_ON_LINK1000		BIT(0)
80 #define   AIR_PHY_LED_ON_LINK100		BIT(1)
81 #define   AIR_PHY_LED_ON_LINK10			BIT(2)
82 #define   AIR_PHY_LED_ON_LINKDOWN		BIT(3)
83 #define   AIR_PHY_LED_ON_FDX			BIT(4) /* Full duplex */
84 #define   AIR_PHY_LED_ON_HDX			BIT(5) /* Half duplex */
85 #define   AIR_PHY_LED_ON_FORCE_ON		BIT(6)
86 #define   AIR_PHY_LED_ON_LINK2500		BIT(8)
87 #define   AIR_PHY_LED_ON_POLARITY		BIT(14)
88 #define   AIR_PHY_LED_ON_ENABLE			BIT(15)
89 
90 #define AIR_PHY_LED_BLINK(i)	       (0x025 + ((i) * 2))
91 #define   AIR_PHY_LED_BLINK_1000TX		BIT(0)
92 #define   AIR_PHY_LED_BLINK_1000RX		BIT(1)
93 #define   AIR_PHY_LED_BLINK_100TX		BIT(2)
94 #define   AIR_PHY_LED_BLINK_100RX		BIT(3)
95 #define   AIR_PHY_LED_BLINK_10TX		BIT(4)
96 #define   AIR_PHY_LED_BLINK_10RX		BIT(5)
97 #define   AIR_PHY_LED_BLINK_COLLISION		BIT(6)
98 #define   AIR_PHY_LED_BLINK_RX_CRC_ERR		BIT(7)
99 #define   AIR_PHY_LED_BLINK_RX_IDLE_ERR		BIT(8)
100 #define   AIR_PHY_LED_BLINK_FORCE_BLINK		BIT(9)
101 #define   AIR_PHY_LED_BLINK_2500TX		BIT(10)
102 #define   AIR_PHY_LED_BLINK_2500RX		BIT(11)
103 
104 /* Registers on BUCKPBUS */
105 #define AIR_PHY_CONTROL			0x3a9c
106 #define   AIR_PHY_CONTROL_INTERNAL		BIT(11)
107 
108 #define EN8811H_2P5G_LPA		0x3b30
109 #define   EN8811H_2P5G_LPA_2P5G			BIT(0)
110 
111 #define EN8811H_FW_VERSION		0x3b3c
112 
113 #define EN8811H_POLARITY		0xca0f8
114 #define   EN8811H_POLARITY_TX_NORMAL		BIT(0)
115 #define   EN8811H_POLARITY_RX_REVERSE		BIT(1)
116 
117 #define EN8811H_GPIO_OUTPUT		0xcf8b8
118 #define   EN8811H_GPIO_OUTPUT_345		(BIT(3) | BIT(4) | BIT(5))
119 
120 #define EN8811H_HWTRAP1			0xcf914
121 #define   EN8811H_HWTRAP1_CKO			BIT(12)
122 #define EN8811H_CLK_CGM			0xcf958
123 #define   EN8811H_CLK_CGM_CKO			BIT(26)
124 
125 #define EN8811H_FW_CTRL_1		0x0f0018
126 #define   EN8811H_FW_CTRL_1_START		0x0
127 #define   EN8811H_FW_CTRL_1_FINISH		0x1
128 #define EN8811H_FW_CTRL_2		0x800000
129 #define EN8811H_FW_CTRL_2_LOADING		BIT(11)
130 
131 #define AN8811HB_CRC_PM_SET1		0xf020c
132 #define AN8811HB_CRC_PM_MON2		0xf0218
133 #define AN8811HB_CRC_PM_MON3		0xf021c
134 #define AN8811HB_CRC_DM_SET1		0xf0224
135 #define AN8811HB_CRC_DM_MON2		0xf0230
136 #define AN8811HB_CRC_DM_MON3		0xf0234
137 #define   AN8811HB_CRC_RD_EN			BIT(0)
138 #define   AN8811HB_CRC_ST			(BIT(0) | BIT(1))
139 #define   AN8811HB_CRC_CHECK_PASS		BIT(0)
140 
141 #define AN8811HB_TX_POLARITY		0x5ce004
142 #define   AN8811HB_TX_POLARITY_NORMAL		BIT(7)
143 #define AN8811HB_RX_POLARITY		0x5ce61c
144 #define   AN8811HB_RX_POLARITY_NORMAL		BIT(7)
145 
146 #define AN8811HB_GPIO_OUTPUT		0x5cf8b8
147 #define   AN8811HB_GPIO_OUTPUT_345		(BIT(3) | BIT(4) | BIT(5))
148 
149 #define AN8811HB_HWTRAP1		0x5cf910
150 #define AN8811HB_HWTRAP2		0x5cf914
151 #define   AN8811HB_HWTRAP2_CKO			BIT(28)
152 
153 #define AN8811HB_CLK_DRV		0x5cf9e4
154 #define AN8811HB_CLK_DRV_CKO_MASK		GENMASK(14, 12)
155 #define   AN8811HB_CLK_DRV_CKOPWD		BIT(12)
156 #define   AN8811HB_CLK_DRV_CKO_LDPWD		BIT(13)
157 #define   AN8811HB_CLK_DRV_CKO_LPPWD		BIT(14)
158 
159 #define AN8811HB_MCU_SW_RST		0x5cf9f8
160 #define   AN8811HB_MCU_SW_RST_HOLD		BIT(16)
161 #define   AN8811HB_MCU_SW_RST_RUN		(BIT(16) | BIT(0))
162 #define AN8811HB_MCU_SW_START		0x5cf9fc
163 #define   AN8811HB_MCU_SW_START_EN		BIT(16)
164 
165 /* MII register constants for PBUS access (PHY addr + 8) */
166 #define AIR_PBUS_ADDR_HIGH		0x1c
167 #define AIR_PBUS_DATA_HIGH		0x10
168 #define AIR_PBUS_REG_ADDR_HIGH_MASK	GENMASK(15, 6)
169 #define AIR_PBUS_REG_ADDR_LOW_MASK	GENMASK(5, 2)
170 
171 /* Led definitions */
172 #define EN8811H_LED_COUNT	3
173 
174 #define EN8811H_PBUS_ADDR_OFFS	8
175 
176 /* Default LED setup:
177  * GPIO5 <-> LED0  On: Link detected, blink Rx/Tx
178  * GPIO4 <-> LED1  On: Link detected at 2500 or 1000 Mbps
179  * GPIO3 <-> LED2  On: Link detected at 2500 or  100 Mbps
180  */
181 #define AIR_DEFAULT_TRIGGER_LED0 (BIT(TRIGGER_NETDEV_LINK)      | \
182 				  BIT(TRIGGER_NETDEV_RX)        | \
183 				  BIT(TRIGGER_NETDEV_TX))
184 #define AIR_DEFAULT_TRIGGER_LED1 (BIT(TRIGGER_NETDEV_LINK_2500) | \
185 				  BIT(TRIGGER_NETDEV_LINK_1000))
186 #define AIR_DEFAULT_TRIGGER_LED2 (BIT(TRIGGER_NETDEV_LINK_2500) | \
187 				  BIT(TRIGGER_NETDEV_LINK_100))
188 
189 struct led {
190 	unsigned long rules;
191 	unsigned long state;
192 };
193 
194 #define clk_hw_to_en8811h_priv(_hw)			\
195 	container_of(_hw, struct en8811h_priv, hw)
196 
197 struct en8811h_priv {
198 	u32			firmware_version;
199 	bool			mcu_needs_restart;
200 	struct led		led[EN8811H_LED_COUNT];
201 	struct clk_hw		hw;
202 	struct phy_device	*phydev;
203 	unsigned int		cko_is_enabled;
204 	struct mdio_device	*pbusdev;
205 };
206 
207 enum {
208 	AIR_PHY_LED_STATE_FORCE_ON,
209 	AIR_PHY_LED_STATE_FORCE_BLINK,
210 };
211 
212 enum {
213 	AIR_PHY_LED_DUR_BLINK_32MS,
214 	AIR_PHY_LED_DUR_BLINK_64MS,
215 	AIR_PHY_LED_DUR_BLINK_128MS,
216 	AIR_PHY_LED_DUR_BLINK_256MS,
217 	AIR_PHY_LED_DUR_BLINK_512MS,
218 	AIR_PHY_LED_DUR_BLINK_1024MS,
219 };
220 
221 enum {
222 	AIR_LED_DISABLE,
223 	AIR_LED_ENABLE,
224 };
225 
226 enum {
227 	AIR_ACTIVE_LOW,
228 	AIR_ACTIVE_HIGH,
229 };
230 
231 enum {
232 	AIR_LED_MODE_DISABLE,
233 	AIR_LED_MODE_USER_DEFINE,
234 };
235 
236 #define AIR_PHY_LED_DUR_UNIT	1024
237 #define AIR_PHY_LED_DUR (AIR_PHY_LED_DUR_UNIT << AIR_PHY_LED_DUR_BLINK_64MS)
238 
239 static const unsigned long en8811h_led_trig = BIT(TRIGGER_NETDEV_FULL_DUPLEX) |
240 					      BIT(TRIGGER_NETDEV_LINK)        |
241 					      BIT(TRIGGER_NETDEV_LINK_10)     |
242 					      BIT(TRIGGER_NETDEV_LINK_100)    |
243 					      BIT(TRIGGER_NETDEV_LINK_1000)   |
244 					      BIT(TRIGGER_NETDEV_LINK_2500)   |
245 					      BIT(TRIGGER_NETDEV_RX)          |
246 					      BIT(TRIGGER_NETDEV_TX);
247 
248 static int __air_pbus_reg_write(struct mdio_device *mdiodev,
249 				u32 pbus_reg, u32 pbus_data)
250 {
251 	int ret;
252 
253 	ret = __mdiobus_write(mdiodev->bus, mdiodev->addr, AIR_EXT_PAGE_ACCESS,
254 			      upper_16_bits(pbus_reg));
255 	if (ret < 0)
256 		return ret;
257 
258 	ret = __mdiobus_write(mdiodev->bus, mdiodev->addr, AIR_PBUS_ADDR_HIGH,
259 			      FIELD_GET(AIR_PBUS_REG_ADDR_HIGH_MASK, pbus_reg));
260 	if (ret < 0)
261 		return ret;
262 
263 	ret = __mdiobus_write(mdiodev->bus, mdiodev->addr,
264 			      FIELD_GET(AIR_PBUS_REG_ADDR_LOW_MASK, pbus_reg),
265 			      lower_16_bits(pbus_data));
266 	if (ret < 0)
267 		return ret;
268 
269 	return __mdiobus_write(mdiodev->bus, mdiodev->addr, AIR_PBUS_DATA_HIGH,
270 			       upper_16_bits(pbus_data));
271 }
272 
273 static int __air_write_buf(struct phy_device *phydev, u32 address,
274 			   const struct firmware *fw)
275 {
276 	unsigned int offset;
277 	int ret;
278 	u16 val;
279 
280 	ret = __phy_write(phydev, AIR_BPBUS_MODE, AIR_BPBUS_MODE_ADDR_INCR);
281 	if (ret < 0)
282 		return ret;
283 
284 	ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_HIGH,
285 			  upper_16_bits(address));
286 	if (ret < 0)
287 		return ret;
288 
289 	ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_LOW,
290 			  lower_16_bits(address));
291 	if (ret < 0)
292 		return ret;
293 
294 	for (offset = 0; offset < fw->size; offset += 4) {
295 		val = get_unaligned_le16(&fw->data[offset + 2]);
296 		ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_HIGH, val);
297 		if (ret < 0)
298 			return ret;
299 
300 		val = get_unaligned_le16(&fw->data[offset]);
301 		ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_LOW, val);
302 		if (ret < 0)
303 			return ret;
304 	}
305 
306 	return 0;
307 }
308 
309 static int air_write_buf(struct phy_device *phydev, u32 address,
310 			 const struct firmware *fw)
311 {
312 	int saved_page;
313 	int ret = 0;
314 
315 	saved_page = phy_select_page(phydev, AIR_PHY_PAGE_EXTENDED_4);
316 
317 	if (saved_page >= 0) {
318 		ret = __air_write_buf(phydev, address, fw);
319 		if (ret < 0)
320 			phydev_err(phydev, "%s 0x%08x failed: %d\n", __func__,
321 				   address, ret);
322 	}
323 
324 	return phy_restore_page(phydev, saved_page, ret);
325 }
326 
327 static int en8811h_wait_mcu_ready(struct phy_device *phydev)
328 {
329 	int ret, reg_value;
330 
331 	ret = air_phy_buckpbus_reg_write(phydev, EN8811H_FW_CTRL_1,
332 					 EN8811H_FW_CTRL_1_FINISH);
333 	if (ret)
334 		return ret;
335 
336 	/* Because of mdio-lock, may have to wait for multiple loads */
337 	ret = phy_read_mmd_poll_timeout(phydev, MDIO_MMD_VEND1,
338 					EN8811H_PHY_FW_STATUS, reg_value,
339 					reg_value == EN8811H_PHY_READY,
340 					20000, 7500000, true);
341 	if (ret) {
342 		phydev_err(phydev, "MCU not ready: 0x%x\n", reg_value);
343 		return -ENODEV;
344 	}
345 
346 	return 0;
347 }
348 
349 static int an8811hb_check_crc(struct phy_device *phydev, u32 set1,
350 			      u32 mon2, u32 mon3)
351 {
352 	u32 pbus_value;
353 	int retry = 25;
354 	int ret;
355 
356 	/* Configure CRC */
357 	ret = air_phy_buckpbus_reg_modify(phydev, set1,
358 					  AN8811HB_CRC_RD_EN,
359 					  AN8811HB_CRC_RD_EN);
360 	if (ret < 0)
361 		return ret;
362 	air_phy_buckpbus_reg_read(phydev, set1, &pbus_value);
363 
364 	do {
365 		msleep(300);
366 		air_phy_buckpbus_reg_read(phydev, mon2, &pbus_value);
367 
368 		/* We do not know what errors this check is supposed
369 		 * catch or what to do about a failure. So print the
370 		 * result and continue like the vendor driver does.
371 		 */
372 		if (pbus_value & AN8811HB_CRC_ST) {
373 			air_phy_buckpbus_reg_read(phydev, mon3, &pbus_value);
374 			phydev_dbg(phydev, "CRC Check %s!\n",
375 				   pbus_value & AN8811HB_CRC_CHECK_PASS ?
376 					"PASS" : "FAIL");
377 			return air_phy_buckpbus_reg_modify(phydev, set1,
378 							   AN8811HB_CRC_RD_EN,
379 							   0);
380 		}
381 	} while (--retry);
382 
383 	phydev_err(phydev, "CRC Check is not ready (%u)\n", pbus_value);
384 	return -ENODEV;
385 }
386 
387 static void en8811h_print_fw_version(struct phy_device *phydev)
388 {
389 	struct en8811h_priv *priv = phydev->priv;
390 
391 	air_phy_buckpbus_reg_read(phydev, EN8811H_FW_VERSION,
392 				  &priv->firmware_version);
393 	phydev_info(phydev, "MD32 firmware version: %08x\n",
394 		    priv->firmware_version);
395 }
396 
397 static int an8811hb_load_file(struct phy_device *phydev, const char *name,
398 			      u32 address)
399 {
400 	struct device *dev = &phydev->mdio.dev;
401 	const struct firmware *fw;
402 	int ret;
403 
404 	ret = request_firmware_direct(&fw, name, dev);
405 	if (ret < 0)
406 		return ret;
407 
408 	ret = air_write_buf(phydev, address,  fw);
409 	release_firmware(fw);
410 	return ret;
411 }
412 
413 static int an8811hb_mcu_assert(struct phy_device *phydev)
414 {
415 	struct en8811h_priv *priv = phydev->priv;
416 	int ret;
417 
418 	phy_lock_mdio_bus(phydev);
419 
420 	ret = __air_pbus_reg_write(priv->pbusdev, AN8811HB_MCU_SW_RST,
421 				   AN8811HB_MCU_SW_RST_HOLD);
422 	if (ret < 0)
423 		goto unlock;
424 
425 	ret = __air_pbus_reg_write(priv->pbusdev, AN8811HB_MCU_SW_START, 0);
426 	if (ret < 0)
427 		goto unlock;
428 
429 	msleep(50);
430 	phydev_dbg(phydev, "MCU asserted\n");
431 
432 unlock:
433 	phy_unlock_mdio_bus(phydev);
434 	return ret;
435 }
436 
437 static int an8811hb_mcu_deassert(struct phy_device *phydev)
438 {
439 	struct en8811h_priv *priv = phydev->priv;
440 	int ret;
441 
442 	phy_lock_mdio_bus(phydev);
443 
444 	ret = __air_pbus_reg_write(priv->pbusdev, AN8811HB_MCU_SW_START,
445 				   AN8811HB_MCU_SW_START_EN);
446 	if (ret < 0)
447 		goto unlock;
448 
449 	ret = __air_pbus_reg_write(priv->pbusdev, AN8811HB_MCU_SW_RST,
450 				   AN8811HB_MCU_SW_RST_RUN);
451 	if (ret < 0)
452 		goto unlock;
453 
454 	msleep(50);
455 	phydev_dbg(phydev, "MCU deasserted\n");
456 
457 unlock:
458 	phy_unlock_mdio_bus(phydev);
459 	return ret;
460 }
461 
462 static int an8811hb_load_firmware(struct phy_device *phydev)
463 {
464 	int ret;
465 
466 	ret = an8811hb_mcu_assert(phydev);
467 	if (ret < 0)
468 		return ret;
469 
470 	ret = an8811hb_mcu_deassert(phydev);
471 	if (ret < 0)
472 		return ret;
473 
474 	ret = air_phy_buckpbus_reg_write(phydev, EN8811H_FW_CTRL_1,
475 					 EN8811H_FW_CTRL_1_START);
476 	if (ret < 0)
477 		return ret;
478 
479 	ret = an8811hb_load_file(phydev, AN8811HB_MD32_DM, AIR_FW_ADDR_DM);
480 	if (ret < 0)
481 		return ret;
482 
483 	ret = an8811hb_check_crc(phydev, AN8811HB_CRC_DM_SET1,
484 				 AN8811HB_CRC_DM_MON2,
485 				 AN8811HB_CRC_DM_MON3);
486 	if (ret < 0)
487 		return ret;
488 
489 	ret = an8811hb_load_file(phydev, AN8811HB_MD32_DSP, AIR_FW_ADDR_DSP);
490 	if (ret < 0)
491 		return ret;
492 
493 	ret = an8811hb_check_crc(phydev, AN8811HB_CRC_PM_SET1,
494 				 AN8811HB_CRC_PM_MON2,
495 				 AN8811HB_CRC_PM_MON3);
496 	if (ret < 0)
497 		return ret;
498 
499 	return en8811h_wait_mcu_ready(phydev);
500 }
501 
502 static int en8811h_load_firmware(struct phy_device *phydev)
503 {
504 	struct device *dev = &phydev->mdio.dev;
505 	const struct firmware *fw1, *fw2;
506 	int ret;
507 
508 	ret = request_firmware_direct(&fw1, EN8811H_MD32_DM, dev);
509 	if (ret < 0)
510 		return ret;
511 
512 	ret = request_firmware_direct(&fw2, EN8811H_MD32_DSP, dev);
513 	if (ret < 0)
514 		goto en8811h_load_firmware_rel1;
515 
516 	ret = air_phy_buckpbus_reg_write(phydev, EN8811H_FW_CTRL_1,
517 					 EN8811H_FW_CTRL_1_START);
518 	if (ret < 0)
519 		goto en8811h_load_firmware_out;
520 
521 	ret = air_phy_buckpbus_reg_modify(phydev, EN8811H_FW_CTRL_2,
522 					  EN8811H_FW_CTRL_2_LOADING,
523 					  EN8811H_FW_CTRL_2_LOADING);
524 	if (ret < 0)
525 		goto en8811h_load_firmware_out;
526 
527 	ret = air_write_buf(phydev, AIR_FW_ADDR_DM,  fw1);
528 	if (ret < 0)
529 		goto en8811h_load_firmware_out;
530 
531 	ret = air_write_buf(phydev, AIR_FW_ADDR_DSP, fw2);
532 	if (ret < 0)
533 		goto en8811h_load_firmware_out;
534 
535 	ret = air_phy_buckpbus_reg_modify(phydev, EN8811H_FW_CTRL_2,
536 					  EN8811H_FW_CTRL_2_LOADING, 0);
537 	if (ret < 0)
538 		goto en8811h_load_firmware_out;
539 
540 	ret = en8811h_wait_mcu_ready(phydev);
541 	if (ret < 0)
542 		goto en8811h_load_firmware_out;
543 
544 	en8811h_print_fw_version(phydev);
545 
546 en8811h_load_firmware_out:
547 	release_firmware(fw2);
548 
549 en8811h_load_firmware_rel1:
550 	release_firmware(fw1);
551 
552 	if (ret < 0)
553 		phydev_err(phydev, "Load firmware failed: %d\n", ret);
554 
555 	return ret;
556 }
557 
558 static int en8811h_restart_mcu(struct phy_device *phydev)
559 {
560 	int ret;
561 
562 	if (phy_id_compare_model(phydev->phy_id, AN8811HB_PHY_ID)) {
563 		ret = an8811hb_mcu_assert(phydev);
564 		if (ret < 0)
565 			return ret;
566 
567 		ret = an8811hb_mcu_deassert(phydev);
568 		if (ret < 0)
569 			return ret;
570 	}
571 
572 	ret = air_phy_buckpbus_reg_write(phydev, EN8811H_FW_CTRL_1,
573 					 EN8811H_FW_CTRL_1_START);
574 	if (ret < 0)
575 		return ret;
576 
577 	return en8811h_wait_mcu_ready(phydev);
578 }
579 
580 static int air_hw_led_on_set(struct phy_device *phydev, u8 index, bool on)
581 {
582 	struct en8811h_priv *priv = phydev->priv;
583 	bool changed;
584 
585 	if (index >= EN8811H_LED_COUNT)
586 		return -EINVAL;
587 
588 	if (on)
589 		changed = !test_and_set_bit(AIR_PHY_LED_STATE_FORCE_ON,
590 					    &priv->led[index].state);
591 	else
592 		changed = !!test_and_clear_bit(AIR_PHY_LED_STATE_FORCE_ON,
593 					       &priv->led[index].state);
594 
595 	changed |= (priv->led[index].rules != 0);
596 
597 	/* clear netdev trigger rules in case LED_OFF has been set */
598 	if (!on)
599 		priv->led[index].rules = 0;
600 
601 	if (changed)
602 		return phy_modify_mmd(phydev, MDIO_MMD_VEND2,
603 				      AIR_PHY_LED_ON(index),
604 				      AIR_PHY_LED_ON_MASK,
605 				      on ? AIR_PHY_LED_ON_FORCE_ON : 0);
606 
607 	return 0;
608 }
609 
610 static int air_hw_led_blink_set(struct phy_device *phydev, u8 index,
611 				bool blinking)
612 {
613 	struct en8811h_priv *priv = phydev->priv;
614 	bool changed;
615 
616 	if (index >= EN8811H_LED_COUNT)
617 		return -EINVAL;
618 
619 	if (blinking)
620 		changed = !test_and_set_bit(AIR_PHY_LED_STATE_FORCE_BLINK,
621 					    &priv->led[index].state);
622 	else
623 		changed = !!test_and_clear_bit(AIR_PHY_LED_STATE_FORCE_BLINK,
624 					       &priv->led[index].state);
625 
626 	changed |= (priv->led[index].rules != 0);
627 
628 	if (changed)
629 		return phy_write_mmd(phydev, MDIO_MMD_VEND2,
630 				     AIR_PHY_LED_BLINK(index),
631 				     blinking ?
632 				     AIR_PHY_LED_BLINK_FORCE_BLINK : 0);
633 	else
634 		return 0;
635 }
636 
637 static int air_led_blink_set(struct phy_device *phydev, u8 index,
638 			     unsigned long *delay_on,
639 			     unsigned long *delay_off)
640 {
641 	struct en8811h_priv *priv = phydev->priv;
642 	bool blinking = false;
643 	int err;
644 
645 	if (index >= EN8811H_LED_COUNT)
646 		return -EINVAL;
647 
648 	if (delay_on && delay_off && (*delay_on > 0) && (*delay_off > 0)) {
649 		blinking = true;
650 		*delay_on = 50;
651 		*delay_off = 50;
652 	}
653 
654 	err = air_hw_led_blink_set(phydev, index, blinking);
655 	if (err)
656 		return err;
657 
658 	/* led-blink set, so switch led-on off */
659 	err = air_hw_led_on_set(phydev, index, false);
660 	if (err)
661 		return err;
662 
663 	/* hw-control is off*/
664 	if (!!test_bit(AIR_PHY_LED_STATE_FORCE_BLINK, &priv->led[index].state))
665 		priv->led[index].rules = 0;
666 
667 	return 0;
668 }
669 
670 static int air_led_brightness_set(struct phy_device *phydev, u8 index,
671 				  enum led_brightness value)
672 {
673 	struct en8811h_priv *priv = phydev->priv;
674 	int err;
675 
676 	if (index >= EN8811H_LED_COUNT)
677 		return -EINVAL;
678 
679 	/* led-on set, so switch led-blink off */
680 	err = air_hw_led_blink_set(phydev, index, false);
681 	if (err)
682 		return err;
683 
684 	err = air_hw_led_on_set(phydev, index, (value != LED_OFF));
685 	if (err)
686 		return err;
687 
688 	/* hw-control is off */
689 	if (!!test_bit(AIR_PHY_LED_STATE_FORCE_ON, &priv->led[index].state))
690 		priv->led[index].rules = 0;
691 
692 	return 0;
693 }
694 
695 static int air_led_hw_control_get(struct phy_device *phydev, u8 index,
696 				  unsigned long *rules)
697 {
698 	struct en8811h_priv *priv = phydev->priv;
699 
700 	if (index >= EN8811H_LED_COUNT)
701 		return -EINVAL;
702 
703 	*rules = priv->led[index].rules;
704 
705 	return 0;
706 };
707 
708 static int air_led_hw_control_set(struct phy_device *phydev, u8 index,
709 				  unsigned long rules)
710 {
711 	struct en8811h_priv *priv = phydev->priv;
712 	u16 on = 0, blink = 0;
713 	int ret;
714 
715 	if (index >= EN8811H_LED_COUNT)
716 		return -EINVAL;
717 
718 	priv->led[index].rules = rules;
719 
720 	if (rules & BIT(TRIGGER_NETDEV_FULL_DUPLEX))
721 		on |= AIR_PHY_LED_ON_FDX;
722 
723 	if (rules & (BIT(TRIGGER_NETDEV_LINK_10) | BIT(TRIGGER_NETDEV_LINK)))
724 		on |= AIR_PHY_LED_ON_LINK10;
725 
726 	if (rules & (BIT(TRIGGER_NETDEV_LINK_100) | BIT(TRIGGER_NETDEV_LINK)))
727 		on |= AIR_PHY_LED_ON_LINK100;
728 
729 	if (rules & (BIT(TRIGGER_NETDEV_LINK_1000) | BIT(TRIGGER_NETDEV_LINK)))
730 		on |= AIR_PHY_LED_ON_LINK1000;
731 
732 	if (rules & (BIT(TRIGGER_NETDEV_LINK_2500) | BIT(TRIGGER_NETDEV_LINK)))
733 		on |= AIR_PHY_LED_ON_LINK2500;
734 
735 	if (rules & BIT(TRIGGER_NETDEV_RX)) {
736 		blink |= AIR_PHY_LED_BLINK_10RX   |
737 			 AIR_PHY_LED_BLINK_100RX  |
738 			 AIR_PHY_LED_BLINK_1000RX |
739 			 AIR_PHY_LED_BLINK_2500RX;
740 	}
741 
742 	if (rules & BIT(TRIGGER_NETDEV_TX)) {
743 		blink |= AIR_PHY_LED_BLINK_10TX   |
744 			 AIR_PHY_LED_BLINK_100TX  |
745 			 AIR_PHY_LED_BLINK_1000TX |
746 			 AIR_PHY_LED_BLINK_2500TX;
747 	}
748 
749 	if (blink || on) {
750 		/* switch hw-control on, so led-on and led-blink are off */
751 		clear_bit(AIR_PHY_LED_STATE_FORCE_ON,
752 			  &priv->led[index].state);
753 		clear_bit(AIR_PHY_LED_STATE_FORCE_BLINK,
754 			  &priv->led[index].state);
755 	} else {
756 		priv->led[index].rules = 0;
757 	}
758 
759 	ret = phy_modify_mmd(phydev, MDIO_MMD_VEND2, AIR_PHY_LED_ON(index),
760 			     AIR_PHY_LED_ON_MASK, on);
761 
762 	if (ret < 0)
763 		return ret;
764 
765 	return phy_write_mmd(phydev, MDIO_MMD_VEND2, AIR_PHY_LED_BLINK(index),
766 			     blink);
767 };
768 
769 static int air_led_init(struct phy_device *phydev, u8 index, u8 state, u8 pol)
770 {
771 	int val = 0;
772 	int err;
773 
774 	if (index >= EN8811H_LED_COUNT)
775 		return -EINVAL;
776 
777 	if (state == AIR_LED_ENABLE)
778 		val |= AIR_PHY_LED_ON_ENABLE;
779 	else
780 		val &= ~AIR_PHY_LED_ON_ENABLE;
781 
782 	if (pol == AIR_ACTIVE_HIGH)
783 		val |= AIR_PHY_LED_ON_POLARITY;
784 	else
785 		val &= ~AIR_PHY_LED_ON_POLARITY;
786 
787 	err = phy_modify_mmd(phydev, MDIO_MMD_VEND2, AIR_PHY_LED_ON(index),
788 			     AIR_PHY_LED_ON_ENABLE |
789 			     AIR_PHY_LED_ON_POLARITY, val);
790 
791 	if (err < 0)
792 		return err;
793 
794 	return 0;
795 }
796 
797 static int air_leds_init(struct phy_device *phydev, int num, int dur, int mode)
798 {
799 	struct en8811h_priv *priv = phydev->priv;
800 	int ret, i;
801 
802 	ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, AIR_PHY_LED_DUR_BLINK,
803 			    dur);
804 	if (ret < 0)
805 		return ret;
806 
807 	ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, AIR_PHY_LED_DUR_ON,
808 			    dur >> 1);
809 	if (ret < 0)
810 		return ret;
811 
812 	switch (mode) {
813 	case AIR_LED_MODE_DISABLE:
814 		ret = phy_modify_mmd(phydev, MDIO_MMD_VEND2, AIR_PHY_LED_BCR,
815 				     AIR_PHY_LED_BCR_EXT_CTRL |
816 				     AIR_PHY_LED_BCR_MODE_MASK, 0);
817 		if (ret < 0)
818 			return ret;
819 		break;
820 	case AIR_LED_MODE_USER_DEFINE:
821 		ret = phy_modify_mmd(phydev, MDIO_MMD_VEND2, AIR_PHY_LED_BCR,
822 				     AIR_PHY_LED_BCR_EXT_CTRL |
823 				     AIR_PHY_LED_BCR_CLK_EN,
824 				     AIR_PHY_LED_BCR_EXT_CTRL |
825 				     AIR_PHY_LED_BCR_CLK_EN);
826 		if (ret < 0)
827 			return ret;
828 		break;
829 	default:
830 		phydev_err(phydev, "LED mode %d is not supported\n", mode);
831 		return -EINVAL;
832 	}
833 
834 	for (i = 0; i < num; ++i) {
835 		ret = air_led_init(phydev, i, AIR_LED_ENABLE, AIR_ACTIVE_HIGH);
836 		if (ret < 0) {
837 			phydev_err(phydev, "LED%d init failed: %d\n", i, ret);
838 			return ret;
839 		}
840 		air_led_hw_control_set(phydev, i, priv->led[i].rules);
841 	}
842 
843 	return 0;
844 }
845 
846 static int en8811h_led_hw_is_supported(struct phy_device *phydev, u8 index,
847 				       unsigned long rules)
848 {
849 	if (index >= EN8811H_LED_COUNT)
850 		return -EINVAL;
851 
852 	/* All combinations of the supported triggers are allowed */
853 	if (rules & ~en8811h_led_trig)
854 		return -EOPNOTSUPP;
855 
856 	return 0;
857 };
858 
859 static unsigned long an8811hb_clk_recalc_rate(struct clk_hw *hw,
860 					      unsigned long parent)
861 {
862 	struct en8811h_priv *priv = clk_hw_to_en8811h_priv(hw);
863 	struct phy_device *phydev = priv->phydev;
864 	u32 pbus_value;
865 	int ret;
866 
867 	ret = air_phy_buckpbus_reg_read(phydev, AN8811HB_HWTRAP2, &pbus_value);
868 	if (ret < 0)
869 		return ret;
870 
871 	return (pbus_value & AN8811HB_HWTRAP2_CKO) ? 50000000 : 25000000;
872 }
873 
874 static int an8811hb_clk_enable(struct clk_hw *hw)
875 {
876 	struct en8811h_priv *priv = clk_hw_to_en8811h_priv(hw);
877 	struct phy_device *phydev = priv->phydev;
878 
879 	return air_phy_buckpbus_reg_modify(phydev, AN8811HB_CLK_DRV,
880 					   AN8811HB_CLK_DRV_CKO_MASK,
881 					   AN8811HB_CLK_DRV_CKO_MASK);
882 }
883 
884 static void an8811hb_clk_disable(struct clk_hw *hw)
885 {
886 	struct en8811h_priv *priv = clk_hw_to_en8811h_priv(hw);
887 	struct phy_device *phydev = priv->phydev;
888 
889 	air_phy_buckpbus_reg_modify(phydev, AN8811HB_CLK_DRV,
890 				    AN8811HB_CLK_DRV_CKO_MASK, 0);
891 }
892 
893 static int an8811hb_clk_is_enabled(struct clk_hw *hw)
894 {
895 	struct en8811h_priv *priv = clk_hw_to_en8811h_priv(hw);
896 	struct phy_device *phydev = priv->phydev;
897 	u32 pbus_value;
898 	int ret;
899 
900 	ret = air_phy_buckpbus_reg_read(phydev, AN8811HB_CLK_DRV, &pbus_value);
901 	if (ret < 0)
902 		return ret;
903 
904 	return (pbus_value & AN8811HB_CLK_DRV_CKO_MASK);
905 }
906 
907 static int an8811hb_clk_save_context(struct clk_hw *hw)
908 {
909 	struct en8811h_priv *priv = clk_hw_to_en8811h_priv(hw);
910 
911 	priv->cko_is_enabled = an8811hb_clk_is_enabled(hw);
912 
913 	return 0;
914 }
915 
916 static void an8811hb_clk_restore_context(struct clk_hw *hw)
917 {
918 	struct en8811h_priv *priv = clk_hw_to_en8811h_priv(hw);
919 
920 	if (!priv->cko_is_enabled)
921 		an8811hb_clk_disable(hw);
922 }
923 
924 static const struct clk_ops an8811hb_clk_ops = {
925 	.recalc_rate		= an8811hb_clk_recalc_rate,
926 	.enable			= an8811hb_clk_enable,
927 	.disable		= an8811hb_clk_disable,
928 	.is_enabled		= an8811hb_clk_is_enabled,
929 	.save_context		= an8811hb_clk_save_context,
930 	.restore_context	= an8811hb_clk_restore_context,
931 };
932 
933 static int an8811hb_clk_provider_setup(struct device *dev, struct clk_hw *hw)
934 {
935 	struct clk_init_data init;
936 	int ret;
937 
938 	if (!IS_ENABLED(CONFIG_COMMON_CLK))
939 		return 0;
940 
941 	init.name = devm_kasprintf(dev, GFP_KERNEL, "%s-cko",
942 				   fwnode_get_name(dev_fwnode(dev)));
943 	if (!init.name)
944 		return -ENOMEM;
945 
946 	init.ops = &an8811hb_clk_ops;
947 	init.flags = 0;
948 	init.num_parents = 0;
949 	hw->init = &init;
950 
951 	ret = devm_clk_hw_register(dev, hw);
952 	if (ret)
953 		return ret;
954 
955 	return devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, hw);
956 }
957 
958 static unsigned long en8811h_clk_recalc_rate(struct clk_hw *hw,
959 					     unsigned long parent)
960 {
961 	struct en8811h_priv *priv = clk_hw_to_en8811h_priv(hw);
962 	struct phy_device *phydev = priv->phydev;
963 	u32 pbus_value;
964 	int ret;
965 
966 	ret = air_phy_buckpbus_reg_read(phydev, EN8811H_HWTRAP1, &pbus_value);
967 	if (ret < 0)
968 		return ret;
969 
970 	return (pbus_value & EN8811H_HWTRAP1_CKO) ? 50000000 : 25000000;
971 }
972 
973 static int en8811h_clk_enable(struct clk_hw *hw)
974 {
975 	struct en8811h_priv *priv = clk_hw_to_en8811h_priv(hw);
976 	struct phy_device *phydev = priv->phydev;
977 
978 	return air_phy_buckpbus_reg_modify(phydev, EN8811H_CLK_CGM,
979 					   EN8811H_CLK_CGM_CKO,
980 					   EN8811H_CLK_CGM_CKO);
981 }
982 
983 static void en8811h_clk_disable(struct clk_hw *hw)
984 {
985 	struct en8811h_priv *priv = clk_hw_to_en8811h_priv(hw);
986 	struct phy_device *phydev = priv->phydev;
987 
988 	air_phy_buckpbus_reg_modify(phydev, EN8811H_CLK_CGM,
989 				    EN8811H_CLK_CGM_CKO, 0);
990 }
991 
992 static int en8811h_clk_is_enabled(struct clk_hw *hw)
993 {
994 	struct en8811h_priv *priv = clk_hw_to_en8811h_priv(hw);
995 	struct phy_device *phydev = priv->phydev;
996 	u32 pbus_value;
997 	int ret;
998 
999 	ret = air_phy_buckpbus_reg_read(phydev, EN8811H_CLK_CGM, &pbus_value);
1000 	if (ret < 0)
1001 		return ret;
1002 
1003 	return (pbus_value & EN8811H_CLK_CGM_CKO);
1004 }
1005 
1006 static int en8811h_clk_save_context(struct clk_hw *hw)
1007 {
1008 	struct en8811h_priv *priv = clk_hw_to_en8811h_priv(hw);
1009 
1010 	priv->cko_is_enabled = en8811h_clk_is_enabled(hw);
1011 
1012 	return 0;
1013 }
1014 
1015 static void en8811h_clk_restore_context(struct clk_hw *hw)
1016 {
1017 	struct en8811h_priv *priv = clk_hw_to_en8811h_priv(hw);
1018 
1019 	if (!priv->cko_is_enabled)
1020 		en8811h_clk_disable(hw);
1021 }
1022 
1023 static const struct clk_ops en8811h_clk_ops = {
1024 	.recalc_rate		= en8811h_clk_recalc_rate,
1025 	.enable			= en8811h_clk_enable,
1026 	.disable		= en8811h_clk_disable,
1027 	.is_enabled		= en8811h_clk_is_enabled,
1028 	.save_context		= en8811h_clk_save_context,
1029 	.restore_context	= en8811h_clk_restore_context,
1030 };
1031 
1032 static int en8811h_clk_provider_setup(struct device *dev, struct clk_hw *hw)
1033 {
1034 	struct clk_init_data init;
1035 	int ret;
1036 
1037 	if (!IS_ENABLED(CONFIG_COMMON_CLK))
1038 		return 0;
1039 
1040 	init.name = devm_kasprintf(dev, GFP_KERNEL, "%s-cko",
1041 				   fwnode_get_name(dev_fwnode(dev)));
1042 	if (!init.name)
1043 		return -ENOMEM;
1044 
1045 	init.ops = &en8811h_clk_ops;
1046 	init.flags = 0;
1047 	init.num_parents = 0;
1048 	hw->init = &init;
1049 
1050 	ret = devm_clk_hw_register(dev, hw);
1051 	if (ret)
1052 		return ret;
1053 
1054 	return devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, hw);
1055 }
1056 
1057 static int en8811h_leds_setup(struct phy_device *phydev)
1058 {
1059 	struct en8811h_priv *priv = phydev->priv;
1060 	int ret;
1061 
1062 	priv->led[0].rules = AIR_DEFAULT_TRIGGER_LED0;
1063 	priv->led[1].rules = AIR_DEFAULT_TRIGGER_LED1;
1064 	priv->led[2].rules = AIR_DEFAULT_TRIGGER_LED2;
1065 
1066 	ret = air_leds_init(phydev, EN8811H_LED_COUNT, AIR_PHY_LED_DUR,
1067 			    AIR_LED_MODE_DISABLE);
1068 	if (ret < 0)
1069 		phydev_err(phydev, "Failed to disable leds: %d\n", ret);
1070 
1071 	return ret;
1072 }
1073 
1074 static int an8811hb_probe(struct phy_device *phydev)
1075 {
1076 	struct mdio_device *mdiodev;
1077 	struct en8811h_priv *priv;
1078 	int ret;
1079 
1080 	priv = devm_kzalloc(&phydev->mdio.dev, sizeof(struct en8811h_priv),
1081 			    GFP_KERNEL);
1082 	if (!priv)
1083 		return -ENOMEM;
1084 	phydev->priv = priv;
1085 
1086 	/*
1087 	 * The AN8811HB PHY address is restricted to 8-15 (decimal),
1088 	 * depending on the board hardware strapping.
1089 	 * This means the PBUS address is only in the range 16-21 (decimal),
1090 	 * so we do not need to handle the case
1091 	 * where the PBUS address exceeds 31 (decimal).
1092 	 */
1093 	mdiodev = mdio_device_create(phydev->mdio.bus,
1094 				     phydev->mdio.addr + EN8811H_PBUS_ADDR_OFFS);
1095 	if (IS_ERR(mdiodev))
1096 		return PTR_ERR(mdiodev);
1097 
1098 	ret = mdio_device_register(mdiodev);
1099 	if (ret)
1100 		goto err_dev_free;
1101 
1102 	priv->pbusdev = mdiodev;
1103 
1104 	ret = an8811hb_load_firmware(phydev);
1105 	if (ret < 0) {
1106 		phydev_err(phydev, "Load firmware failed: %d\n", ret);
1107 		goto err_dev_create;
1108 	}
1109 
1110 	en8811h_print_fw_version(phydev);
1111 
1112 	/* mcu has just restarted after firmware load */
1113 	priv->mcu_needs_restart = false;
1114 
1115 	/* MDIO_DEVS1/2 empty, so set mmds_present bits here */
1116 	phydev->c45_ids.mmds_present |= MDIO_DEVS_PMAPMD | MDIO_DEVS_AN;
1117 
1118 	ret = en8811h_leds_setup(phydev);
1119 	if (ret < 0)
1120 		goto err_dev_create;
1121 
1122 	priv->phydev = phydev;
1123 	/* Co-Clock Output */
1124 	ret = an8811hb_clk_provider_setup(&phydev->mdio.dev, &priv->hw);
1125 	if (ret)
1126 		goto err_dev_create;
1127 
1128 	/* Configure led gpio pins as output */
1129 	ret = air_phy_buckpbus_reg_modify(phydev, AN8811HB_GPIO_OUTPUT,
1130 					  AN8811HB_GPIO_OUTPUT_345,
1131 					  AN8811HB_GPIO_OUTPUT_345);
1132 	if (ret < 0)
1133 		goto err_dev_create;
1134 
1135 	return 0;
1136 
1137 err_dev_create:
1138 	mdio_device_remove(mdiodev);
1139 
1140 err_dev_free:
1141 	mdio_device_free(mdiodev);
1142 	return ret;
1143 }
1144 
1145 static int en8811h_probe(struct phy_device *phydev)
1146 {
1147 	struct en8811h_priv *priv;
1148 	int ret;
1149 
1150 	priv = devm_kzalloc(&phydev->mdio.dev, sizeof(struct en8811h_priv),
1151 			    GFP_KERNEL);
1152 	if (!priv)
1153 		return -ENOMEM;
1154 	phydev->priv = priv;
1155 
1156 	ret = en8811h_load_firmware(phydev);
1157 	if (ret < 0)
1158 		return ret;
1159 
1160 	/* mcu has just restarted after firmware load */
1161 	priv->mcu_needs_restart = false;
1162 
1163 	/* MDIO_DEVS1/2 empty, so set mmds_present bits here */
1164 	phydev->c45_ids.mmds_present |= MDIO_DEVS_PMAPMD | MDIO_DEVS_AN;
1165 
1166 	ret = en8811h_leds_setup(phydev);
1167 	if (ret < 0)
1168 		return ret;
1169 
1170 	priv->phydev = phydev;
1171 	/* Co-Clock Output */
1172 	ret = en8811h_clk_provider_setup(&phydev->mdio.dev, &priv->hw);
1173 	if (ret)
1174 		return ret;
1175 
1176 	/* Configure led gpio pins as output */
1177 	ret = air_phy_buckpbus_reg_modify(phydev, EN8811H_GPIO_OUTPUT,
1178 					  EN8811H_GPIO_OUTPUT_345,
1179 					  EN8811H_GPIO_OUTPUT_345);
1180 	if (ret < 0)
1181 		return ret;
1182 
1183 	return 0;
1184 }
1185 
1186 static int an8811hb_config_serdes_polarity(struct phy_device *phydev)
1187 {
1188 	struct device *dev = &phydev->mdio.dev;
1189 	u32 pbus_value = 0;
1190 	unsigned int pol;
1191 	int ret;
1192 
1193 	ret = phy_get_manual_rx_polarity(dev_fwnode(dev),
1194 					 phy_modes(phydev->interface), &pol);
1195 	if (ret)
1196 		return ret;
1197 	if (pol == PHY_POL_NORMAL)
1198 		pbus_value |= AN8811HB_RX_POLARITY_NORMAL;
1199 	ret = air_phy_buckpbus_reg_modify(phydev, AN8811HB_RX_POLARITY,
1200 					  AN8811HB_RX_POLARITY_NORMAL,
1201 					  pbus_value);
1202 	if (ret < 0)
1203 		return ret;
1204 
1205 	ret = phy_get_manual_tx_polarity(dev_fwnode(dev),
1206 					 phy_modes(phydev->interface), &pol);
1207 	if (ret)
1208 		return ret;
1209 	pbus_value = 0;
1210 	if (pol == PHY_POL_NORMAL)
1211 		pbus_value |= AN8811HB_TX_POLARITY_NORMAL;
1212 	return air_phy_buckpbus_reg_modify(phydev, AN8811HB_TX_POLARITY,
1213 					   AN8811HB_TX_POLARITY_NORMAL,
1214 					   pbus_value);
1215 }
1216 
1217 static int en8811h_config_serdes_polarity(struct phy_device *phydev)
1218 {
1219 	struct device *dev = &phydev->mdio.dev;
1220 	unsigned int pol, default_pol;
1221 	u32 pbus_value = 0;
1222 	int ret;
1223 
1224 	default_pol = PHY_POL_NORMAL;
1225 	if (device_property_read_bool(dev, "airoha,pnswap-rx"))
1226 		default_pol = PHY_POL_INVERT;
1227 
1228 	ret = phy_get_rx_polarity(dev_fwnode(dev), phy_modes(phydev->interface),
1229 				  BIT(PHY_POL_NORMAL) | BIT(PHY_POL_INVERT),
1230 				  default_pol, &pol);
1231 	if (ret)
1232 		return ret;
1233 	if (pol == PHY_POL_INVERT)
1234 		pbus_value |= EN8811H_POLARITY_RX_REVERSE;
1235 
1236 	default_pol = PHY_POL_NORMAL;
1237 	if (device_property_read_bool(dev, "airoha,pnswap-tx"))
1238 		default_pol = PHY_POL_INVERT;
1239 
1240 	ret = phy_get_tx_polarity(dev_fwnode(dev), phy_modes(phydev->interface),
1241 				  BIT(PHY_POL_NORMAL) | BIT(PHY_POL_INVERT),
1242 				  default_pol, &pol);
1243 	if (ret)
1244 		return ret;
1245 	if (pol == PHY_POL_NORMAL)
1246 		pbus_value |= EN8811H_POLARITY_TX_NORMAL;
1247 
1248 	return air_phy_buckpbus_reg_modify(phydev, EN8811H_POLARITY,
1249 					   EN8811H_POLARITY_RX_REVERSE |
1250 					   EN8811H_POLARITY_TX_NORMAL,
1251 					   pbus_value);
1252 }
1253 
1254 static int an8811hb_config_init(struct phy_device *phydev)
1255 {
1256 	struct en8811h_priv *priv = phydev->priv;
1257 	int ret;
1258 
1259 	/* If restart happened in .probe(), no need to restart now */
1260 	if (priv->mcu_needs_restart) {
1261 		ret = en8811h_restart_mcu(phydev);
1262 		if (ret < 0)
1263 			return ret;
1264 	} else {
1265 		/* Next calls to .config_init() mcu needs to restart */
1266 		priv->mcu_needs_restart = true;
1267 	}
1268 
1269 	ret = an8811hb_config_serdes_polarity(phydev);
1270 	if (ret < 0)
1271 		return ret;
1272 
1273 	ret = air_leds_init(phydev, EN8811H_LED_COUNT, AIR_PHY_LED_DUR,
1274 			    AIR_LED_MODE_USER_DEFINE);
1275 	if (ret < 0)
1276 		phydev_err(phydev, "Failed to initialize leds: %d\n", ret);
1277 
1278 	return ret;
1279 }
1280 
1281 static int en8811h_config_init(struct phy_device *phydev)
1282 {
1283 	struct en8811h_priv *priv = phydev->priv;
1284 	int ret;
1285 
1286 	/* If restart happened in .probe(), no need to restart now */
1287 	if (priv->mcu_needs_restart) {
1288 		ret = en8811h_restart_mcu(phydev);
1289 		if (ret < 0)
1290 			return ret;
1291 	} else {
1292 		/* Next calls to .config_init() mcu needs to restart */
1293 		priv->mcu_needs_restart = true;
1294 	}
1295 
1296 	/* Select mode 1, the only mode supported.
1297 	 * Configures the SerDes for 2500Base-X with rate adaptation
1298 	 */
1299 	ret = phy_write_mmd(phydev, MDIO_MMD_VEND1, AIR_PHY_MCU_CMD_1,
1300 			    AIR_PHY_MCU_CMD_1_MODE1);
1301 	if (ret < 0)
1302 		return ret;
1303 	ret = phy_write_mmd(phydev, MDIO_MMD_VEND1, AIR_PHY_MCU_CMD_2,
1304 			    AIR_PHY_MCU_CMD_2_MODE1);
1305 	if (ret < 0)
1306 		return ret;
1307 	ret = phy_write_mmd(phydev, MDIO_MMD_VEND1, AIR_PHY_MCU_CMD_3,
1308 			    AIR_PHY_MCU_CMD_3_MODE1);
1309 	if (ret < 0)
1310 		return ret;
1311 	ret = phy_write_mmd(phydev, MDIO_MMD_VEND1, AIR_PHY_MCU_CMD_4,
1312 			    AIR_PHY_MCU_CMD_4_MODE1);
1313 	if (ret < 0)
1314 		return ret;
1315 
1316 	ret = en8811h_config_serdes_polarity(phydev);
1317 	if (ret < 0)
1318 		return ret;
1319 
1320 	ret = air_leds_init(phydev, EN8811H_LED_COUNT, AIR_PHY_LED_DUR,
1321 			    AIR_LED_MODE_USER_DEFINE);
1322 	if (ret < 0) {
1323 		phydev_err(phydev, "Failed to initialize leds: %d\n", ret);
1324 		return ret;
1325 	}
1326 
1327 	return 0;
1328 }
1329 
1330 static int en8811h_get_features(struct phy_device *phydev)
1331 {
1332 	linkmode_set_bit_array(phy_basic_ports_array,
1333 			       ARRAY_SIZE(phy_basic_ports_array),
1334 			       phydev->supported);
1335 
1336 	return genphy_c45_pma_read_abilities(phydev);
1337 }
1338 
1339 static int en8811h_get_rate_matching(struct phy_device *phydev,
1340 				     phy_interface_t iface)
1341 {
1342 	return RATE_MATCH_PAUSE;
1343 }
1344 
1345 static int en8811h_config_aneg(struct phy_device *phydev)
1346 {
1347 	bool changed = false;
1348 	int ret;
1349 	u32 adv;
1350 
1351 	if (phydev->autoneg == AUTONEG_DISABLE) {
1352 		phydev_warn(phydev, "Disabling autoneg is not supported\n");
1353 		return -EINVAL;
1354 	}
1355 
1356 	adv = linkmode_adv_to_mii_10gbt_adv_t(phydev->advertising);
1357 
1358 	ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL,
1359 				     MDIO_AN_10GBT_CTRL_ADV2_5G, adv);
1360 	if (ret < 0)
1361 		return ret;
1362 	if (ret > 0)
1363 		changed = true;
1364 
1365 	return __genphy_config_aneg(phydev, changed);
1366 }
1367 
1368 static int en8811h_read_status(struct phy_device *phydev)
1369 {
1370 	struct en8811h_priv *priv = phydev->priv;
1371 	u32 pbus_value;
1372 	int ret, val;
1373 
1374 	ret = genphy_update_link(phydev);
1375 	if (ret)
1376 		return ret;
1377 
1378 	phydev->master_slave_get = MASTER_SLAVE_CFG_UNSUPPORTED;
1379 	phydev->master_slave_state = MASTER_SLAVE_STATE_UNSUPPORTED;
1380 	phydev->speed = SPEED_UNKNOWN;
1381 	phydev->duplex = DUPLEX_UNKNOWN;
1382 	phydev->pause = 0;
1383 	phydev->asym_pause = 0;
1384 	phydev->rate_matching = RATE_MATCH_PAUSE;
1385 
1386 	ret = genphy_read_master_slave(phydev);
1387 	if (ret < 0)
1388 		return ret;
1389 
1390 	ret = genphy_read_lpa(phydev);
1391 	if (ret < 0)
1392 		return ret;
1393 
1394 	if (phy_id_compare_model(phydev->phy_id, AN8811HB_PHY_ID)) {
1395 		val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_STAT);
1396 		if (val < 0)
1397 			return val;
1398 		linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
1399 				 phydev->lp_advertising,
1400 				 val & MDIO_AN_10GBT_STAT_LP2_5G);
1401 	} else {
1402 		/* Get link partner 2.5GBASE-T ability from vendor register */
1403 		ret = air_phy_buckpbus_reg_read(phydev, EN8811H_2P5G_LPA,
1404 						&pbus_value);
1405 		if (ret < 0)
1406 			return ret;
1407 		linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
1408 				 phydev->lp_advertising,
1409 				 pbus_value & EN8811H_2P5G_LPA_2P5G);
1410 	}
1411 
1412 	if (phydev->autoneg_complete)
1413 		phy_resolve_aneg_pause(phydev);
1414 
1415 	if (!phydev->link)
1416 		return 0;
1417 
1418 	/* Get real speed from vendor register */
1419 	val = phy_read(phydev, AIR_AUX_CTRL_STATUS);
1420 	if (val < 0)
1421 		return val;
1422 	switch (val & AIR_AUX_CTRL_STATUS_SPEED_MASK) {
1423 	case AIR_AUX_CTRL_STATUS_SPEED_2500:
1424 		phydev->speed = SPEED_2500;
1425 		break;
1426 	case AIR_AUX_CTRL_STATUS_SPEED_1000:
1427 		phydev->speed = SPEED_1000;
1428 		break;
1429 	case AIR_AUX_CTRL_STATUS_SPEED_100:
1430 		phydev->speed = SPEED_100;
1431 		break;
1432 	case AIR_AUX_CTRL_STATUS_SPEED_10:
1433 		phydev->speed = SPEED_10;
1434 		break;
1435 	}
1436 
1437 	/* Firmware before version 24011202 has no vendor register 2P5G_LPA.
1438 	 * Assume link partner advertised it if connected at 2500Mbps.
1439 	 */
1440 	if (priv->firmware_version < 0x24011202) {
1441 		linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
1442 				 phydev->lp_advertising,
1443 				 phydev->speed == SPEED_2500);
1444 	}
1445 
1446 	/* Only supports full duplex */
1447 	phydev->duplex = DUPLEX_FULL;
1448 
1449 	return 0;
1450 }
1451 
1452 static int en8811h_clear_intr(struct phy_device *phydev)
1453 {
1454 	int ret;
1455 
1456 	ret = phy_write_mmd(phydev, MDIO_MMD_VEND1, AIR_PHY_MCU_CMD_3,
1457 			    AIR_PHY_MCU_CMD_3_DOCMD);
1458 	if (ret < 0)
1459 		return ret;
1460 
1461 	ret = phy_write_mmd(phydev, MDIO_MMD_VEND1, AIR_PHY_MCU_CMD_4,
1462 			    AIR_PHY_MCU_CMD_4_INTCLR);
1463 	if (ret < 0)
1464 		return ret;
1465 
1466 	return 0;
1467 }
1468 
1469 static irqreturn_t en8811h_handle_interrupt(struct phy_device *phydev)
1470 {
1471 	int ret;
1472 
1473 	ret = en8811h_clear_intr(phydev);
1474 	if (ret < 0) {
1475 		phy_error(phydev);
1476 		return IRQ_NONE;
1477 	}
1478 
1479 	phy_trigger_machine(phydev);
1480 
1481 	return IRQ_HANDLED;
1482 }
1483 
1484 static int en8811h_resume(struct phy_device *phydev)
1485 {
1486 	clk_restore_context();
1487 
1488 	return genphy_resume(phydev);
1489 }
1490 
1491 static int en8811h_suspend(struct phy_device *phydev)
1492 {
1493 	clk_save_context();
1494 
1495 	return genphy_suspend(phydev);
1496 }
1497 
1498 static void an8811hb_remove(struct phy_device *phydev)
1499 {
1500 	struct en8811h_priv *priv = phydev->priv;
1501 
1502 	if (priv->pbusdev) {
1503 		mdio_device_remove(priv->pbusdev);
1504 		mdio_device_free(priv->pbusdev);
1505 	}
1506 }
1507 
1508 static struct phy_driver en8811h_driver[] = {
1509 {
1510 	PHY_ID_MATCH_MODEL(EN8811H_PHY_ID),
1511 	.name			= "Airoha EN8811H",
1512 	.probe			= en8811h_probe,
1513 	.get_features		= en8811h_get_features,
1514 	.config_init		= en8811h_config_init,
1515 	.get_rate_matching	= en8811h_get_rate_matching,
1516 	.config_aneg		= en8811h_config_aneg,
1517 	.read_status		= en8811h_read_status,
1518 	.resume			= en8811h_resume,
1519 	.suspend		= en8811h_suspend,
1520 	.config_intr		= en8811h_clear_intr,
1521 	.handle_interrupt	= en8811h_handle_interrupt,
1522 	.led_hw_is_supported	= en8811h_led_hw_is_supported,
1523 	.read_page		= air_phy_read_page,
1524 	.write_page		= air_phy_write_page,
1525 	.led_blink_set		= air_led_blink_set,
1526 	.led_brightness_set	= air_led_brightness_set,
1527 	.led_hw_control_set	= air_led_hw_control_set,
1528 	.led_hw_control_get	= air_led_hw_control_get,
1529 },
1530 {
1531 	PHY_ID_MATCH_MODEL(AN8811HB_PHY_ID),
1532 	.name			= "Airoha AN8811HB",
1533 	.probe			= an8811hb_probe,
1534 	.remove			= an8811hb_remove,
1535 	.get_features		= en8811h_get_features,
1536 	.config_init		= an8811hb_config_init,
1537 	.get_rate_matching	= en8811h_get_rate_matching,
1538 	.config_aneg		= en8811h_config_aneg,
1539 	.read_status		= en8811h_read_status,
1540 	.resume			= en8811h_resume,
1541 	.suspend		= en8811h_suspend,
1542 	.config_intr		= en8811h_clear_intr,
1543 	.handle_interrupt	= en8811h_handle_interrupt,
1544 	.led_hw_is_supported	= en8811h_led_hw_is_supported,
1545 	.read_page		= air_phy_read_page,
1546 	.write_page		= air_phy_write_page,
1547 	.led_blink_set		= air_led_blink_set,
1548 	.led_brightness_set	= air_led_brightness_set,
1549 	.led_hw_control_set	= air_led_hw_control_set,
1550 	.led_hw_control_get	= air_led_hw_control_get,
1551 } };
1552 
1553 module_phy_driver(en8811h_driver);
1554 
1555 static const struct mdio_device_id __maybe_unused en8811h_tbl[] = {
1556 	{ PHY_ID_MATCH_MODEL(EN8811H_PHY_ID) },
1557 	{ PHY_ID_MATCH_MODEL(AN8811HB_PHY_ID) },
1558 	{ }
1559 };
1560 
1561 MODULE_DEVICE_TABLE(mdio, en8811h_tbl);
1562 MODULE_FIRMWARE(EN8811H_MD32_DM);
1563 MODULE_FIRMWARE(EN8811H_MD32_DSP);
1564 MODULE_FIRMWARE(AN8811HB_MD32_DM);
1565 MODULE_FIRMWARE(AN8811HB_MD32_DSP);
1566 
1567 MODULE_DESCRIPTION("Airoha EN8811H and AN8811HB PHY drivers");
1568 MODULE_AUTHOR("Airoha");
1569 MODULE_AUTHOR("Eric Woudstra <ericwouds@gmail.com>");
1570 MODULE_LICENSE("GPL");
1571