Skip to content

Commit e8acd2d

Browse files
jwrdegoedeBartosz Golaszewski
authored andcommitted
gpiolib: Fix triggering "kobject: 'gpiochipX' is not initialized, yet" kobject_get() errors
When a gpiochip gets added by loading a module, then another driver may be waiting for that gpiochip to load on the deferred-probe list. If the deferred-probe for the consumer of gpiochip then triggers between the gpiodev_add_to_list_unlocked() calls which makes gpio_device_find() see the chip and the gpiochip_setup_dev() later then gpio_device_find() does a kobject_get() on an uninitialized kobject since the kobject is initialized by gpiochip_setup_dev() calling device_initialize(): arizona spi-10WM5102:00: cannot find GPIO chip arizona, deferring arizona spi-10WM5102:00: cannot find GPIO chip arizona, deferring ------------[ cut here ]------------ kobject: 'gpiochip5' (00000000241466f2): is not initialized, yet kobject_get() is being called. WARNING: CPU: 3 PID: 42 at lib/kobject.c:640 kobject_get+0x43/0x70 Call Trace: kobject_get gpio_device_find gpiod_find_and_request gpiod_get snd_byt_wm5102_mc_probe Not only is the device not initialized yet, but when the gpio-device is added to the list things like the irqchip also have not been initialized yet. So gpio_device_find() should really ignore the gpio-device until gpiochip_add_data_with_key() is fully done. Add a device_is_registered() check to gpio_device_find() to ignore gpio-devices on the list which are not yet fully initialized. Fixes: aab5c6f ("gpio: set device type for GPIO chips") Suggested-by: Bartosz Golaszewski <[email protected]> Signed-off-by: Hans de Goede <[email protected]> Reviewed-by: Andy Shevchenko <[email protected]> [Bartosz: fix a typo in commit message] Signed-off-by: Bartosz Golaszewski <[email protected]>
1 parent 39cd87c commit e8acd2d

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

drivers/gpio/gpiolib.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1175,6 +1175,9 @@ struct gpio_device *gpio_device_find(const void *data,
11751175

11761176
list_for_each_entry_srcu(gdev, &gpio_devices, list,
11771177
srcu_read_lock_held(&gpio_devices_srcu)) {
1178+
if (!device_is_registered(&gdev->dev))
1179+
continue;
1180+
11781181
guard(srcu)(&gdev->srcu);
11791182

11801183
gc = srcu_dereference(gdev->chip, &gdev->srcu);

0 commit comments

Comments
 (0)