dm: treewide: Use uclass_first_device_err when accessing one device
authorMichal Suchanek <msuchanek@suse.de>
Wed, 12 Oct 2022 19:57:59 +0000 (21:57 +0200)
committerSimon Glass <sjg@chromium.org>
Tue, 18 Oct 2022 03:17:12 +0000 (21:17 -0600)
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>
25 files changed:
arch/arm/mach-omap2/am33xx/board.c
arch/x86/cpu/broadwell/cpu.c
arch/x86/cpu/intel_common/cpu.c
arch/x86/lib/pinctrl_ich6.c
board/intel/cougarcanyon2/cougarcanyon2.c
drivers/mmc/omap_hsmmc.c
drivers/serial/serial-uclass.c
drivers/serial/serial_bcm283x_mu.c
drivers/serial/serial_bcm283x_pl011.c
drivers/sysreset/sysreset_ast.c
drivers/video/exynos/exynos_fb.c
drivers/video/mali_dp.c
drivers/video/stm32/stm32_dsi.c
drivers/video/tegra124/dp.c
lib/acpi/acpi_table.c
lib/efi_loader/efi_gop.c
net/eth-uclass.c
test/boot/bootmeth.c
test/dm/acpi.c
test/dm/devres.c
test/dm/i2c.c
test/dm/virtio_device.c
test/dm/virtio_rng.c
test/fuzz/cmd_fuzz.c
test/fuzz/virtio.c

index 7f1b84e..f393ff9 100644 (file)
@@ -265,8 +265,8 @@ int arch_misc_init(void)
        struct udevice *dev;
        int ret;
 
-       ret = uclass_first_device(UCLASS_MISC, &dev);
-       if (ret || !dev)
+       ret = uclass_first_device_err(UCLASS_MISC, &dev);
+       if (ret)
                return ret;
 
 #if defined(CONFIG_DM_ETH) && defined(CONFIG_USB_ETHER)
index 2adcf4b..7877961 100644 (file)
@@ -31,11 +31,9 @@ static int broadwell_init_cpu(void *ctx, struct event *event)
        int ret;
 
        /* 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)
                return ret;
-       if (!dev)
-               return -ENODEV;
        ret = cpu_set_flex_ratio_to_tdp_nominal();
        if (ret)
                return ret;
index 96d05e2..8f489e6 100644 (file)
@@ -61,11 +61,9 @@ int cpu_common_init(void)
        /* Early chipset init required before RAM init can work */
        uclass_first_device(UCLASS_NORTHBRIDGE, &dev);
 
-       ret = uclass_first_device(UCLASS_LPC, &lpc);
+       ret = uclass_first_device_err(UCLASS_LPC, &lpc);
        if (ret)
                return ret;
-       if (!lpc)
-               return -ENODEV;
 
        /* Cause the SATA device to do its early init */
        uclass_first_device(UCLASS_AHCI, &dev);
index fd5e311..c93f245 100644 (file)
@@ -160,11 +160,9 @@ static int ich6_pinctrl_probe(struct udevice *dev)
        u32 iobase = -1;
 
        debug("%s: start\n", __func__);
-       ret = uclass_first_device(UCLASS_PCH, &pch);
+       ret = uclass_first_device_err(UCLASS_PCH, &pch);
        if (ret)
                return ret;
-       if (!pch)
-               return -ENODEV;
 
        /*
         * Get the memory/io base address to configure every pins.
index ce11eae..7f61ef8 100644 (file)
@@ -21,11 +21,9 @@ int board_early_init_f(void)
        struct udevice *pch;
        int ret;
 
-       ret = uclass_first_device(UCLASS_PCH, &pch);
+       ret = uclass_first_device_err(UCLASS_PCH, &pch);
        if (ret)
                return ret;
-       if (!pch)
-               return -ENODEV;
 
        /* Initialize LPC interface to turn on superio chipset decode range */
        dm_pci_write_config16(pch, LPC_IO_DEC, COMA_DEC_RANGE | COMB_DEC_RANGE);
index b2f4a4e..a2595d1 100644 (file)
@@ -644,7 +644,7 @@ static int omap_hsmmc_execute_tuning(struct udevice *dev, uint opcode)
              ((mmc->selected_mode == UHS_SDR50) && (val & CAPA2_TSDR50))))
                return 0;
 
