Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[PATCH] i2c: Re-instate body of i2c_parent_is_i2c_adapter()

3 views
Skip to first unread message

Stephen Warren

unread,
Jan 13, 2014, 4:30:01 PM1/13/14
to
From: Stephen Warren <swa...@nvidia.com>

The body of i2c_parent_is_i2c_adapter() is currently guarded by
CONFIG_I2C_MUX instead.

Among potentially other problems, this resulted in i2c_lock_adapter()
only locking I2C mux child adapters, and not the parent adapter. In
turn, this could allow inter-mingling of mux child selection and I2C
transactions, which could result in I2C transactions being directed to
the wrong I2C bus, and possibly even switching between busses in the
middle of a transaction.

One concrete issue caused by this bug was corrupted HDMI EDID reads
during boot on the NVIDIA Tegra Seaboard system, although this only
became apparent in recent linux-next, when the boot timing was changed
just enough to trigger the race condition.

Fixes: 3923172b3d70 ("i2c: reduce parent checking to a NOOP in non-I2C_MUX case")
Cc: Phil Carmody <phil.c...@partner.samsung.com>
Cc: <sta...@vger.kernel.org>
Signed-off-by: Stephen Warren <swa...@nvidia.com>
---
include/linux/i2c.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/linux/i2c.h b/include/linux/i2c.h
index eff50e062be8..d9c8dbd3373f 100644
--- a/include/linux/i2c.h
+++ b/include/linux/i2c.h
@@ -445,7 +445,7 @@ static inline void i2c_set_adapdata(struct i2c_adapter *dev, void *data)
static inline struct i2c_adapter *
i2c_parent_is_i2c_adapter(const struct i2c_adapter *adapter)
{
-#if IS_ENABLED(I2C_MUX)
+#if IS_ENABLED(CONFIG_I2C_MUX)
struct device *parent = adapter->dev.parent;

if (parent != NULL && parent->type == &i2c_adapter_type)
--
1.8.1.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majo...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

Wolfram Sang

unread,
Jan 14, 2014, 11:20:01 AM1/14/14
to
On Mon, Jan 13, 2014 at 02:29:04PM -0700, Stephen Warren wrote:
> From: Stephen Warren <swa...@nvidia.com>
>
> The body of i2c_parent_is_i2c_adapter() is currently guarded by
> CONFIG_I2C_MUX instead.

This paragraph sounds strange to me. I'll update it a little. After that
I'll go looking for a brown paper bag...

> Among potentially other problems, this resulted in i2c_lock_adapter()
> only locking I2C mux child adapters, and not the parent adapter. In
> turn, this could allow inter-mingling of mux child selection and I2C
> transactions, which could result in I2C transactions being directed to
> the wrong I2C bus, and possibly even switching between busses in the
> middle of a transaction.
>
> One concrete issue caused by this bug was corrupted HDMI EDID reads
> during boot on the NVIDIA Tegra Seaboard system, although this only
> became apparent in recent linux-next, when the boot timing was changed
> just enough to trigger the race condition.
>
> Fixes: 3923172b3d70 ("i2c: reduce parent checking to a NOOP in non-I2C_MUX case")
> Cc: Phil Carmody <phil.c...@partner.samsung.com>
> Cc: <sta...@vger.kernel.org>
> Signed-off-by: Stephen Warren <swa...@nvidia.com>

Applied to for-current, thanks for catching this one!

signature.asc

Stephen Warren

unread,
Jan 16, 2014, 12:30:02 PM1/16/14
to
I do see this in for-current, but it looks like that branch isn't part
of linux-next. Should it be, or perhaps for-current should be merged
into for-next?

Wolfram Sang

unread,
Jan 16, 2014, 1:10:02 PM1/16/14
to
> I do see this in for-current, but it looks like that branch isn't part
> of linux-next. Should it be, or perhaps for-current should be merged
> into for-next?

It is upstream already.

signature.asc
0 new messages