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>
75 lines
2.3 KiB
Diff
75 lines
2.3 KiB
Diff
From 91acadcc6e599dfc62717abcdad58a459cfb1684 Mon Sep 17 00:00:00 2001
|
|
From: Christian Marangi <ansuelsmth@gmail.com>
|
|
Date: Mon, 17 Apr 2023 17:17:25 +0200
|
|
Subject: [PATCH 3/9] net: dsa: qca8k: add LEDs blink_set() support
|
|
|
|
Add LEDs blink_set() support to qca8k Switch Family.
|
|
These LEDs support hw accellerated blinking at a fixed rate
|
|
of 4Hz.
|
|
|
|
Reject any other value since not supported by the LEDs switch.
|
|
|
|
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
|
|
Acked-by: Pavel Machek <pavel@ucw.cz>
|
|
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
---
|
|
drivers/net/dsa/qca/qca8k-leds.c | 38 ++++++++++++++++++++++++++++++++
|
|
1 file changed, 38 insertions(+)
|
|
|
|
--- a/drivers/net/dsa/qca/qca8k-leds.c
|
|
+++ b/drivers/net/dsa/qca/qca8k-leds.c
|
|
@@ -128,6 +128,43 @@ qca8k_led_brightness_get(struct qca8k_le
|
|
}
|
|
|
|
static int
|
|
+qca8k_cled_blink_set(struct led_classdev *ldev,
|
|
+ unsigned long *delay_on,
|
|
+ unsigned long *delay_off)
|
|
+{
|
|
+ struct qca8k_led *led = container_of(ldev, struct qca8k_led, cdev);
|
|
+ u32 mask, val = QCA8K_LED_ALWAYS_BLINK_4HZ;
|
|
+ struct qca8k_led_pattern_en reg_info;
|
|
+ struct qca8k_priv *priv = led->priv;
|
|
+
|
|
+ if (*delay_on == 0 && *delay_off == 0) {
|
|
+ *delay_on = 125;
|
|
+ *delay_off = 125;
|
|
+ }
|
|
+
|
|
+ if (*delay_on != 125 || *delay_off != 125) {
|
|
+ /* The hardware only supports blinking at 4Hz. Fall back
|
|
+ * to software implementation in other cases.
|
|
+ */
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
+ qca8k_get_enable_led_reg(led->port_num, led->led_num, ®_info);
|
|
+
|
|
+ if (led->port_num == 0 || led->port_num == 4) {
|
|
+ mask = QCA8K_LED_PATTERN_EN_MASK;
|
|
+ val <<= QCA8K_LED_PATTERN_EN_SHIFT;
|
|
+ } else {
|
|
+ mask = QCA8K_LED_PHY123_PATTERN_EN_MASK;
|
|
+ }
|
|
+
|
|
+ regmap_update_bits(priv->regmap, reg_info.reg, mask << reg_info.shift,
|
|
+ val << reg_info.shift);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int
|
|
qca8k_parse_port_leds(struct qca8k_priv *priv, struct fwnode_handle *port, int port_num)
|
|
{
|
|
struct fwnode_handle *led = NULL, *leds = NULL;
|
|
@@ -186,6 +223,7 @@ qca8k_parse_port_leds(struct qca8k_priv
|
|
|
|
port_led->cdev.max_brightness = 1;
|
|
port_led->cdev.brightness_set_blocking = qca8k_cled_brightness_set_blocking;
|
|
+ port_led->cdev.blink_set = qca8k_cled_blink_set;
|
|
init_data.default_label = ":port";
|
|
init_data.fwnode = led;
|
|
init_data.devname_mandatory = true;
|