-       ret = uclass_first_device(UCLASS_THERMAL, &thermal_dev);
+       ret = uclass_first_device_err(UCLASS_THERMAL, &thermal_dev);
        if (ret) {
                printf("Couldn't get thermal device for tuning\n");
                return ret;
index da3e1eb..83cda1f 100644 (file)
@@ -143,7 +143,7 @@ static void serial_find_console_or_panic(void)
 #else
                if (!uclass_get_device_by_seq(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;
                        return;
                }
index 493a42b..12cbcb9 100644 (file)
@@ -147,7 +147,7 @@ static bool bcm283x_is_serial_muxed(void)
        int serial_gpio = 15;
        struct udevice *dev;
 
-       if (uclass_first_device(UCLASS_PINCTRL, &dev) || !dev)
+       if (uclass_first_device_err(UCLASS_PINCTRL, &dev))
                return false;
 
        if (pinctrl_get_gpio_mux(dev, 0, serial_gpio) != BCM2835_GPIO_ALT5)
index fe74629..7d172cd 100644 (file)
@@ -24,7 +24,7 @@ static bool bcm283x_is_serial_muxed(void)
        int serial_gpio = 15;
        struct udevice *dev;
 
-       if (uclass_first_device(UCLASS_PINCTRL, &dev) || !dev)
+       if (uclass_first_device_err(UCLASS_PINCTRL, &dev))
                return false;
 
        if (pinctrl_get_gpio_mux(dev, 0, serial_gpio) != BCM2835_GPIO_ALT0)
index d747ed0..92fad96 100644 (file)
@@ -18,7 +18,7 @@ static int ast_sysreset_request(struct udevice *dev, enum sysreset_t type)
 {
        struct udevice *wdt;
        u32 reset_mode;
-       int ret = uclass_first_device(UCLASS_WDT, &wdt);
+       int ret = uclass_first_device_err(UCLASS_WDT, &wdt);
 
        if (ret)
                return ret;
index 69992b3..86970a6 100644 (file)
@@ -640,25 +640,17 @@ static int exynos_fb_probe(struct udevice *dev)
 #endif
        exynos_fimd_lcd_init(dev);
 
-       ret = uclass_first_device(UCLASS_PANEL, &panel);
+       ret = uclass_first_device_err(UCLASS_PANEL, &panel);
        if (ret) {
-               printf("LCD panel failed to probe\n");
+               printf("%s: LCD panel failed to probe %d\n", __func__, 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) {
                debug("%s: Display device error %d\n", __func__, ret);
                return ret;
        }
-       if (!dev) {
-               debug("%s: Display device missing\n", __func__);
-               return -ENODEV;
-       }
        ret = display_enable(dp, 18, NULL);
        if (ret) {
                debug("%s: Display enable error %d\n", __func__, ret);
index ba1ddd6..cbcdb99 100644 (file)
@@ -244,7 +244,7 @@ static int malidp_update_timings_from_edid(struct udevice *dev,
        struct udevice *disp_dev;
        int err;
 
-       err = uclass_first_device(UCLASS_DISPLAY, &disp_dev);
+       err = uclass_first_device_err(UCLASS_DISPLAY, &disp_dev);
        if (err)
                return err;
 
index 5871ac7..e6347bb 100644 (file)
@@ -346,7 +346,7 @@ static int stm32_dsi_attach(struct udevice *dev)
        struct display_timing timings;
        int ret;
 
-       ret = uclass_first_device(UCLASS_PANEL, &priv->panel);
+       ret = uclass_first_device_err(UCLASS_PANEL, &priv->panel);
        if (ret) {
                dev_err(dev, "panel device error %d\n", ret);
                return ret;
index ee4f09a..b27b163 100644 (file)
@@ -1494,8 +1494,8 @@ int tegra_dp_enable(struct udevice *dev, int panel_bpp,
                return -ENOLINK;
        }
 
-       ret = uclass_first_device(UCLASS_VIDEO_BRIDGE, &sor);
-       if (ret || !sor) {
+       ret = uclass_first_device_err(UCLASS_VIDEO_BRIDGE, &sor);
+       if (ret) {
                debug("dp: failed to find SOR device: ret=%d\n", ret);
                return ret;
        }
index f8642f9..7c4189e 100644 (file)
@@ -40,7 +40,7 @@ int acpi_create_dmar(struct acpi_dmar *dmar, enum dmar_flags flags)
        struct udevice *cpu;
        int ret;
 
-       ret = uclass_first_device(UCLASS_CPU, &cpu);
+       ret = uclass_first_device_err(UCLASS_CPU, &cpu);
        if (ret)
                return log_msg_ret("cpu", ret);
        ret = cpu_get_info(cpu, &info);
index 5908b5c..20bd7ff 100644 (file)
@@ -482,7 +482,7 @@ efi_status_t efi_gop_register(void)
        struct video_priv *priv;
 
        /* 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");
                return EFI_SUCCESS;
        }
index 0f6b45b..8c3f9cc 100644 (file)
@@ -91,8 +91,8 @@ struct udevice *eth_get_dev(void)
                eth_errno = uclass_get_device_by_seq(UCLASS_ETH, 0,
                                                     &uc_priv->current);
                if (eth_errno)
-                       eth_errno = uclass_first_device(UCLASS_ETH,
-                                                       &uc_priv->current);
+                       eth_errno = uclass_first_device_err(UCLASS_ETH,
+                                                           &uc_priv->current);
        }
        return uc_priv->current;
 }
index fb62731..f0b5ab9 100644 (file)
@@ -156,7 +156,7 @@ static int bootmeth_state(struct unit_test_state *uts)
        struct udevice *dev;
        char buf[50];
 
-       ut_assertok(uclass_first_device(UCLASS_BOOTMETH, &dev));
+       ut_assertok(uclass_first_device_err(UCLASS_BOOTMETH, &dev));
        ut_assertnonnull(dev);
 
        ut_assertok(bootmeth_get_state_desc(dev, buf, sizeof(buf)));
index edad913..9634fc2 100644 (file)
@@ -169,28 +169,28 @@ static int dm_test_acpi_get_name(struct unit_test_state *uts)
        ut_asserteq_str("GHIJ", 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_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_asserteq_str("SPI0", name);
 
        /* 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));
 
        /* 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_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_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_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 udevice *cpu;
 
-       ut_assertok(uclass_first_device(UCLASS_CPU, &cpu));
+       ut_assertok(uclass_first_device_err(UCLASS_CPU, &cpu));
        ut_assertnonnull(cpu);
        ut_assertok(acpi_create_dmar(&dmar, DMAR_INTR_REMAP));
        ut_asserteq(DMAR_INTR_REMAP, dmar.flags);
index 524114c..3df0f64 100644 (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);
 
        /* Probing the device should add one allocation */
-       ut_assertok(uclass_first_device(UCLASS_TEST_DEVRES, &dev));
-       ut_assert(dev != NULL);
+       ut_assertok(uclass_first_device_err(UCLASS_TEST_DEVRES, &dev));
+       ut_assertnonnull(dev);
        devres_get_stats(dev, &stats);
        ut_asserteq(3, stats.allocs);
        ut_asserteq(TEST_DEVRES_SIZE + TEST_DEVRES_SIZE2 + TEST_DEVRES_SIZE3,
index 74b2097..b46a22e 100644 (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));
 
        /* 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);
        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 */
        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 */
        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 */
        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 */
        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 */
        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 */
        ut_assertok(dm_i2c_write(dev, 0, "\xff\x00\xff\x00\x10", 5));
index d0195e6..b5c4523 100644 (file)
@@ -22,7 +22,7 @@ static int dm_test_virtio_base(struct unit_test_state *uts)
        u8 status;
 
        /* check probe success */
-       ut_assertok(uclass_first_device(UCLASS_VIRTIO, &bus));
+       ut_assertok(uclass_first_device_err(UCLASS_VIRTIO, &bus));
        ut_assertnonnull(bus);
 
        /* 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];
 
        /* check probe success */
-       ut_assertok(uclass_first_device(UCLASS_VIRTIO, &bus));
+       ut_assertok(uclass_first_device_err(UCLASS_VIRTIO, &bus));
        ut_assertnonnull(bus);
 
        /* 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;
 
        /* check probe success */
-       ut_assertok(uclass_first_device(UCLASS_VIRTIO, &bus));
+       ut_assertok(uclass_first_device_err(UCLASS_VIRTIO, &bus));
        ut_assertnonnull(bus);
 
        /* 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];
 
        /* check probe success */
-       ut_assertok(uclass_first_device(UCLASS_VIRTIO, &bus));
+       ut_assertok(uclass_first_device_err(UCLASS_VIRTIO, &bus));
        ut_assertnonnull(bus);
 
        /* check the child virtio-blk device is bound */
index ff5646b..8b9a04b 100644 (file)
@@ -28,7 +28,7 @@ static int dm_test_virtio_rng_check_len(struct unit_test_state *uts)
        u8 buffer[16];
 
        /* check probe success */
-       ut_assertok(uclass_first_device(UCLASS_VIRTIO, &bus));
+       ut_assertok(uclass_first_device_err(UCLASS_VIRTIO, &bus));
        ut_assertnonnull(bus);
 
        /* check the child virtio-rng device is bound */
index 0cc01dc..e2f44f3 100644 (file)
@@ -29,7 +29,7 @@ static struct udevice *find_fuzzing_engine(void)
 {
        struct udevice *dev;
 
-       if (uclass_first_device(UCLASS_FUZZING_ENGINE, &dev))
+       if (uclass_first_device_err(UCLASS_FUZZING_ENGINE, &dev))
                return NULL;
 
        return dev;
index e5363d5..8a47667 100644 (file)
@@ -30,7 +30,7 @@ static int fuzz_vring(const uint8_t *data, size_t size)
                return 0;
 
        /* 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");
 
        /* check the child virtio-rng device is bound */