diff options
author | Philippe Reynes <philippe.reynes@softathome.com> | 2023-06-29 11:25:23 +0200 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2023-07-14 15:21:08 -0400 |
commit | 910b01c27c0499ae8f84104a0db745dd3a056c04 (patch) | |
tree | 4312840918eb0cd0596d4596b5be997578b3ee41 | |
parent | 874bf6e0e25389a9d43b5844855342595d58648e (diff) | |
download | u-boot-910b01c27c0499ae8f84104a0db745dd3a056c04.zip u-boot-910b01c27c0499ae8f84104a0db745dd3a056c04.tar.gz u-boot-910b01c27c0499ae8f84104a0db745dd3a056c04.tar.bz2 |
drivers: led: bcm6753: do not use null label to find the top
This driver considers that a node with an empty label is the top.
But the led class has changed, if a label is not provided for a led,
the label is filed with the node name. So we update this driver
to use a wrapper to manage the top led node.
Signed-off-by: Philippe Reynes <philippe.reynes@softathome.com>
-rw-r--r-- | drivers/led/led_bcm6753.c | 114 |
1 files changed, 60 insertions, 54 deletions
diff --git a/drivers/led/led_bcm6753.c b/drivers/led/led_bcm6753.c index 88b650c..2466d93 100644 --- a/drivers/led/led_bcm6753.c +++ b/drivers/led/led_bcm6753.c @@ -174,57 +174,65 @@ static const struct led_ops bcm6753_led_ops = { static int bcm6753_led_probe(struct udevice *dev) { - struct led_uc_plat *uc_plat = dev_get_uclass_plat(dev); - - /* Top-level LED node */ - if (!uc_plat->label) { - void __iomem *regs; - u32 set_bits = 0; - - regs = dev_remap_addr(dev); - if (!regs) - return -EINVAL; - - if (dev_read_bool(dev, "brcm,serial-led-msb-first")) - set_bits |= CLED_CTRL_SERIAL_LED_MSB_FIRST; - if (dev_read_bool(dev, "brcm,serial-led-en-pol")) - set_bits |= CLED_CTRL_SERIAL_LED_EN_POL; - if (dev_read_bool(dev, "brcm,serial-led-clk-pol")) - set_bits |= CLED_CTRL_SERIAL_LED_CLK_POL; - if (dev_read_bool(dev, "brcm,serial-led-data-ppol")) - set_bits |= CLED_CTRL_SERIAL_LED_DATA_PPOL; - - clrsetbits_32(regs + CLED_CTRL_REG, CLED_CTRL_MASK, set_bits); - } else { - struct bcm6753_led_priv *priv = dev_get_priv(dev); - void __iomem *regs; - unsigned int pin; - - regs = dev_remap_addr(dev_get_parent(dev)); - if (!regs) - return -EINVAL; - - pin = dev_read_u32_default(dev, "reg", LEDS_MAX); - if (pin >= LEDS_MAX) - return -EINVAL; - - priv->regs = regs; - priv->pin = pin; - - /* this led is managed by software */ - clrbits_32(regs + CLED_HW_LED_EN_REG, 1 << pin); - - /* configure the polarity */ - if (dev_read_bool(dev, "active-low")) - clrbits_32(regs + CLED_PLED_OP_PPOL_REG, 1 << pin); - else - setbits_32(regs + CLED_PLED_OP_PPOL_REG, 1 << pin); - } + struct bcm6753_led_priv *priv = dev_get_priv(dev); + void __iomem *regs; + unsigned int pin; + + regs = dev_remap_addr(dev_get_parent(dev)); + if (!regs) + return -EINVAL; + + pin = dev_read_u32_default(dev, "reg", LEDS_MAX); + if (pin >= LEDS_MAX) + return -EINVAL; + + priv->regs = regs; + priv->pin = pin; + + /* this led is managed by software */ + clrbits_32(regs + CLED_HW_LED_EN_REG, 1 << pin); + + /* configure the polarity */ + if (dev_read_bool(dev, "active-low")) + clrbits_32(regs + CLED_PLED_OP_PPOL_REG, 1 << pin); + else + setbits_32(regs + CLED_PLED_OP_PPOL_REG, 1 << pin); return 0; } -static int bcm6753_led_bind(struct udevice *parent) +U_BOOT_DRIVER(bcm6753_led) = { + .name = "bcm6753-led", + .id = UCLASS_LED, + .probe = bcm6753_led_probe, + .priv_auto = sizeof(struct bcm6753_led_priv), + .ops = &bcm6753_led_ops, +}; + +static int bcm6753_led_wrap_probe(struct udevice *dev) +{ + void __iomem *regs; + u32 set_bits = 0; + + regs = dev_remap_addr(dev); + if (!regs) + return -EINVAL; + + if (dev_read_bool(dev, "brcm,serial-led-msb-first")) + set_bits |= CLED_CTRL_SERIAL_LED_MSB_FIRST; + if (dev_read_bool(dev, "brcm,serial-led-en-pol")) + set_bits |= CLED_CTRL_SERIAL_LED_EN_POL; + if (dev_read_bool(dev, "brcm,serial-led-clk-pol")) + set_bits |= CLED_CTRL_SERIAL_LED_CLK_POL; + if (dev_read_bool(dev, "brcm,serial-led-data-ppol")) + set_bits |= CLED_CTRL_SERIAL_LED_DATA_PPOL; + + clrsetbits_32(regs + CLED_CTRL_REG, CLED_CTRL_MASK, set_bits); + + return 0; +} + +static int bcm6753_led_wrap_bind(struct udevice *parent) { ofnode node; @@ -247,12 +255,10 @@ static const struct udevice_id bcm6753_led_ids[] = { { /* sentinel */ } }; -U_BOOT_DRIVER(bcm6753_led) = { - .name = "bcm6753-led", - .id = UCLASS_LED, +U_BOOT_DRIVER(bcm6753_led_wrap) = { + .name = "bcm6753_led_wrap", + .id = UCLASS_NOP, .of_match = bcm6753_led_ids, - .bind = bcm6753_led_bind, - .probe = bcm6753_led_probe, - .priv_auto = sizeof(struct bcm6753_led_priv), - .ops = &bcm6753_led_ops, + .probe = bcm6753_led_wrap_probe, + .bind = bcm6753_led_wrap_bind, }; |