net: phy: dp83867: Add support for active-low LEDs

Add the led_polarity_set callback for setting LED polarity.

Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Alexander Stein 2024-01-31 08:50:48 +01:00 committed by David S. Miller
parent 969337a4c9
commit 447b80a933
1 changed files with 22 additions and 0 deletions

View File

@ -158,6 +158,7 @@
/* LED_DRV bits */
#define DP83867_LED_DRV_EN(x) BIT((x) * 4)
#define DP83867_LED_DRV_VAL(x) BIT((x) * 4 + 1)
#define DP83867_LED_POLARITY(x) BIT((x) * 4 + 2)
#define DP83867_LED_FN(idx, val) (((val) & 0xf) << ((idx) * 4))
#define DP83867_LED_FN_MASK(idx) (0xf << ((idx) * 4))
@ -1152,6 +1153,26 @@ static int dp83867_led_hw_control_get(struct phy_device *phydev, u8 index,
return 0;
}
static int dp83867_led_polarity_set(struct phy_device *phydev, int index,
unsigned long modes)
{
/* Default active high */
u16 polarity = DP83867_LED_POLARITY(index);
u32 mode;
for_each_set_bit(mode, &modes, __PHY_LED_MODES_NUM) {
switch (mode) {
case PHY_LED_ACTIVE_LOW:
polarity = 0;
break;
default:
return -EINVAL;
}
}
return phy_modify(phydev, DP83867_LEDCR2,
DP83867_LED_POLARITY(index), polarity);
}
static struct phy_driver dp83867_driver[] = {
{
.phy_id = DP83867_PHY_ID,
@ -1184,6 +1205,7 @@ static struct phy_driver dp83867_driver[] = {
.led_hw_is_supported = dp83867_led_hw_is_supported,
.led_hw_control_set = dp83867_led_hw_control_set,
.led_hw_control_get = dp83867_led_hw_control_get,
.led_polarity_set = dp83867_led_polarity_set,
},
};
module_phy_driver(dp83867_driver);