Skip to content

Commit 91acadc

Browse files
Ansueldavem330
authored andcommitted
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]>
1 parent 1e264f9 commit 91acadc

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed

drivers/net/dsa/qca/qca8k-leds.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,43 @@ qca8k_led_brightness_get(struct qca8k_led *led)
127127
return val == QCA8K_LED_ALWAYS_ON;
128128
}
129129

130+
static int
131+
qca8k_cled_blink_set(struct led_classdev *ldev,
132+
unsigned long *delay_on,
133+
unsigned long *delay_off)
134+
{
135+
struct qca8k_led *led = container_of(ldev, struct qca8k_led, cdev);
136+
u32 mask, val = QCA8K_LED_ALWAYS_BLINK_4HZ;
137+
struct qca8k_led_pattern_en reg_info;
138+
struct qca8k_priv *priv = led->priv;
139+
140+
if (*delay_on == 0 && *delay_off == 0) {
141+
*delay_on = 125;
142+
*delay_off = 125;
143+
}
144+
145+
if (*delay_on != 125 || *delay_off != 125) {
146+
/* The hardware only supports blinking at 4Hz. Fall back
147+
* to software implementation in other cases.
148+
*/
149+
return -EINVAL;
150+
}
151+
152+
qca8k_get_enable_led_reg(led->port_num, led->led_num, &reg_info);
153+
154+
if (led->port_num == 0 || led->port_num == 4) {
155+
mask = QCA8K_LED_PATTERN_EN_MASK;
156+
val <<= QCA8K_LED_PATTERN_EN_SHIFT;
157+
} else {
158+
mask = QCA8K_LED_PHY123_PATTERN_EN_MASK;
159+
}
160+
161+
regmap_update_bits(priv->regmap, reg_info.reg, mask << reg_info.shift,
162+
val << reg_info.shift);
163+
164+
return 0;
165+
}
166+
130167
static int
131168
qca8k_parse_port_leds(struct qca8k_priv *priv, struct fwnode_handle *port, int port_num)
132169
{
@@ -186,6 +223,7 @@ qca8k_parse_port_leds(struct qca8k_priv *priv, struct fwnode_handle *port, int p
186223

187224
port_led->cdev.max_brightness = 1;
188225
port_led->cdev.brightness_set_blocking = qca8k_cled_brightness_set_blocking;
226+
port_led->cdev.blink_set = qca8k_cled_blink_set;
189227
init_data.default_label = ":port";
190228
init_data.fwnode = led;
191229
init_data.devname_mandatory = true;

0 commit comments

Comments
 (0)