dm: treewide: Use uclass_first_device_err when accessing one device

There is a number of users that use uclass_first_device to access the
first and (assumed) only device in uclass.

Some check the return value of uclass_first_device and also that a
device was returned which is exactly what uclass_first_device_err does.

Some are not checking that a device was returned and can potentially
crash if no device exists in the uclass. Finally there is one that
returns NULL on error either way.

Convert all of these to use uclass_first_device_err instead, the return
value will be removed from uclass_first_device in a later patch.

Signed-off-by: Michal Suchanek <msuchanek@suse.de>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Michal Suchanek 2022-10-12 21:57:59 +02:00 committed by Simon Glass
parent 8676ae36ae
commit c726fc01cf
25 changed files with 43 additions and 59 deletions

View File

@ -265,8 +265,8 @@ int arch_misc_init(void)
struct udevice *dev; struct udevice *dev;
int ret; int ret;
ret = uclass_first_device(UCLASS_MISC, &dev); ret = uclass_first_device_err(UCLASS_MISC, &dev);
if (ret || !dev) if (ret)
return ret; return ret;
#if defined(CONFIG_DM_ETH) && defined(CONFIG_USB_ETHER) #if defined(CONFIG_DM_ETH) && defined(CONFIG_USB_ETHER)

View File

@ -31,11 +31,9 @@ static int broadwell_init_cpu(void *ctx, struct event *event)
int ret; int ret;
/* Start up the LPC so we have serial */ /* Start up the LPC so we have serial */
ret = uclass_first_device(UCLASS_LPC, &dev); ret = uclass_first_device_err(UCLASS_LPC, &dev);
if (ret) if (ret)
return ret; return ret;
if (!dev)
return -ENODEV;
ret = cpu_set_flex_ratio_to_tdp_nominal(); ret = cpu_set_flex_ratio_to_tdp_nominal();
if (ret) if (ret)
return ret; return ret;

View File

@ -61,11 +61,9 @@ int cpu_common_init(void)
/* Early chipset init required before RAM init can work */ /* Early chipset init required before RAM init can work */
uclass_first_device(UCLASS_NORTHBRIDGE, &dev); uclass_first_device(UCLASS_NORTHBRIDGE, &dev);
ret = uclass_first_device(UCLASS_LPC, &lpc); ret = uclass_first_device_err(UCLASS_LPC, &lpc);
if (ret) if (ret)
return ret; return ret;
if (!lpc)
return -ENODEV;
/* Cause the SATA device to do its early init */ /* Cause the SATA device to do its early init */
uclass_first_device(UCLASS_AHCI, &dev); uclass_first_device(UCLASS_AHCI, &dev);

View File

@ -160,11 +160,9 @@ static int ich6_pinctrl_probe(struct udevice *dev)
u32 iobase = -1; u32 iobase = -1;
debug("%s: start\n", __func__); debug("%s: start\n", __func__);
ret = uclass_first_device(UCLASS_PCH, &pch); ret = uclass_first_device_err(UCLASS_PCH, &pch);
if (ret) if (ret)
return ret; return ret;
if (!pch)
return -ENODEV;
/* /*
* Get the memory/io base address to configure every pins. * Get the memory/io base address to configure every pins.

View File

@ -21,11 +21,9 @@ int board_early_init_f(void)
struct udevice *pch; struct udevice *pch;
int ret; int ret;
ret = uclass_first_device(UCLASS_PCH, &pch); ret = uclass_first_device_err(UCLASS_PCH, &pch);
if (ret) if (ret)
return ret; return ret;
if (!pch)
return -ENODEV;
/* Initialize LPC interface to turn on superio chipset decode range */ /* Initialize LPC interface to turn on superio chipset decode range */
dm_pci_write_config16(pch, LPC_IO_DEC, COMA_DEC_RANGE | COMB_DEC_RANGE); dm_pci_write_config16(pch, LPC_IO_DEC, COMA_DEC_RANGE | COMB_DEC_RANGE);

