pinctrl: starfive: Save register values when suspending and restore them when resuming
authorHal Feng <hal.feng@starfivetech.com>
Fri, 6 Jan 2023 10:12:33 +0000 (18:12 +0800)
committerHal Feng <hal.feng@starfivetech.com>
Mon, 9 Jan 2023 06:25:50 +0000 (14:25 +0800)
Restore the register configuration after resuming.

Signed-off-by: Hal Feng <hal.feng@starfivetech.com>
drivers/pinctrl/starfive/pinctrl-starfive-jh7110.c
drivers/pinctrl/starfive/pinctrl-starfive.h

index e4a8042..091f366 100755 (executable)
@@ -1666,6 +1666,15 @@ static int starfive_jh7110_pinctrl_probe(struct platform_device *pdev)
 static int __maybe_unused starfive_pinctrl_suspend(struct device *dev)
 {
        struct starfive_pinctrl *pctl = dev_get_drvdata(dev);
+       u8 i;
+
+       for (i = 0 ; i < SYS_IRQ_REG_SUSPENDED_NUM ; i++)
+               pctl->sys_irq_reg_suspended[i] =
+                       readl_relaxed(pctl->padctl_base + GPIO_EN + OFFSET_PER_REG * i);
+
+       for (i = 0 ; i < AON_IRQ_REG_SUSPENDED_NUM ; i++)
+               pctl->aon_irq_reg_suspended[i] =
+                       readl_relaxed(pctl->padctl_base + AON_GPIO_EN_REG + OFFSET_PER_REG * i);
 
        return pinctrl_force_sleep(pctl->pctl_dev);
 }
@@ -1673,6 +1682,15 @@ static int __maybe_unused starfive_pinctrl_suspend(struct device *dev)
 static int __maybe_unused starfive_pinctrl_resume(struct device *dev)
 {
        struct starfive_pinctrl *pctl = dev_get_drvdata(dev);
+       u8 i;
+
+       for (i = 0 ; i < SYS_IRQ_REG_SUSPENDED_NUM ; i++)
+               writel_relaxed(pctl->sys_irq_reg_suspended[i],
+                              pctl->padctl_base + GPIO_EN + OFFSET_PER_REG * i);
+
+       for (i = 0 ; i < AON_IRQ_REG_SUSPENDED_NUM ; i++)
+               writel_relaxed(pctl->aon_irq_reg_suspended[i],
+                              pctl->padctl_base + AON_GPIO_EN_REG + OFFSET_PER_REG * i);
 
        return pinctrl_force_default(pctl->pctl_dev);
 }
index a319720..ed79d72 100644 (file)
@@ -17,6 +17,9 @@
 
 #define STARFIVE_USE_SCU                       BIT(0)
 
+#define SYS_IRQ_REG_SUSPENDED_NUM              11
+#define AON_IRQ_REG_SUSPENDED_NUM              6
+
 struct platform_device;
 
 extern const struct pinmux_ops starfive_pmx_ops;
@@ -74,6 +77,9 @@ struct starfive_pinctrl {
        struct pinctrl_gpio_range gpios;
        unsigned long enabled;
        unsigned int trigger[MAX_GPIO];
+
+       u32 sys_irq_reg_suspended[SYS_IRQ_REG_SUSPENDED_NUM];
+       u32 aon_irq_reg_suspended[AON_IRQ_REG_SUSPENDED_NUM];
 };
 
 struct starfive_pinctrl_soc_info {