[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. Peterquoted
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 busdiff --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