aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek Vasut <marek.vasut@gmail.com>2018-12-07 15:28:58 -0500
committerSimon Horman <horms+renesas@verge.net.au>2019-01-07 07:24:07 -0500
commit5347a0203709d5039a74d7c94e23519eee478094 (patch)
tree9684f6904f863ebf80a9873028ecb40af77795ca
parent8d22020a7e1e540592e801a0aa0aebe938599f47 (diff)
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: Marek Vasut <marek.vasut+renesas@gmail.com> Tested-by: Nguyen Viet Dung <dung.nguyen.aj@renesas.com> Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
-rw-r--r--arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c b/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c
index 8e50daa99151..dc526ef2e9b3 100644
--- a/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c
+++ b/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c
@@ -40,6 +40,7 @@
40struct regulator_quirk { 40struct regulator_quirk {
41 struct list_head list; 41 struct list_head list;
42 const struct of_device_id *id; 42 const struct of_device_id *id;
43 struct device_node *np;
43 struct of_phandle_args irq_args; 44 struct of_phandle_args irq_args;
44 struct i2c_msg i2c_msg; 45 struct i2c_msg i2c_msg;
45 bool shared; /* IRQ line is shared */ 46 bool shared; /* IRQ line is shared */
@@ -101,6 +102,9 @@ static int regulator_quirk_notify(struct notifier_block *nb,
101 if (!pos->shared) 102 if (!pos->shared)
102 continue; 103 continue;
103 104
105 if (pos->np->parent != client->dev.parent->of_node)
106 continue;
107
104 dev_info(&client->dev, "clearing %s@0x%02x interrupts\n", 108 dev_info(&client->dev, "clearing %s@0x%02x interrupts\n",
105 pos->id->compatible, pos->i2c_msg.addr); 109 pos->id->compatible, pos->i2c_msg.addr);
106 110
@@ -165,6 +169,7 @@ static int __init rcar_gen2_regulator_quirk(void)
165 memcpy(&quirk->i2c_msg, id->data, sizeof(quirk->i2c_msg)); 169 memcpy(&quirk->i2c_msg, id->data, sizeof(quirk->i2c_msg));
166 170
167 quirk->id = id; 171 quirk->id = id;
172 quirk->np = np;
168 quirk->i2c_msg.addr = addr; 173 quirk->i2c_msg.addr = addr;
169 174
170 ret = of_irq_parse_one(np, 0, argsa); 175 ret = of_irq_parse_one(np, 0, argsa);