Input: pm8941-powerkey - fix debounce on gen2+ PMICs
[ Upstream commit8c9cce9cb8
] 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:
parent
421ce97657
commit
03b2c470a1
|
@ -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
|
||||
|
||||
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",
|
||||
|
|
Loading…
Reference in New Issue