View File

@ -644,7 +644,7 @@ static int omap_hsmmc_execute_tuning(struct udevice *dev, uint opcode)
((mmc->selected_mode == UHS_SDR50) && (val & CAPA2_TSDR50)))) ((mmc->selected_mode == UHS_SDR50) && (val & CAPA2_TSDR50))))
return 0; return 0;
ret = uclass_first_device(UCLASS_THERMAL, &thermal_dev); ret = uclass_first_device_err(UCLASS_THERMAL, &thermal_dev);
if (ret) { if (ret) {
printf("Couldn't get thermal device for tuning\n"); printf("Couldn't get thermal device for tuning\n");
return ret; return ret;

View File

@ -143,7 +143,7 @@ static void serial_find_console_or_panic(void)
#else #else
if (!uclass_get_device_by_seq(UCLASS_SERIAL, INDEX, &dev) || if (!uclass_get_device_by_seq(UCLASS_SERIAL, INDEX, &dev) ||
!uclass_get_device(UCLASS_SERIAL, INDEX, &dev) || !uclass_get_device(UCLASS_SERIAL, INDEX, &dev) ||
(!uclass_first_device(UCLASS_SERIAL, &dev) && dev)) { !uclass_first_device_err(UCLASS_SERIAL, &dev)) {
gd->cur_serial_dev = dev; gd->cur_serial_dev = dev;
return; return;
} }

View File

@ -147,7 +147,7 @@ static bool bcm283x_is_serial_muxed(void)
int serial_gpio = 15; int serial_gpio = 15;
struct udevice *dev; struct udevice *dev;
if (uclass_first_device(UCLASS_PINCTRL, &dev) || !dev) if (uclass_first_device_err(UCLASS_PINCTRL, &dev))
return false; return false;
if (pinctrl_get_gpio_mux(dev, 0, serial_gpio) != BCM2835_GPIO_ALT5) if (pinctrl_get_gpio_mux(dev, 0, serial_gpio) != BCM2835_GPIO_ALT5)

View File

@ -24,7 +24,7 @@ static bool bcm283x_is_serial_muxed(void)
int serial_gpio = 15; int serial_gpio = 15;
struct udevice *dev; struct udevice *dev;
if (uclass_first_device(UCLASS_PINCTRL, &dev) || !dev) if (uclass_first_device_err(UCLASS_PINCTRL, &dev))
return false; return false;
if (pinctrl_get_gpio_mux(dev, 0, serial_gpio) != BCM2835_GPIO_ALT0) if (pinctrl_get_gpio_mux(dev, 0, serial_gpio) != BCM2835_GPIO_ALT0)

View File

@ -18,7 +18,7 @@ static int ast_sysreset_request(struct udevice *dev, enum sysreset_t type)
{ {
struct udevice *wdt; struct udevice *wdt;
u32 reset_mode; u32 reset_mode;
int ret = uclass_first_device(UCLASS_WDT, &wdt); int ret = uclass_first_device_err(UCLASS_WDT, &wdt);
if (ret) if (ret)
return ret; return ret;

View File

@ -640,25 +640,17 @@ static int exynos_fb_probe(struct udevice *dev)
#endif #endif
exynos_fimd_lcd_init(dev); exynos_fimd_lcd_init(dev);
ret = uclass_first_device(UCLASS_PANEL, &panel); ret = uclass_first_device_err(UCLASS_PANEL, &panel);
if (ret) { if (ret) {
printf("LCD panel failed to probe\n"); printf("%s: LCD panel failed to probe %d\n", __func__, ret);
return ret; return ret;
} }
if (!panel) {
printf("LCD panel not found\n");
return -ENODEV;
}
ret = uclass_first_device(UCLASS_DISPLAY, &dp); ret = uclass_first_device_err(UCLASS_DISPLAY, &dp);
if (ret) { if (ret) {
debug("%s: Display device error %d\n", __func__, ret); debug("%s: Display device error %d\n", __func__, ret);
return ret; return ret;
} }
if (!dev) {
debug("%s: Display device missing\n", __func__);
return -ENODEV;
}
ret = display_enable(dp, 18, NULL); ret = display_enable(dp, 18, NULL);
if (ret) { if (ret) {
debug("%s: Display enable error %d\n", __func__, ret); debug("%s: Display enable error %d\n", __func__, ret);

View File

@ -244,7 +244,7 @@ static int malidp_update_timings_from_edid(struct udevice *dev,
struct udevice *disp_dev; struct udevice *disp_dev;
int err; int err;
err = uclass_first_device(UCLASS_DISPLAY, &disp_dev); err = uclass_first_device_err(UCLASS_DISPLAY, &disp_dev);
if (err) if (err)
return err; return err;

View File

@ -346,7 +346,7 @@ static int stm32_dsi_attach(struct udevice *dev)
struct display_timing timings; struct display_timing timings;
int ret; int ret;
ret = uclass_first_device(UCLASS_PANEL, &priv->panel); ret = uclass_first_device_err(UCLASS_PANEL, &priv->panel);
if (ret) { if (ret) {
dev_err(dev, "panel device error %d\n", ret); dev_err(dev, "panel device error %d\n", ret);
return ret; return ret;

View File

@ -1494,8 +1494,8 @@ int tegra_dp_enable(struct udevice *dev, int panel_bpp,
return -ENOLINK; return -ENOLINK;
} }
ret = uclass_first_device(UCLASS_VIDEO_BRIDGE, &sor); ret = uclass_first_device_err(UCLASS_VIDEO_BRIDGE, &sor);
if (ret || !sor) { if (ret) {
debug("dp: failed to find SOR device: ret=%d\n", ret); debug("dp: failed to find SOR device: ret=%d\n", ret);
return ret; return ret;
} }

View File

@ -40,7 +40,7 @@ int acpi_create_dmar(struct acpi_dmar *dmar, enum dmar_flags flags)
struct udevice *cpu; struct udevice *cpu;
int ret; int ret;
ret = uclass_first_device(UCLASS_CPU, &cpu); ret = uclass_first_device_err(UCLASS_CPU, &cpu);
if (ret) if (ret)
return log_msg_ret("cpu", ret); return log_msg_ret("cpu", ret);
ret = cpu_get_info(cpu, &info); ret = cpu_get_info(cpu, &info);

View File

@ -482,7 +482,7 @@ efi_status_t efi_gop_register(void)
struct video_priv *priv; struct video_priv *priv;
/* We only support a single video output device for now */ /* We only support a single video output device for now */
if (uclass_first_device(UCLASS_VIDEO, &vdev) || !vdev) { if (uclass_first_device_err(UCLASS_VIDEO, &vdev)) {
debug("WARNING: No video device\n"); debug("WARNING: No video device\n");
return EFI_SUCCESS; return EFI_SUCCESS;
} }

View File

@ -91,8 +91,8 @@ struct udevice *eth_get_dev(void)
eth_errno = uclass_get_device_by_seq(UCLASS_ETH, 0, eth_errno = uclass_get_device_by_seq(UCLASS_ETH, 0,
&uc_priv->current); &uc_priv->current);
if (eth_errno) if (eth_errno)
eth_errno = uclass_first_device(UCLASS_ETH, eth_errno = uclass_first_device_err(UCLASS_ETH,
&uc_priv->current); &uc_priv->current);
} }
return uc_priv->current; return uc_priv->current;
} }

View File

@ -156,7 +156,7 @@ static int bootmeth_state(struct unit_test_state *uts)
struct udevice *dev; struct udevice *dev;
char buf[50]; char buf[50];
ut_assertok(uclass_first_device(UCLASS_BOOTMETH, &dev)); ut_assertok(uclass_first_device_err(UCLASS_BOOTMETH, &dev));
ut_assertnonnull(dev); ut_assertnonnull(dev);
ut_assertok(bootmeth_get_state_desc(dev, buf, sizeof(buf))); ut_assertok(bootmeth_get_state_desc(dev, buf, sizeof(buf)));

View File

@ -169,28 +169,28 @@ static int dm_test_acpi_get_name(struct unit_test_state *uts)
ut_asserteq_str("GHIJ", name); ut_asserteq_str("GHIJ", name);
/* Test getting the name from acpi_device_get_name() */ /* Test getting the name from acpi_device_get_name() */
ut_assertok(uclass_first_device(UCLASS_I2C, &i2c)); ut_assertok(uclass_first_device_err(UCLASS_I2C, &i2c));
ut_assertok(acpi_get_name(i2c, name)); ut_assertok(acpi_get_name(i2c, name));
ut_asserteq_str("I2C0", name); ut_asserteq_str("I2C0", name);
ut_assertok(uclass_first_device(UCLASS_SPI, &spi)); ut_assertok(uclass_first_device_err(UCLASS_SPI, &spi));
ut_assertok(acpi_get_name(spi, name)); ut_assertok(acpi_get_name(spi, name));
ut_asserteq_str("SPI0", name); ut_asserteq_str("SPI0", name);
/* ACPI doesn't know about the timer */ /* ACPI doesn't know about the timer */
ut_assertok(uclass_first_device(UCLASS_TIMER, &timer)); ut_assertok(uclass_first_device_err(UCLASS_TIMER, &timer));
ut_asserteq(-ENOENT, acpi_get_name(timer, name)); ut_asserteq(-ENOENT, acpi_get_name(timer, name));
/* May as well test the rest of the cases */ /* May as well test the rest of the cases */
ut_assertok(uclass_first_device(UCLASS_SOUND, &sound)); ut_assertok(uclass_first_device_err(UCLASS_SOUND, &sound));
ut_assertok(acpi_get_name(sound, name)); ut_assertok(acpi_get_name(sound, name));
ut_asserteq_str("HDAS", name); ut_asserteq_str("HDAS", name);
ut_assertok(uclass_first_device(UCLASS_PCI, &pci)); ut_assertok(uclass_first_device_err(UCLASS_PCI, &pci));
ut_assertok(acpi_get_name(pci, name)); ut_assertok(acpi_get_name(pci, name));
ut_asserteq_str("PCI0", name); ut_asserteq_str("PCI0", name);
ut_assertok(uclass_first_device(UCLASS_ROOT, &root)); ut_assertok(uclass_first_device_err(UCLASS_ROOT, &root));
ut_assertok(acpi_get_name(root, name)); ut_assertok(acpi_get_name(root, name));
ut_asserteq_str("\\_SB", name); ut_asserteq_str("\\_SB", name);
@ -219,7 +219,7 @@ static int dm_test_acpi_create_dmar(struct unit_test_state *uts)
struct acpi_dmar dmar; struct acpi_dmar dmar;
struct udevice *cpu; struct udevice *cpu;
ut_assertok(uclass_first_device(UCLASS_CPU, &cpu)); ut_assertok(uclass_first_device_err(UCLASS_CPU, &cpu));
ut_assertnonnull(cpu); ut_assertnonnull(cpu);
ut_assertok(acpi_create_dmar(&dmar, DMAR_INTR_REMAP)); ut_assertok(acpi_create_dmar(&dmar, DMAR_INTR_REMAP));
ut_asserteq(DMAR_INTR_REMAP, dmar.flags); ut_asserteq(DMAR_INTR_REMAP, dmar.flags);

View File

@ -165,8 +165,8 @@ static int dm_test_devres_phase(struct unit_test_state *uts)
ut_asserteq(TEST_DEVRES_SIZE + TEST_DEVRES_SIZE3, stats.total_size); ut_asserteq(TEST_DEVRES_SIZE + TEST_DEVRES_SIZE3, stats.total_size);
/* Probing the device should add one allocation */ /* Probing the device should add one allocation */
ut_assertok(uclass_first_device(UCLASS_TEST_DEVRES, &dev)); ut_assertok(uclass_first_device_err(UCLASS_TEST_DEVRES, &dev));
ut_assert(dev != NULL); ut_assertnonnull(dev);
devres_get_stats(dev, &stats); devres_get_stats(dev, &stats);
ut_asserteq(3, stats.allocs); ut_asserteq(3, stats.allocs);
ut_asserteq(TEST_DEVRES_SIZE + TEST_DEVRES_SIZE2 + TEST_DEVRES_SIZE3, ut_asserteq(TEST_DEVRES_SIZE + TEST_DEVRES_SIZE2 + TEST_DEVRES_SIZE3,

View File

@ -124,7 +124,7 @@ static int dm_test_i2c_bytewise(struct unit_test_state *uts)
ut_asserteq_mem(buf, "\0\0\0\0\0", sizeof(buf)); ut_asserteq_mem(buf, "\0\0\0\0\0", sizeof(buf));
/* Tell the EEPROM to only read/write one register at a time */ /* Tell the EEPROM to only read/write one register at a time */
ut_assertok(uclass_first_device(UCLASS_I2C_EMUL, &eeprom)); ut_assertok(uclass_first_device_err(UCLASS_I2C_EMUL, &eeprom));
ut_assertnonnull(eeprom); ut_assertnonnull(eeprom);
sandbox_i2c_eeprom_set_test_mode(eeprom, SIE_TEST_MODE_SINGLE_BYTE); sandbox_i2c_eeprom_set_test_mode(eeprom, SIE_TEST_MODE_SINGLE_BYTE);
@ -177,7 +177,7 @@ static int dm_test_i2c_offset(struct unit_test_state *uts)
/* Do a transfer so we can find the emulator */ /* Do a transfer so we can find the emulator */
ut_assertok(dm_i2c_read(dev, 0, buf, 5)); ut_assertok(dm_i2c_read(dev, 0, buf, 5));
ut_assertok(uclass_first_device(UCLASS_I2C_EMUL, &eeprom)); ut_assertok(uclass_first_device_err(UCLASS_I2C_EMUL, &eeprom));
/* Offset length 0 */ /* Offset length 0 */
sandbox_i2c_eeprom_set_offset_len(eeprom, 0); sandbox_i2c_eeprom_set_offset_len(eeprom, 0);
@ -250,7 +250,7 @@ static int dm_test_i2c_addr_offset(struct unit_test_state *uts)
/* Do a transfer so we can find the emulator */ /* Do a transfer so we can find the emulator */
ut_assertok(dm_i2c_read(dev, 0, buf, 5)); ut_assertok(dm_i2c_read(dev, 0, buf, 5));
ut_assertok(uclass_first_device(UCLASS_I2C_EMUL, &eeprom)); ut_assertok(uclass_first_device_err(UCLASS_I2C_EMUL, &eeprom));
/* Offset length 0 */ /* Offset length 0 */
sandbox_i2c_eeprom_set_offset_len(eeprom, 0); sandbox_i2c_eeprom_set_offset_len(eeprom, 0);
@ -315,7 +315,7 @@ static int dm_test_i2c_reg_clrset(struct unit_test_state *uts)
/* Do a transfer so we can find the emulator */ /* Do a transfer so we can find the emulator */
ut_assertok(dm_i2c_read(dev, 0, buf, 5)); ut_assertok(dm_i2c_read(dev, 0, buf, 5));
ut_assertok(uclass_first_device(UCLASS_I2C_EMUL, &eeprom)); ut_assertok(uclass_first_device_err(UCLASS_I2C_EMUL, &eeprom));
/* Dummy data for the test */ /* Dummy data for the test */
ut_assertok(dm_i2c_write(dev, 0, "\xff\x00\xff\x00\x10", 5)); ut_assertok(dm_i2c_write(dev, 0, "\xff\x00\xff\x00\x10", 5));

View File

@ -22,7 +22,7 @@ static int dm_test_virtio_base(struct unit_test_state *uts)
u8 status; u8 status;
/* check probe success */ /* check probe success */
ut_assertok(uclass_first_device(UCLASS_VIRTIO, &bus)); ut_assertok(uclass_first_device_err(UCLASS_VIRTIO, &bus));
ut_assertnonnull(bus); ut_assertnonnull(bus);
/* check the child virtio-rng device is bound */ /* check the child virtio-rng device is bound */
@ -60,7 +60,7 @@ static int dm_test_virtio_all_ops(struct unit_test_state *uts)
struct virtqueue *vqs[2]; struct virtqueue *vqs[2];
/* check probe success */ /* check probe success */
ut_assertok(uclass_first_device(UCLASS_VIRTIO, &bus)); ut_assertok(uclass_first_device_err(UCLASS_VIRTIO, &bus));
ut_assertnonnull(bus); ut_assertnonnull(bus);
/* check the child virtio-rng device is bound */ /* check the child virtio-rng device is bound */
@ -102,7 +102,7 @@ static int dm_test_virtio_remove(struct unit_test_state *uts)
struct udevice *bus, *dev; struct udevice *bus, *dev;
/* check probe success */ /* check probe success */
ut_assertok(uclass_first_device(UCLASS_VIRTIO, &bus)); ut_assertok(uclass_first_device_err(UCLASS_VIRTIO, &bus));
ut_assertnonnull(bus); ut_assertnonnull(bus);
/* check the child virtio-rng device is bound */ /* check the child virtio-rng device is bound */
@ -134,7 +134,7 @@ static int dm_test_virtio_ring(struct unit_test_state *uts)
u8 buffer[2][32]; u8 buffer[2][32];
/* check probe success */ /* check probe success */
ut_assertok(uclass_first_device(UCLASS_VIRTIO, &bus)); ut_assertok(uclass_first_device_err(UCLASS_VIRTIO, &bus));
ut_assertnonnull(bus); ut_assertnonnull(bus);
/* check the child virtio-blk device is bound */ /* check the child virtio-blk device is bound */

View File

@ -28,7 +28,7 @@ static int dm_test_virtio_rng_check_len(struct unit_test_state *uts)
u8 buffer[16]; u8 buffer[16];
/* check probe success */ /* check probe success */
ut_assertok(uclass_first_device(UCLASS_VIRTIO, &bus)); ut_assertok(uclass_first_device_err(UCLASS_VIRTIO, &bus));
ut_assertnonnull(bus); ut_assertnonnull(bus);
/* check the child virtio-rng device is bound */ /* check the child virtio-rng device is bound */

View File

@ -29,7 +29,7 @@ static struct udevice *find_fuzzing_engine(void)
{ {
struct udevice *dev; struct udevice *dev;
if (uclass_first_device(UCLASS_FUZZING_ENGINE, &dev)) if (uclass_first_device_err(UCLASS_FUZZING_ENGINE, &dev))
return NULL; return NULL;
return dev; return dev;

View File

@ -30,7 +30,7 @@ static int fuzz_vring(const uint8_t *data, size_t size)
return 0; return 0;
/* check probe success */ /* check probe success */
if (uclass_first_device(UCLASS_VIRTIO, &bus) || !bus) if (uclass_first_device_err(UCLASS_VIRTIO, &bus))
panic("Could not find virtio bus\n"); panic("Could not find virtio bus\n");
/* check the child virtio-rng device is bound */ /* check the child virtio-rng device is bound */