9f6dac9431b363867cea61670551e3ed37259bcd
[openwrt/staging/pepe2k.git] /
1 From 5b605457b93d0979ab623ef2aa6eb456c46e511c Mon Sep 17 00:00:00 2001
2 From: "SkyLake.Huang" <skylake.huang@mediatek.com>
3 Date: Fri, 4 Oct 2024 18:24:10 +0800
4 Subject: [PATCH 6/9] net: phy: mediatek: Hook LED helper functions in mtk-ge.c
5
6 We have mtk-phy-lib.c now so that we can use LED helper functions in
7 mtk-ge.c(mt7531 part). It also means that mt7531/mt7981/mt7988's
8 Giga ethernet phys share almost the same HW LED controller design.
9 Also, add probe function for mt7531 so that it can initialize LED state.
10
11 Signed-off-by: SkyLake.Huang <skylake.huang@mediatek.com>
12 ---
13 drivers/net/phy/mediatek/mtk-ge.c | 100 ++++++++++++++++++++++++++++++
14 1 file changed, 100 insertions(+)
15
16 --- a/drivers/net/phy/mediatek/mtk-ge.c
17 +++ b/drivers/net/phy/mediatek/mtk-ge.c
18 @@ -14,6 +14,10 @@
19 #define MTK_PHY_PAGE_EXTENDED_2A30 0x2a30
20 #define MTK_PHY_PAGE_EXTENDED_52B5 0x52b5
21
22 +struct mtk_gephy_priv {
23 + unsigned long led_state;
24 +};
25 +
26 static void mtk_gephy_config_init(struct phy_device *phydev)
27 {
28 /* Disable EEE */
29 @@ -94,6 +98,96 @@ static int mt7531_phy_config_init(struct
30 return 0;
31 }
32
33 +static int mt7531_phy_probe(struct phy_device *phydev)
34 +{
35 + struct mtk_gephy_priv *priv;
36 +
37 + priv = devm_kzalloc(&phydev->mdio.dev, sizeof(struct mtk_gephy_priv),
38 + GFP_KERNEL);
39 + if (!priv)
40 + return -ENOMEM;
41 +
42 + phydev->priv = priv;
43 +
44 + mtk_phy_leds_state_init(phydev);
45 +
46 + return 0;
47 +}
48 +
49 +static int mt753x_phy_led_blink_set(struct phy_device *phydev, u8 index,
50 + unsigned long *delay_on,
51 + unsigned long *delay_off)
52 +{
53 + struct mtk_gephy_priv *priv = phydev->priv;
54 + bool blinking = false;
55 + int err = 0;
56 +
57 + err = mtk_phy_led_num_dly_cfg(index, delay_on, delay_off, &blinking);
58 + if (err < 0)
59 + return err;
60 +
61 + err = mtk_phy_hw_led_blink_set(phydev, index, &priv->led_state,
62 + blinking);
63 + if (err)
64 + return err;
65 +
66 + return mtk_phy_hw_led_on_set(phydev, index, &priv->led_state,
67 + MTK_GPHY_LED_ON_MASK, false);
68 +}
69 +
70 +static int mt753x_phy_led_brightness_set(struct phy_device *phydev,
71 + u8 index, enum led_brightness value)
72 +{
73 + struct mtk_gephy_priv *priv = phydev->priv;
74 + int err;
75 +
76 + err = mtk_phy_hw_led_blink_set(phydev, index, &priv->led_state, false);
77 + if (err)
78 + return err;
79 +
80 + return mtk_phy_hw_led_on_set(phydev, index, &priv->led_state,
81 + MTK_GPHY_LED_ON_MASK, (value != LED_OFF));
82 +}
83 +
84 +static const unsigned long supported_triggers =
85 + BIT(TRIGGER_NETDEV_FULL_DUPLEX) |
86 + BIT(TRIGGER_NETDEV_HALF_DUPLEX) |
87 + BIT(TRIGGER_NETDEV_LINK) |
88 + BIT(TRIGGER_NETDEV_LINK_10) |
89 + BIT(TRIGGER_NETDEV_LINK_100) |
90 + BIT(TRIGGER_NETDEV_LINK_1000) |
91 + BIT(TRIGGER_NETDEV_RX) |
92 + BIT(TRIGGER_NETDEV_TX);
93 +
94 +static int mt753x_phy_led_hw_is_supported(struct phy_device *phydev, u8 index,
95 + unsigned long rules)
96 +{
97 + return mtk_phy_led_hw_is_supported(phydev, index, rules,
98 + supported_triggers);
99 +}
100 +
101 +static int mt753x_phy_led_hw_control_get(struct phy_device *phydev, u8 index,
102 + unsigned long *rules)
103 +{
104 + struct mtk_gephy_priv *priv = phydev->priv;
105 +
106 + return mtk_phy_led_hw_ctrl_get(phydev, index, rules, &priv->led_state,
107 + MTK_GPHY_LED_ON_SET,
108 + MTK_GPHY_LED_RX_BLINK_SET,
109 + MTK_GPHY_LED_TX_BLINK_SET);
110 +};
111 +
112 +static int mt753x_phy_led_hw_control_set(struct phy_device *phydev, u8 index,
113 + unsigned long rules)
114 +{
115 + struct mtk_gephy_priv *priv = phydev->priv;
116 +
117 + return mtk_phy_led_hw_ctrl_set(phydev, index, rules, &priv->led_state,
118 + MTK_GPHY_LED_ON_SET,
119 + MTK_GPHY_LED_RX_BLINK_SET,
120 + MTK_GPHY_LED_TX_BLINK_SET);
121 +};
122 +
123 static struct phy_driver mtk_gephy_driver[] = {
124 {
125 PHY_ID_MATCH_EXACT(0x03a29412),
126 @@ -112,6 +206,7 @@ static struct phy_driver mtk_gephy_drive
127 {
128 PHY_ID_MATCH_EXACT(0x03a29441),
129 .name = "MediaTek MT7531 PHY",
130 + .probe = mt7531_phy_probe,
131 .config_init = mt7531_phy_config_init,
132 /* Interrupts are handled by the switch, not the PHY
133 * itself.
134 @@ -122,6 +217,11 @@ static struct phy_driver mtk_gephy_drive
135 .resume = genphy_resume,
136 .read_page = mtk_phy_read_page,
137 .write_page = mtk_phy_write_page,
138 + .led_blink_set = mt753x_phy_led_blink_set,
139 + .led_brightness_set = mt753x_phy_led_brightness_set,
140 + .led_hw_is_supported = mt753x_phy_led_hw_is_supported,
141 + .led_hw_control_set = mt753x_phy_led_hw_control_set,
142 + .led_hw_control_get = mt753x_phy_led_hw_control_get,
143 },
144 };
145