]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00283508-5 pinctrl: imx: support pin sleep mode in suspend
authorAnson Huang <b20788@freescale.com>
Mon, 14 Oct 2013 19:32:48 +0000 (15:32 -0400)
committerLothar Waßmann <LW@KARO-electronics.de>
Mon, 16 Jun 2014 16:01:37 +0000 (18:01 +0200)
When system suspend, need to switch pwm pin to sleep mode,
this is to save IO power. Using pinctrl mode switch framework
to make it happen.

Signed-off-by: Anson Huang <b20788@freescale.com>
drivers/pinctrl/pinctrl-imx.c
drivers/pinctrl/pinctrl-imx.h
drivers/pinctrl/pinctrl-imx6sl.c

index a24448e5d3996ee81a490710545626be8c83f0a2..52c342577f40927a75f47c80ea4f8bd82d09eabe 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Core driver for the imx pin controller
  *
- * Copyright (C) 2012 Freescale Semiconductor, Inc.
+ * Copyright (C) 2012-2013 Freescale Semiconductor, Inc.
  * Copyright (C) 2012 Linaro Ltd.
  *
  * Author: Dong Aisheng <dong.aisheng@linaro.org>
@@ -628,3 +628,25 @@ int imx_pinctrl_remove(struct platform_device *pdev)
 
        return 0;
 }
+
+#ifdef CONFIG_PM
+int imx_pinctrl_suspend(struct platform_device *pdev, pm_message_t state)
+{
+       struct imx_pinctrl *ipctl = platform_get_drvdata(pdev);
+
+       if (!ipctl)
+               return -EINVAL;
+
+       return pinctrl_force_sleep(ipctl->pctl);
+}
+
+int imx_pinctrl_resume(struct platform_device *pdev)
+{
+       struct imx_pinctrl *ipctl = platform_get_drvdata(pdev);
+
+       if (!ipctl)
+               return -EINVAL;
+
+       return pinctrl_force_default(ipctl->pctl);
+}
+#endif
index db408b0570002af667a8e7a6875a4f344703fa87..63aff36687883167d875c638289f1516871e0c1f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * IMX pinmux core definitions
  *
- * Copyright (C) 2012 Freescale Semiconductor, Inc.
+ * Copyright (C) 2012-2013 Freescale Semiconductor, Inc.
  * Copyright (C) 2012 Linaro Ltd.
  *
  * Author: Dong Aisheng <dong.aisheng@linaro.org>
@@ -98,4 +98,8 @@ struct imx_pinctrl_soc_info {
 int imx_pinctrl_probe(struct platform_device *pdev,
                        struct imx_pinctrl_soc_info *info);
 int imx_pinctrl_remove(struct platform_device *pdev);
+#ifdef CONFIG_PM
+int imx_pinctrl_suspend(struct platform_device *pdev, pm_message_t state);
+int imx_pinctrl_resume(struct platform_device *pdev);
+#endif
 #endif /* __DRIVERS_PINCTRL_IMX_H */
index f21b7389df3c2771127e381030151d124782de36..bc5c19cb711343abb5de839e5ef65b095af43625 100644 (file)
@@ -384,6 +384,10 @@ static struct platform_driver imx6sl_pinctrl_driver = {
        },
        .probe = imx6sl_pinctrl_probe,
        .remove = imx_pinctrl_remove,
+#ifdef CONFIG_PM
+       .suspend = imx_pinctrl_suspend,
+       .resume = imx_pinctrl_resume,
+#endif
 };
 
 static int __init imx6sl_pinctrl_init(void)