1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- From 91acadcc6e599dfc62717abcdad58a459cfb1684 Mon Sep 17 00:00:00 2001
- From: Christian Marangi <[email protected]>
- 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 <[email protected]>
- Reviewed-by: Andrew Lunn <[email protected]>
- Acked-by: Pavel Machek <[email protected]>
- Reviewed-by: Florian Fainelli <[email protected]>
- Signed-off-by: David S. Miller <[email protected]>
- ---
- 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;
|