On Fri, Dec 07, 2018 at 09:28:58PM +0100, Marek Vasut wrote:
> 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]

Thanks,

This looks fine to me but I will wait to see if there are other reviews
before applying.

Reviewed-by: Simon Horman <[email protected]>

> ---
>  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