• Hans de Goede's avatar
    i2c: core: Setup i2c_adapter runtime-pm before calling device_add() · 60f68597
    Hans de Goede authored
    Platform glue code, which is not build into the kernel and thus cannot
    use i2c_register_board_info() may want to use bus_register_notifier()
    to listen for i2c-adapters to show up on which the platform code needs
    to manually instantiate platform specific i2c_clients.
    
    This results in calling i2c_new_client_device() from the bus notifier
    which happens near the device_add() call.
    
    If the i2c-core has not yet setup runtime-pm (specifically the
    no-callbacks and ignore-children flags) for the device embedded
    inside struct i2c_adapter and the driver for the i2c_client
    calls pm_runtime_set_active() this will trigger the following
    error inside __pm_runtime_set_status():
    
    "runtime PM trying to activate child device %s but parent (%s) is not active\n"
    
    and the i2c_client's runtime-status will not be updated.
    
    Split the device_register() call for the adapter into device_initialize()
    and device_add() and move the pm-runtime init calls inbetween these 2 calls
    so that the runtime-status can be correctly set when a driver binds from
    the bus-notifier.
    
    Note the moved pm-runtime init calls just override the initial value of
    some flags in struct device set by device_initialize() and calling these
    before device_add() is safe.
    Reviewed-by: default avatarPali Rohár <pali@kernel.org>
    Reviewed-by: default avatarAndi Shyti <andi.shyti@kernel.org>
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    Acked-by: default avatarWolfram Sang <wsa+renesas@sang-engineering.com>
    Signed-off-by: default avatarAndi Shyti <andi.shyti@kernel.org>
    60f68597
i2c-core-base.c 72.6 KB