/* Remove LED from cached HW blinking intervals */
led->blink_leds[0] &= ~BIT(led->pin);
led->blink_leds[1] &= ~BIT(led->pin);
/* Set LED on/off */ if ((led->active_low && value == LED_OFF) ||
(!led->active_low && value != LED_OFF))
bcm6328_led_mode(led, BCM6328_LED_MODE_ON); else
bcm6328_led_mode(led, BCM6328_LED_MODE_OFF);
if (!*delay_on)
*delay_on = BCM6328_LED_DEF_DELAY; if (!*delay_off)
*delay_off = BCM6328_LED_DEF_DELAY;
delay = bcm6328_blink_delay(*delay_on); if (delay != bcm6328_blink_delay(*delay_off)) {
dev_dbg(led_cdev->dev, "fallback to soft blinking (delay_on != delay_off)\n"); return -EINVAL;
}
if (delay > BCM6328_LED_BLINK_MASK) {
dev_dbg(led_cdev->dev, "fallback to soft blinking (delay > %ums)\n",
BCM6328_LED_BLINK_MASK * BCM6328_LED_BLINK_MS); return -EINVAL;
}
spin_lock_irqsave(led->lock, flags); /* * Check if any of the two configurable HW blinking intervals is * available: * 1. No LEDs assigned to the HW blinking interval. * 2. Only this LED is assigned to the HW blinking interval. * 3. LEDs with the same delay assigned.
*/ if (led->blink_leds[0] == 0 ||
led->blink_leds[0] == BIT(led->pin) ||
led->blink_delay[0] == delay) { unsignedlong val;
/* Add LED to the first HW blinking interval cache */
led->blink_leds[0] |= BIT(led->pin);
/* Remove LED from the second HW blinking interval cache */
led->blink_leds[1] &= ~BIT(led->pin);
/* Update the delay for the first HW blinking interval */
val = bcm6328_led_read(led->mem + BCM6328_REG_INIT);
val &= ~BCM6328_LED_BLINK1_MASK;
val |= (delay << BCM6328_LED_BLINK1_SHIFT);
bcm6328_led_write(led->mem + BCM6328_REG_INIT, val);
/* Set the LED to first HW blinking interval */
bcm6328_led_mode(led, BCM6328_LED_MODE_BLINK1);
/* Update the delay for the second HW blinking interval */
val = bcm6328_led_read(led->mem + BCM6328_REG_INIT);
val &= ~BCM6328_LED_BLINK2_MASK;
val |= (delay << BCM6328_LED_BLINK2_SHIFT);
bcm6328_led_write(led->mem + BCM6328_REG_INIT, val);
/* Set the LED to second HW blinking interval */
bcm6328_led_mode(led, BCM6328_LED_MODE_BLINK2);
val = bcm6328_led_read(mem + BCM6328_REG_INIT);
val &= ~(BCM6328_INIT_MASK); if (of_property_read_bool(np, "brcm,serial-leds"))
val |= BCM6328_SERIAL_LED_EN; if (of_property_read_bool(np, "brcm,serial-mux"))
val |= BCM6328_SERIAL_LED_MUX; if (of_property_read_bool(np, "brcm,serial-clk-low"))
val |= BCM6328_SERIAL_LED_CLK_NPOL; if (!of_property_read_bool(np, "brcm,serial-dat-low"))
val |= BCM6328_SERIAL_LED_DATA_PPOL; if (!of_property_read_bool(np, "brcm,serial-shift-inv"))
val |= BCM6328_SERIAL_LED_SHIFT_DIR;
bcm6328_led_write(mem + BCM6328_REG_INIT, val);
for_each_available_child_of_node_scoped(np, child) { int rc;
u32 reg;
if (of_property_read_u32(child, "reg", ®)) continue;
if (reg >= BCM6328_LED_MAX_COUNT) {
dev_err(dev, "invalid LED (%u >= %d)\n", reg,
BCM6328_LED_MAX_COUNT); continue;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.