aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorChristian Engelmayer <christian.engelmayer@frequentis.com>2013-04-03 06:18:51 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-04-03 14:38:53 -0400
commite6604a7fd71f9bd2890e07800e191167d7f5751b (patch)
tree5afe401f0fd5c82380b536beeba74829c69c6a04 /drivers/usb
parente7d3b6e22c871ba36d052ca99bc8ceca4d546a60 (diff)
EHCI: Quirk flag for port power handling on overcurrent.
Commit 756aa6b3d536afe85e151138cb03a293998887b3 (ehci-hub: improved over-current recovery) added port power cycling on overcurrent indications as needed by the MPC8349 USB controller after resolving of the overcurrent situation in order to have the host state machine assert the correct port status again. Commit 81463c1d707186adbbe534016cd1249edeab0dac (EHCI: only power off port if over-current is active) solved a thus resulting issue of endless overcurrent changes in combination with the MAX4967 USB power supply chip that signals overcurrent when power is not enabled by only powering off a port if the overcurrent is currently active. Added quirks flag need_oc_pp_cycle in order to specify the needed behaviour as there is no common behaviour that can comply with both requirements. Activated the quirks handling for Freescale 83xx based boards. Signed-off-by: Christian Engelmayer <christian.engelmayer@frequentis.com> Acked-by: Alan Stern <stern@rowland.harvard.edu> Acked-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/host/ehci-fsl.c9
-rw-r--r--drivers/usb/host/ehci-hub.c3
-rw-r--r--drivers/usb/host/ehci.h1
3 files changed, 12 insertions, 1 deletions
diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c
index d81d2fcbff18..3be3df233a0e 100644
--- a/drivers/usb/host/ehci-fsl.c
+++ b/drivers/usb/host/ehci-fsl.c
@@ -370,6 +370,15 @@ static int ehci_fsl_setup(struct usb_hcd *hcd)
370 /* EHCI registers start at offset 0x100 */ 370 /* EHCI registers start at offset 0x100 */
371 ehci->caps = hcd->regs + 0x100; 371 ehci->caps = hcd->regs + 0x100;
372 372
373#ifdef CONFIG_PPC_83xx
374 /*
375 * Deal with MPC834X that need port power to be cycled after the power
376 * fault condition is removed. Otherwise the state machine does not
377 * reflect PORTSC[CSC] correctly.
378 */
379 ehci->need_oc_pp_cycle = 1;
380#endif
381
373 hcd->has_tt = 1; 382 hcd->has_tt = 1;
374 383
375 retval = ehci_setup(hcd); 384 retval = ehci_setup(hcd);
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c
index 7b04ca96b585..9ab4a4d9768a 100644
--- a/drivers/usb/host/ehci-hub.c
+++ b/drivers/usb/host/ehci-hub.c
@@ -840,7 +840,8 @@ static int ehci_hub_control (
840 * power switching; they're allowed to just limit the 840 * power switching; they're allowed to just limit the
841 * current. khubd will turn the power back on. 841 * current. khubd will turn the power back on.
842 */ 842 */
843 if ((temp & PORT_OC) && HCS_PPC(ehci->hcs_params)) { 843 if (((temp & PORT_OC) || (ehci->need_oc_pp_cycle))
844 && HCS_PPC(ehci->hcs_params)) {
844 ehci_writel(ehci, 845 ehci_writel(ehci,
845 temp & ~(PORT_RWC_BITS | PORT_POWER), 846 temp & ~(PORT_RWC_BITS | PORT_POWER),
846 status_reg); 847 status_reg);
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
index e66699950997..7c978b23520d 100644
--- a/drivers/usb/host/ehci.h
+++ b/drivers/usb/host/ehci.h
@@ -199,6 +199,7 @@ struct ehci_hcd { /* one per controller */
199 unsigned use_dummy_qh:1; /* AMD Frame List table quirk*/ 199 unsigned use_dummy_qh:1; /* AMD Frame List table quirk*/
200 unsigned has_synopsys_hc_bug:1; /* Synopsys HC */ 200 unsigned has_synopsys_hc_bug:1; /* Synopsys HC */
201 unsigned frame_index_bug:1; /* MosChip (AKA NetMos) */ 201 unsigned frame_index_bug:1; /* MosChip (AKA NetMos) */
202 unsigned need_oc_pp_cycle:1; /* MPC834X port power */
202 203
203 /* required for usb32 quirk */ 204 /* required for usb32 quirk */
204 #define OHCI_CTRL_HCFS (3 << 6) 205 #define OHCI_CTRL_HCFS (3 << 6)