REGMAP_IRQ_MAIN_REG_OFFSET(p3_offs),
 };
 
-static unsigned int pm8008_virt_regs[] = {
-       PM8008_POLARITY_HI_BASE,
-       PM8008_POLARITY_LO_BASE,
-};
-
 enum {
+       SET_TYPE_INDEX,
        POLARITY_HI_INDEX,
        POLARITY_LO_INDEX,
-       PM8008_NUM_VIRT_REGS,
+};
+
+static unsigned int pm8008_config_regs[] = {
+       PM8008_TYPE_BASE,
+       PM8008_POLARITY_HI_BASE,
+       PM8008_POLARITY_LO_BASE,
 };
 
 static struct regmap_irq pm8008_irqs[] = {
        REGMAP_IRQ_REG(PM8008_IRQ_GPIO2,        PM8008_GPIO2,   BIT(0)),
 };
 
-static int pm8008_set_type_virt(unsigned int **virt_buf,
-                                     unsigned int type, unsigned long hwirq,
-                                     int reg)
+static int pm8008_set_type_config(unsigned int **buf, unsigned int type,
+                                 const struct regmap_irq *irq_data, int idx,
+                                 void *irq_drv_data)
 {
        switch (type) {
        case IRQ_TYPE_EDGE_FALLING:
        case IRQ_TYPE_LEVEL_LOW:
-               virt_buf[POLARITY_HI_INDEX][reg] &= ~pm8008_irqs[hwirq].mask;
-               virt_buf[POLARITY_LO_INDEX][reg] |= pm8008_irqs[hwirq].mask;
+               buf[POLARITY_HI_INDEX][idx] &= ~irq_data->mask;
+               buf[POLARITY_LO_INDEX][idx] |= irq_data->mask;
                break;
 
        case IRQ_TYPE_EDGE_RISING:
        case IRQ_TYPE_LEVEL_HIGH:
-               virt_buf[POLARITY_HI_INDEX][reg] |= pm8008_irqs[hwirq].mask;
-               virt_buf[POLARITY_LO_INDEX][reg] &= ~pm8008_irqs[hwirq].mask;
+               buf[POLARITY_HI_INDEX][idx] |= irq_data->mask;
+               buf[POLARITY_LO_INDEX][idx] &= ~irq_data->mask;
                break;
 
        case IRQ_TYPE_EDGE_BOTH:
-               virt_buf[POLARITY_HI_INDEX][reg] |= pm8008_irqs[hwirq].mask;
-               virt_buf[POLARITY_LO_INDEX][reg] |= pm8008_irqs[hwirq].mask;
+               buf[POLARITY_HI_INDEX][idx] |= irq_data->mask;
+               buf[POLARITY_LO_INDEX][idx] |= irq_data->mask;
                break;
 
        default:
                return -EINVAL;
        }
 
+       if (type & IRQ_TYPE_EDGE_BOTH)
+               buf[SET_TYPE_INDEX][idx] |= irq_data->mask;
+       else
+               buf[SET_TYPE_INDEX][idx] &= ~irq_data->mask;
+
        return 0;
 }
 
        .name                   = "pm8008_irq",
        .main_status            = I2C_INTR_STATUS_BASE,
        .num_main_regs          = 1,
-       .num_virt_regs          = PM8008_NUM_VIRT_REGS,
        .irqs                   = pm8008_irqs,
        .num_irqs               = ARRAY_SIZE(pm8008_irqs),
        .num_regs               = PM8008_NUM_PERIPHS,
        .not_fixed_stride       = true,
        .sub_reg_offsets        = pm8008_sub_reg_offsets,
-       .set_type_virt          = pm8008_set_type_virt,
        .status_base            = PM8008_STATUS_BASE,
        .mask_base              = PM8008_MASK_BASE,
        .unmask_base            = PM8008_UNMASK_BASE,
        .mask_unmask_non_inverted = true,
-       .type_base              = PM8008_TYPE_BASE,
        .ack_base               = PM8008_ACK_BASE,
-       .virt_reg_base          = pm8008_virt_regs,
-       .num_type_reg           = PM8008_NUM_PERIPHS,
+       .config_base            = pm8008_config_regs,
+       .num_config_bases       = ARRAY_SIZE(pm8008_config_regs),
+       .num_config_regs        = PM8008_NUM_PERIPHS,
+       .set_type_config        = pm8008_set_type_config,
 };
 
 static struct regmap_config qcom_mfd_regmap_cfg = {
        for (i = 0; i < ARRAY_SIZE(pm8008_irqs); i++) {
                type = &pm8008_irqs[i].type;
 
-               type->type_reg_offset     = pm8008_irqs[i].reg_offset;
-               type->type_rising_val     = pm8008_irqs[i].mask;
-               type->type_falling_val    = pm8008_irqs[i].mask;
-               type->type_level_high_val = 0;
-               type->type_level_low_val  = 0;
+               type->type_reg_offset = pm8008_irqs[i].reg_offset;
 
                if (type->type_reg_offset == PM8008_MISC)
                        type->types_supported = IRQ_TYPE_EDGE_RISING;