Lines Matching +full:led +full:- +full:0
1 // SPDX-License-Identifier: GPL-2.0-or-later
10 /* Offset 0x16: LED control */
29 *val &= 0x3ff; in mv88e6xxx_port_led_read()
34 static int mv88e6xxx_led_brightness_set(struct mv88e6xxx_port *p, int led, in mv88e6xxx_led_brightness_set() argument
40 err = mv88e6xxx_port_led_read(p->chip, p->port, in mv88e6xxx_led_brightness_set()
46 if (led == 1) in mv88e6xxx_led_brightness_set()
52 /* Selector 0x0f == Force LED ON */ in mv88e6xxx_led_brightness_set()
53 if (led == 1) in mv88e6xxx_led_brightness_set()
58 /* Selector 0x0e == Force LED OFF */ in mv88e6xxx_led_brightness_set()
59 if (led == 1) in mv88e6xxx_led_brightness_set()
67 return mv88e6xxx_port_led_write(p->chip, p->port, reg); in mv88e6xxx_led_brightness_set()
76 mv88e6xxx_reg_lock(p->chip); in mv88e6xxx_led0_brightness_set_blocking()
77 err = mv88e6xxx_led_brightness_set(p, 0, brightness); in mv88e6xxx_led0_brightness_set_blocking()
78 mv88e6xxx_reg_unlock(p->chip); in mv88e6xxx_led0_brightness_set_blocking()
89 mv88e6xxx_reg_lock(p->chip); in mv88e6xxx_led1_brightness_set_blocking()
91 mv88e6xxx_reg_unlock(p->chip); in mv88e6xxx_led1_brightness_set_blocking()
97 int led; member
106 * certain LED given restrictions such as that some rules only work with fiber
109 #define MV88E6XXX_PORTS_0_3 (BIT(0) | BIT(1) | BIT(2) | BIT(3))
117 * different tables per-family here.
121 .led = 0,
128 .led = 1,
135 .led = 0,
142 .led = 1,
149 .led = 0,
157 .led = 1,
165 .led = 0,
172 .led = 1,
179 .led = 0,
187 .led = 1,
195 .led = 0,
202 .led = 1,
208 .led = 1,
215 .led = 1,
222 .led = 1,
228 .led = 0,
235 .led = 1,
242 .led = 0,
249 .led = 1,
256 .led = 0,
263 .led = 1,
269 .led = 0,
275 .led = 1,
282 .led = 0,
289 .led = 0,
295 .led = 1,
301 .led = 0,
308 .led = 1,
315 .led = 0,
321 .led = 1,
329 /* mv88e6xxx_led_match_selector() - look up the appropriate LED mode selector
331 * @led: LED number, 0 or 1
332 * @blink_activity: blink the LED (usually blink on indicated activity)
334 * @rules: LED status flags from the LED classdev core
337 static int mv88e6xxx_led_match_selector(struct mv88e6xxx_port *p, int led, bool blink_activity, in mv88e6xxx_led_match_selector() argument
343 /* No rules means we turn the LED off */ in mv88e6xxx_led_match_selector()
345 if (led == 1) in mv88e6xxx_led_match_selector()
349 return 0; in mv88e6xxx_led_match_selector()
356 for (i = 0; i < ARRAY_SIZE(mv88e6352_led_hwconfigs); i++) { in mv88e6xxx_led_match_selector()
359 if (conf->led != led) in mv88e6xxx_led_match_selector()
362 if (!(conf->portmask & BIT(p->port))) in mv88e6xxx_led_match_selector()
365 if (conf->blink_activity != blink_activity) in mv88e6xxx_led_match_selector()
368 if (conf->fiber != fiber) in mv88e6xxx_led_match_selector()
371 if (conf->rules == rules) { in mv88e6xxx_led_match_selector()
372 dev_dbg(p->chip->dev, "port%d LED %d set selector %04x for rules %08lx\n", in mv88e6xxx_led_match_selector()
373 p->port, led, conf->selector, rules); in mv88e6xxx_led_match_selector()
374 *selector |= conf->selector; in mv88e6xxx_led_match_selector()
375 return 0; in mv88e6xxx_led_match_selector()
379 return -EOPNOTSUPP; in mv88e6xxx_led_match_selector()
382 /* mv88e6xxx_led_match_selector() - find Linux netdev rules from a selector value
384 * @selector: the selector value from the LED actity register
385 * @led: LED number, 0 or 1
389 mv88e6xxx_led_match_rule(struct mv88e6xxx_port *p, u16 selector, int led, unsigned long *rules) in mv88e6xxx_led_match_rule() argument
396 * or is fiber-only. in mv88e6xxx_led_match_rule()
398 for (i = 0; i < ARRAY_SIZE(mv88e6352_led_hwconfigs); i++) { in mv88e6xxx_led_match_rule()
401 if (conf->led != led) in mv88e6xxx_led_match_rule()
404 if (!(conf->portmask & BIT(p->port))) in mv88e6xxx_led_match_rule()
407 if (conf->selector == selector) { in mv88e6xxx_led_match_rule()
408 dev_dbg(p->chip->dev, "port%d LED %d has selector %04x, rules %08lx\n", in mv88e6xxx_led_match_rule()
409 p->port, led, selector, conf->rules); in mv88e6xxx_led_match_rule()
410 *rules = conf->rules; in mv88e6xxx_led_match_rule()
411 return 0; in mv88e6xxx_led_match_rule()
415 return -EINVAL; in mv88e6xxx_led_match_rule()
418 /* mv88e6xxx_led_get_selector() - get the appropriate LED mode selector
420 * @led: LED number, 0 or 1
422 * @rules: LED status flags from the LED classdev core
425 static int mv88e6xxx_led_get_selector(struct mv88e6xxx_port *p, int led, in mv88e6xxx_led_get_selector() argument
431 * indicator (such as LED is on for a 1000 link) else we try a second in mv88e6xxx_led_get_selector()
435 err = mv88e6xxx_led_match_selector(p, led, false, fiber, rules, selector); in mv88e6xxx_led_get_selector()
437 return mv88e6xxx_led_match_selector(p, led, true, fiber, rules, selector); in mv88e6xxx_led_get_selector()
439 return 0; in mv88e6xxx_led_get_selector()
443 static int mv88e6xxx_led_set_blinking_period(struct mv88e6xxx_port *p, int led, in mv88e6xxx_led_set_blinking_period() argument
451 reg = 0; in mv88e6xxx_led_set_blinking_period()
474 return -EINVAL; in mv88e6xxx_led_set_blinking_period()
478 * will the LED be on. Zero isn't great in most cases. in mv88e6xxx_led_set_blinking_period()
481 case 0: in mv88e6xxx_led_set_blinking_period()
482 /* This is usually pretty useless and will make the LED look OFF */ in mv88e6xxx_led_set_blinking_period()
498 /* Just use something non-zero */ in mv88e6xxx_led_set_blinking_period()
506 return mv88e6xxx_port_led_write(p->chip, p->port, reg); in mv88e6xxx_led_set_blinking_period()
509 static int mv88e6xxx_led_blink_set(struct mv88e6xxx_port *p, int led, in mv88e6xxx_led_blink_set() argument
516 if ((*delay_on == 0) && (*delay_off == 0)) { in mv88e6xxx_led_blink_set()
522 if (*delay_off == 0) in mv88e6xxx_led_blink_set()
523 return mv88e6xxx_led_brightness_set(p, led, 1); in mv88e6xxx_led_blink_set()
525 err = mv88e6xxx_led_set_blinking_period(p, led, *delay_on, *delay_off); in mv88e6xxx_led_blink_set()
529 err = mv88e6xxx_port_led_read(p->chip, p->port, in mv88e6xxx_led_blink_set()
535 if (led == 1) in mv88e6xxx_led_blink_set()
541 if (led == 1) in mv88e6xxx_led_blink_set()
548 return mv88e6xxx_port_led_write(p->chip, p->port, reg); in mv88e6xxx_led_blink_set()
558 mv88e6xxx_reg_lock(p->chip); in mv88e6xxx_led0_blink_set()
559 err = mv88e6xxx_led_blink_set(p, 0, delay_on, delay_off); in mv88e6xxx_led0_blink_set()
560 mv88e6xxx_reg_unlock(p->chip); in mv88e6xxx_led0_blink_set()
572 mv88e6xxx_reg_lock(p->chip); in mv88e6xxx_led1_blink_set()
574 mv88e6xxx_reg_unlock(p->chip); in mv88e6xxx_led1_blink_set()
583 u16 selector = 0; in mv88e6xxx_led0_hw_control_is_supported()
585 return mv88e6xxx_led_get_selector(p, 0, p->fiber, rules, &selector); in mv88e6xxx_led0_hw_control_is_supported()
592 u16 selector = 0; in mv88e6xxx_led1_hw_control_is_supported()
594 return mv88e6xxx_led_get_selector(p, 1, p->fiber, rules, &selector); in mv88e6xxx_led1_hw_control_is_supported()
598 int led, unsigned long rules) in mv88e6xxx_led_hw_control_set() argument
603 err = mv88e6xxx_port_led_read(p->chip, p->port, in mv88e6xxx_led_hw_control_set()
609 if (led == 1) in mv88e6xxx_led_hw_control_set()
614 err = mv88e6xxx_led_get_selector(p, led, p->fiber, rules, ®); in mv88e6xxx_led_hw_control_set()
620 if (led == 0) in mv88e6xxx_led_hw_control_set()
621 dev_dbg(p->chip->dev, "LED 0 hw control on port %d trigger selector 0x%02x\n", in mv88e6xxx_led_hw_control_set()
622 p->port, in mv88e6xxx_led_hw_control_set()
625 dev_dbg(p->chip->dev, "LED 1 hw control on port %d trigger selector 0x%02x\n", in mv88e6xxx_led_hw_control_set()
626 p->port, in mv88e6xxx_led_hw_control_set()
629 return mv88e6xxx_port_led_write(p->chip, p->port, reg); in mv88e6xxx_led_hw_control_set()
633 mv88e6xxx_led_hw_control_get(struct mv88e6xxx_port *p, int led, unsigned long *rules) in mv88e6xxx_led_hw_control_get() argument
638 mv88e6xxx_reg_lock(p->chip); in mv88e6xxx_led_hw_control_get()
639 err = mv88e6xxx_port_led_read(p->chip, p->port, in mv88e6xxx_led_hw_control_get()
641 mv88e6xxx_reg_unlock(p->chip); in mv88e6xxx_led_hw_control_get()
646 if (led == 1) { in mv88e6xxx_led_hw_control_get()
652 *rules = 0; in mv88e6xxx_led_hw_control_get()
653 return 0; in mv88e6xxx_led_hw_control_get()
661 *rules = 0; in mv88e6xxx_led_hw_control_get()
662 return 0; in mv88e6xxx_led_hw_control_get()
666 err = mv88e6xxx_led_match_rule(p, val, led, rules); in mv88e6xxx_led_hw_control_get()
668 return 0; in mv88e6xxx_led_hw_control_get()
670 dev_dbg(p->chip->dev, "couldn't find matching selector for %04x\n", val); in mv88e6xxx_led_hw_control_get()
671 *rules = 0; in mv88e6xxx_led_hw_control_get()
672 return 0; in mv88e6xxx_led_hw_control_get()
681 mv88e6xxx_reg_lock(p->chip); in mv88e6xxx_led0_hw_control_set()
682 err = mv88e6xxx_led_hw_control_set(p, 0, rules); in mv88e6xxx_led0_hw_control_set()
683 mv88e6xxx_reg_unlock(p->chip); in mv88e6xxx_led0_hw_control_set()
694 mv88e6xxx_reg_lock(p->chip); in mv88e6xxx_led1_hw_control_set()
696 mv88e6xxx_reg_unlock(p->chip); in mv88e6xxx_led1_hw_control_set()
706 return mv88e6xxx_led_hw_control_get(p, 0, rules); in mv88e6xxx_led0_hw_control_get()
721 dp = dsa_to_port(p->chip->ds, p->port); in mv88e6xxx_led_hw_control_get_device()
724 if (dp->user) in mv88e6xxx_led_hw_control_get_device()
725 return &dp->user->dev; in mv88e6xxx_led_hw_control_get_device()
747 struct fwnode_handle *led = NULL, *leds = NULL; in mv88e6xxx_port_setup_leds() local
756 /* LEDs are on ports 1,2,3,4, 5 and 6 (index 0..5), no more */ in mv88e6xxx_port_setup_leds()
758 return -EOPNOTSUPP; in mv88e6xxx_port_setup_leds()
760 p = &chip->ports[port]; in mv88e6xxx_port_setup_leds()
761 if (!p->fwnode) in mv88e6xxx_port_setup_leds()
762 return 0; in mv88e6xxx_port_setup_leds()
764 dev = chip->dev; in mv88e6xxx_port_setup_leds()
766 leds = fwnode_get_named_child_node(p->fwnode, "leds"); in mv88e6xxx_port_setup_leds()
770 return 0; in mv88e6xxx_port_setup_leds()
773 fwnode_for_each_child_node(leds, led) { in mv88e6xxx_port_setup_leds()
774 /* Reg represent the led number of the port, max 2 in mv88e6xxx_port_setup_leds()
776 * only one LED is connected. in mv88e6xxx_port_setup_leds()
778 if (fwnode_property_read_u32(led, "reg", &led_num)) in mv88e6xxx_port_setup_leds()
781 dev_err(dev, "invalid LED specified port %d\n", port); in mv88e6xxx_port_setup_leds()
782 return -EINVAL; in mv88e6xxx_port_setup_leds()
785 if (led_num == 0) in mv88e6xxx_port_setup_leds()
786 l = &p->led0; in mv88e6xxx_port_setup_leds()
788 l = &p->led1; in mv88e6xxx_port_setup_leds()
790 state = led_init_default_state_get(led); in mv88e6xxx_port_setup_leds()
793 l->brightness = 1; in mv88e6xxx_port_setup_leds()
799 l->brightness = 0; in mv88e6xxx_port_setup_leds()
800 mv88e6xxx_led_brightness_set(p, led_num, 0); in mv88e6xxx_port_setup_leds()
803 l->max_brightness = 1; in mv88e6xxx_port_setup_leds()
804 if (led_num == 0) { in mv88e6xxx_port_setup_leds()
805 l->brightness_set_blocking = mv88e6xxx_led0_brightness_set_blocking; in mv88e6xxx_port_setup_leds()
806 l->blink_set = mv88e6xxx_led0_blink_set; in mv88e6xxx_port_setup_leds()
807 l->hw_control_is_supported = mv88e6xxx_led0_hw_control_is_supported; in mv88e6xxx_port_setup_leds()
808 l->hw_control_set = mv88e6xxx_led0_hw_control_set; in mv88e6xxx_port_setup_leds()
809 l->hw_control_get = mv88e6xxx_led0_hw_control_get; in mv88e6xxx_port_setup_leds()
810 l->hw_control_get_device = mv88e6xxx_led0_hw_control_get_device; in mv88e6xxx_port_setup_leds()
812 l->brightness_set_blocking = mv88e6xxx_led1_brightness_set_blocking; in mv88e6xxx_port_setup_leds()
813 l->blink_set = mv88e6xxx_led1_blink_set; in mv88e6xxx_port_setup_leds()
814 l->hw_control_is_supported = mv88e6xxx_led1_hw_control_is_supported; in mv88e6xxx_port_setup_leds()
815 l->hw_control_set = mv88e6xxx_led1_hw_control_set; in mv88e6xxx_port_setup_leds()
816 l->hw_control_get = mv88e6xxx_led1_hw_control_get; in mv88e6xxx_port_setup_leds()
817 l->hw_control_get_device = mv88e6xxx_led1_hw_control_get_device; in mv88e6xxx_port_setup_leds()
819 l->hw_control_trigger = "netdev"; in mv88e6xxx_port_setup_leds()
822 init_data.fwnode = led; in mv88e6xxx_port_setup_leds()
824 init_data.devicename = kasprintf(GFP_KERNEL, "%s:0%d:0%d", chip->info->name, in mv88e6xxx_port_setup_leds()
827 return -ENOMEM; in mv88e6xxx_port_setup_leds()
833 dev_err(dev, "Failed to init LED %d for port %d", led_num, port); in mv88e6xxx_port_setup_leds()
838 return 0; in mv88e6xxx_port_setup_leds()