blob: 64a63533c982900af590d40b1c93efaf1cf796c0 [file] [log] [blame]
developerfd40db22021-04-29 10:08:25 +08001// SPDX-License-Identifier: GPL-2.0
2// Copyright (c) 2018-2019 MediaTek Inc.
3
4/* A library for MediaTek SGMII circuit
5 *
6 * Author: Sean Wang <sean.wang@mediatek.com>
7 *
8 */
9
10#include <linux/mfd/syscon.h>
11#include <linux/of.h>
12#include <linux/regmap.h>
13
14#include "mtk_eth_soc.h"
15
developer089e8852022-09-28 14:43:46 +080016int mtk_sgmii_init(struct mtk_xgmii *ss, struct device_node *r, u32 ana_rgc3)
developerfd40db22021-04-29 10:08:25 +080017{
18 struct device_node *np;
19 int i;
20
21 ss->ana_rgc3 = ana_rgc3;
22
23 for (i = 0; i < MTK_MAX_DEVS; i++) {
24 np = of_parse_phandle(r, "mediatek,sgmiisys", i);
25 if (!np)
26 break;
27
developer089e8852022-09-28 14:43:46 +080028 ss->regmap_sgmii[i] = syscon_node_to_regmap(np);
29 if (IS_ERR(ss->regmap_sgmii[i]))
30 return PTR_ERR(ss->regmap_sgmii[i]);
developerf8ac94a2021-07-29 16:40:01 +080031
32 ss->flags[i] &= ~(MTK_SGMII_PN_SWAP);
33 if (of_property_read_bool(np, "pn_swap"))
34 ss->flags[i] |= MTK_SGMII_PN_SWAP;
developerfd40db22021-04-29 10:08:25 +080035 }
36
37 return 0;
38}
39
developer089e8852022-09-28 14:43:46 +080040void mtk_sgmii_setup_phya_gen1(struct mtk_xgmii *ss, int mac_id)
developerfd40db22021-04-29 10:08:25 +080041{
developer089e8852022-09-28 14:43:46 +080042 u32 id = mtk_mac2xgmii_id(ss->eth, mac_id);
43
developer543e7922022-12-01 11:24:47 +080044 if (id >= MTK_MAX_DEVS ||
developer089e8852022-09-28 14:43:46 +080045 !ss->regmap_sgmii[id] || !ss->regmap_pextp[id])
46 return;
47
48 regmap_update_bits(ss->regmap_pextp[id], 0x9024, GENMASK(31, 0), 0x00D9071C);
49 regmap_update_bits(ss->regmap_pextp[id], 0x2020, GENMASK(31, 0), 0xAA8585AA);
50 regmap_update_bits(ss->regmap_pextp[id], 0x2030, GENMASK(31, 0), 0x0C020207);
51 regmap_update_bits(ss->regmap_pextp[id], 0x2034, GENMASK(31, 0), 0x0E05050F);
52 regmap_update_bits(ss->regmap_pextp[id], 0x2040, GENMASK(31, 0), 0x00200032);
53 regmap_update_bits(ss->regmap_pextp[id], 0x50F0, GENMASK(31, 0), 0x00C014BA);
54 regmap_update_bits(ss->regmap_pextp[id], 0x50E0, GENMASK(31, 0), 0x3777C12B);
55 regmap_update_bits(ss->regmap_pextp[id], 0x506C, GENMASK(31, 0), 0x005F9CFF);
56 regmap_update_bits(ss->regmap_pextp[id], 0x5070, GENMASK(31, 0), 0x9D9DFAFA);
57 regmap_update_bits(ss->regmap_pextp[id], 0x5074, GENMASK(31, 0), 0x27273F3F);
58 regmap_update_bits(ss->regmap_pextp[id], 0x5078, GENMASK(31, 0), 0xA7883C68);
59 regmap_update_bits(ss->regmap_pextp[id], 0x507C, GENMASK(31, 0), 0x11661166);
60 regmap_update_bits(ss->regmap_pextp[id], 0x5080, GENMASK(31, 0), 0x0E000EAF);
61 regmap_update_bits(ss->regmap_pextp[id], 0x5084, GENMASK(31, 0), 0x08080E0D);
62 regmap_update_bits(ss->regmap_pextp[id], 0x5088, GENMASK(31, 0), 0x02030B09);
63 regmap_update_bits(ss->regmap_pextp[id], 0x50E4, GENMASK(31, 0), 0x0C0C0000);
64 regmap_update_bits(ss->regmap_pextp[id], 0x50E8, GENMASK(31, 0), 0x04040000);
65 regmap_update_bits(ss->regmap_pextp[id], 0x50EC, GENMASK(31, 0), 0x0F0F0606);
66 regmap_update_bits(ss->regmap_pextp[id], 0x50A8, GENMASK(31, 0), 0x506E8C8C);
67 regmap_update_bits(ss->regmap_pextp[id], 0x6004, GENMASK(31, 0), 0x18190000);
68 regmap_update_bits(ss->regmap_pextp[id], 0x00F8, GENMASK(31, 0), 0x00FA32FA);
69 regmap_update_bits(ss->regmap_pextp[id], 0x00F4, GENMASK(31, 0), 0x80201F21);
70 regmap_update_bits(ss->regmap_pextp[id], 0x0030, GENMASK(31, 0), 0x00050C00);
71 regmap_update_bits(ss->regmap_pextp[id], 0x0070, GENMASK(31, 0), 0x02002800);
72 ndelay(1020);
73 regmap_update_bits(ss->regmap_pextp[id], 0x30B0, GENMASK(31, 0), 0x00000020);
74 regmap_update_bits(ss->regmap_pextp[id], 0x3028, GENMASK(31, 0), 0x00008A01);
75 regmap_update_bits(ss->regmap_pextp[id], 0x302C, GENMASK(31, 0), 0x0000A884);
76 regmap_update_bits(ss->regmap_pextp[id], 0x3024, GENMASK(31, 0), 0x00083002);
77 regmap_update_bits(ss->regmap_pextp[id], 0x3010, GENMASK(31, 0), 0x00011110);
78 regmap_update_bits(ss->regmap_pextp[id], 0x3048, GENMASK(31, 0), 0x40704000);
79 regmap_update_bits(ss->regmap_pextp[id], 0x3064, GENMASK(31, 0), 0x0000C000);
80 regmap_update_bits(ss->regmap_pextp[id], 0x3050, GENMASK(31, 0), 0xA8000000);
81 regmap_update_bits(ss->regmap_pextp[id], 0x3054, GENMASK(31, 0), 0x000000AA);
82 regmap_update_bits(ss->regmap_pextp[id], 0x306C, GENMASK(31, 0), 0x20200F00);
83 regmap_update_bits(ss->regmap_pextp[id], 0xA060, GENMASK(31, 0), 0x00050000);
84 regmap_update_bits(ss->regmap_pextp[id], 0x90D0, GENMASK(31, 0), 0x00000007);
85 regmap_update_bits(ss->regmap_pextp[id], 0x0070, GENMASK(31, 0), 0x0200E800);
86 udelay(150);
87 regmap_update_bits(ss->regmap_pextp[id], 0x0070, GENMASK(31, 0), 0x0200C111);
88 ndelay(1020);
89 regmap_update_bits(ss->regmap_pextp[id], 0x0070, GENMASK(31, 0), 0x0200C101);
90 udelay(15);
91 regmap_update_bits(ss->regmap_pextp[id], 0x0070, GENMASK(31, 0), 0x0201C111);
92 ndelay(1020);
93 regmap_update_bits(ss->regmap_pextp[id], 0x0070, GENMASK(31, 0), 0x0201C101);
94 udelay(100);
95 regmap_update_bits(ss->regmap_pextp[id], 0x30B0, GENMASK(31, 0), 0x00000030);
96 regmap_update_bits(ss->regmap_pextp[id], 0x00F4, GENMASK(31, 0), 0x80201F01);
97 regmap_update_bits(ss->regmap_pextp[id], 0x3040, GENMASK(31, 0), 0x30000000);
98 udelay(400);
99}
100
101void mtk_sgmii_setup_phya_gen2(struct mtk_xgmii *ss, int mac_id)
102{
103 u32 id = mtk_mac2xgmii_id(ss->eth, mac_id);
104
developer8b6f2402022-11-28 13:42:34 +0800105 if (id >= MTK_MAX_DEVS ||
developer089e8852022-09-28 14:43:46 +0800106 !ss->regmap_sgmii[id] || !ss->regmap_pextp[id])
107 return;
108
109 regmap_update_bits(ss->regmap_pextp[id], 0x9024, GENMASK(31, 0), 0x00D9071C);
110 regmap_update_bits(ss->regmap_pextp[id], 0x2020, GENMASK(31, 0), 0xAA8585AA);
111 regmap_update_bits(ss->regmap_pextp[id], 0x2030, GENMASK(31, 0), 0x0C020707);
112 regmap_update_bits(ss->regmap_pextp[id], 0x2034, GENMASK(31, 0), 0x0E050F0F);
113 regmap_update_bits(ss->regmap_pextp[id], 0x2040, GENMASK(31, 0), 0x00140032);
114 regmap_update_bits(ss->regmap_pextp[id], 0x50F0, GENMASK(31, 0), 0x00C014AA);
115 regmap_update_bits(ss->regmap_pextp[id], 0x50E0, GENMASK(31, 0), 0x3777C12B);
116 regmap_update_bits(ss->regmap_pextp[id], 0x506C, GENMASK(31, 0), 0x005F9CFF);
117 regmap_update_bits(ss->regmap_pextp[id], 0x5070, GENMASK(31, 0), 0x9D9DFAFA);
118 regmap_update_bits(ss->regmap_pextp[id], 0x5074, GENMASK(31, 0), 0x27273F3F);
119 regmap_update_bits(ss->regmap_pextp[id], 0x5078, GENMASK(31, 0), 0xA7883C68);
120 regmap_update_bits(ss->regmap_pextp[id], 0x507C, GENMASK(31, 0), 0x11661166);
121 regmap_update_bits(ss->regmap_pextp[id], 0x5080, GENMASK(31, 0), 0x0E000AAF);
122 regmap_update_bits(ss->regmap_pextp[id], 0x5084, GENMASK(31, 0), 0x08080D0D);
123 regmap_update_bits(ss->regmap_pextp[id], 0x5088, GENMASK(31, 0), 0x02030909);
124 regmap_update_bits(ss->regmap_pextp[id], 0x50E4, GENMASK(31, 0), 0x0C0C0000);
125 regmap_update_bits(ss->regmap_pextp[id], 0x50E8, GENMASK(31, 0), 0x04040000);
126 regmap_update_bits(ss->regmap_pextp[id], 0x50EC, GENMASK(31, 0), 0x0F0F0C06);
127 regmap_update_bits(ss->regmap_pextp[id], 0x50A8, GENMASK(31, 0), 0x506E8C8C);
128 regmap_update_bits(ss->regmap_pextp[id], 0x6004, GENMASK(31, 0), 0x18190000);
129 regmap_update_bits(ss->regmap_pextp[id], 0x00F8, GENMASK(31, 0), 0x009C329C);
130 regmap_update_bits(ss->regmap_pextp[id], 0x00F4, GENMASK(31, 0), 0x80201F21);
131 regmap_update_bits(ss->regmap_pextp[id], 0x0030, GENMASK(31, 0), 0x00050C00);
132 regmap_update_bits(ss->regmap_pextp[id], 0x0070, GENMASK(31, 0), 0x02002800);
133 ndelay(1020);
134 regmap_update_bits(ss->regmap_pextp[id], 0x30B0, GENMASK(31, 0), 0x00000020);
135 regmap_update_bits(ss->regmap_pextp[id], 0x3028, GENMASK(31, 0), 0x00008A01);
136 regmap_update_bits(ss->regmap_pextp[id], 0x302C, GENMASK(31, 0), 0x0000A884);
137 regmap_update_bits(ss->regmap_pextp[id], 0x3024, GENMASK(31, 0), 0x00083002);
138 regmap_update_bits(ss->regmap_pextp[id], 0x3010, GENMASK(31, 0), 0x00011110);
139 regmap_update_bits(ss->regmap_pextp[id], 0x3048, GENMASK(31, 0), 0x40704000);
140 regmap_update_bits(ss->regmap_pextp[id], 0x3050, GENMASK(31, 0), 0xA8000000);
141 regmap_update_bits(ss->regmap_pextp[id], 0x3054, GENMASK(31, 0), 0x000000AA);
142 regmap_update_bits(ss->regmap_pextp[id], 0x306C, GENMASK(31, 0), 0x22000F00);
143 regmap_update_bits(ss->regmap_pextp[id], 0xA060, GENMASK(31, 0), 0x00050000);
144 regmap_update_bits(ss->regmap_pextp[id], 0x90D0, GENMASK(31, 0), 0x00000005);
145 regmap_update_bits(ss->regmap_pextp[id], 0x0070, GENMASK(31, 0), 0x0200E800);
146 udelay(150);
147 regmap_update_bits(ss->regmap_pextp[id], 0x0070, GENMASK(31, 0), 0x0200C111);
148 ndelay(1020);
149 regmap_update_bits(ss->regmap_pextp[id], 0x0070, GENMASK(31, 0), 0x0200C101);
150 udelay(15);
151 regmap_update_bits(ss->regmap_pextp[id], 0x0070, GENMASK(31, 0), 0x0201C111);
152 ndelay(1020);
153 regmap_update_bits(ss->regmap_pextp[id], 0x0070, GENMASK(31, 0), 0x0201C101);
154 udelay(100);
155 regmap_update_bits(ss->regmap_pextp[id], 0x30B0, GENMASK(31, 0), 0x00000030);
156 regmap_update_bits(ss->regmap_pextp[id], 0x00F4, GENMASK(31, 0), 0x80201F01);
157 regmap_update_bits(ss->regmap_pextp[id], 0x3040, GENMASK(31, 0), 0x30000000);
158 udelay(400);
159}
160
161int mtk_sgmii_setup_mode_an(struct mtk_xgmii *ss, unsigned int mac_id)
162{
163 struct mtk_eth *eth = ss->eth;
developer543e7922022-12-01 11:24:47 +0800164 unsigned int val = 0;
developer089e8852022-09-28 14:43:46 +0800165 u32 id = mtk_mac2xgmii_id(ss->eth, mac_id);
developerfd40db22021-04-29 10:08:25 +0800166
developer089e8852022-09-28 14:43:46 +0800167 if (!ss->regmap_sgmii[id])
developerfd40db22021-04-29 10:08:25 +0800168 return -EINVAL;
169
developer089e8852022-09-28 14:43:46 +0800170 if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V3))
171 mtk_xfi_pll_enable(ss);
172
developer2fbee452022-08-12 13:58:20 +0800173 /* Assert PHYA power down state */
developer089e8852022-09-28 14:43:46 +0800174 regmap_write(ss->regmap_sgmii[id], SGMSYS_QPHY_PWR_STATE_CTRL, SGMII_PHYA_PWD);
developer2fbee452022-08-12 13:58:20 +0800175
developer2b76a9d2022-09-20 14:59:45 +0800176 /* Reset SGMII PCS state */
developer089e8852022-09-28 14:43:46 +0800177 regmap_write(ss->regmap_sgmii[id], SGMII_RESERVED_0, SGMII_SW_RESET);
developer2b76a9d2022-09-20 14:59:45 +0800178
developer089e8852022-09-28 14:43:46 +0800179 regmap_read(ss->regmap_sgmii[id], ss->ana_rgc3, &val);
developer2fbee452022-08-12 13:58:20 +0800180 val &= ~RG_PHY_SPEED_3_125G;
developer089e8852022-09-28 14:43:46 +0800181 regmap_write(ss->regmap_sgmii[id], ss->ana_rgc3, val);
developer2fbee452022-08-12 13:58:20 +0800182
developerfd40db22021-04-29 10:08:25 +0800183 /* Setup the link timer and QPHY power up inside SGMIISYS */
developer089e8852022-09-28 14:43:46 +0800184 regmap_write(ss->regmap_sgmii[id], SGMSYS_PCS_LINK_TIMER,
developerfd40db22021-04-29 10:08:25 +0800185 SGMII_LINK_TIMER_DEFAULT);
186
developer089e8852022-09-28 14:43:46 +0800187 regmap_read(ss->regmap_sgmii[id], SGMSYS_SGMII_MODE, &val);
developerfd40db22021-04-29 10:08:25 +0800188 val |= SGMII_REMOTE_FAULT_DIS;
developer089e8852022-09-28 14:43:46 +0800189 regmap_write(ss->regmap_sgmii[id], SGMSYS_SGMII_MODE, val);
developerfd40db22021-04-29 10:08:25 +0800190
developer2fbee452022-08-12 13:58:20 +0800191 /* SGMII AN mode setting */
developer089e8852022-09-28 14:43:46 +0800192 regmap_read(ss->regmap_sgmii[id], SGMSYS_SGMII_MODE, &val);
developer2fbee452022-08-12 13:58:20 +0800193 val &= ~SGMII_IF_MODE_MASK;
194 val |= SGMII_SPEED_DUPLEX_AN;
developer089e8852022-09-28 14:43:46 +0800195 regmap_write(ss->regmap_sgmii[id], SGMSYS_SGMII_MODE, val);
developer2fbee452022-08-12 13:58:20 +0800196
developer089e8852022-09-28 14:43:46 +0800197 /* Enable SGMII AN */
198 regmap_read(ss->regmap_sgmii[id], SGMSYS_PCS_CONTROL_1, &val);
developer2fbee452022-08-12 13:58:20 +0800199 val |= SGMII_AN_ENABLE;
developer089e8852022-09-28 14:43:46 +0800200 regmap_write(ss->regmap_sgmii[id], SGMSYS_PCS_CONTROL_1, val);
developerfd40db22021-04-29 10:08:25 +0800201
developerf8ac94a2021-07-29 16:40:01 +0800202 if(MTK_HAS_FLAGS(ss->flags[id],MTK_SGMII_PN_SWAP))
developer089e8852022-09-28 14:43:46 +0800203 regmap_update_bits(ss->regmap_sgmii[id], SGMSYS_QPHY_WRAP_CTRL,
developerf8ac94a2021-07-29 16:40:01 +0800204 SGMII_PN_SWAP_MASK, SGMII_PN_SWAP_TX_RX);
205
developer3d014da2022-05-11 16:29:59 +0800206 /* Release PHYA power down state */
developer089e8852022-09-28 14:43:46 +0800207 regmap_write(ss->regmap_sgmii[id], SGMSYS_QPHY_PWR_STATE_CTRL, 0);
208
209 if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V3))
210 mtk_sgmii_setup_phya_gen1(ss, mac_id);
developerfd40db22021-04-29 10:08:25 +0800211
212 return 0;
213}
214
developer089e8852022-09-28 14:43:46 +0800215int mtk_sgmii_setup_mode_force(struct mtk_xgmii *ss, unsigned int mac_id,
developerfd40db22021-04-29 10:08:25 +0800216 const struct phylink_link_state *state)
217{
developer089e8852022-09-28 14:43:46 +0800218 struct mtk_eth *eth = ss->eth;
developer543e7922022-12-01 11:24:47 +0800219 unsigned int val = 0;
developer089e8852022-09-28 14:43:46 +0800220 u32 id = mtk_mac2xgmii_id(eth, mac_id);
developerfd40db22021-04-29 10:08:25 +0800221
developer089e8852022-09-28 14:43:46 +0800222 if (!ss->regmap_sgmii[id])
developerfd40db22021-04-29 10:08:25 +0800223 return -EINVAL;
224
developer089e8852022-09-28 14:43:46 +0800225 if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V3))
226 mtk_xfi_pll_enable(ss);
227
developer2fbee452022-08-12 13:58:20 +0800228 /* Assert PHYA power down state */
developer089e8852022-09-28 14:43:46 +0800229 regmap_write(ss->regmap_sgmii[id], SGMSYS_QPHY_PWR_STATE_CTRL, SGMII_PHYA_PWD);
developer2fbee452022-08-12 13:58:20 +0800230
developer2b76a9d2022-09-20 14:59:45 +0800231 /* Reset SGMII PCS state */
developer089e8852022-09-28 14:43:46 +0800232 regmap_write(ss->regmap_sgmii[id], SGMII_RESERVED_0, SGMII_SW_RESET);
developer2b76a9d2022-09-20 14:59:45 +0800233
developer089e8852022-09-28 14:43:46 +0800234 regmap_read(ss->regmap_sgmii[id], ss->ana_rgc3, &val);
developerfd40db22021-04-29 10:08:25 +0800235 val &= ~RG_PHY_SPEED_MASK;
236 if (state->interface == PHY_INTERFACE_MODE_2500BASEX)
237 val |= RG_PHY_SPEED_3_125G;
developer089e8852022-09-28 14:43:46 +0800238 regmap_write(ss->regmap_sgmii[id], ss->ana_rgc3, val);
developerfd40db22021-04-29 10:08:25 +0800239
240 /* Disable SGMII AN */
developer089e8852022-09-28 14:43:46 +0800241 regmap_read(ss->regmap_sgmii[id], SGMSYS_PCS_CONTROL_1, &val);
developerfd40db22021-04-29 10:08:25 +0800242 val &= ~SGMII_AN_ENABLE;
developer089e8852022-09-28 14:43:46 +0800243 regmap_write(ss->regmap_sgmii[id], SGMSYS_PCS_CONTROL_1, val);
developerfd40db22021-04-29 10:08:25 +0800244
245 /* SGMII force mode setting */
developer089e8852022-09-28 14:43:46 +0800246 regmap_read(ss->regmap_sgmii[id], SGMSYS_SGMII_MODE, &val);
developerfd40db22021-04-29 10:08:25 +0800247 val &= ~SGMII_IF_MODE_MASK;
developer2b76a9d2022-09-20 14:59:45 +0800248 val &= ~SGMII_REMOTE_FAULT_DIS;
developerfd40db22021-04-29 10:08:25 +0800249
250 switch (state->speed) {
251 case SPEED_10:
252 val |= SGMII_SPEED_10;
253 break;
254 case SPEED_100:
255 val |= SGMII_SPEED_100;
256 break;
257 case SPEED_2500:
258 case SPEED_1000:
developer089e8852022-09-28 14:43:46 +0800259 default:
developerfd40db22021-04-29 10:08:25 +0800260 val |= SGMII_SPEED_1000;
261 break;
262 };
263
developer2b76a9d2022-09-20 14:59:45 +0800264 /* SGMII 1G and 2.5G force mode can only work in full duplex
265 * mode, no matter SGMII_FORCE_HALF_DUPLEX is set or not.
266 */
267 if (state->duplex != DUPLEX_FULL)
developerfd40db22021-04-29 10:08:25 +0800268 val |= SGMII_DUPLEX_FULL;
269
developer089e8852022-09-28 14:43:46 +0800270 regmap_write(ss->regmap_sgmii[id], SGMSYS_SGMII_MODE, val);
developerfd40db22021-04-29 10:08:25 +0800271
developerf8ac94a2021-07-29 16:40:01 +0800272 if(MTK_HAS_FLAGS(ss->flags[id],MTK_SGMII_PN_SWAP))
developer089e8852022-09-28 14:43:46 +0800273 regmap_update_bits(ss->regmap_sgmii[id], SGMSYS_QPHY_WRAP_CTRL,
developerf8ac94a2021-07-29 16:40:01 +0800274 SGMII_PN_SWAP_MASK, SGMII_PN_SWAP_TX_RX);
developer3d014da2022-05-11 16:29:59 +0800275
developerfd40db22021-04-29 10:08:25 +0800276 /* Release PHYA power down state */
developer089e8852022-09-28 14:43:46 +0800277 regmap_write(ss->regmap_sgmii[id], SGMSYS_QPHY_PWR_STATE_CTRL, 0);
278
279 if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V3))
280 mtk_sgmii_setup_phya_gen2(ss, mac_id);
developerfd40db22021-04-29 10:08:25 +0800281
282 return 0;
283}
284
285void mtk_sgmii_restart_an(struct mtk_eth *eth, int mac_id)
286{
developer089e8852022-09-28 14:43:46 +0800287 struct mtk_xgmii *ss = eth->xgmii;
developer543e7922022-12-01 11:24:47 +0800288 unsigned int val = 0, sid = mtk_mac2xgmii_id(eth, mac_id);
developerfd40db22021-04-29 10:08:25 +0800289
290 /* Decide how GMAC and SGMIISYS be mapped */
291 sid = (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_SGMII)) ?
developer089e8852022-09-28 14:43:46 +0800292 0 : sid;
developerfd40db22021-04-29 10:08:25 +0800293
developer089e8852022-09-28 14:43:46 +0800294 if (!ss->regmap_sgmii[sid])
developerfd40db22021-04-29 10:08:25 +0800295 return;
296
developer089e8852022-09-28 14:43:46 +0800297 regmap_read(ss->regmap_sgmii[sid], SGMSYS_PCS_CONTROL_1, &val);
developerfd40db22021-04-29 10:08:25 +0800298 val |= SGMII_AN_RESTART;
developer089e8852022-09-28 14:43:46 +0800299 regmap_write(ss->regmap_sgmii[sid], SGMSYS_PCS_CONTROL_1, val);
developerfd40db22021-04-29 10:08:25 +0800300}