struct irq_chip *chip = irq_data_get_irq_chip(irqd);
        struct exynos_irq_chip *our_chip = to_exynos_irq_chip(chip);
        struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
-       unsigned long reg_mask = our_chip->eint_mask + bank->eint_offset;
+       unsigned long reg_mask;
        unsigned int mask;
        unsigned long flags;
 
+       if (bank->eint_mask_offset)
+               reg_mask = bank->pctl_offset + bank->eint_mask_offset;
+       else
+               reg_mask = our_chip->eint_mask + bank->eint_offset;
+
        raw_spin_lock_irqsave(&bank->slock, flags);
 
        mask = readl(bank->eint_base + reg_mask);
        struct irq_chip *chip = irq_data_get_irq_chip(irqd);
        struct exynos_irq_chip *our_chip = to_exynos_irq_chip(chip);
        struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
-       unsigned long reg_pend = our_chip->eint_pend + bank->eint_offset;
+       unsigned long reg_pend;
+
+       if (bank->eint_pend_offset)
+               reg_pend = bank->pctl_offset + bank->eint_pend_offset;
+       else
+               reg_pend = our_chip->eint_pend + bank->eint_offset;
 
        writel(1 << irqd->hwirq, bank->eint_base + reg_pend);
 }
        struct irq_chip *chip = irq_data_get_irq_chip(irqd);
        struct exynos_irq_chip *our_chip = to_exynos_irq_chip(chip);
        struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
-       unsigned long reg_mask = our_chip->eint_mask + bank->eint_offset;
+       unsigned long reg_mask;
        unsigned int mask;
        unsigned long flags;
 
        if (irqd_get_trigger_type(irqd) & IRQ_TYPE_LEVEL_MASK)
                exynos_irq_ack(irqd);
 
+       if (bank->eint_mask_offset)
+               reg_mask = bank->pctl_offset + bank->eint_mask_offset;
+       else
+               reg_mask = our_chip->eint_mask + bank->eint_offset;
+
        raw_spin_lock_irqsave(&bank->slock, flags);
 
        mask = readl(bank->eint_base + reg_mask);
        struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
        unsigned int shift = EXYNOS_EINT_CON_LEN * irqd->hwirq;
        unsigned int con, trig_type;
-       unsigned long reg_con = our_chip->eint_con + bank->eint_offset;
+       unsigned long reg_con;
 
        switch (type) {
        case IRQ_TYPE_EDGE_RISING:
        else
                irq_set_handler_locked(irqd, handle_level_irq);
 
+       if (bank->eint_con_offset)
+               reg_con = bank->pctl_offset + bank->eint_con_offset;
+       else
+               reg_con = our_chip->eint_con + bank->eint_offset;
+
        con = readl(bank->eint_base + reg_con);
        con &= ~(EXYNOS_EINT_CON_MASK << shift);
        con |= trig_type << shift;
        pr_debug("%s: save    mask %#010x\n", bank->name, save->eint_mask);
 }
 
