• Jarkko Nikula's avatar
    i2c: designware: Prevent runtime suspend during adapter registration · cd998ded
    Jarkko Nikula authored
    There can be unnecessary runtime suspend-resume cycle during
    i2c-designware-platdrv probe when it registers the I2C adapter device. This
    happens because i2c-designware-platdrv is set to initially active platform
    device in its probe function and is a parent of I2C adapter.
    
    In that case power.usage_count of i2c-designware device is zero and
    pm_runtime_get()/pm_runtime_put() cycle during probe could put it into
    runtime suspend. This happens when the i2c_register_adapter() calls the
    device_register():
    
    i2c_register_adapter
      device_register
        device_add
          bus_probe_device
            device_initial_probe
              __device_attach
                if (dev->parent) pm_runtime_get_sync(dev->parent)
                ...
                if (dev->parent) pm_runtime_put(dev->parent)
    
    After that the i2c_register_adapter() continues registering I2C slave
    devices. In case slave device probe does I2C transfers the parent will
    resume again and thus get a needless runtime suspend/resume cycle during
    adapter registration.
    
    Prevent this while retaining the runtime PM status of i2c-designware by
    only incrementing/decrementing device power usage count during I2C
    adapter registration. That makes sure there won't be spurious runtime PM
    status changes and lets the driver core to idle the device after probe
    finishes.
    Signed-off-by: default avatarJarkko Nikula <jarkko.nikula@linux.intel.com>
    Acked-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
    Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
    cd998ded
i2c-designware-core.c 23.6 KB