|
50 | 50 | #define PON_RESIN_PULL_UP BIT(0)
|
51 | 51 |
|
52 | 52 | #define PON_DBC_CTL 0x71
|
53 |
| -#define PON_DBC_DELAY_MASK 0x7 |
| 53 | +#define PON_DBC_DELAY_MASK_GEN1 0x7 |
| 54 | +#define PON_DBC_DELAY_MASK_GEN2 0xf |
| 55 | +#define PON_DBC_SHIFT_GEN1 6 |
| 56 | +#define PON_DBC_SHIFT_GEN2 14 |
54 | 57 |
|
55 | 58 | struct pm8941_data {
|
56 | 59 | unsigned int pull_up_bit;
|
@@ -247,7 +250,7 @@ static int pm8941_pwrkey_probe(struct platform_device *pdev)
|
247 | 250 | struct device *parent;
|
248 | 251 | struct device_node *regmap_node;
|
249 | 252 | const __be32 *addr;
|
250 |
| - u32 req_delay; |
| 253 | + u32 req_delay, mask, delay_shift; |
251 | 254 | int error;
|
252 | 255 |
|
253 | 256 | 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)
|
336 | 339 | pwrkey->input->phys = pwrkey->data->phys;
|
337 | 340 |
|
338 | 341 | if (pwrkey->data->supports_debounce_config) {
|
339 |
| - req_delay = (req_delay << 6) / USEC_PER_SEC; |
| 342 | + if (pwrkey->subtype >= PON_SUBTYPE_GEN2_PRIMARY) { |
| 343 | + mask = PON_DBC_DELAY_MASK_GEN2; |
| 344 | + delay_shift = PON_DBC_SHIFT_GEN2; |
| 345 | + } else { |
| 346 | + mask = PON_DBC_DELAY_MASK_GEN1; |
| 347 | + delay_shift = PON_DBC_SHIFT_GEN1; |
| 348 | + } |
| 349 | + |
| 350 | + req_delay = (req_delay << delay_shift) / USEC_PER_SEC; |
340 | 351 | req_delay = ilog2(req_delay);
|
341 | 352 |
|
342 | 353 | error = regmap_update_bits(pwrkey->regmap,
|
343 | 354 | pwrkey->baseaddr + PON_DBC_CTL,
|
344 |
| - PON_DBC_DELAY_MASK, |
| 355 | + mask, |
345 | 356 | req_delay);
|
346 | 357 | if (error) {
|
347 | 358 | dev_err(&pdev->dev, "failed to set debounce: %d\n",
|
|
0 commit comments