From 20a7945b82a4aefcb9ca0a14978412e4ae0057c9 Mon Sep 17 00:00:00 2001
From: Robert Marko <robimarko@gmail.com>
Date: Tue, 11 Jan 2022 00:28:42 +0100
Subject: [PATCH 07/11] qca807x: add a LED quirk for Xiaomi AX9000

Xiaomi AX9000 has a single LED for each of 4 gigabit ethernet ports that
are connected to QCA8075, and that LED is connected to the 100M LED pin.

So, by default it will only work when in 10 or 100Mbit mode, this is quite
annoying and makes no sense(If they have connected it to the 1000Mbit LED
pin then it would have worked for 10/100 by default as well).

So, to solve this add a check for system compatible as we cant parse if
from DTS in any other way and set the 100M LED to blink on 1000Base-T
as well.

Signed-off-by: Robert Marko <robimarko@gmail.com>
---
 include/hsl/phy/malibu_phy.h |  2 ++
 src/hsl/phy/malibu_phy.c     | 11 +++++++++++
 2 files changed, 13 insertions(+)

--- a/include/hsl/phy/malibu_phy.h
+++ b/include/hsl/phy/malibu_phy.h
@@ -94,6 +94,7 @@ extern "C"
 #define MALIBU_DAC_CTRL_MASK  0x380
 #define MALIBU_DAC_CTRL_VALUE  0x280
 #define MALIBU_LED_1000_CTRL1_100_10_MASK  0x30
+#define MALIBU_LED_100_CTRL1_1000_MASK  0x40
 
 #define MALIBU_PHY_EEE_ADV_100M 0x0002
 #define MALIBU_PHY_EEE_ADV_1000M 0x0004
@@ -118,6 +119,7 @@ extern "C"
 #define MALIBU_PHY_MMD7_EGRESS_COUNTER_HIGH       0x802d
 #define MALIBU_PHY_MMD7_EGRESS_COUNTER_LOW       0x802e
 #define MALIBU_PHY_MMD7_EGRESS_ERROR_COUNTER       0x802f
+#define MALIBU_PHY_MMD7_LED_100_CTRL1       0x8074
 #define MALIBU_PHY_MMD7_LED_1000_CTRL1       0x8076
 
 
--- a/src/hsl/phy/malibu_phy.c
+++ b/src/hsl/phy/malibu_phy.c
@@ -15,6 +15,8 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#include <linux/of.h>
+
 #include "sw.h"
 #include "fal_port_ctrl.h"
 #include "hsl_api.h"
@@ -2708,6 +2710,15 @@ malibu_phy_hw_init(a_uint32_t dev_id, a_
 			led_status |= MALIBU_LED_1000_CTRL1_100_10_MASK;
 			malibu_phy_mmd_write(dev_id, phy_addr, MALIBU_PHY_MMD7_NUM,
 				MALIBU_PHY_MMD7_LED_1000_CTRL1, led_status);
+			if (of_machine_is_compatible("xiaomi,ax9000")) {
+				/* add 1000M link LED behavior for Xiaomi AX9000 */
+				led_status = malibu_phy_mmd_read(dev_id, phy_addr, MALIBU_PHY_MMD7_NUM,
+					MALIBU_PHY_MMD7_LED_100_CTRL1);
+				led_status &= ~MALIBU_LED_100_CTRL1_1000_MASK;
+				led_status |= MALIBU_LED_100_CTRL1_1000_MASK;
+				malibu_phy_mmd_write(dev_id, phy_addr, MALIBU_PHY_MMD7_NUM,
+					MALIBU_PHY_MMD7_LED_100_CTRL1, led_status);
+			}
 			/*disable Extended next page*/
 			phy_data = malibu_phy_reg_read(dev_id, phy_addr, MALIBU_AUTONEG_ADVERT);
 			phy_data &= ~MALIBU_EXTENDED_NEXT_PAGE_EN;
