Skip to content

Commit 64061b6

Browse files
hal-fengLinus Walleij
authored andcommitted
pinctrl: starfive: jh7110: Add system pm ops to save and restore context
Add system pm ops to save and restore pinctrl registers when suspending and resuming the driver, respectively. Signed-off-by: Hal Feng <hal.feng@starfivetech.com> Link: https://lore.kernel.org/r/20230905122105.117000-3-hal.feng@starfivetech.com Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
1 parent 8406d6b commit 64061b6

5 files changed

Lines changed: 53 additions & 0 deletions

File tree

MAINTAINERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20489,6 +20489,7 @@ F: include/dt-bindings/clock/starfive?jh71*.h
2048920489
STARFIVE JH71X0 PINCTRL DRIVERS
2049020490
M: Emil Renner Berthing <kernel@esmil.dk>
2049120491
M: Jianlong Huang <jianlong.huang@starfivetech.com>
20492+
M: Hal Feng <hal.feng@starfivetech.com>
2049220493
L: linux-gpio@vger.kernel.org
2049320494
S: Maintained
2049420495
F: Documentation/devicetree/bindings/pinctrl/starfive,jh71*.yaml

drivers/pinctrl/starfive/pinctrl-starfive-jh7110-aon.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
#define JH7110_AON_NGPIO 4
3232
#define JH7110_AON_GC_BASE 64
3333

