Input: pm8941-powerkey - fix debounce on gen2+ PMICs

[ Upstream commit 8c9cce9cb8 ]

Since PM8998/PM660, the power key debounce register was redefined to
support shorter debounce times. On PM8941 the shortest debounce time
(represented by register value 0) was 15625us, on PM8998 the shortest
debounce time is 62us, with the default being 2ms.

Adjust the bit shift to correctly program debounce on PM8998 and newer.

Fixes: 68c581d5e7 ("Input: add Qualcomm PM8941 power key driver")
Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
Link: https://lore.kernel.org/r/20230529-pm8941-pwrkey-debounce-v1-2-c043a6d5c814@linaro.org
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Caleb Connolly 2023-06-06 12:05:32 -07:00 committed by Greg Kroah-Hartman
parent 421ce97657
commit 03b2c470a1
1 changed files with 15 additions and 4 deletions

View File

@ -50,7 +50,10 @@
#define PON_RESIN_PULL_UP BIT(0) #define PON_RESIN_PULL_UP BIT(0)
#define PON_DBC_CTL 0x71 #define PON_DBC_CTL 0x71
#define PON_DBC_DELAY_MASK 0x7 #define PON_DBC_DELAY_MASK_GEN1 0x7
#define PON_DBC_DELAY_MASK_GEN2 0xf
#define PON_DBC_SHIFT_GEN1 6
#define PON_DBC_SHIFT_GEN2 14
struct pm8941_data { struct pm8941_data {
unsigned int pull_up_bit; unsigned int pull_up_bit;
@ -247,7 +250,7 @@ static int pm8941_pwrkey_probe(struct platform_device *pdev)
struct device *parent; struct device *parent;
struct device_node *regmap_node; struct device_node *regmap_node;
const __be32 *addr; const __be32 *addr;
u32 req_delay; u32 req_delay, mask, delay_shift;
int error; int error;
if (of_property_read_u32(pdev->dev.of_node, "debounce", &req_delay)) if (of_property_read_u32(pdev->dev.of_node, "debounce", &req_delay))
@ -336,12 +339,20 @@ static int pm8941_pwrkey_probe(struct platform_device *pdev)
pwrkey->input->phys = pwrkey->data->phys; pwrkey->input->phys = pwrkey->data->phys;
if (pwrkey->data->supports_debounce_config) { if (pwrkey->data->supports_debounce_config) {
req_delay = (req_delay << 6) / USEC_PER_SEC; if (pwrkey->subtype >= PON_SUBTYPE_GEN2_PRIMARY) {
mask = PON_DBC_DELAY_MASK_GEN2;
delay_shift = PON_DBC_SHIFT_GEN2;
} else {
mask = PON_DBC_DELAY_MASK_GEN1;
delay_shift = PON_DBC_SHIFT_GEN1;
}
req_delay = (req_delay << delay_shift) / USEC_PER_SEC;
req_delay = ilog2(req_delay); req_delay = ilog2(req_delay);
error = regmap_update_bits(pwrkey->regmap, error = regmap_update_bits(pwrkey->regmap,
pwrkey->baseaddr + PON_DBC_CTL, pwrkey->baseaddr + PON_DBC_CTL,
PON_DBC_DELAY_MASK, mask,
req_delay); req_delay);
if (error) { if (error) {
dev_err(&pdev->dev, "failed to set debounce: %d\n", dev_err(&pdev->dev, "failed to set debounce: %d\n",