Merge tag 'gpio-updates-for-v5.13-v2' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-block.git] / drivers / gpio / gpio-omap.c
index f4df555fc39c8ac42c6f39ce0e6a0a15fcc9e1f7..ca23f72165ca4bcbcd4861d63c548a56a2b368ce 100644 (file)
@@ -29,6 +29,7 @@
 #define OMAP4_GPIO_DEBOUNCINGTIME_MASK 0xFF
 
 struct gpio_regs {
+       u32 sysconfig;
        u32 irqenable1;
        u32 irqenable2;
        u32 wake_en;
@@ -1069,6 +1070,7 @@ static void omap_gpio_init_context(struct gpio_bank *p)
        const struct omap_gpio_reg_offs *regs = p->regs;
        void __iomem *base = p->base;
 
+       p->context.sysconfig    = readl_relaxed(base + regs->sysconfig);
        p->context.ctrl         = readl_relaxed(base + regs->ctrl);
        p->context.oe           = readl_relaxed(base + regs->direction);
        p->context.wake_en      = readl_relaxed(base + regs->wkup_en);
@@ -1088,6 +1090,7 @@ static void omap_gpio_restore_context(struct gpio_bank *bank)
        const struct omap_gpio_reg_offs *regs = bank->regs;
        void __iomem *base = bank->base;
 
+       writel_relaxed(bank->context.sysconfig, base + regs->sysconfig);
        writel_relaxed(bank->context.wake_en, base + regs->wkup_en);
        writel_relaxed(bank->context.ctrl, base + regs->ctrl);
        writel_relaxed(bank->context.leveldetect0, base + regs->leveldetect0);
@@ -1115,6 +1118,10 @@ static void omap_gpio_idle(struct gpio_bank *bank, bool may_lose_context)
 
        bank->saved_datain = readl_relaxed(base + bank->regs->datain);
 
+       /* Save syconfig, it's runtime value can be different from init value */
+       if (bank->loses_context)
+               bank->context.sysconfig = readl_relaxed(base + bank->regs->sysconfig);
+
        if (!bank->enabled_non_wakeup_gpios)
                goto update_gpio_context_count;
 
@@ -1279,6 +1286,7 @@ out_unlock:
 
 static const struct omap_gpio_reg_offs omap2_gpio_regs = {
        .revision =             OMAP24XX_GPIO_REVISION,
+       .sysconfig =            OMAP24XX_GPIO_SYSCONFIG,
        .direction =            OMAP24XX_GPIO_OE,
        .datain =               OMAP24XX_GPIO_DATAIN,
        .dataout =              OMAP24XX_GPIO_DATAOUT,
@@ -1302,6 +1310,7 @@ static const struct omap_gpio_reg_offs omap2_gpio_regs = {
 
 static const struct omap_gpio_reg_offs omap4_gpio_regs = {
        .revision =             OMAP4_GPIO_REVISION,
+       .sysconfig =            OMAP4_GPIO_SYSCONFIG,
        .direction =            OMAP4_GPIO_OE,
        .datain =               OMAP4_GPIO_DATAIN,
        .dataout =              OMAP4_GPIO_DATAOUT,