• Hans de Goede's avatar
    gpiolib: Fix triggering "kobject: 'gpiochipX' is not initialized, yet" kobject_get() errors · e8acd2d2
    Hans de Goede authored
    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: aab5c6f2 ("gpio: set device type for GPIO chips")
    Suggested-by: default avatarBartosz Golaszewski <brgl@bgdev.pl>
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    Reviewed-by: default avatarAndy Shevchenko <andy@kernel.org>
    [Bartosz: fix a typo in commit message]
    Signed-off-by: default avatarBartosz Golaszewski <bartosz.golaszewski@linaro.org>
    e8acd2d2
gpiolib.c 131 KB