• Javier Martinez Canillas's avatar
    i2c: exynos5: Fix possible ABBA deadlock by keeping I2C clock prepared · 10ff4c52
    Javier Martinez Canillas authored
    The exynos5 I2C controller driver always prepares and enables a clock
    before using it and then disables unprepares it when the clock is not
    used anymore.
    
    But this can cause a possible ABBA deadlock in some scenarios since a
    driver that uses regmap to access its I2C registers, will first grab
    the regmap lock and then the I2C xfer function will grab the prepare
    lock when preparing the I2C clock. But since the clock driver also
    uses regmap for I2C accesses, preparing a clock will first grab the
    prepare lock and then the regmap lock when using the regmap API.
    
    An example of this happens on the Exynos5422 Odroid XU4 board where a
    s2mps11 PMIC is used and both the s2mps11 regulators and clk drivers
    share the same I2C regmap.
    
    The possible deadlock is reported by the kernel lockdep:
    
      Possible unsafe locking scenario:
    
            CPU0                    CPU1
            ----                    ----
       lock(sec_core:428:(regmap)->lock);
                                    lock(prepare_lock);
                                    lock(sec_core:428:(regmap)->lock);
       lock(prepare_lock);
    
      *** DEADLOCK ***
    
    Fix it by leaving the code prepared on probe and use {en,dis}able in
    the I2C transfer function.
    
    This patch is similar to commit 34e81ad5 ("i2c: s3c2410: fix ABBA
    deadlock by keeping clock prepared") that fixes the same bug in other
    driver for an I2C controller found in Samsung SoCs.
    Reported-by: default avatarAnand Moon <linux.amoon@gmail.com>
    Signed-off-by: default avatarJavier Martinez Canillas <javier@osg.samsung.com>
    Reviewed-by: default avatarAnand Moon <linux.amoon@gmail.com>
    Reviewed-by: default avatarKrzysztof Kozlowski <k.kozlowski@samsung.com>
    Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
    Cc: stable@kernel.org
    10ff4c52
i2c-exynos5.c 22.9 KB