2
0

815-v6.4-03-net-dsa-qca8k-add-LEDs-blink_set-support.patch 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. From 91acadcc6e599dfc62717abcdad58a459cfb1684 Mon Sep 17 00:00:00 2001
  2. From: Christian Marangi <[email protected]>
  3. Date: Mon, 17 Apr 2023 17:17:25 +0200
  4. Subject: [PATCH 3/9] net: dsa: qca8k: add LEDs blink_set() support
  5. Add LEDs blink_set() support to qca8k Switch Family.
  6. These LEDs support hw accellerated blinking at a fixed rate
  7. of 4Hz.
  8. Reject any other value since not supported by the LEDs switch.
  9. Signed-off-by: Christian Marangi <[email protected]>
  10. Reviewed-by: Andrew Lunn <[email protected]>
  11. Acked-by: Pavel Machek <[email protected]>
  12. Reviewed-by: Florian Fainelli <[email protected]>
  13. Signed-off-by: David S. Miller <[email protected]>
  14. ---
  15. drivers/net/dsa/qca/qca8k-leds.c | 38 ++++++++++++++++++++++++++++++++
  16. 1 file changed, 38 insertions(+)
  17. --- a/drivers/net/dsa/qca/qca8k-leds.c
  18. +++ b/drivers/net/dsa/qca/qca8k-leds.c
  19. @@ -128,6 +128,43 @@ qca8k_led_brightness_get(struct qca8k_le
  20. }
  21. static int
  22. +qca8k_cled_blink_set(struct led_classdev *ldev,
  23. + unsigned long *delay_on,
  24. + unsigned long *delay_off)
  25. +{
  26. + struct qca8k_led *led = container_of(ldev, struct qca8k_led, cdev);
  27. + u32 mask, val = QCA8K_LED_ALWAYS_BLINK_4HZ;
  28. + struct qca8k_led_pattern_en reg_info;
  29. + struct qca8k_priv *priv = led->priv;
  30. +
  31. + if (*delay_on == 0 && *delay_off == 0) {
  32. + *delay_on = 125;
  33. + *delay_off = 125;
  34. + }
  35. +
  36. + if (*delay_on != 125 || *delay_off != 125) {
  37. + /* The hardware only supports blinking at 4Hz. Fall back
  38. + * to software implementation in other cases.
  39. + */
  40. + return -EINVAL;
  41. + }
  42. +
  43. + qca8k_get_enable_led_reg(led->port_num, led->led_num, &reg_info);
  44. +
  45. + if (led->port_num == 0 || led->port_num == 4) {
  46. + mask = QCA8K_LED_PATTERN_EN_MASK;
  47. + val <<= QCA8K_LED_PATTERN_EN_SHIFT;
  48. + } else {
  49. + mask = QCA8K_LED_PHY123_PATTERN_EN_MASK;
  50. + }
  51. +
  52. + regmap_update_bits(priv->regmap, reg_info.reg, mask << reg_info.shift,
  53. + val << reg_info.shift);
  54. +
  55. + return 0;
  56. +}
  57. +
  58. +static int
  59. qca8k_parse_port_leds(struct qca8k_priv *priv, struct fwnode_handle *port, int port_num)
  60. {
  61. struct fwnode_handle *led = NULL, *leds = NULL;
  62. @@ -186,6 +223,7 @@ qca8k_parse_port_leds(struct qca8k_priv
  63. port_led->cdev.max_brightness = 1;
  64. port_led->cdev.brightness_set_blocking = qca8k_cled_brightness_set_blocking;
  65. + port_led->cdev.blink_set = qca8k_cled_blink_set;
  66. init_data.default_label = ":port";
  67. init_data.fwnode = led;
  68. init_data.devname_mandatory = true;