• Chen-Yu Tsai's avatar
    platform/chrome: cros_ec: Use per-device lockdep key · 961a325b
    Chen-Yu Tsai authored
    Lockdep reports a bogus possible deadlock on MT8192 Chromebooks due to
    the following lock sequences:
    
    1. lock(i2c_register_adapter) [1]; lock(&ec_dev->lock)
    2. lock(&ec_dev->lock); lock(prepare_lock);
    
    The actual dependency chains are much longer. The shortened version
    looks somewhat like:
    
    1. cros-ec-rpmsg on mtk-scp
       ec_dev->lock -> prepare_lock
    2. In rt5682_i2c_probe() on native I2C bus:
       prepare_lock -> regmap->lock -> (possibly) i2c_adapter->bus_lock
    3. In rt5682_i2c_probe() on native I2C bus:
       regmap->lock -> i2c_adapter->bus_lock
    4. In sbs_probe() on i2c-cros-ec-tunnel I2C bus attached on cros-ec:
       i2c_adapter->bus_lock -> ec_dev->lock
    
    While lockdep is correct that the shared lockdep classes have a circular
    dependency, it is bogus because
    
      a) 2+3 happen on a native I2C bus
      b) 4 happens on the actual EC on ChromeOS devices
      c) 1 happens on the SCP coprocessor on MediaTek Chromebooks that just
         happens to expose a cros-ec interface, but does not have an
         i2c-cros-ec-tunnel I2C bus
    
    In short, the "dependencies" are actually on different devices.
    
    Setup a per-device lockdep key for cros_ec devices so lockdep can tell
    the two instances apart. This helps with getting rid of the bogus
    lockdep warning. For ChromeOS devices that only have one cros-ec
    instance this doesn't change anything.
    
    Also add a missing mutex_destroy, just to make the teardown complete.
    
    [1] This is likely the per I2C bus lock with shared lockdep class
    Signed-off-by: default avatarChen-Yu Tsai <wenst@chromium.org>
    Signed-off-by: default avatarTzung-Bi Shih <tzungbi@kernel.org>
    Link: https://lore.kernel.org/r/20230111074146.2624496-1-wenst@chromium.org
    961a325b
cros_ec_proto.h 9.79 KB