34+
#define JH7110_AON_REGS_NUM 37
35+
3436
/* registers */
3537
#define JH7110_AON_DOEN 0x0
3638
#define JH7110_AON_DOUT 0x4
@@ -145,6 +147,7 @@ static const struct jh7110_pinctrl_soc_info jh7110_aon_pinctrl_info = {
145147
.gpi_mask = GENMASK(3, 0),
146148
.gpioin_reg_base = JH7110_AON_GPIOIN,
147149
.irq_reg = &jh7110_aon_irq_reg,
150+
.nsaved_regs = JH7110_AON_REGS_NUM,
148151
.jh7110_set_one_pin_mux = jh7110_aon_set_one_pin_mux,
149152
.jh7110_get_padcfg_base = jh7110_aon_get_padcfg_base,
150153
.jh7110_gpio_irq_handler = jh7110_aon_irq_handler,
@@ -165,6 +168,7 @@ static struct platform_driver jh7110_aon_pinctrl_driver = {
165168
.driver = {
166169
.name = "starfive-jh7110-aon-pinctrl",
167170
.of_match_table = jh7110_aon_pinctrl_of_match,
171+
.pm = pm_sleep_ptr(&jh7110_pinctrl_pm_ops),
168172
},
169173
};
170174
module_platform_driver(jh7110_aon_pinctrl_driver);

drivers/pinctrl/starfive/pinctrl-starfive-jh7110-sys.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
#define JH7110_SYS_NGPIO 64
3232
#define JH7110_SYS_GC_BASE 0
3333

34+
#define JH7110_SYS_REGS_NUM 174
35+
3436
/* registers */
3537
#define JH7110_SYS_DOEN 0x000
3638
#define JH7110_SYS_DOUT 0x040
@@ -417,6 +419,7 @@ static const struct jh7110_pinctrl_soc_info jh7110_sys_pinctrl_info = {
417419
.gpi_mask = GENMASK(6, 0),
418420
.gpioin_reg_base = JH7110_SYS_GPIOIN,
419421
.irq_reg = &jh7110_sys_irq_reg,
422+
.nsaved_regs = JH7110_SYS_REGS_NUM,
420423
.jh7110_set_one_pin_mux = jh7110_sys_set_one_pin_mux,
421424
.jh7110_get_padcfg_base = jh7110_sys_get_padcfg_base,
422425
.jh7110_gpio_irq_handler = jh7110_sys_irq_handler,
@@ -437,6 +440,7 @@ static struct platform_driver jh7110_sys_pinctrl_driver = {
437440
.driver = {
438441
.name = "starfive-jh7110-sys-pinctrl",
439442
.of_match_table = jh7110_sys_pinctrl_of_match,
443+
.pm = pm_sleep_ptr(&jh7110_pinctrl_pm_ops),
440444
},
441445
};
442446
module_platform_driver(jh7110_sys_pinctrl_driver);

drivers/pinctrl/starfive/pinctrl-starfive-jh7110.c

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -872,6 +872,13 @@ int jh7110_pinctrl_probe(struct platform_device *pdev)
872872
if (!sfp)
873873
return -ENOMEM;
874874

875+
#if IS_ENABLED(CONFIG_PM_SLEEP)
876+
sfp->saved_regs = devm_kcalloc(dev, info->nsaved_regs,
877+
sizeof(*sfp->saved_regs), GFP_KERNEL);
878+
if (!sfp->saved_regs)
879+
return -ENOMEM;
880+
#endif
881+
875882
sfp->base = devm_platform_ioremap_resource(pdev, 0);
876883
if (IS_ERR(sfp->base))
877884
return PTR_ERR(sfp->base);
@@ -973,6 +980,39 @@ int jh7110_pinctrl_probe(struct platform_device *pdev)
973980
}
974981
EXPORT_SYMBOL_GPL(jh7110_pinctrl_probe);
975982

983+
static int jh7110_pinctrl_suspend(struct device *dev)
984+
{
985+
struct jh7110_pinctrl *sfp = dev_get_drvdata(dev);
986+
unsigned long flags;
987+
unsigned int i;
988+
989+
raw_spin_lock_irqsave(&sfp->lock, flags);
990+
for (i = 0 ; i < sfp->info->nsaved_regs ; i++)
991+
sfp->saved_regs[i] = readl_relaxed(sfp->base + 4 * i);
992+
993+
raw_spin_unlock_irqrestore(&sfp->lock, flags);
994+
return 0;
995+
}
996+
997+
static int jh7110_pinctrl_resume(struct device *dev)
998+
{
999+
struct jh7110_pinctrl *sfp = dev_get_drvdata(dev);
1000+
unsigned long flags;
1001+
unsigned int i;
1002+
1003+
raw_spin_lock_irqsave(&sfp->lock, flags);
1004+
for (i = 0 ; i < sfp->info->nsaved_regs ; i++)
1005+
writel_relaxed(sfp->saved_regs[i], sfp->base + 4 * i);
1006+
1007+
raw_spin_unlock_irqrestore(&sfp->lock, flags);
1008+
return 0;
1009+
}
1010+
1011+
const struct dev_pm_ops jh7110_pinctrl_pm_ops = {
1012+
LATE_SYSTEM_SLEEP_PM_OPS(jh7110_pinctrl_suspend, jh7110_pinctrl_resume)
1013+
};
1014+
EXPORT_SYMBOL_GPL(jh7110_pinctrl_pm_ops);
1015+
9761016
MODULE_DESCRIPTION("Pinctrl driver for the StarFive JH7110 SoC");
9771017
MODULE_AUTHOR("Emil Renner Berthing <kernel@esmil.dk>");
9781018
MODULE_AUTHOR("Jianlong Huang <jianlong.huang@starfivetech.com>");

drivers/pinctrl/starfive/pinctrl-starfive-jh7110.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ struct jh7110_pinctrl {
2121
/* register read/write mutex */
2222
struct mutex mutex;
2323
const struct jh7110_pinctrl_soc_info *info;
24+
u32 *saved_regs;
2425
};
2526

2627
struct jh7110_gpio_irq_reg {
@@ -50,6 +51,8 @@ struct jh7110_pinctrl_soc_info {
5051

5152
const struct jh7110_gpio_irq_reg *irq_reg;
5253

54+
unsigned int nsaved_regs;
55+
5356
/* generic pinmux */
5457
int (*jh7110_set_one_pin_mux)(struct jh7110_pinctrl *sfp,
5558
unsigned int pin,
@@ -66,5 +69,6 @@ void jh7110_set_gpiomux(struct jh7110_pinctrl *sfp, unsigned int pin,
6669
unsigned int din, u32 dout, u32 doen);
6770
int jh7110_pinctrl_probe(struct platform_device *pdev);
6871
struct jh7110_pinctrl *jh7110_from_irq_desc(struct irq_desc *desc);
72+
extern const struct dev_pm_ops jh7110_pinctrl_pm_ops;
6973

7074
#endif /* __PINCTRL_STARFIVE_JH7110_H__ */

0 commit comments

Comments
 (0)