hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/drivers/net/phy/rk630phy.c
....@@ -160,14 +160,33 @@
160160 phy_write(phydev, REG_PAGE_SEL, 0x0000);
161161 }
162162
163
-static void rk630_phy_set_uaps(struct phy_device *phydev)
163
+static void rk630_phy_set_aps(struct phy_device *phydev, bool enable)
164
+{
165
+ u32 value;
166
+
167
+ /* Switch to page 1 */
168
+ phy_write(phydev, REG_PAGE_SEL, 0x0100);
169
+ value = phy_read(phydev, REG_PAGE1_APS_CTRL);
170
+ if (enable)
171
+ value |= BIT(15);
172
+ else
173
+ value &= ~BIT(15);
174
+ phy_write(phydev, REG_PAGE1_APS_CTRL, value);
175
+ /* Switch to page 0 */
176
+ phy_write(phydev, REG_PAGE_SEL, 0x0000);
177
+}
178
+
179
+static void rk630_phy_set_uaps(struct phy_device *phydev, bool enable)
164180 {
165181 u32 value;
166182
167183 /* Switch to page 1 */
168184 phy_write(phydev, REG_PAGE_SEL, 0x0100);
169185 value = phy_read(phydev, REG_PAGE1_UAPS_CONFIGURE);
170
- value |= BIT(15);
186
+ if (enable)
187
+ value |= BIT(15);
188
+ else
189
+ value &= ~BIT(15);
171190 phy_write(phydev, REG_PAGE1_UAPS_CONFIGURE, value);
172191 /* Switch to page 0 */
173192 phy_write(phydev, REG_PAGE_SEL, 0x0000);
....@@ -208,6 +227,8 @@
208227
209228 /* Switch to page 1 */
210229 phy_write(phydev, REG_PAGE_SEL, 0x0100);
230
+ /* Enable offset clock */
231
+ phy_write(phydev, 0x10, 0xfbfe);
211232 /* Disable APS */
212233 phy_write(phydev, REG_PAGE1_APS_CTRL, 0x4824);
213234 /* Switch to page 2 */
....@@ -217,7 +238,7 @@
217238 /* Switch to page 6 */
218239 phy_write(phydev, REG_PAGE_SEL, 0x0600);
219240 /* PHYAFE ADC optimization */
220
- phy_write(phydev, REG_PAGE6_ADC_ANONTROL, 0x5540);
241
+ phy_write(phydev, REG_PAGE6_ADC_ANONTROL, 0x555e);
221242 /* PHYAFE Gain optimization */
222243 phy_write(phydev, REG_PAGE6_GAIN_ANONTROL, 0x0400);
223244 /* PHYAFE EQ optimization */
....@@ -244,6 +265,8 @@
244265 phy_write(phydev, REG_PAGE_SEL, 0x0800);
245266 /* Disable auto-cal */
246267 phy_write(phydev, REG_PAGE8_AUTO_CAL, 0x0844);
268
+ /* Reatart offset calibration */
269
+ phy_write(phydev, 0x13, 0xc096);
247270
248271 /* Switch to page 0 */
249272 phy_write(phydev, REG_PAGE_SEL, 0x0000);
....@@ -264,10 +287,12 @@
264287 * Ultra Auto-Power Saving Mode (UAPS) is designed to
265288 * save power when cable is not plugged into PHY.
266289 */
267
- rk630_phy_set_uaps(phydev);
290
+ rk630_phy_set_uaps(phydev, true);
268291 break;
269292 case PHY_ADDR_T22:
270293 rk630_phy_t22_config_init(phydev);
294
+ rk630_phy_set_aps(phydev, true);
295
+ rk630_phy_set_uaps(phydev, true);
271296 break;
272297 default:
273298 phydev_err(phydev, "Unsupported address for current phy: %d\n",
....@@ -278,6 +303,23 @@
278303 rk630_phy_ieee_set(phydev, true);
279304
280305 return 0;
306
+}
307
+
308
+static void rk630_link_change_notify(struct phy_device *phydev)
309
+{
310
+ unsigned int val;
311
+
312
+ if (phydev->state == PHY_RUNNING || phydev->state == PHY_NOLINK) {
313
+ /* Switch to page 6 */
314
+ phy_write(phydev, REG_PAGE_SEL, 0x0600);
315
+ val = phy_read(phydev, REG_PAGE6_AFE_TX_CTRL);
316
+ val &= ~GENMASK(14, 13);
317
+ if (phydev->speed == SPEED_10 && phydev->link)
318
+ val |= BIT(13);
319
+ phy_write(phydev, REG_PAGE6_AFE_TX_CTRL, val);
320
+ /* Switch to page 0 */
321
+ phy_write(phydev, REG_PAGE_SEL, 0x0000);
322
+ }
281323 }
282324
283325 static irqreturn_t rk630_wol_irq_thread(int irq, void *dev_id)
....@@ -365,6 +407,7 @@
365407 .name = "RK630 PHY",
366408 .features = PHY_BASIC_FEATURES,
367409 .flags = 0,
410
+ .link_change_notify = rk630_link_change_notify,
368411 .probe = rk630_phy_probe,
369412 .remove = rk630_phy_remove,
370413 .soft_reset = genphy_soft_reset,
....@@ -381,7 +424,7 @@
381424 { }
382425 };
383426
384
-MODULE_DEVICE_TABLE(mdio, rockchip_phy_tbl);
427
+MODULE_DEVICE_TABLE(mdio, rk630_phy_tbl);
385428
386429 module_phy_driver(rk630_phy_driver);
387430