> 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 <[email protected]>
> Cc: Geert Uytterhoeven <[email protected]>
> Cc: Kuninori Morimoto <[email protected]>
> Cc: Simon Horman <[email protected]>
> Cc: Wolfram Sang <[email protected]>
> Cc: Yoshihiro Shimoda <[email protected]>
> Cc: [email protected]
> ---
Hi Mr Marek

Tested-by: Nguyen Viet Dung <[email protected]>

I have tested this patch on H2 Lager with mainline v4.20-rc4 kernel.
Confirmed that the problem is improved by this patch.

Best regards,
Dung

>  arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c
> b/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c
> index d4774d8ff997..f78e5348bd4c 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 @@
>  struct regulator_quirk {
>       struct list_head                list;
>       const struct of_device_id       *id;
> +     struct device_node              *np;
>       struct of_phandle_args          irq_args;
>       struct i2c_msg                  i2c_msg;
>       bool                            shared; /* IRQ line is shared */
> @@ -102,6 +103,9 @@ static int regulator_quirk_notify(struct notifier_block
> *nb,
>               if (!pos->shared)
>                       continue;
> 
> +             if (pos->np->parent != client->dev.parent->of_node)
> +                     continue;
> +
>               dev_info(&client->dev, "clearing %s@0x%02x interrupts\n",
>                        pos->id->compatible, pos->i2c_msg.addr);
> 
> @@ -167,6 +171,7 @@ static int __init rcar_gen2_regulator_quirk(void)
>               memcpy(&quirk->i2c_msg, id->data,
> sizeof(quirk->i2c_msg));
> 
>               quirk->id = id;
> +             quirk->np = np;
>               quirk->i2c_msg.addr = addr;
> 
>               ret = of_irq_parse_one(np, 0, argsa);
> --
> 2.18.0

Reply via email to