forked from Openwrt/openwrt
0a4b309f41
Backport initial LEDs hw control support. Currently this is limited to only rx/tx and link events for the netdev trigger but the API got accepted and the additional modes are working on and will be backported later. Refresh every patch and add the additional config flag for QCA8K new LEDs support. Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
71 lines
2.3 KiB
Diff
71 lines
2.3 KiB
Diff
From 4f53c27f772e27e4cf4e5507d6f4d5980002cb6a Mon Sep 17 00:00:00 2001
|
|
From: Andrew Lunn <andrew@lunn.ch>
|
|
Date: Mon, 29 May 2023 18:32:43 +0200
|
|
Subject: [PATCH 13/13] net: dsa: qca8k: add op to get ports netdev
|
|
|
|
In order that the LED trigger can blink the switch MAC ports LED, it
|
|
needs to know the netdev associated to the port. Add the callback to
|
|
return the struct device of the netdev.
|
|
|
|
Add an helper function qca8k_phy_to_port() to convert the phy back to
|
|
dsa_port index, as we reference LED port based on the internal PHY
|
|
index and needs to be converted back.
|
|
|
|
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
|
|
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
---
|
|
drivers/net/dsa/qca/qca8k-leds.c | 27 +++++++++++++++++++++++++++
|
|
1 file changed, 27 insertions(+)
|
|
|
|
--- a/drivers/net/dsa/qca/qca8k-leds.c
|
|
+++ b/drivers/net/dsa/qca/qca8k-leds.c
|
|
@@ -5,6 +5,18 @@
|
|
#include "qca8k.h"
|
|
#include "qca8k_leds.h"
|
|
|
|
+static u32 qca8k_phy_to_port(int phy)
|
|
+{
|
|
+ /* Internal PHY 0 has port at index 1.
|
|
+ * Internal PHY 1 has port at index 2.
|
|
+ * Internal PHY 2 has port at index 3.
|
|
+ * Internal PHY 3 has port at index 4.
|
|
+ * Internal PHY 4 has port at index 5.
|
|
+ */
|
|
+
|
|
+ return phy + 1;
|
|
+}
|
|
+
|
|
static int
|
|
qca8k_get_enable_led_reg(int port_num, int led_num, struct qca8k_led_pattern_en *reg_info)
|
|
{
|
|
@@ -314,6 +326,20 @@ qca8k_cled_hw_control_get(struct led_cla
|
|
return 0;
|
|
}
|
|
|
|
+static struct device *qca8k_cled_hw_control_get_device(struct led_classdev *ldev)
|
|
+{
|
|
+ struct qca8k_led *led = container_of(ldev, struct qca8k_led, cdev);
|
|
+ struct qca8k_priv *priv = led->priv;
|
|
+ struct dsa_port *dp;
|
|
+
|
|
+ dp = dsa_to_port(priv->ds, qca8k_phy_to_port(led->port_num));
|
|
+ if (!dp)
|
|
+ return NULL;
|
|
+ if (dp->slave)
|
|
+ return &dp->slave->dev;
|
|
+ return NULL;
|
|
+}
|
|
+
|
|
static int
|
|
qca8k_parse_port_leds(struct qca8k_priv *priv, struct fwnode_handle *port, int port_num)
|
|
{
|
|
@@ -377,6 +403,7 @@ qca8k_parse_port_leds(struct qca8k_priv
|
|
port_led->cdev.hw_control_is_supported = qca8k_cled_hw_control_is_supported;
|
|
port_led->cdev.hw_control_set = qca8k_cled_hw_control_set;
|
|
port_led->cdev.hw_control_get = qca8k_cled_hw_control_get;
|
|
+ port_led->cdev.hw_control_get_device = qca8k_cled_hw_control_get_device;
|
|
port_led->cdev.hw_control_trigger = "netdev";
|
|
init_data.default_label = ":port";
|
|
init_data.fwnode = led;
|