extcon: usb-gpio: add pinctrl operation during system PM
PATCH 1/1 extcon: usb-gpio: add pinctrl operation during system PM
At some systems, the pinctrl setting will be lost or needs to set as "sleep" state to save power consumption. So, we need to configure pinctrl as "sleep" state when system enters suspend, and as "default" state after system resumes. In this way, the pinctrl value can be recovered as "default" state after resuming.
--- drivers/extcon/extcon-usb-gpio.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/extcon/extcon-usb-gpio.c +2 -0
@@ -244,6 +244,7 @@ static int usb_extcon_suspend(struct device *dev)disable_irq (info->id_irq);if (info->vbus_gpiod)disable_irq (info->vbus_irq); +pinctrl_pm_select_sleep_state (dev);return ret; }
@@ -253,6 +254,7 @@ static int usb_extcon_resume(struct device *dev)struct usb_extcon_info *info =dev_get_drvdata (dev);int ret =0 ; +pinctrl_pm_select_default_state (dev);if (device_may_wakeup (dev)) {if (info->id_gpiod) { ret =disable_irq_wake (info->id_irq);
Signature · 1 line
2.7.4
Hi Peter,
Quoted 25 lines · Peter Chen
At some systems, the pinctrl setting will be lost or needs to set as "sleep" state to save power consumption. So, we need to configure pinctrl as "sleep" state when system enters suspend, and as "default" state after system resumes. In this way, the pinctrl value can be recovered as "default" state after resuming.
Signed-off-by Peter Chen <[email protected]>--- drivers/extcon/extcon-usb-gpio.c | 2 ++ 1 file changed, 2 insertions(+)drivers/extcon/extcon-usb-gpio.c +1
-0@@ -244,6 +244,7 @@ static int usb_extcon_suspend(struct device *dev)disable_irq (info->id_irq);if (info->vbus_gpiod)disable_irq (info->vbus_irq); +pinctrl_pm_select_sleep_state (dev);return ret; }
drivers/extcon/extcon-usb-gpio.c static int usb_extcon_resume(struct device *dev) · line 260
Quoted 7 lines
drivers/extcon/extcon-usb-gpio.c +1
-0@@ -253,6 +254,7 @@ static int usb_extcon_resume(struct device *dev)struct usb_extcon_info *info =dev_get_drvdata (dev);int ret =0 ; +pinctrl_pm_select_default_state (dev);if (device_may_wakeup (dev)) {if (info->id_gpiod) { ret =disable_irq_wake (info->id_irq);
How does this work if wake from suspend is desired? pinctrl sleep state might not support wakeup.
cheers,
-roger
Quoted 31 lines · Peter Chen
Quoted 28 lines
At some systems, the pinctrl setting will be lost or needs to set as "sleep" state to save power consumption. So, we need to configure pinctrl as "sleep" state when system enters suspend, and as "default" state after system resumes. In this way, the pinctrl value can be recovered as "default" state after resuming.
Signed-off-by Peter Chen <[email protected]>--- drivers/extcon/extcon-usb-gpio.c | 2 ++ 1 file changed, 2 insertions(+)drivers/extcon/extcon-usb-gpio.c +1
-0@@ -244,6 +244,7 @@ static int usb_extcon_suspend(struct device *dev)disable_irq (info->id_irq);if (info->vbus_gpiod)disable_irq (info->vbus_irq); +pinctrl_pm_select_sleep_state (dev);return ret; }@@ -253,6 +254,7 @@ static int usb_extcon_resume(struct device *dev)struct usb_extcon_info *info =dev_get_drvdata (dev);int ret =0 ;
Quoted 9 lines
drivers/extcon/extcon-usb-gpio.c static int usb_extcon_resume(struct device *dev) · line 260
Quoted 5 lines
drivers/extcon/extcon-usb-gpio.c +1
-0+pinctrl_pm_select_default_state (dev);if (device_may_wakeup (dev)) {if (info->id_gpiod) { ret =disable_irq_wake (info->id_irq);How does this work if wake from suspend is desired? pinctrl sleep state might not support wakeup.
Oh, yes. I should consider wakeup condition. For GPIO pins, if wakeup is requested by user, the pinctrl should NOT in sleep state.
Peter
kbuild test robot
build botreproduce:
Hi Peter,
[auto build test ERROR on chanwoo-extcon/extcon-next]
[also build test ERROR on v4.10-rc2 next-20170103]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Peter-Chen/extcon-usb-gpio-add-pinctrl-operation-during-system-PM/20170103-223852 base: https://git.kernel.org/pub/scm/linux/kernel/git/chanwoo/extcon.git extcon-next config: i386-randconfig-x007-201701 (attached as .config) compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901 reproduce: # save the attached .config to linux build tree make ARCH=i386
All errors (new ones prefixed by >>):
drivers/extcon/extcon-usb-gpio.c: In function 'usb_extcon_suspend':
>> drivers/extcon/extcon-usb-gpio.c:247:2: error: implicit declaration of function 'pinctrl_pm_select_sleep_state' [-Werror=implicit-function-declaration]
pinctrl_pm_select_sleep_state(dev);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/extcon/extcon-usb-gpio.c: In function 'usb_extcon_resume':
>> drivers/extcon/extcon-usb-gpio.c:257:2: error: implicit declaration of function 'pinctrl_pm_select_default_state' [-Werror=implicit-function-declaration]
pinctrl_pm_select_default_state(dev);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cc1: some warnings being treated as errors
vim +/pinctrl_pm_select_sleep_state +247 drivers/extcon/extcon-usb-gpio.c
241 * accessible until resume completes. So disable IRQ.
242 */
243 if (info->id_gpiod)
244 disable_irq(info->id_irq);
245 if (info->vbus_gpiod)
246 disable_irq(info->vbus_irq);
> 247 pinctrl_pm_select_sleep_state(dev);
248
249 return ret;
250 }
251
252 static int usb_extcon_resume(struct device *dev)
253 {
254 struct usb_extcon_info *info = dev_get_drvdata(dev);
255 int ret = 0;
256
> 257 pinctrl_pm_select_default_state(dev); 258 if (device_may_wakeup(dev)) {
259 if (info->id_gpiod) {
260 ret = disable_irq_wake(info->id_irq);
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation