#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;
        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))
        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",