Merge branch '2022-04-28-led-updates'

- DM GPIO bugfix
- LED related code clean-ups
- Fix some of the DM/LED tests
- Update the LED dt binding doc
This commit is contained in:
Tom Rini 2022-04-28 13:46:31 -04:00
commit e95afa5675
24 changed files with 92 additions and 109 deletions

View File

@ -418,7 +418,6 @@ int board_late_init(void)
int x, y;
int ret;
led_default_state();
splash_get_pos(&x, &y);
bmp_display((ulong)&bmp_logo_bitmap[0], x, y);

View File

@ -327,9 +327,6 @@ int board_late_init(void)
int ret;
struct udevice *cdev;
#ifdef CONFIG_LED_GPIO
led_default_state();
#endif
set_bootmode_env();
ret = uclass_get_device(UCLASS_PANEL, 0, &cdev);

View File

@ -607,9 +607,6 @@ int board_init(void)
board_init_fmc2();
if (CONFIG_IS_ENABLED(LED))
led_default_state();
return 0;
}

View File

@ -24,9 +24,6 @@ int board_late_init(void)
{
at91_prepare_cpu_var();
if (IS_ENABLED(CONFIG_LED))
led_default_state();
return 0;
}

View File

@ -183,9 +183,6 @@ err_free:
int board_late_init(void)
{
if (IS_ENABLED(CONFIG_LED))
led_default_state();
factory_data_env_config();
return 0;

View File

@ -128,8 +128,6 @@ int board_late_init(void)
u8 enetaddr[6];
char fdt[64];
led_default_state();
/* Set board serial/model */
if (!env_get("serial#"))
env_set_ulong("serial#", eeprom_get_serial());

View File

@ -137,9 +137,6 @@ int board_late_init(void)
add_board_boot_modes(board_boot_modes);
#endif
if (IS_ENABLED(CONFIG_LED))
led_default_state();
env_set("boardname", "kp-tpc");
env_set("boardsoc", "imx6q");
return 0;

View File

@ -30,10 +30,6 @@ int board_early_init_r(void)
/* Address of boot parameters */
gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE;
/* LED setup */
if (IS_ENABLED(CONFIG_LED))
led_default_state();
return 0;
}

View File

@ -31,10 +31,6 @@ int board_early_init_r(void)
/* Address of boot parameters */
gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE;
/* LED setup */
if (IS_ENABLED(CONFIG_LED))
led_default_state();
return 0;
}

View File

@ -79,10 +79,6 @@ int board_early_init_r(void)
/* Address of boot parameters */
gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE;
/* LED setup */
if (IS_ENABLED(CONFIG_LED))
led_default_state();
return 0;
}

View File

@ -24,10 +24,6 @@ int board_early_init_r(void)
/* Address of boot parameters */
gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE;
/* LED setup */
if (IS_ENABLED(CONFIG_LED))
led_default_state();
return 0;
}

View File

@ -24,10 +24,6 @@ int board_early_init_r(void)
/* Address of boot parameters */
gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE;
/* LED setup */
if (IS_ENABLED(CONFIG_LED))
led_default_state();
return 0;
}

View File