+static void exynosauto_pinctrl_suspend_bank(struct samsung_pinctrl_drv_data *drvdata,
+                                           struct samsung_pin_bank *bank)
+{
+       struct exynos_eint_gpio_save *save = bank->soc_priv;
+       void __iomem *regs = bank->eint_base;
+
+       save->eint_con = readl(regs + bank->pctl_offset + bank->eint_con_offset);
+       save->eint_mask = readl(regs + bank->pctl_offset + bank->eint_mask_offset);
+
+       pr_debug("%s: save     con %#010x\n", bank->name, save->eint_con);
+       pr_debug("%s: save    mask %#010x\n", bank->name, save->eint_mask);
+}
+
 void exynos_pinctrl_suspend(struct samsung_pinctrl_drv_data *drvdata)
 {
        struct samsung_pin_bank *bank = drvdata->pin_banks;
        int i;
 
        for (i = 0; i < drvdata->nr_banks; ++i, ++bank) {
-               if (bank->eint_type == EINT_TYPE_GPIO)
-                       exynos_pinctrl_suspend_bank(drvdata, bank);
+               if (bank->eint_type == EINT_TYPE_GPIO) {
+                       if (bank->eint_con_offset)
+                               exynosauto_pinctrl_suspend_bank(drvdata, bank);
+                       else
+                               exynos_pinctrl_suspend_bank(drvdata, bank);
+               }
                else if (bank->eint_type == EINT_TYPE_WKUP) {
                        if (!irq_chip) {
                                irq_chip = bank->irq_chip;
                                                + bank->eint_offset);
 }
 
+static void exynosauto_pinctrl_resume_bank(struct samsung_pinctrl_drv_data *drvdata,
+                                          struct samsung_pin_bank *bank)
+{
+       struct exynos_eint_gpio_save *save = bank->soc_priv;
+       void __iomem *regs = bank->eint_base;
+
+       pr_debug("%s:     con %#010x => %#010x\n", bank->name,
+                readl(regs + bank->pctl_offset + bank->eint_con_offset), save->eint_con);
+       pr_debug("%s:    mask %#010x => %#010x\n", bank->name,
+                readl(regs + bank->pctl_offset + bank->eint_mask_offset), save->eint_mask);
+
+       writel(save->eint_con, regs + bank->pctl_offset + bank->eint_con_offset);
+       writel(save->eint_mask, regs + bank->pctl_offset + bank->eint_mask_offset);
+}
+
 void exynos_pinctrl_resume(struct samsung_pinctrl_drv_data *drvdata)
 {
        struct samsung_pin_bank *bank = drvdata->pin_banks;
        int i;
 
        for (i = 0; i < drvdata->nr_banks; ++i, ++bank)
-               if (bank->eint_type == EINT_TYPE_GPIO)
-                       exynos_pinctrl_resume_bank(drvdata, bank);
+               if (bank->eint_type == EINT_TYPE_GPIO) {
+                       if (bank->eint_con_offset)
+                               exynosauto_pinctrl_resume_bank(drvdata, bank);
+                       else
+                               exynos_pinctrl_resume_bank(drvdata, bank);
+               }
 }
 
 static void exynos_retention_enable(struct samsung_pinctrl_drv_data *drvdata)
 
  * @eint_type: type of the external interrupt supported by the bank.
  * @eint_mask: bit mask of pins which support EINT function.
  * @eint_offset: SoC-specific EINT register or interrupt offset of bank.
+ * @eint_con_offset: ExynosAuto SoC-specific EINT control register offset of bank.
+ * @eint_mask_offset: ExynosAuto SoC-specific EINT mask register offset of bank.
+ * @eint_pend_offset: ExynosAuto SoC-specific EINT pend register offset of bank.
  * @name: name to be prefixed for each pin in this pin bank.
  */
 struct samsung_pin_bank_data {
        enum eint_type  eint_type;
        u32             eint_mask;
        u32             eint_offset;
+       u32             eint_con_offset;
+       u32             eint_mask_offset;
+       u32             eint_pend_offset;
        const char      *name;
 };
 
  * @eint_type: type of the external interrupt supported by the bank.
  * @eint_mask: bit mask of pins which support EINT function.
  * @eint_offset: SoC-specific EINT register or interrupt offset of bank.
+ * @eint_con_offset: ExynosAuto SoC-specific EINT register or interrupt offset of bank.
+ * @eint_mask_offset: ExynosAuto SoC-specific EINT mask register offset of bank.
+ * @eint_pend_offset: ExynosAuto SoC-specific EINT pend register offset of bank.
  * @name: name to be prefixed for each pin in this pin bank.
  * @id: id of the bank, propagated to the pin range.
  * @pin_base: starting pin number of the bank.
        enum eint_type  eint_type;
        u32             eint_mask;
        u32             eint_offset;
+       u32             eint_con_offset;
+       u32             eint_mask_offset;
+       u32             eint_pend_offset;
        const char      *name;
        u32             id;