Message ID | 1478584845-75666-1-git-send-email-preid@electromag.com.au |
---|---|
State | New |
Headers | show |
On Tue, Nov 8, 2016 at 7:00 AM, Phil Reid <preid@electromag.com.au> wrote: > gpiod_set_array_value_complex does not clear the bits field. > Therefore when the drivers set_multiple funciton is called bits outside > the mask are undefined and can be either set or not. So bank_val needs > to be masked with bank_mask before or with the reg_val cache. > > Signed-off-by: Phil Reid <preid@electromag.com.au> Patch applied for fixes. Should it also be tagged for stable? Is there a commit this fixes that we can set as Fixes:? Yours, Linus Walleij -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 8/11/2016 16:30, Linus Walleij wrote: > On Tue, Nov 8, 2016 at 7:00 AM, Phil Reid <preid@electromag.com.au> wrote: > >> gpiod_set_array_value_complex does not clear the bits field. >> Therefore when the drivers set_multiple funciton is called bits outside >> the mask are undefined and can be either set or not. So bank_val needs >> to be masked with bank_mask before or with the reg_val cache. >> >> Signed-off-by: Phil Reid <preid@electromag.com.au> > > Patch applied for fixes. Should it also be tagged for stable? > Is there a commit this fixes that we can set as Fixes:? > It looks like it was broken in my original implementation of the set_multiple call. fixes commit: b4818afeacbd81821f89a89951471cffcb6a65e0 I guess it should probably go into stable.
diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c index b0eb113..fe731f0 100644 --- a/drivers/gpio/gpio-pca953x.c +++ b/drivers/gpio/gpio-pca953x.c @@ -380,6 +380,7 @@ static void pca953x_gpio_set_multiple(struct gpio_chip *gc, if (bank_mask) { bank_val = bits[bank / sizeof(*bits)] >> ((bank % sizeof(*bits)) * 8); + bank_val &= bank_mask; reg_val[bank] = (reg_val[bank] & ~bank_mask) | bank_val; } }
gpiod_set_array_value_complex does not clear the bits field. Therefore when the drivers set_multiple funciton is called bits outside the mask are undefined and can be either set or not. So bank_val needs to be masked with bank_mask before or with the reg_val cache. Signed-off-by: Phil Reid <preid@electromag.com.au> --- drivers/gpio/gpio-pca953x.c | 1 + 1 file changed, 1 insertion(+)