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-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=1089c7e75617c19ca4e8b47462b19025e1312ec2;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 7284b8678ead..6cae657d2a74 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 @@ -649,3 +649,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 bcedd991c9f3..e18c94deccf5 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 @@ -92,4 +92,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 4eb7ccab5f2d..f8613d53beab 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)