• B
    gpio: pca953x: fix an incorrect lockdep warning · 559b4699
    Bartosz Golaszewski 提交于
    If an I2C GPIO multiplexer is driven by a GPIO provided by an expander
    when there's a second expander using the same device driver on one of
    the I2C bus segments, lockdep prints a deadlock warning when trying to
    set the direction or the value of the GPIOs provided by the second
    expander.
    
    The below diagram presents the setup:
    
                                                   - - - - -
     -------             ---------  Bus segment 1 |         |
    |       |           |         |---------------  Devices
    |       | SCL/SDA   |         |               |         |
    | Linux |-----------| I2C MUX |                - - - - -
    |       |    |      |         | Bus segment 2
    |       |    |      |         |-------------------
     -------     |       ---------                    |
                 |           |                    - - - - -
            ------------     | MUX GPIO          |         |
           |            |    |                     Devices
           |    GPIO    |    |                   |         |
           | Expander 1 |----                     - - - - -
           |            |                             |
            ------------                              | SCL/SDA
                                                      |
                                                 ------------
                                                |            |
                                                |    GPIO    |
                                                | Expander 2 |
                                                |            |
                                                 ------------
    
    The reason for lockdep warning is that we take the chip->i2c_lock in
    pca953x_gpio_set_value() or pca953x_gpio_direction_output() and then
    come right back to pca953x_gpio_set_value() when the GPIO mux kicks
    in. The locks actually protect different expanders, but for lockdep
    both are of the same class, so it says:
    
      Possible unsafe locking scenario:
    
            CPU0
            ----
       lock(&chip->i2c_lock);
       lock(&chip->i2c_lock);
    
      *** DEADLOCK ***
    
      May be due to missing lock nesting notation
    
    In order to get rid of the warning, retrieve the adapter nesting depth
    and use it as lockdep subclass for chip->i2c_lock.
    Signed-off-by: NBartosz Golaszewski <bgolaszewski@baylibre.com>
    Acked-by: NPeter Rosin <peda@axentia.se>
    Acked-by: NPeter Zijlstra (Intel) <peterz@infradead.org>
    Acked-by: NLinus Walleij <linus.walleij@linaro.org>
    Signed-off-by: NWolfram Sang <wsa@the-dreams.de>
    559b4699
gpio-pca953x.c 22.4 KB