From: Anson Huang Date: Mon, 14 Oct 2013 19:32:48 +0000 (-0400) Subject: ENGR00283508-5 pinctrl: imx: support pin sleep mode in suspend X-Git-Tag: KARO-TX6-2014-07-10~192 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=9f55ab6725a5eaa0ab4959cfba712de8a02f35c6;p=karo-tx-linux.git ENGR00283508-5 pinctrl: imx: support pin sleep mode in suspend 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 --- diff --git a/drivers/pinctrl/pinctrl-imx.c b/drivers/pinctrl/pinctrl-imx.c index a24448e5d399..52c342577f40 100644 --- a/drivers/pinctrl/pinctrl-imx.c +++ b/drivers/pinctrl/pinctrl-imx.c @@ -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 @@ -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 diff --git a/drivers/pinctrl/pinctrl-imx.h b/drivers/pinctrl/pinctrl-imx.h index db408b057000..63aff3668788 100644 --- a/drivers/pinctrl/pinctrl-imx.h +++ b/drivers/pinctrl/pinctrl-imx.h @@ -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 @@ -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 */ diff --git a/drivers/pinctrl/pinctrl-imx6sl.c b/drivers/pinctrl/pinctrl-imx6sl.c index f21b7389df3c..bc5c19cb7113 100644 --- a/drivers/pinctrl/pinctrl-imx6sl.c +++ b/drivers/pinctrl/pinctrl-imx6sl.c @@ -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)