mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-03 14:34:27 -05:00 
			
		
		
		
	Backport QCA807x PHY patches merged upstream that introduce the new concept of PHY package. Also add in generic config the new Kconfig CONFIG_QCA807X_PHY. All affected patch automatically refreshed with make target/linux/refresh. Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
		
			
				
	
	
		
			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);
 |