Commit 5347a020 authored by Marek Vasut's avatar Marek Vasut Committed by Simon Horman

ARM: shmobile: Fix R-Car Gen2 regulator quirk

The quirk code currently detects all compatible I2C chips with a shared
IRQ line on all I2C busses, adds them into a list, and registers a bus
notifier. For every chip for which the bus notifier triggers, the quirk
code performs I2C transfer on that I2C bus for all addresses in the list.
The problem is that this may generate transfers to non-existing chips on
systems with multiple I2C busses.

This patch adds a check to verify that the I2C bus to which the chip with
shared IRQ is attached to matches the I2C bus of the chip which triggered
the bus notifier and only starts the I2C transfer if they match.
Signed-off-by: 's avatarMarek Vasut <>
Tested-by: 's avatarNguyen Viet Dung <>
Signed-off-by: 's avatarSimon Horman <>
parent 8d22020a
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
struct regulator_quirk { struct regulator_quirk {
struct list_head list; struct list_head list;
const struct of_device_id *id; const struct of_device_id *id;
struct device_node *np;
struct of_phandle_args irq_args; struct of_phandle_args irq_args;
struct i2c_msg i2c_msg; struct i2c_msg i2c_msg;
bool shared; /* IRQ line is shared */ bool shared; /* IRQ line is shared */
...@@ -101,6 +102,9 @@ static int regulator_quirk_notify(struct notifier_block *nb, ...@@ -101,6 +102,9 @@ static int regulator_quirk_notify(struct notifier_block *nb,
if (!pos->shared) if (!pos->shared)
continue; continue;
if (pos->np->parent != client->dev.parent->of_node)
dev_info(&client->dev, "clearing %s@0x%02x interrupts\n", dev_info(&client->dev, "clearing %s@0x%02x interrupts\n",
pos->id->compatible, pos->i2c_msg.addr); pos->id->compatible, pos->i2c_msg.addr);
...@@ -165,6 +169,7 @@ static int __init rcar_gen2_regulator_quirk(void) ...@@ -165,6 +169,7 @@ static int __init rcar_gen2_regulator_quirk(void)
memcpy(&quirk->i2c_msg, id->data, sizeof(quirk->i2c_msg)); memcpy(&quirk->i2c_msg, id->data, sizeof(quirk->i2c_msg));
quirk->id = id; quirk->id = id;
quirk->np = np;
quirk->i2c_msg.addr = addr; quirk->i2c_msg.addr = addr;
ret = of_irq_parse_one(np, 0, argsa); ret = of_irq_parse_one(np, 0, argsa);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment