[COMMON] i2c: exynos5: Fix possible ABBA deadlock by keeping I2C clock prepared
authorYoungmin Nam <youngmin.nam@samsung.com>
Tue, 14 Jun 2016 11:48:09 +0000 (20:48 +0900)
committermyung-su.cha <myung-su.cha@samsung.com>
Wed, 9 May 2018 12:14:45 +0000 (21:14 +0900)
commit8e66e2a8d88a60dea1e9f50140ba6f0495e4cde7
treeba442620249aa599931eedd37dc77f58e18ff30c
parent16bea57469426856dddaba62e1e70b94d8d48221
[COMMON] i2c: exynos5: Fix possible ABBA deadlock by keeping I2C clock prepared

This patch came from commit "3b566a5c38b7311a545ac536a3b43944153918d2"

---------------------------------------------------------------------
commit 10ff4c5239a137abfc896ec73ef3d15a0f86a16a upstream.

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 34e81ad5f0b6 ("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.
--------------------------------------------------------------------

This patch is similar to commit "3b566a5c38b7311a545ac536a3b43944153918d2"
to apply current exynos5 hsi2c driver.

Change-Id: Iefc7a31e2c2db1e3f539654aa609aa6a8ed4cbfe
Signed-off-by: Youngmin Nam <youngmin.nam@samsung.com>
drivers/i2c/busses/i2c-exynos5.c