@ -360,9 +360,6 @@ int board_late_init(void)
struct src *psrc = (struct src *)SRC_BASE_ADDR;
u32 reg;
if (IS_ENABLED(CONFIG_LED))
led_default_state();
/*
* BK4r1 handle emergency/service SD card boot
* Checking the SBMR1 register BOOTCFG1 byte:

View File

@ -107,9 +107,6 @@ int dram_init(void)
int board_init(void)
{
if (IS_ENABLED(CONFIG_LED))
led_default_state();
return 0;
}

View File

@ -244,10 +244,6 @@ static int board_led_init(void)
u8 pca_led[2] = { 0x00, 0x00 };
int ret;
/* init all GPIO LED's */
if (IS_ENABLED(CONFIG_LED))
led_default_state();
/* enable all leds on PCA9552 */
ret = uclass_get_device_by_seq(UCLASS_I2C, PCA9552_1_I2C_BUS, &bus);
if (ret) {

View File

@ -666,9 +666,6 @@ int board_init(void)
if (IS_ENABLED(CONFIG_ARMV7_NONSEC))
sysconf_init();
if (CONFIG_IS_ENABLED(LED))
led_default_state();
setup_led(LEDST_ON);
return 0;

View File

@ -361,6 +361,28 @@ void *dm_priv_to_rw(void *priv)
}
#endif
static int dm_probe_devices(struct udevice *dev, bool pre_reloc_only)
{
u32 mask = DM_FLAG_PROBE_AFTER_BIND;
u32 flags = dev_get_flags(dev);
struct udevice *child;
int ret;
if (pre_reloc_only)
mask |= DM_FLAG_PRE_RELOC;
if ((flags & mask) == mask) {
ret = device_probe(dev);
if (ret)
return ret;
}
list_for_each_entry(child, &dev->child_head, sibling_node)
dm_probe_devices(child, pre_reloc_only);
return 0;
}
/**
* dm_scan() - Scan tables to bind devices
*
@ -393,7 +415,7 @@ static int dm_scan(bool pre_reloc_only)
if (ret)
return ret;
return 0;
return dm_probe_devices(gd->dm_root, pre_reloc_only);
}
int dm_init_and_scan(bool pre_reloc_only)

View File

@ -66,12 +66,6 @@ int led_set_period(struct udevice *dev, int period_ms)
}
#endif
/* This is superseded by led_post_bind()/led_post_probe() below. */
int led_default_state(void)
{
return 0;
}
static int led_post_bind(struct udevice *dev)
{
struct led_uc_plat *uc_plat = dev_get_uclass_plat(dev);
@ -98,7 +92,9 @@ static int led_post_bind(struct udevice *dev)
* In case the LED has default-state DT property, trigger
* probe() to configure its default state during startup.
*/
return device_probe(dev);
dev_or_flags(dev, DM_FLAG_PROBE_AFTER_BIND);
return 0;
}
static int led_post_probe(struct udevice *dev)

View File

