i2c: designware: Prevent runtime suspend during adapter registration
authorJarkko Nikula <jarkko.nikula@linux.intel.com>
Thu, 11 Feb 2016 14:36:03 +0000 (16:36 +0200)
committerWolfram Sang <wsa@the-dreams.de>
Fri, 12 Feb 2016 19:40:14 +0000 (20:40 +0100)
commitcd998ded5c1295c690285c04a6ef8bc014d14234
treec5be566ab9a77663b5dbb770c752631980f359ed
parent942ab128eacf092e4276919c25317defcd11e6fb
i2c: designware: Prevent runtime suspend during adapter registration

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: Jarkko Nikula <jarkko.nikula@linux.intel.com>
Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
drivers/i2c/busses/i2c-designware-core.c
This page took 0.024313 seconds and 5 git commands to generate.