Commit 22c4e5bc authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'gpio-fixes-for-v5.12' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux

Pull gpio fix from Bartosz Golaszewski:
 "Save and restore the sysconfig register in gpio-omap to fix a
  power-management issue"

* tag 'gpio-fixes-for-v5.12' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux:
  gpio: omap: Save and restore sysconfig
parents 18a3c5f7 ddd8d94c
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#define OMAP4_GPIO_DEBOUNCINGTIME_MASK 0xFF #define OMAP4_GPIO_DEBOUNCINGTIME_MASK 0xFF
struct gpio_regs { struct gpio_regs {
u32 sysconfig;
u32 irqenable1; u32 irqenable1;
u32 irqenable2; u32 irqenable2;
u32 wake_en; u32 wake_en;
...@@ -1069,6 +1070,7 @@ static void omap_gpio_init_context(struct gpio_bank *p) ...@@ -1069,6 +1070,7 @@ static void omap_gpio_init_context(struct gpio_bank *p)
const struct omap_gpio_reg_offs *regs = p->regs; const struct omap_gpio_reg_offs *regs = p->regs;
void __iomem *base = p->base; void __iomem *base = p->base;
p->context.sysconfig = readl_relaxed(base + regs->sysconfig);
p->context.ctrl = readl_relaxed(base + regs->ctrl); p->context.ctrl = readl_relaxed(base + regs->ctrl);
p->context.oe = readl_relaxed(base + regs->direction); p->context.oe = readl_relaxed(base + regs->direction);
p->context.wake_en = readl_relaxed(base + regs->wkup_en); p->context.wake_en = readl_relaxed(base + regs->wkup_en);
...@@ -1088,6 +1090,7 @@ static void omap_gpio_restore_context(struct gpio_bank *bank) ...@@ -1088,6 +1090,7 @@ static void omap_gpio_restore_context(struct gpio_bank *bank)
const struct omap_gpio_reg_offs *regs = bank->regs; const struct omap_gpio_reg_offs *regs = bank->regs;
void __iomem *base = bank->base; 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.wake_en, base + regs->wkup_en);
writel_relaxed(bank->context.ctrl, base + regs->ctrl); writel_relaxed(bank->context.ctrl, base + regs->ctrl);
writel_relaxed(bank->context.leveldetect0, base + regs->leveldetect0); 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) ...@@ -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); 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) if (!bank->enabled_non_wakeup_gpios)
goto update_gpio_context_count; goto update_gpio_context_count;
...@@ -1279,6 +1286,7 @@ static int gpio_omap_cpu_notifier(struct notifier_block *nb, ...@@ -1279,6 +1286,7 @@ static int gpio_omap_cpu_notifier(struct notifier_block *nb,
static const struct omap_gpio_reg_offs omap2_gpio_regs = { static const struct omap_gpio_reg_offs omap2_gpio_regs = {
.revision = OMAP24XX_GPIO_REVISION, .revision = OMAP24XX_GPIO_REVISION,
.sysconfig = OMAP24XX_GPIO_SYSCONFIG,
.direction = OMAP24XX_GPIO_OE, .direction = OMAP24XX_GPIO_OE,
.datain = OMAP24XX_GPIO_DATAIN, .datain = OMAP24XX_GPIO_DATAIN,
.dataout = OMAP24XX_GPIO_DATAOUT, .dataout = OMAP24XX_GPIO_DATAOUT,
...@@ -1302,6 +1310,7 @@ static const struct omap_gpio_reg_offs omap2_gpio_regs = { ...@@ -1302,6 +1310,7 @@ static const struct omap_gpio_reg_offs omap2_gpio_regs = {
static const struct omap_gpio_reg_offs omap4_gpio_regs = { static const struct omap_gpio_reg_offs omap4_gpio_regs = {
.revision = OMAP4_GPIO_REVISION, .revision = OMAP4_GPIO_REVISION,
.sysconfig = OMAP4_GPIO_SYSCONFIG,
.direction = OMAP4_GPIO_OE, .direction = OMAP4_GPIO_OE,
.datain = OMAP4_GPIO_DATAIN, .datain = OMAP4_GPIO_DATAIN,
.dataout = OMAP4_GPIO_DATAOUT, .dataout = OMAP4_GPIO_DATAOUT,
......
...@@ -85,6 +85,7 @@ ...@@ -85,6 +85,7 @@
* omap2+ specific GPIO registers * omap2+ specific GPIO registers
*/ */
#define OMAP24XX_GPIO_REVISION 0x0000 #define OMAP24XX_GPIO_REVISION 0x0000
#define OMAP24XX_GPIO_SYSCONFIG 0x0010
#define OMAP24XX_GPIO_IRQSTATUS1 0x0018 #define OMAP24XX_GPIO_IRQSTATUS1 0x0018
#define OMAP24XX_GPIO_IRQSTATUS2 0x0028 #define OMAP24XX_GPIO_IRQSTATUS2 0x0028
#define OMAP24XX_GPIO_IRQENABLE2 0x002c #define OMAP24XX_GPIO_IRQENABLE2 0x002c
...@@ -108,6 +109,7 @@ ...@@ -108,6 +109,7 @@
#define OMAP24XX_GPIO_SETDATAOUT 0x0094 #define OMAP24XX_GPIO_SETDATAOUT 0x0094
#define OMAP4_GPIO_REVISION 0x0000 #define OMAP4_GPIO_REVISION 0x0000
#define OMAP4_GPIO_SYSCONFIG 0x0010
#define OMAP4_GPIO_EOI 0x0020 #define OMAP4_GPIO_EOI 0x0020
#define OMAP4_GPIO_IRQSTATUSRAW0 0x0024 #define OMAP4_GPIO_IRQSTATUSRAW0 0x0024
#define OMAP4_GPIO_IRQSTATUSRAW1 0x0028 #define OMAP4_GPIO_IRQSTATUSRAW1 0x0028
...@@ -148,6 +150,7 @@ ...@@ -148,6 +150,7 @@
#ifndef __ASSEMBLER__ #ifndef __ASSEMBLER__
struct omap_gpio_reg_offs { struct omap_gpio_reg_offs {
u16 revision; u16 revision;
u16 sysconfig;
u16 direction; u16 direction;
u16 datain; u16 datain;
u16 dataout; u16 dataout;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment