mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-28 17:48:58 +00:00
173 lines
5.7 KiB
Diff
173 lines
5.7 KiB
Diff
|
From 47b930d0dd437af927145dba50a2e2ea1ba97c67 Mon Sep 17 00:00:00 2001
|
||
|
From: Christian Marangi <ansuelsmth@gmail.com>
|
||
|
Date: Tue, 6 Feb 2024 18:31:12 +0100
|
||
|
Subject: [PATCH 09/10] net: phy: qcom: generalize some qca808x LED functions
|
||
|
|
||
|
Generalize some qca808x LED functions in preparation for qca807x LED
|
||
|
support.
|
||
|
|
||
|
The LED implementation of qca808x and qca807x is the same but qca807x
|
||
|
supports also Fiber port and have different hw control bits for Fiber
|
||
|
port. To limit code duplication introduce micro functions that takes reg
|
||
|
instead of LED index to tweak all the supported LED modes.
|
||
|
|
||
|
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||
|
---
|
||
|
drivers/net/phy/qcom/qca808x.c | 38 +++-----------------
|
||
|
drivers/net/phy/qcom/qcom-phy-lib.c | 54 +++++++++++++++++++++++++++++
|
||
|
drivers/net/phy/qcom/qcom.h | 7 ++++
|
||
|
3 files changed, 65 insertions(+), 34 deletions(-)
|
||
|
|
||
|
--- a/drivers/net/phy/qcom/qca808x.c
|
||
|
+++ b/drivers/net/phy/qcom/qca808x.c
|
||
|
@@ -437,9 +437,7 @@ static int qca808x_led_hw_control_enable
|
||
|
return -EINVAL;
|
||
|
|
||
|
reg = QCA808X_MMD7_LED_FORCE_CTRL(index);
|
||
|
-
|
||
|
- return phy_clear_bits_mmd(phydev, MDIO_MMD_AN, reg,
|
||
|
- QCA808X_LED_FORCE_EN);
|
||
|
+ return qca808x_led_reg_hw_control_enable(phydev, reg);
|
||
|
}
|
||
|
|
||
|
static int qca808x_led_hw_is_supported(struct phy_device *phydev, u8 index,
|
||
|
@@ -480,16 +478,12 @@ static int qca808x_led_hw_control_set(st
|
||
|
static bool qca808x_led_hw_control_status(struct phy_device *phydev, u8 index)
|
||
|
{
|
||
|
u16 reg;
|
||
|
- int val;
|
||
|
|
||
|
if (index > 2)
|
||
|
return false;
|
||
|
|
||
|
reg = QCA808X_MMD7_LED_FORCE_CTRL(index);
|
||
|
-
|
||
|
- val = phy_read_mmd(phydev, MDIO_MMD_AN, reg);
|
||
|
-
|
||
|
- return !(val & QCA808X_LED_FORCE_EN);
|
||
|
+ return qca808x_led_reg_hw_control_status(phydev, reg);
|
||
|
}
|
||
|
|
||
|
static int qca808x_led_hw_control_get(struct phy_device *phydev, u8 index,
|
||
|
@@ -557,44 +551,20 @@ static int qca808x_led_brightness_set(st
|
||
|
}
|
||
|
|
||
|
reg = QCA808X_MMD7_LED_FORCE_CTRL(index);
|
||
|
-
|
||
|
- return phy_modify_mmd(phydev, MDIO_MMD_AN, reg,
|
||
|
- QCA808X_LED_FORCE_EN | QCA808X_LED_FORCE_MODE_MASK,
|
||
|
- QCA808X_LED_FORCE_EN | (value ? QCA808X_LED_FORCE_ON :
|
||
|
- QCA808X_LED_FORCE_OFF));
|
||
|
+ return qca808x_led_reg_brightness_set(phydev, reg, value);
|
||
|
}
|
||
|
|
||
|
static int qca808x_led_blink_set(struct phy_device *phydev, u8 index,
|
||
|
unsigned long *delay_on,
|
||
|
unsigned long *delay_off)
|
||
|
{
|
||
|
- int ret;
|
||
|
u16 reg;
|
||
|
|
||
|
if (index > 2)
|
||
|
return -EINVAL;
|
||
|
|
||
|
reg = QCA808X_MMD7_LED_FORCE_CTRL(index);
|
||
|
-
|
||
|
- /* Set blink to 50% off, 50% on at 4Hz by default */
|
||
|
- ret = phy_modify_mmd(phydev, MDIO_MMD_AN, QCA808X_MMD7_LED_GLOBAL,
|
||
|
- QCA808X_LED_BLINK_FREQ_MASK | QCA808X_LED_BLINK_DUTY_MASK,
|
||
|
- QCA808X_LED_BLINK_FREQ_4HZ | QCA808X_LED_BLINK_DUTY_50_50);
|
||
|
- if (ret)
|
||
|
- return ret;
|
||
|
-
|
||
|
- /* We use BLINK_1 for normal blinking */
|
||
|
- ret = phy_modify_mmd(phydev, MDIO_MMD_AN, reg,
|
||
|
- QCA808X_LED_FORCE_EN | QCA808X_LED_FORCE_MODE_MASK,
|
||
|
- QCA808X_LED_FORCE_EN | QCA808X_LED_FORCE_BLINK_1);
|
||
|
- if (ret)
|
||
|
- return ret;
|
||
|
-
|
||
|
- /* We set blink to 4Hz, aka 250ms */
|
||
|
- *delay_on = 250 / 2;
|
||
|
- *delay_off = 250 / 2;
|
||
|
-
|
||
|
- return 0;
|
||
|
+ return qca808x_led_reg_blink_set(phydev, reg, delay_on, delay_off);
|
||
|
}
|
||
|
|
||
|
static int qca808x_led_polarity_set(struct phy_device *phydev, int index,
|
||
|
--- a/drivers/net/phy/qcom/qcom-phy-lib.c
|
||
|
+++ b/drivers/net/phy/qcom/qcom-phy-lib.c
|
||
|
@@ -620,3 +620,57 @@ int qca808x_cable_test_get_status(struct
|
||
|
return 0;
|
||
|
}
|
||
|
EXPORT_SYMBOL_GPL(qca808x_cable_test_get_status);
|
||
|
+
|
||
|
+int qca808x_led_reg_hw_control_enable(struct phy_device *phydev, u16 reg)
|
||
|
+{
|
||
|
+ return phy_clear_bits_mmd(phydev, MDIO_MMD_AN, reg,
|
||
|
+ QCA808X_LED_FORCE_EN);
|
||
|
+}
|
||
|
+EXPORT_SYMBOL_GPL(qca808x_led_reg_hw_control_enable);
|
||
|
+
|
||
|
+bool qca808x_led_reg_hw_control_status(struct phy_device *phydev, u16 reg)
|
||
|
+{
|
||
|
+ int val;
|
||
|
+
|
||
|
+ val = phy_read_mmd(phydev, MDIO_MMD_AN, reg);
|
||
|
+ return !(val & QCA808X_LED_FORCE_EN);
|
||
|
+}
|
||
|
+EXPORT_SYMBOL_GPL(qca808x_led_reg_hw_control_status);
|
||
|
+
|
||
|
+int qca808x_led_reg_brightness_set(struct phy_device *phydev,
|
||
|
+ u16 reg, enum led_brightness value)
|
||
|
+{
|
||
|
+ return phy_modify_mmd(phydev, MDIO_MMD_AN, reg,
|
||
|
+ QCA808X_LED_FORCE_EN | QCA808X_LED_FORCE_MODE_MASK,
|
||
|
+ QCA808X_LED_FORCE_EN | (value ? QCA808X_LED_FORCE_ON :
|
||
|
+ QCA808X_LED_FORCE_OFF));
|
||
|
+}
|
||
|
+EXPORT_SYMBOL_GPL(qca808x_led_reg_brightness_set);
|
||
|
+
|
||
|
+int qca808x_led_reg_blink_set(struct phy_device *phydev, u16 reg,
|
||
|
+ unsigned long *delay_on,
|
||
|
+ unsigned long *delay_off)
|
||
|
+{
|
||
|
+ int ret;
|
||
|
+
|
||
|
+ /* Set blink to 50% off, 50% on at 4Hz by default */
|
||
|
+ ret = phy_modify_mmd(phydev, MDIO_MMD_AN, QCA808X_MMD7_LED_GLOBAL,
|
||
|
+ QCA808X_LED_BLINK_FREQ_MASK | QCA808X_LED_BLINK_DUTY_MASK,
|
||
|
+ QCA808X_LED_BLINK_FREQ_4HZ | QCA808X_LED_BLINK_DUTY_50_50);
|
||
|
+ if (ret)
|
||
|
+ return ret;
|
||
|
+
|
||
|
+ /* We use BLINK_1 for normal blinking */
|
||
|
+ ret = phy_modify_mmd(phydev, MDIO_MMD_AN, reg,
|
||
|
+ QCA808X_LED_FORCE_EN | QCA808X_LED_FORCE_MODE_MASK,
|
||
|
+ QCA808X_LED_FORCE_EN | QCA808X_LED_FORCE_BLINK_1);
|
||
|
+ if (ret)
|
||
|
+ return ret;
|
||
|
+
|
||
|
+ /* We set blink to 4Hz, aka 250ms */
|
||
|
+ *delay_on = 250 / 2;
|
||
|
+ *delay_off = 250 / 2;
|
||
|
+
|
||
|
+ return 0;
|
||
|
+}
|
||
|
+EXPORT_SYMBOL_GPL(qca808x_led_reg_blink_set);
|
||
|
--- a/drivers/net/phy/qcom/qcom.h
|
||
|
+++ b/drivers/net/phy/qcom/qcom.h
|
||
|
@@ -234,3 +234,10 @@ int at803x_cdt_start(struct phy_device *
|
||
|
int at803x_cdt_wait_for_completion(struct phy_device *phydev,
|
||
|
u32 cdt_en);
|
||
|
int qca808x_cable_test_get_status(struct phy_device *phydev, bool *finished);
|
||
|
+int qca808x_led_reg_hw_control_enable(struct phy_device *phydev, u16 reg);
|
||
|
+bool qca808x_led_reg_hw_control_status(struct phy_device *phydev, u16 reg);
|
||
|
+int qca808x_led_reg_brightness_set(struct phy_device *phydev,
|
||
|
+ u16 reg, enum led_brightness value);
|
||
|
+int qca808x_led_reg_blink_set(struct phy_device *phydev, u16 reg,
|
||
|
+ unsigned long *delay_on,
|
||
|
+ unsigned long *delay_off);
|