lkml.org 
[lkml]   [2023]   [Mar]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[net-next PATCH 02/11] net: dsa: qca8k: add LEDs blink_set() support
    Date
    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>
    ---
    drivers/net/dsa/qca/qca8k-leds.c | 38 ++++++++++++++++++++++++++++++++
    1 file changed, 38 insertions(+)

    diff --git a/drivers/net/dsa/qca/qca8k-leds.c b/drivers/net/dsa/qca/qca8k-leds.c
    index 079f1b423f9a..821ffa1f5b5d 100644
    --- a/drivers/net/dsa/qca/qca8k-leds.c
    +++ b/drivers/net/dsa/qca/qca8k-leds.c
    @@ -98,6 +98,43 @@ qca8k_cled_brightness_get(struct led_classdev *ldev)
    return qca8k_led_brightness_get(led);
    }

    +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, &reg_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)
    {
    @@ -155,6 +192,7 @@ qca8k_parse_port_leds(struct qca8k_priv *priv, struct fwnode_handle *port, int p
    port_led->cdev.max_brightness = 1;
    port_led->cdev.brightness_set_blocking = qca8k_cled_brightness_set_blocking;
    port_led->cdev.brightness_get = qca8k_cled_brightness_get;
    + port_led->cdev.blink_set = qca8k_cled_blink_set;
    init_data.default_label = ":port";
    init_data.devicename = "qca8k";
    init_data.fwnode = led;
    --
    2.39.2
    \
     
     \ /
      Last update: 2023-03-27 00:48    [W:6.799 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site