Skip to contentSkip to conversation

extcon: usb-gpio: add pinctrl operation during system PM

PATCH Superseded Peter Chen 3 participants 4 messages Jan 3, 2017 – Jan 4, 2017 External connector subsystem (extcon)

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore

Peter Chen

author
#0 lore raw

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
index d589c5f..f7172ae 100644
@@ -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
#1 lore raw

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.

---
 drivers/extcon/extcon-usb-gpio.c | 2 ++
 1 file changed, 2 insertions(+)
drivers/extcon/extcon-usb-gpio.c +1 -0
index d589c5f..f7172ae 100644
@@ -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

author
#2 lore raw
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.

---
 drivers/extcon/extcon-usb-gpio.c | 2 ++
 1 file changed, 2 insertions(+)
drivers/extcon/extcon-usb-gpio.c +1 -0
index d589c5f..f7172ae 100644
@@ -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

#3 lore raw
In reply to Peter Chen
reproduce:

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