Lines Matching +full:container +full:- +full:rules
1 // SPDX-License-Identifier: GPL-2.0-or-later
40 err = mv88e6xxx_port_led_read(p->chip, p->port, 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()
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()
99 unsigned long rules; member
105 /* The following is a lookup table to check what rules we can support on a
106 * certain LED given restrictions such as that some rules only work with fiber
117 * different tables per-family here.
123 .rules = BIT(TRIGGER_NETDEV_LINK),
130 .rules = BIT(TRIGGER_NETDEV_LINK_1000),
137 .rules = BIT(TRIGGER_NETDEV_LINK_100) | BIT(TRIGGER_NETDEV_LINK_1000),
144 .rules = BIT(TRIGGER_NETDEV_LINK_10) | BIT(TRIGGER_NETDEV_LINK_100),
151 .rules = BIT(TRIGGER_NETDEV_LINK_100),
159 .rules = BIT(TRIGGER_NETDEV_LINK_1000),
167 .rules = BIT(TRIGGER_NETDEV_LINK_1000),
174 .rules = BIT(TRIGGER_NETDEV_LINK_10) | BIT(TRIGGER_NETDEV_LINK_100),
181 .rules = BIT(TRIGGER_NETDEV_LINK_1000),
189 .rules = BIT(TRIGGER_NETDEV_LINK_100),
197 .rules = BIT(TRIGGER_NETDEV_LINK),
204 .rules = BIT(TRIGGER_NETDEV_LINK_1000),
210 .rules = BIT(TRIGGER_NETDEV_LINK),
217 .rules = BIT(TRIGGER_NETDEV_LINK),
224 .rules = BIT(TRIGGER_NETDEV_LINK),
230 .rules = BIT(TRIGGER_NETDEV_FULL_DUPLEX),
237 .rules = BIT(TRIGGER_NETDEV_LINK_10) | BIT(TRIGGER_NETDEV_LINK_1000),
244 .rules = BIT(TRIGGER_NETDEV_FULL_DUPLEX),
251 .rules = BIT(TRIGGER_NETDEV_FULL_DUPLEX),
258 .rules = BIT(TRIGGER_NETDEV_LINK_10) | BIT(TRIGGER_NETDEV_LINK_1000),
265 .rules = BIT(TRIGGER_NETDEV_LINK_10) | BIT(TRIGGER_NETDEV_LINK_1000),
271 .rules = BIT(TRIGGER_NETDEV_LINK),
277 .rules = BIT(TRIGGER_NETDEV_LINK),
284 .rules = BIT(TRIGGER_NETDEV_LINK),
291 .rules = BIT(TRIGGER_NETDEV_LINK_10),
297 .rules = BIT(TRIGGER_NETDEV_LINK_100),
303 .rules = BIT(TRIGGER_NETDEV_LINK_10),
310 .rules = BIT(TRIGGER_NETDEV_LINK_100),
317 .rules = BIT(TRIGGER_NETDEV_LINK_100) | BIT(TRIGGER_NETDEV_LINK_1000),
323 .rules = BIT(TRIGGER_NETDEV_LINK_100) | BIT(TRIGGER_NETDEV_LINK_1000),
329 /* mv88e6xxx_led_match_selector() - look up the appropriate LED mode selector
330 * @p: port state container
334 * @rules: LED status flags from the LED classdev core
338 bool fiber, unsigned long rules, u16 *selector) in mv88e6xxx_led_match_selector() argument
343 /* No rules means we turn the LED off */ in mv88e6xxx_led_match_selector()
344 if (!rules) { in mv88e6xxx_led_match_selector()
352 /* TODO: these rules are for MV88E6352, when adding other families, 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()
379 return -EOPNOTSUPP; in mv88e6xxx_led_match_selector()
382 /* mv88e6xxx_led_match_selector() - find Linux netdev rules from a selector value
383 * @p: port state container
386 * @rules: Linux netdev activity rules found from selector
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()
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()
415 return -EINVAL; in mv88e6xxx_led_match_rule()
418 /* mv88e6xxx_led_get_selector() - get the appropriate LED mode selector
419 * @p: port state container
422 * @rules: LED status flags from the LED classdev core
426 bool fiber, unsigned long rules, u16 *selector) in mv88e6xxx_led_get_selector() argument
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()
474 return -EINVAL; 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()
529 err = mv88e6xxx_port_led_read(p->chip, p->port, 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()
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()
580 mv88e6xxx_led0_hw_control_is_supported(struct led_classdev *ldev, unsigned long rules) in mv88e6xxx_led0_hw_control_is_supported() argument
585 return mv88e6xxx_led_get_selector(p, 0, p->fiber, rules, &selector); in mv88e6xxx_led0_hw_control_is_supported()
589 mv88e6xxx_led1_hw_control_is_supported(struct led_classdev *ldev, unsigned long rules) in mv88e6xxx_led1_hw_control_is_supported() argument
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()
614 err = mv88e6xxx_led_get_selector(p, led, p->fiber, rules, ®); 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()
652 *rules = 0; in mv88e6xxx_led_hw_control_get()
661 *rules = 0; in mv88e6xxx_led_hw_control_get()
666 err = mv88e6xxx_led_match_rule(p, val, led, rules); 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()
676 mv88e6xxx_led0_hw_control_set(struct led_classdev *ldev, unsigned long rules) in mv88e6xxx_led0_hw_control_set() argument
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()
689 mv88e6xxx_led1_hw_control_set(struct led_classdev *ldev, unsigned long rules) in mv88e6xxx_led1_hw_control_set() argument
694 mv88e6xxx_reg_lock(p->chip); in mv88e6xxx_led1_hw_control_set()
695 err = mv88e6xxx_led_hw_control_set(p, 1, rules); in mv88e6xxx_led1_hw_control_set()
696 mv88e6xxx_reg_unlock(p->chip); in mv88e6xxx_led1_hw_control_set()
702 mv88e6xxx_led0_hw_control_get(struct led_classdev *ldev, unsigned long *rules) in mv88e6xxx_led0_hw_control_get() argument
706 return mv88e6xxx_led_hw_control_get(p, 0, rules); in mv88e6xxx_led0_hw_control_get()
710 mv88e6xxx_led1_hw_control_get(struct led_classdev *ldev, unsigned long *rules) in mv88e6xxx_led1_hw_control_get() argument
714 return mv88e6xxx_led_hw_control_get(p, 1, rules); in mv88e6xxx_led1_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()
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()
764 dev = chip->dev; in mv88e6xxx_port_setup_leds()
766 leds = fwnode_get_named_child_node(p->fwnode, "leds"); in mv88e6xxx_port_setup_leds()
782 return -EINVAL; in mv88e6xxx_port_setup_leds()
786 l = &p->led0; in mv88e6xxx_port_setup_leds()
788 l = &p->led1; in mv88e6xxx_port_setup_leds()
793 l->brightness = 1; in mv88e6xxx_port_setup_leds()
799 l->brightness = 0; in mv88e6xxx_port_setup_leds()
803 l->max_brightness = 1; 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()
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()