mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-30 18:47:06 +00:00
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;
|