Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Input: pm8xxx-vib - fix handling of separate enable register

Setting the vibrator enable_mask is not implemented correctly:

For regmap_update_bits(map, reg, mask, val) we give in either
regs->enable_mask or 0 (= no-op) as mask and "val" as value.
But "val" actually refers to the vibrator voltage control register,
which has nothing to do with the enable_mask.

So we usually end up doing nothing when we really wanted
to enable the vibrator.

We want to set or clear the enable_mask (to enable/disable the vibrator).
Therefore, change the call to always modify the enable_mask
and set the bits only if we want to enable the vibrator.

Fixes: d4c7c5c96c92 ("Input: pm8xxx-vib - handle separate enable register")
Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
Link: https://lore.kernel.org/r/20200114183442.45720-1-stephan@gerhold.net
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

authored by

Stephan Gerhold and committed by
Dmitry Torokhov
996d5d5f ba9a103f

+1 -1
+1 -1
drivers/input/misc/pm8xxx-vibrator.c
··· 90 90 91 91 if (regs->enable_mask) 92 92 rc = regmap_update_bits(vib->regmap, regs->enable_addr, 93 - on ? regs->enable_mask : 0, val); 93 + regs->enable_mask, on ? ~0 : 0); 94 94 95 95 return rc; 96 96 }