* [PATCH net-next 0/2] Add LED support/fix to MediaTek 2.5Gphy & Gphy
@ 2025-05-23 11:35 Sky Huang
2025-05-23 11:36 ` [PATCH net-next 1/2] net: phy: mtk-2p5ge: Add LED support for MT7988 Sky Huang
2025-05-23 11:36 ` [PATCH net-next 2/2] net: phy: mtk-ge-soc: Fix LED behavior if blinking is not set Sky Huang
0 siblings, 2 replies; 5+ messages in thread
From: Sky Huang @ 2025-05-23 11:35 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Daniel Golle,
Qingfang Deng, SkyLake Huang, Matthias Brugger,
AngeloGioacchino Del Regno, linux-kernel, netdev,
linux-arm-kernel, linux-mediatek
Cc: Sky Huang
From: Sky Huang <skylake.huang@mediatek.com>
This patchset adds LED support to MediaTek's built-in 2.5G phy, which
basically hooks the same helper function with built-in Gphy. Also, fix
LED behavior when blinking(delay_on & delay_off are both zero) is not set.
Sky Huang (2):
net: phy: mtk-2p5ge: Add LED support for MT7988
net: phy: mtk-ge-soc: Fix LED behavior if blinking is not set.
drivers/net/phy/mediatek/mtk-2p5ge.c | 104 ++++++++++++++++++++++++--
drivers/net/phy/mediatek/mtk-ge-soc.c | 7 +-
2 files changed, 103 insertions(+), 8 deletions(-)
--
2.45.2
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH net-next 1/2] net: phy: mtk-2p5ge: Add LED support for MT7988
2025-05-23 11:35 [PATCH net-next 0/2] Add LED support/fix to MediaTek 2.5Gphy & Gphy Sky Huang
@ 2025-05-23 11:36 ` Sky Huang
2025-05-23 16:02 ` Andrew Lunn
2025-05-23 11:36 ` [PATCH net-next 2/2] net: phy: mtk-ge-soc: Fix LED behavior if blinking is not set Sky Huang
1 sibling, 1 reply; 5+ messages in thread
From: Sky Huang @ 2025-05-23 11:36 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Daniel Golle,
Qingfang Deng, SkyLake Huang, Matthias Brugger,
AngeloGioacchino Del Regno, linux-kernel, netdev,
linux-arm-kernel, linux-mediatek
Cc: Sky Huang
From: Sky Huang <skylake.huang@mediatek.com>
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>
---
drivers/net/phy/mediatek/mtk-2p5ge.c | 104 +++++++++++++++++++++++++--
1 file changed, 98 insertions(+), 6 deletions(-)
diff --git a/drivers/net/phy/mediatek/mtk-2p5ge.c b/drivers/net/phy/mediatek/mtk-2p5ge.c
index e147eab52..de8a41a18 100644
--- a/drivers/net/phy/mediatek/mtk-2p5ge.c
+++ b/drivers/net/phy/mediatek/mtk-2p5ge.c
@@ -249,8 +249,80 @@ static int mt798x_2p5ge_phy_get_rate_matching(struct phy_device *phydev,
return RATE_MATCH_PAUSE;
}
+static const unsigned long supported_triggers =
+ BIT(TRIGGER_NETDEV_FULL_DUPLEX) |
+ BIT(TRIGGER_NETDEV_LINK) |
+ BIT(TRIGGER_NETDEV_LINK_10) |
+ BIT(TRIGGER_NETDEV_LINK_100) |
+ BIT(TRIGGER_NETDEV_LINK_1000) |
+ BIT(TRIGGER_NETDEV_LINK_2500) |
+ BIT(TRIGGER_NETDEV_RX) |
+ BIT(TRIGGER_NETDEV_TX);
+
+static int mt798x_2p5ge_phy_led_blink_set(struct phy_device *phydev, u8 index,
+ unsigned long *delay_on,
+ unsigned long *delay_off)
+{
+ bool blinking = false;
+ int err = 0;
+
+ err = mtk_phy_led_num_dly_cfg(index, delay_on, delay_off, &blinking);
+ if (err < 0)
+ return err;
+
+ err = mtk_phy_hw_led_blink_set(phydev, index, blinking);
+ if (err)
+ return err;
+
+ if (blinking)
+ mtk_phy_hw_led_on_set(phydev, index, MTK_2P5GPHY_LED_ON_MASK,
+ false);
+
+ return 0;
+}
+
+static int mt798x_2p5ge_phy_led_brightness_set(struct phy_device *phydev,
+ u8 index,
+ enum led_brightness value)
+{
+ int err;
+
+ err = mtk_phy_hw_led_blink_set(phydev, index, false);
+ if (err)
+ return err;
+
+ return mtk_phy_hw_led_on_set(phydev, index, MTK_2P5GPHY_LED_ON_MASK,
+ (value != LED_OFF));
+}
+
+static int mt798x_2p5ge_phy_led_hw_is_supported(struct phy_device *phydev,
+ u8 index, unsigned long rules)
+{
+ return mtk_phy_led_hw_is_supported(phydev, index, rules,
+ supported_triggers);
+}
+
+static int mt798x_2p5ge_phy_led_hw_control_get(struct phy_device *phydev,
+ u8 index, unsigned long *rules)
+{
+ return mtk_phy_led_hw_ctrl_get(phydev, index, rules,
+ MTK_2P5GPHY_LED_ON_SET,
+ MTK_2P5GPHY_LED_RX_BLINK_SET,
+ MTK_2P5GPHY_LED_TX_BLINK_SET);
+};
+
+static int mt798x_2p5ge_phy_led_hw_control_set(struct phy_device *phydev,
+ u8 index, unsigned long rules)
+{
+ return mtk_phy_led_hw_ctrl_set(phydev, index, rules,
+ MTK_2P5GPHY_LED_ON_SET,
+ MTK_2P5GPHY_LED_RX_BLINK_SET,
+ MTK_2P5GPHY_LED_TX_BLINK_SET);
+};
+
static int mt798x_2p5ge_phy_probe(struct phy_device *phydev)
{
+ struct mtk_socphy_priv *priv;
struct pinctrl *pinctrl;
int ret;
@@ -273,19 +345,34 @@ static int mt798x_2p5ge_phy_probe(struct phy_device *phydev)
if (ret < 0)
return ret;
- /* Setup LED */
+ /* Setup LED. On default, LED0 is on/off when link is up/down. As for
+ * LED1, it blinks as tx/rx transmission takes place.
+ */
phy_set_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_LED0_ON_CTRL,
- MTK_PHY_LED_ON_POLARITY | MTK_PHY_LED_ON_LINK10 |
- MTK_PHY_LED_ON_LINK100 | MTK_PHY_LED_ON_LINK1000 |
- MTK_PHY_LED_ON_LINK2500);
- phy_set_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_LED1_ON_CTRL,
- MTK_PHY_LED_ON_FDX | MTK_PHY_LED_ON_HDX);
+ MTK_PHY_LED_ON_POLARITY | MTK_2P5GPHY_LED_ON_SET);
+ phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_LED0_BLINK_CTRL,
+ MTK_2P5GPHY_LED_TX_BLINK_SET |
+ MTK_2P5GPHY_LED_RX_BLINK_SET);
+ phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_LED1_ON_CTRL,
+ MTK_PHY_LED_ON_FDX | MTK_PHY_LED_ON_HDX |
+ MTK_2P5GPHY_LED_ON_SET);
+ phy_set_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_LED1_BLINK_CTRL,
+ MTK_2P5GPHY_LED_TX_BLINK_SET |
+ MTK_2P5GPHY_LED_RX_BLINK_SET);
/* Switch pinctrl after setting polarity to avoid bogus blinking */
pinctrl = devm_pinctrl_get_select(&phydev->mdio.dev, "i2p5gbe-led");
if (IS_ERR(pinctrl))
dev_err(&phydev->mdio.dev, "Fail to set LED pins!\n");
+ priv = devm_kzalloc(&phydev->mdio.dev, sizeof(struct mtk_socphy_priv),
+ GFP_KERNEL);
+ if (!priv)
+ return -ENOMEM;
+ phydev->priv = priv;
+
+ mtk_phy_leds_state_init(phydev);
+
return 0;
}
@@ -303,6 +390,11 @@ static struct phy_driver mtk_2p5gephy_driver[] = {
.resume = genphy_resume,
.read_page = mtk_phy_read_page,
.write_page = mtk_phy_write_page,
+ .led_blink_set = mt798x_2p5ge_phy_led_blink_set,
+ .led_brightness_set = mt798x_2p5ge_phy_led_brightness_set,
+ .led_hw_is_supported = mt798x_2p5ge_phy_led_hw_is_supported,
+ .led_hw_control_get = mt798x_2p5ge_phy_led_hw_control_get,
+ .led_hw_control_set = mt798x_2p5ge_phy_led_hw_control_set,
},
};
--
2.45.2
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH net-next 2/2] net: phy: mtk-ge-soc: Fix LED behavior if blinking is not set.
2025-05-23 11:35 [PATCH net-next 0/2] Add LED support/fix to MediaTek 2.5Gphy & Gphy Sky Huang
2025-05-23 11:36 ` [PATCH net-next 1/2] net: phy: mtk-2p5ge: Add LED support for MT7988 Sky Huang
@ 2025-05-23 11:36 ` Sky Huang
2025-05-23 16:07 ` Andrew Lunn
1 sibling, 1 reply; 5+ messages in thread
From: Sky Huang @ 2025-05-23 11:36 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Daniel Golle,
Qingfang Deng, SkyLake Huang, Matthias Brugger,
AngeloGioacchino Del Regno, linux-kernel, netdev,
linux-arm-kernel, linux-mediatek
Cc: Sky Huang
From: Sky Huang <skylake.huang@mediatek.com>
If delay_on==0 and delay_off==0 are passed to
mt798x_2p5ge_phy_led_blink_set() and mtk_phy_led_num_dly_cfg(),
blinking is actually not set. So don't clean "LED on" status under
this circumstance.
Signed-off-by: Sky Huang <skylake.huang@mediatek.com>
---
drivers/net/phy/mediatek/mtk-ge-soc.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/net/phy/mediatek/mtk-ge-soc.c b/drivers/net/phy/mediatek/mtk-ge-soc.c
index cd0968478..15dcf2046 100644
--- a/drivers/net/phy/mediatek/mtk-ge-soc.c
+++ b/drivers/net/phy/mediatek/mtk-ge-soc.c
@@ -1228,8 +1228,11 @@ static int mt798x_phy_led_blink_set(struct phy_device *phydev, u8 index,
if (err)
return err;
- return mtk_phy_hw_led_on_set(phydev, index, MTK_GPHY_LED_ON_MASK,
- false);
+ if (blinking)
+ mtk_phy_hw_led_on_set(phydev, index, MTK_GPHY_LED_ON_MASK,
+ false);
+
+ return 0;
}
static int mt798x_phy_led_brightness_set(struct phy_device *phydev,
--
2.45.2
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net-next 1/2] net: phy: mtk-2p5ge: Add LED support for MT7988
2025-05-23 11:36 ` [PATCH net-next 1/2] net: phy: mtk-2p5ge: Add LED support for MT7988 Sky Huang
@ 2025-05-23 16:02 ` Andrew Lunn
0 siblings, 0 replies; 5+ messages in thread
From: Andrew Lunn @ 2025-05-23 16:02 UTC (permalink / raw)
To: Sky Huang
Cc: Heiner Kallweit, Russell King, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Daniel Golle, Qingfang Deng,
Matthias Brugger, AngeloGioacchino Del Regno, linux-kernel,
netdev, linux-arm-kernel, linux-mediatek
On Fri, May 23, 2025 at 07:36:00PM +0800, Sky Huang wrote:
> From: Sky Huang <skylake.huang@mediatek.com>
>
> 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>
Andrew
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net-next 2/2] net: phy: mtk-ge-soc: Fix LED behavior if blinking is not set.
2025-05-23 11:36 ` [PATCH net-next 2/2] net: phy: mtk-ge-soc: Fix LED behavior if blinking is not set Sky Huang
@ 2025-05-23 16:07 ` Andrew Lunn
0 siblings, 0 replies; 5+ messages in thread
From: Andrew Lunn @ 2025-05-23 16:07 UTC (permalink / raw)
To: Sky Huang
Cc: Heiner Kallweit, Russell King, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Daniel Golle, Qingfang Deng,
Matthias Brugger, AngeloGioacchino Del Regno, linux-kernel,
netdev, linux-arm-kernel, linux-mediatek
On Fri, May 23, 2025 at 07:36:01PM +0800, Sky Huang wrote:
> From: Sky Huang <skylake.huang@mediatek.com>
>
> If delay_on==0 and delay_off==0 are passed to
> mt798x_2p5ge_phy_led_blink_set() and mtk_phy_led_num_dly_cfg(),
> blinking is actually not set. So don't clean "LED on" status under
> this circumstance.
Actually, i think mtk_phy_led_num_dly_cfg() is wrong.
https://docs.kernel.org/leds/leds-class.html#hardware-accelerated-blink-of-leds
The blink_set() function should choose a user friendly blinking
value if it is called with *delay_on==0 && *delay_off==0
parameters. In this case the driver should give back the chosen
value through delay_on and delay_off parameters to the leds
subsystem.
That is not what mtk_phy_led_num_dly_cfg() does.
Andrew
---
pw-bot: cr
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-05-23 16:08 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-05-23 11:35 [PATCH net-next 0/2] Add LED support/fix to MediaTek 2.5Gphy & Gphy Sky Huang
2025-05-23 11:36 ` [PATCH net-next 1/2] net: phy: mtk-2p5ge: Add LED support for MT7988 Sky Huang
2025-05-23 16:02 ` Andrew Lunn
2025-05-23 11:36 ` [PATCH net-next 2/2] net: phy: mtk-ge-soc: Fix LED behavior if blinking is not set Sky Huang
2025-05-23 16:07 ` Andrew Lunn
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®