-
Notifications
You must be signed in to change notification settings - Fork 19.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
generic: phy: aquantia: correctly describe LED polarity
Backport newly introduced support for 'active-high' property and use it to correctly implement polarity assignment for Aquantia PHY LEDs. Previously the 'active-low' property was used to switch a LED PIN to active-high ("drive VDD" in Aquantia-speak) mode. Signed-off-by: Daniel Golle <[email protected]>
- Loading branch information
Showing
7 changed files
with
164 additions
and
3 deletions.
There are no files selected for viewing
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -49,7 +49,7 @@ Reviewed-by: Russell King (Oracle) <[email protected]> | |
|
||
--- a/drivers/net/phy/aquantia/aquantia_main.c | ||
+++ b/drivers/net/phy/aquantia/aquantia_main.c | ||
@@ -506,7 +506,7 @@ static int aqr107_config_init(struct phy | ||
@@ -501,7 +501,7 @@ static int aqr107_config_init(struct phy | ||
{ | ||
struct aqr107_priv *priv = phydev->priv; | ||
u32 led_active_low; | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -104,4 +104,4 @@ Signed-off-by: Jakub Kicinski <[email protected]> | |
+ | ||
/* Restore LED polarity state after reset */ | ||
for_each_set_bit(led_active_low, &priv->leds_active_low, AQR_MAX_LEDS) { | ||
ret = aqr_phy_led_active_low_set(phydev, index, led_active_low); | ||
ret = aqr_phy_led_active_low_set(phydev, led_active_low, true); |
File renamed without changes.
53 changes: 53 additions & 0 deletions
53
...ux/generic/backport-6.6/841-v6.13-net-phy-support-active-high-property-for-PHY-LEDs.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
From a274465cc3bef2dfd9c9ea5100848dda0a8641e1 Mon Sep 17 00:00:00 2001 | ||
From: Daniel Golle <[email protected]> | ||
Date: Thu, 10 Oct 2024 13:54:19 +0100 | ||
Subject: [PATCH 1/4] net: phy: support 'active-high' property for PHY LEDs | ||
|
||
In addition to 'active-low' and 'inactive-high-impedance' also | ||
support 'active-high' property for PHY LED pin configuration. | ||
As only either 'active-high' or 'active-low' can be set at the | ||
same time, WARN and return an error in case both are set. | ||
|
||
Signed-off-by: Daniel Golle <[email protected]> | ||
Reviewed-by: Andrew Lunn <[email protected]> | ||
Link: https://patch.msgid.link/91598487773d768f254d5faf06cf65b13e972f0e.1728558223.git.daniel@makrotopia.org | ||
Signed-off-by: Paolo Abeni <[email protected]> | ||
--- | ||
drivers/net/phy/phy_device.c | 6 ++++++ | ||
include/linux/phy.h | 5 +++-- | ||
2 files changed, 9 insertions(+), 2 deletions(-) | ||
|
||
--- a/drivers/net/phy/phy_device.c | ||
+++ b/drivers/net/phy/phy_device.c | ||
@@ -3219,11 +3219,17 @@ static int of_phy_led(struct phy_device | ||
if (index > U8_MAX) | ||
return -EINVAL; | ||
|
||
+ if (of_property_read_bool(led, "active-high")) | ||
+ set_bit(PHY_LED_ACTIVE_HIGH, &modes); | ||
if (of_property_read_bool(led, "active-low")) | ||
set_bit(PHY_LED_ACTIVE_LOW, &modes); | ||
if (of_property_read_bool(led, "inactive-high-impedance")) | ||
set_bit(PHY_LED_INACTIVE_HIGH_IMPEDANCE, &modes); | ||
|
||
+ if (WARN_ON(modes & BIT(PHY_LED_ACTIVE_LOW) && | ||
+ modes & BIT(PHY_LED_ACTIVE_HIGH))) | ||
+ return -EINVAL; | ||
+ | ||
if (modes) { | ||
/* Return error if asked to set polarity modes but not supported */ | ||
if (!phydev->drv->led_polarity_set) | ||
--- a/include/linux/phy.h | ||
+++ b/include/linux/phy.h | ||
@@ -872,8 +872,9 @@ struct phy_led { | ||
|
||
/* Modes for PHY LED configuration */ | ||
enum phy_led_modes { | ||
- PHY_LED_ACTIVE_LOW = 0, | ||
- PHY_LED_INACTIVE_HIGH_IMPEDANCE = 1, | ||
+ PHY_LED_ACTIVE_HIGH = 0, | ||
+ PHY_LED_ACTIVE_LOW = 1, | ||
+ PHY_LED_INACTIVE_HIGH_IMPEDANCE = 2, | ||
|
||
/* keep it last */ | ||
__PHY_LED_MODES_NUM, |
108 changes: 108 additions & 0 deletions
108
...generic/backport-6.6/842-v6.13-net-phy-aquantia-correctly-describe-LED-polarity-ove.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
From 9d55e68b19f222e6334ef4021c5527998f5ab537 Mon Sep 17 00:00:00 2001 | ||
From: Daniel Golle <[email protected]> | ||
Date: Thu, 10 Oct 2024 13:55:00 +0100 | ||
Subject: [PATCH 2/4] net: phy: aquantia: correctly describe LED polarity | ||
override | ||
|
||
Use newly defined 'active-high' property to set the | ||
VEND1_GLOBAL_LED_DRIVE_VDD bit and let 'active-low' clear that bit. This | ||
reflects the technical reality which was inverted in the previous | ||
description in which the 'active-low' property was used to actually set | ||
the VEND1_GLOBAL_LED_DRIVE_VDD bit, which means that VDD (ie. supply | ||
voltage) of the LED is driven rather than GND. | ||
|
||
Signed-off-by: Daniel Golle <[email protected]> | ||
Reviewed-by: Andrew Lunn <[email protected]> | ||
Link: https://patch.msgid.link/86a413b4387c42dcb54f587cc2433a06f16aae83.1728558223.git.daniel@makrotopia.org | ||
Signed-off-by: Paolo Abeni <[email protected]> | ||
--- | ||
drivers/net/phy/aquantia/aquantia.h | 1 + | ||
drivers/net/phy/aquantia/aquantia_leds.c | 19 ++++++++++++++----- | ||
drivers/net/phy/aquantia/aquantia_main.c | 12 +++++++++--- | ||
3 files changed, 24 insertions(+), 8 deletions(-) | ||
|
||
--- a/drivers/net/phy/aquantia/aquantia.h | ||
+++ b/drivers/net/phy/aquantia/aquantia.h | ||
@@ -169,6 +169,7 @@ static const struct aqr107_hw_stat aqr10 | ||
struct aqr107_priv { | ||
u64 sgmii_stats[AQR107_SGMII_STAT_SZ]; | ||
unsigned long leds_active_low; | ||
+ unsigned long leds_active_high; | ||
}; | ||
|
||
#if IS_REACHABLE(CONFIG_HWMON) | ||
--- a/drivers/net/phy/aquantia/aquantia_leds.c | ||
+++ b/drivers/net/phy/aquantia/aquantia_leds.c | ||
@@ -121,13 +121,13 @@ int aqr_phy_led_active_low_set(struct ph | ||
{ | ||
return phy_modify_mmd(phydev, MDIO_MMD_VEND1, AQR_LED_DRIVE(index), | ||
VEND1_GLOBAL_LED_DRIVE_VDD, | ||
- enable ? VEND1_GLOBAL_LED_DRIVE_VDD : 0); | ||
+ enable ? 0 : VEND1_GLOBAL_LED_DRIVE_VDD); | ||
} | ||
|
||
int aqr_phy_led_polarity_set(struct phy_device *phydev, int index, unsigned long modes) | ||
{ | ||
+ bool force_active_low = false, force_active_high = false; | ||
struct aqr107_priv *priv = phydev->priv; | ||
- bool active_low = false; | ||
u32 mode; | ||
|
||
if (index >= AQR_MAX_LEDS) | ||
@@ -136,7 +136,10 @@ int aqr_phy_led_polarity_set(struct phy_ | ||
for_each_set_bit(mode, &modes, __PHY_LED_MODES_NUM) { | ||
switch (mode) { | ||
case PHY_LED_ACTIVE_LOW: | ||
- active_low = true; | ||
+ force_active_low = true; | ||
+ break; | ||
+ case PHY_LED_ACTIVE_HIGH: | ||
+ force_active_high = true; | ||
break; | ||
default: | ||
return -EINVAL; | ||
@@ -144,8 +147,14 @@ int aqr_phy_led_polarity_set(struct phy_ | ||
} | ||
|
||
/* Save LED driver vdd state to restore on SW reset */ | ||
- if (active_low) | ||
+ if (force_active_low) | ||
priv->leds_active_low |= BIT(index); | ||
|
||
- return aqr_phy_led_active_low_set(phydev, index, active_low); | ||
+ if (force_active_high) | ||
+ priv->leds_active_high |= BIT(index); | ||
+ | ||
+ if (force_active_high || force_active_low) | ||
+ return aqr_phy_led_active_low_set(phydev, index, force_active_low); | ||
+ | ||
+ unreachable(); | ||
} | ||
--- a/drivers/net/phy/aquantia/aquantia_main.c | ||
+++ b/drivers/net/phy/aquantia/aquantia_main.c | ||
@@ -529,7 +529,7 @@ static int aqr107_config_mdi(struct phy_ | ||
static int aqr107_config_init(struct phy_device *phydev) | ||
{ | ||
struct aqr107_priv *priv = phydev->priv; | ||
- u32 led_active_low; | ||
+ u32 led_idx; | ||
int ret; | ||
|
||
/* Check that the PHY interface type is compatible */ | ||
@@ -569,8 +569,14 @@ static int aqr107_config_init(struct phy | ||
return ret; | ||
|
||
/* Restore LED polarity state after reset */ | ||
- for_each_set_bit(led_active_low, &priv->leds_active_low, AQR_MAX_LEDS) { | ||
- ret = aqr_phy_led_active_low_set(phydev, led_active_low, true); | ||
+ for_each_set_bit(led_idx, &priv->leds_active_low, AQR_MAX_LEDS) { | ||
+ ret = aqr_phy_led_active_low_set(phydev, led_idx, true); | ||
+ if (ret) | ||
+ return ret; | ||
+ } | ||
+ | ||
+ for_each_set_bit(led_idx, &priv->leds_active_high, AQR_MAX_LEDS) { | ||
+ ret = aqr_phy_led_active_low_set(phydev, led_idx, false); | ||
if (ret) | ||
return ret; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -23,7 +23,7 @@ Signed-off-by: Gabor Juhos <[email protected]> | |
sysfs_remove_link(&dev->dev.kobj, "phydev"); | ||
--- a/include/linux/phy.h | ||
+++ b/include/linux/phy.h | ||
@@ -979,6 +979,12 @@ struct phy_driver { | ||
@@ -980,6 +980,12 @@ struct phy_driver { | ||
/** @handle_interrupt: Override default interrupt handling */ | ||
irqreturn_t (*handle_interrupt)(struct phy_device *phydev); | ||
|
||
|