@ -57,19 +57,9 @@ static enum led_state_t gpio_led_get_state(struct udevice *dev)
static int led_gpio_probe(struct udevice *dev)
{
struct led_uc_plat *uc_plat = dev_get_uclass_plat(dev);
struct led_gpio_priv *priv = dev_get_priv(dev);
int ret;
/* Ignore the top-level LED node */
if (!uc_plat->label)
return 0;
ret = gpio_request_by_name(dev, "gpios", 0, &priv->gpio, GPIOD_IS_OUT);
if (ret)
return ret;
return 0;
return gpio_request_by_name(dev, "gpios", 0, &priv->gpio, GPIOD_IS_OUT);
}
static int led_gpio_remove(struct udevice *dev)
@ -110,18 +100,23 @@ static const struct led_ops gpio_led_ops = {
.get_state = gpio_led_get_state,
};
U_BOOT_DRIVER(led_gpio) = {
.name = "gpio_led",
.id = UCLASS_LED,
.ops = &gpio_led_ops,
.priv_auto = sizeof(struct led_gpio_priv),
.probe = led_gpio_probe,
.remove = led_gpio_remove,
};
static const struct udevice_id led_gpio_ids[] = {
{ .compatible = "gpio-leds" },
{ }
};
U_BOOT_DRIVER(led_gpio) = {
.name = "gpio_led",
.id = UCLASS_LED,
U_BOOT_DRIVER(led_gpio_wrap) = {
.name = "gpio_led_wrap",
.id = UCLASS_NOP,
.of_match = led_gpio_ids,
.ops = &gpio_led_ops,
.priv_auto = sizeof(struct led_gpio_priv),
.bind = led_gpio_bind,
.probe = led_gpio_probe,
.remove = led_gpio_remove,
};

View File

@ -80,6 +80,9 @@ struct driver_info;
*/
#define DM_FLAG_VITAL (1 << 14)
/* Device must be probed after it was bound */
#define DM_FLAG_PROBE_AFTER_BIND (1 << 15)
/*
* One or multiple of these flags are passed to device_remove() so that
* a selective device removal as specified by the remove-stage and the

View File

@ -6,6 +6,7 @@
* Author: Jacek Anaszewski <j.anaszewski@samsung.com>
*
* Copyright (C) 2019 Jacek Anaszewski <jacek.anaszewski@gmail.com>
* Copyright (C) 2020 Pavel Machek <pavel@ucw.cz>
*/
#ifndef __DT_BINDINGS_LEDS_H
@ -29,19 +30,51 @@
#define LED_COLOR_ID_VIOLET 5
#define LED_COLOR_ID_YELLOW 6
#define LED_COLOR_ID_IR 7
#define LED_COLOR_ID_MAX 8
#define LED_COLOR_ID_MULTI 8 /* For multicolor LEDs */
#define LED_COLOR_ID_RGB 9 /* For multicolor LEDs that can do arbitrary color,
so this would include RGBW and similar */
#define LED_COLOR_ID_MAX 10
/* Standard LED functions */
/* Keyboard LEDs, usually it would be input4::capslock etc. */
/* Obsolete equivalent: "shift-key-light" */
#define LED_FUNCTION_CAPSLOCK "capslock"
#define LED_FUNCTION_SCROLLLOCK "scrolllock"
#define LED_FUNCTION_NUMLOCK "numlock"
/* Obsolete equivalents: "tpacpi::thinklight" (IBM/Lenovo Thinkpads),
"lp5523:kb{1,2,3,4,5,6}" (Nokia N900) */
#define LED_FUNCTION_KBD_BACKLIGHT "kbd_backlight"
/* System LEDs, usually found on system body.
platform::mute (etc) is sometimes seen, :mute would be better */
#define LED_FUNCTION_POWER "power"
#define LED_FUNCTION_DISK "disk"
/* Obsolete: "platform:*:charging" (allwinner sun50i) */
#define LED_FUNCTION_CHARGING "charging"
/* Used RGB notification LEDs common on phones.
Obsolete equivalents: "status-led:{red,green,blue}" (Motorola Droid 4),
"lp5523:{r,g,b}" (Nokia N900) */
#define LED_FUNCTION_STATUS "status"
#define LED_FUNCTION_MICMUTE "micmute"
#define LED_FUNCTION_MUTE "mute"
/* Used for player LEDs as found on game controllers from e.g. Nintendo, Sony. */
#define LED_FUNCTION_PLAYER1 "player-1"
#define LED_FUNCTION_PLAYER2 "player-2"
#define LED_FUNCTION_PLAYER3 "player-3"
#define LED_FUNCTION_PLAYER4 "player-4"
#define LED_FUNCTION_PLAYER5 "player-5"
/* Miscelleaus functions. Use functions above if you can. */
#define LED_FUNCTION_ACTIVITY "activity"
#define LED_FUNCTION_ALARM "alarm"
#define LED_FUNCTION_BACKLIGHT "backlight"
#define LED_FUNCTION_BLUETOOTH "bluetooth"
#define LED_FUNCTION_BOOT "boot"
#define LED_FUNCTION_CPU "cpu"
#define LED_FUNCTION_CAPSLOCK "capslock"
#define LED_FUNCTION_CHARGING "charging"
#define LED_FUNCTION_DEBUG "debug"
#define LED_FUNCTION_DISK "disk"
#define LED_FUNCTION_DISK_ACTIVITY "disk-activity"
#define LED_FUNCTION_DISK_ERR "disk-err"
#define LED_FUNCTION_DISK_READ "disk-read"
@ -50,21 +83,14 @@
#define LED_FUNCTION_FLASH "flash"
#define LED_FUNCTION_HEARTBEAT "heartbeat"
#define LED_FUNCTION_INDICATOR "indicator"
#define LED_FUNCTION_KBD_BACKLIGHT "kbd_backlight"
#define LED_FUNCTION_LAN "lan"
#define LED_FUNCTION_MAIL "mail"
#define LED_FUNCTION_MTD "mtd"
#define LED_FUNCTION_MICMUTE "micmute"
#define LED_FUNCTION_MUTE "mute"
#define LED_FUNCTION_NUMLOCK "numlock"
#define LED_FUNCTION_PANIC "panic"
#define LED_FUNCTION_PROGRAMMING "programming"
#define LED_FUNCTION_POWER "power"
#define LED_FUNCTION_RX "rx"
#define LED_FUNCTION_SD "sd"
#define LED_FUNCTION_SCROLLLOCK "scrolllock"
#define LED_FUNCTION_STANDBY "standby"
#define LED_FUNCTION_STATUS "status"
#define LED_FUNCTION_TORCH "torch"
#define LED_FUNCTION_TX "tx"
#define LED_FUNCTION_USB "usb"

View File

@ -110,13 +110,4 @@ enum led_state_t led_get_state(struct udevice *dev);
*/
int led_set_period(struct udevice *dev, int period_ms);
/**
* led_default_state() - set the default state for all the LED
*
* This enables all leds which have default state.
* see Documentation/devicetree/bindings/leds/common.txt
*
*/
int led_default_state(void);
#endif

View File

@ -7,12 +7,17 @@
#include <common.h>
#include <command.h>
#include <dm.h>
#include <dm/test.h>
#include <test/test.h>
#include <test/ut.h>
static int dm_test_cmd_pinmux_status_pinname(struct unit_test_state *uts)
{
struct udevice *dev;
ut_assertok(uclass_get_device(UCLASS_LED, 2, &dev));
/* Test that 'pinmux status <pinname>' displays the selected pin. */
console_record_reset();
run_command("pinmux status a5", 0);

View File

@ -21,8 +21,7 @@ static int dm_test_led_base(struct unit_test_state *uts)
ut_assertok(uclass_get_device(UCLASS_LED, 1, &dev));
ut_assertok(uclass_get_device(UCLASS_LED, 2, &dev));
ut_assertok(uclass_get_device(UCLASS_LED, 3, &dev));
ut_assertok(uclass_get_device(UCLASS_LED, 4, &dev));
ut_asserteq(-ENODEV, uclass_get_device(UCLASS_LED, 5, &dev));
ut_asserteq(-ENODEV, uclass_get_device(UCLASS_LED, 4, &dev));
return 0;
}
@ -33,9 +32,6 @@ static int dm_test_led_default_state(struct unit_test_state *uts)
{
struct udevice *dev;
/* configure the default state (auto-probe) */
led_default_state();
/* Check that we handle the default-state property correctly. */
ut_assertok(led_get_by_label("sandbox:default_on", &dev));
ut_asserteq(LEDST_ON, led_get_state(dev));
@ -55,10 +51,10 @@ static int dm_test_led_gpio(struct unit_test_state *uts)
struct udevice *dev, *gpio;
/*
* Check that we can manipulate an LED. LED 1 is connected to GPIO
* Check that we can manipulate an LED. LED 0 is connected to GPIO
* bank gpio_a, offset 1.
*/
ut_assertok(uclass_get_device(UCLASS_LED, 1, &dev));
ut_assertok(uclass_get_device(UCLASS_LED, 0, &dev));
ut_assertok(uclass_get_device(UCLASS_GPIO, 1, &gpio));
ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
ut_assertok(led_set_state(dev, LEDST_ON));
@ -80,10 +76,10 @@ static int dm_test_led_toggle(struct unit_test_state *uts)
struct udevice *dev, *gpio;
/*
* Check that we can manipulate an LED. LED 1 is connected to GPIO
* Check that we can manipulate an LED. LED 0 is connected to GPIO
* bank gpio_a, offset 1.
*/
ut_assertok(uclass_get_device(UCLASS_LED, 1, &dev));
ut_assertok(uclass_get_device(UCLASS_LED, 0, &dev));
ut_assertok(uclass_get_device(UCLASS_GPIO, 1, &gpio));
ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
ut_assertok(led_set_state(dev, LEDST_TOGGLE));
@ -105,12 +101,12 @@ static int dm_test_led_label(struct unit_test_state *uts)
ut_assertok(led_get_by_label("sandbox:red", &dev));
ut_asserteq(1, device_active(dev));
ut_assertok(uclass_get_device(UCLASS_LED, 1, &cmp));
ut_assertok(uclass_get_device(UCLASS_LED, 0, &cmp));
ut_asserteq_ptr(dev, cmp);
ut_assertok(led_get_by_label("sandbox:green", &dev));
ut_asserteq(1, device_active(dev));
ut_assertok(uclass_get_device(UCLASS_LED, 2, &cmp));
ut_assertok(uclass_get_device(UCLASS_LED, 1, &cmp));
ut_asserteq_ptr(dev, cmp);
ut_asserteq(-ENODEV, led_get_by_label("sandbox:blue", &dev));
@ -130,7 +126,7 @@ static int dm_test_led_blink(struct unit_test_state *uts)
* Check that we get an error when trying to blink an LED, since it is
* not supported by the GPIO LED driver.
*/
ut_assertok(uclass_get_device(UCLASS_LED, 1, &dev));
ut_assertok(uclass_get_device(UCLASS_LED, 0, &dev));
ut_assertok(uclass_get_device(UCLASS_GPIO, 1, &gpio));
ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
ut_asserteq(-ENOSYS, led_set_state(dev, LEDST_BLINK));