mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-27 01:11:14 +00:00
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;
|