On 29.05.2023 21:55, Caleb Connolly wrote: > 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: 68c581d5e7d8 ("Input: add Qualcomm PM8941 power key driver") > Signed-off-by: Caleb Connolly <caleb.connolly@xxxxxxxxxx> > --- > This patch shouldn't be backported earlier then 5.4, as that is the > first kernel with support for PM8998. > --- > drivers/input/misc/pm8941-pwrkey.c | 19 +++++++++++++++---- > 1 file changed, 15 insertions(+), 4 deletions(-) > > diff --git a/drivers/input/misc/pm8941-pwrkey.c b/drivers/input/misc/pm8941-pwrkey.c > index b6a27ebae977..74d77d8aaeff 100644 > --- a/drivers/input/misc/pm8941-pwrkey.c > +++ b/drivers/input/misc/pm8941-pwrkey.c > @@ -50,7 +50,10 @@ > #define PON_RESIN_PULL_UP BIT(0) > > #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 mask+shift -> field_prep/get? Nice find! Konrad > > struct pm8941_data { > unsigned int pull_up_bit; > @@ -247,7 +250,7 @@ static int pm8941_pwrkey_probe(struct platform_device *pdev) > struct device *parent; > struct device_node *regmap_node; > const __be32 *addr; > - u32 req_delay; > + u32 req_delay, mask, delay_shift; > int error; > > 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; > > 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); > > error = regmap_update_bits(pwrkey->regmap, > pwrkey->baseaddr + PON_DBC_CTL, > - PON_DBC_DELAY_MASK, > + mask, > req_delay); > if (error) { > dev_err(&pdev->dev, "failed to set debounce: %d\n", >