Thread (12 messages) 12 messages, 3 authors, 2017-06-06

[PATCH v14 4/7] usb: core: add power sequence handling for USB devices

From: Peter Chen <hidden>
Date: 2017-06-06 01:32:31
Also in: linux-devicetree, linux-pm, lkml

On Mon, Jun 05, 2017 at 10:16:34AM -0400, Alan Stern wrote:
On Mon, 5 Jun 2017, Peter Chen wrote:
quoted
On Thu, May 18, 2017 at 08:49:00AM +0800, Peter Chen wrote:
quoted
Some hard-wired USB devices need to do power sequence to let the
device work normally, the typical power sequence like: enable USB
PHY clock, toggle reset pin, etc. But current Linux USB driver
lacks of such code to do it, it may cause some hard-wired USB devices
works abnormal or can't be recognized by controller at all.

In this patch, it calls power sequence library APIs to finish
the power sequence events. It will do power on sequence at hub's
probe for all devices under this hub (includes root hub).
At hub_disconnect, it will do power off sequence which is at powered
on list.
Greg, Alan, would you please help on reviewing it? It seems Rafael
is waiting for USB MAINTAINERS's comments or ack. It resolves some
USB HUB issues for several persons.

Peter
quoted
Signed-off-by: Peter Chen <redacted>
Tested-by Joshua Clayton [off-list ref]
Tested-by: Maciej S. Szmigiero <redacted>
Reviewed-by: Vaibhav Hiremath <hvaibhav.linux@gmail.com>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
quoted
quoted
---
 drivers/usb/Kconfig    |  1 +
 drivers/usb/core/hub.c | 49 +++++++++++++++++++++++++++++++++++++++++++++----
 drivers/usb/core/hub.h |  1 +
 3 files changed, 47 insertions(+), 4 deletions(-)
diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig
index 939a63b..b6f626e 100644
--- a/drivers/usb/Kconfig
+++ b/drivers/usb/Kconfig
@@ -39,6 +39,7 @@ config USB
 	tristate "Support for Host-side USB"
 	depends on USB_ARCH_HAS_HCD
 	select USB_COMMON
+	select POWER_SEQUENCE
 	select NLS  # for UTF-8 strings
 	---help---
 	  Universal Serial Bus (USB) is a specification for a serial bus
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 9dca59e..7a67296 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -28,6 +28,7 @@
 #include <linux/mutex.h>
 #include <linux/random.h>
 #include <linux/pm_qos.h>
+#include <linux/power/pwrseq.h>
 
 #include <linux/uaccess.h>
 #include <asm/byteorder.h>
@@ -1619,6 +1620,7 @@ static void hub_disconnect(struct usb_interface *intf)
 	hub->error = 0;
 	hub_quiesce(hub, HUB_DISCONNECT);
 
+	of_pwrseq_off_list(&hub->pwrseq_on_list);
Things like this look a little peculiar -- you are passing an "on_list" 
to a function named "...off_list".

How about naming the new field hub->pwrseq_list instead?
Thanks, Alan. I will change it at next revision.

-- 

Best Regards,
Peter Chen
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help