Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

net: phy: mtk-2p5ge: Add LED support for MT7988

Add LED support for MT7988's built-in 2.5Gphy. LED hardware has almost
the same design with MT7981's/MT7988's built-in GbE. So hook the same
helper function here.

Before mtk_phy_leds_state_init(), set correct default values of LED0
and LED1.

Signed-off-by: Sky Huang <skylake.huang@mediatek.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Link: https://patch.msgid.link/20250827044755.3256991-1-SkyLake.Huang@mediatek.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Sky Huang and committed by
Jakub Kicinski
5e3aae2d c158b5a5

+98 -6
+98 -6
drivers/net/phy/mediatek/mtk-2p5ge.c
··· 249 249 return RATE_MATCH_PAUSE; 250 250 } 251 251 252 + static const unsigned long supported_triggers = 253 + BIT(TRIGGER_NETDEV_FULL_DUPLEX) | 254 + BIT(TRIGGER_NETDEV_LINK) | 255 + BIT(TRIGGER_NETDEV_LINK_10) | 256 + BIT(TRIGGER_NETDEV_LINK_100) | 257 + BIT(TRIGGER_NETDEV_LINK_1000) | 258 + BIT(TRIGGER_NETDEV_LINK_2500) | 259 + BIT(TRIGGER_NETDEV_RX) | 260 + BIT(TRIGGER_NETDEV_TX); 261 + 262 + static int mt798x_2p5ge_phy_led_blink_set(struct phy_device *phydev, u8 index, 263 + unsigned long *delay_on, 264 + unsigned long *delay_off) 265 + { 266 + bool blinking = false; 267 + int err = 0; 268 + 269 + err = mtk_phy_led_num_dly_cfg(index, delay_on, delay_off, &blinking); 270 + if (err < 0) 271 + return err; 272 + 273 + err = mtk_phy_hw_led_blink_set(phydev, index, blinking); 274 + if (err) 275 + return err; 276 + 277 + if (blinking) 278 + mtk_phy_hw_led_on_set(phydev, index, MTK_2P5GPHY_LED_ON_MASK, 279 + false); 280 + 281 + return 0; 282 + } 283 + 284 + static int mt798x_2p5ge_phy_led_brightness_set(struct phy_device *phydev, 285 + u8 index, 286 + enum led_brightness value) 287 + { 288 + int err; 289 + 290 + err = mtk_phy_hw_led_blink_set(phydev, index, false); 291 + if (err) 292 + return err; 293 + 294 + return mtk_phy_hw_led_on_set(phydev, index, MTK_2P5GPHY_LED_ON_MASK, 295 + (value != LED_OFF)); 296 + } 297 + 298 + static int mt798x_2p5ge_phy_led_hw_is_supported(struct phy_device *phydev, 299 + u8 index, unsigned long rules) 300 + { 301 + return mtk_phy_led_hw_is_supported(phydev, index, rules, 302 + supported_triggers); 303 + } 304 + 305 + static int mt798x_2p5ge_phy_led_hw_control_get(struct phy_device *phydev, 306 + u8 index, unsigned long *rules) 307 + { 308 + return mtk_phy_led_hw_ctrl_get(phydev, index, rules, 309 + MTK_2P5GPHY_LED_ON_SET, 310 + MTK_2P5GPHY_LED_RX_BLINK_SET, 311 + MTK_2P5GPHY_LED_TX_BLINK_SET); 312 + }; 313 + 314 + static int mt798x_2p5ge_phy_led_hw_control_set(struct phy_device *phydev, 315 + u8 index, unsigned long rules) 316 + { 317 + return mtk_phy_led_hw_ctrl_set(phydev, index, rules, 318 + MTK_2P5GPHY_LED_ON_SET, 319 + MTK_2P5GPHY_LED_RX_BLINK_SET, 320 + MTK_2P5GPHY_LED_TX_BLINK_SET); 321 + }; 322 + 252 323 static int mt798x_2p5ge_phy_probe(struct phy_device *phydev) 253 324 { 325 + struct mtk_socphy_priv *priv; 254 326 struct pinctrl *pinctrl; 255 327 int ret; 256 328 ··· 345 273 if (ret < 0) 346 274 return ret; 347 275 348 - /* Setup LED */ 276 + /* Setup LED. On default, LED0 is on/off when link is up/down. As for 277 + * LED1, it blinks as tx/rx transmission takes place. 278 + */ 349 279 phy_set_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_LED0_ON_CTRL, 350 - MTK_PHY_LED_ON_POLARITY | MTK_PHY_LED_ON_LINK10 | 351 - MTK_PHY_LED_ON_LINK100 | MTK_PHY_LED_ON_LINK1000 | 352 - MTK_PHY_LED_ON_LINK2500); 353 - phy_set_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_LED1_ON_CTRL, 354 - MTK_PHY_LED_ON_FDX | MTK_PHY_LED_ON_HDX); 280 + MTK_PHY_LED_ON_POLARITY | MTK_2P5GPHY_LED_ON_SET); 281 + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_LED0_BLINK_CTRL, 282 + MTK_2P5GPHY_LED_TX_BLINK_SET | 283 + MTK_2P5GPHY_LED_RX_BLINK_SET); 284 + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_LED1_ON_CTRL, 285 + MTK_PHY_LED_ON_FDX | MTK_PHY_LED_ON_HDX | 286 + MTK_2P5GPHY_LED_ON_SET); 287 + phy_set_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_LED1_BLINK_CTRL, 288 + MTK_2P5GPHY_LED_TX_BLINK_SET | 289 + MTK_2P5GPHY_LED_RX_BLINK_SET); 355 290 356 291 /* Switch pinctrl after setting polarity to avoid bogus blinking */ 357 292 pinctrl = devm_pinctrl_get_select(&phydev->mdio.dev, "i2p5gbe-led"); 358 293 if (IS_ERR(pinctrl)) 359 294 dev_err(&phydev->mdio.dev, "Fail to set LED pins!\n"); 295 + 296 + priv = devm_kzalloc(&phydev->mdio.dev, sizeof(struct mtk_socphy_priv), 297 + GFP_KERNEL); 298 + if (!priv) 299 + return -ENOMEM; 300 + phydev->priv = priv; 301 + 302 + mtk_phy_leds_state_init(phydev); 360 303 361 304 return 0; 362 305 } ··· 390 303 .resume = genphy_resume, 391 304 .read_page = mtk_phy_read_page, 392 305 .write_page = mtk_phy_write_page, 306 + .led_blink_set = mt798x_2p5ge_phy_led_blink_set, 307 + .led_brightness_set = mt798x_2p5ge_phy_led_brightness_set, 308 + .led_hw_is_supported = mt798x_2p5ge_phy_led_hw_is_supported, 309 + .led_hw_control_get = mt798x_2p5ge_phy_led_hw_control_get, 310 + .led_hw_control_set = mt798x_2p5ge_phy_led_hw_control_set, 393 311 }, 394 312 }; 395 313