123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- From 47b930d0dd437af927145dba50a2e2ea1ba97c67 Mon Sep 17 00:00:00 2001
- From: Christian Marangi <[email protected]>
- 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 <[email protected]>
- Signed-off-by: David S. Miller <[email protected]>
- ---
- 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);
|