pinctrl: mvebu: add suspend/resume support to Armada XP pinctrl driver
Subsystems (3)
PATCH 1/1 pinctrl: mvebu: add suspend/resume support to Armada XP pinctrl driver
This commit adds suspend/resume support to the Armada XP pinctrl driver, by simply saving and restoring the MPP registers.
--- drivers/pinctrl/mvebu/pinctrl-armada-xp.c | 40 +++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+)
drivers/pinctrl/mvebu/pinctrl-armada-xp.c +40 -0
@@ -34,6 +34,7 @@#include "pinctrl-mvebu.h" static void __iomem *mpp_base; +static u32 *mpp_saved_regs;static int armada_xp_mpp_ctrl_get (unsigned pid,unsigned long *config) {
@@ -406,12 +407,42 @@ static struct pinctrl_gpio_range mv78460_mpp_gpio_ranges[] = { MPP_GPIO_RANGE(2, 64, 64, 3), }; +static int armada_xp_pinctrl_suspend (struct platform_device *pdev, +pm_message_t state) +{ +struct mvebu_pinctrl_soc_info *soc = +platform_get_drvdata (pdev); +int i, nregs; + + nregs =DIV_ROUND_UP (soc->nmodes,MVEBU_MPPS_PER_REG ); + +for (i =0 ; i < nregs; i++) + mpp_saved_regs[i] =readl (mpp_base + i *4 ); + +return 0 ; +} + +static int armada_xp_pinctrl_resume (struct platform_device *pdev) +{ +struct mvebu_pinctrl_soc_info *soc = +platform_get_drvdata (pdev); +int i, nregs; + + nregs =DIV_ROUND_UP (soc->nmodes,MVEBU_MPPS_PER_REG ); + +for (i =0 ; i < nregs; i++) +writel (mpp_saved_regs[i], mpp_base + i *4 ); + +return 0 ; +} +static int armada_xp_pinctrl_probe (struct platform_device *pdev) {struct mvebu_pinctrl_soc_info *soc = &armada_xp_pinctrl_info;const struct of_device_id *match =of_match_device (armada_xp_pinctrl_of_match, &pdev->dev);struct resource *res; +int nregs;if (!match)return -ENODEV ;
@@ -459,6 +490,13 @@ static int armada_xp_pinctrl_probe(struct platform_device *pdev)break ; } + nregs =DIV_ROUND_UP (soc->nmodes,MVEBU_MPPS_PER_REG ); + + mpp_saved_regs =devm_kmalloc (&pdev->dev, nregs *sizeof (u32), +GFP_KERNEL ); +if (!mpp_saved_regs) +return -ENOMEM ; + pdev->dev.platform_data = soc;return mvebu_pinctrl_probe (pdev);
@@ -476,6 +514,8 @@ static struct platform_driver armada_xp_pinctrl_driver = { }, .probe = armada_xp_pinctrl_probe, .remove = armada_xp_pinctrl_remove, + .suspend = armada_xp_pinctrl_suspend, + .resume = armada_xp_pinctrl_resume, };module_platform_driver (armada_xp_pinctrl_driver);
Signature · 1 line
2.1.0
PATCH 1/1 pinctrl: mvebu: add suspend/resume support to Armada XP pinctrl driver
Quoted 4 lines · Thomas Petazzoni
This commit adds suspend/resume support to the Armada XP pinctrl driver, by simply saving and restoring the MPP registers.
Signed-off-by Thomas Petazzoni <[email protected]>
Patch applied, but:
Quoted 2 lines
static void
__iomem*mpp_base;
+static u32*mpp_saved_regs;
I didn't notice this singleton design pattern in this driver before :( I see the legacy Dove driver have a few more.
Can we have a mvebu refactoring patch bringing these things into a state container? Like a per-subdriver kmalloc:ed struct foo_state {}?
Yours,
Linus Walleij
PATCH 1/1 pinctrl: mvebu: add suspend/resume support to Armada XP pinctrl driver
Linus,
Quoted 10 lines · Linus Walleij
Patch applied, but:
Quoted 2 lines
static void
__iomem*mpp_base;
+static u32*mpp_saved_regs;I didn't notice this singleton design pattern in this driver before :( I see the legacy Dove driver have a few more.
Can we have a mvebu refactoring patch bringing these things into a state container? Like a per-subdriver kmalloc:ed struct
foo_state{}?
Yes, I agree this isn't nice. I'll try to nice what I can come up with and propose a patch.
Thanks a lot!
Thomas
Signature · 3 lines
Thomas Petazzoni, CTO, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com