| From 5123ceab1d410b8d0c12db5be66f666a949229a0 Mon Sep 17 00:00:00 2001 |
| From: Stephan Gerhold <stephan@gerhold.net> |
| Date: Fri, 17 Jan 2020 13:40:36 -0800 |
| Subject: [PATCH] Input: pm8xxx-vib - fix handling of separate enable register |
| |
| commit 996d5d5f89a558a3608a46e73ccd1b99f1b1d058 upstream. |
| |
| 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> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/input/misc/pm8xxx-vibrator.c b/drivers/input/misc/pm8xxx-vibrator.c |
| index ecd762f93732..53ad25eaf1a2 100644 |
| --- a/drivers/input/misc/pm8xxx-vibrator.c |
| +++ b/drivers/input/misc/pm8xxx-vibrator.c |
| @@ -90,7 +90,7 @@ static int pm8xxx_vib_set(struct pm8xxx_vib *vib, bool on) |
| |
| if (regs->enable_mask) |
| rc = regmap_update_bits(vib->regmap, regs->enable_addr, |
| - on ? regs->enable_mask : 0, val); |
| + regs->enable_mask, on ? ~0 : 0); |
| |
| return rc; |
| } |
| -- |
| 2.7.4 |
| |