The MT7530/MT7531 reset pin is active-low in hardware, but the driver historically hardcoded a high-active reset sequence by toggling the GPIO as 0 → 1. This only worked because several DTS files incorrectly marked the reset GPIO as active-high, making both DTS and driver wrong in the same way. This patch changes the driver to respect the GPIO polarity using gpiod_is_active_low(), and generates the reset sequence as: assert = drive logical active level deassert = drive logical inactive level As a result, both cases now correctly produce the required high → low → high transition on the actual reset pin. Compatibility ------------- This change makes the driver fully backward-compatible with older, incorrect DTS files that marked the reset line as GPIO_ACTIVE_HIGH: * Old DTS marked active-high: is_active_low = 0 driver drives 0 → 1 actual levels: high → low → high (correct) * New DTS marked active-low: is_active_low = 1 driver drives 1 → 0 actual levels: high → low → high (correct) Therefore, regardless of whether a DTS is old or new, correct or incorrect, the driver now generates the correct electrical reset pulse. Going forward, DTS files should use GPIO_ACTIVE_LOW to match the hardware, but no regressions will occur with older DTS blobs. Signed-off-by: Chen Minqiang --- drivers/net/dsa/mt7530.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c index 548b85befbf4..615e9a5709ca 100644 --- a/drivers/net/dsa/mt7530.c +++ b/drivers/net/dsa/mt7530.c @@ -2405,9 +2405,10 @@ mt7530_setup(struct dsa_switch *ds) usleep_range(5000, 5100); reset_control_deassert(priv->rstc); } else { - gpiod_set_value_cansleep(priv->reset, 0); + int is_active_low = !!gpiod_is_active_low(priv->reset); + gpiod_set_value_cansleep(priv->reset, is_active_low); usleep_range(5000, 5100); - gpiod_set_value_cansleep(priv->reset, 1); + gpiod_set_value_cansleep(priv->reset, !is_active_low); } /* Waiting for MT7530 got to stable */ @@ -2643,9 +2644,10 @@ mt7531_setup(struct dsa_switch *ds) usleep_range(5000, 5100); reset_control_deassert(priv->rstc); } else { - gpiod_set_value_cansleep(priv->reset, 0); + int is_active_low = !!gpiod_is_active_low(priv->reset); + gpiod_set_value_cansleep(priv->reset, is_active_low); usleep_range(5000, 5100); - gpiod_set_value_cansleep(priv->reset, 1); + gpiod_set_value_cansleep(priv->reset, !is_active_low); } /* Waiting for MT7530 got to stable */ -- 2.17.1