From: SangeethaRao <sangeetha....@lsi.com> Signed-off-by: SangeethaRao <sangeetha....@lsi.com> --- drivers/usb/host/ehci-ci13612.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
diff --git a/drivers/usb/host/ehci-ci13612.c b/drivers/usb/host/ehci-ci13612.c index 68ac2f4..c56f476 100644 --- a/drivers/usb/host/ehci-ci13612.c +++ b/drivers/usb/host/ehci-ci13612.c @@ -90,6 +90,7 @@ static int ci13612_ehci_init(struct usb_hcd *hcd) struct ehci_hcd *ehci = hcd_to_ehci(hcd); int retval = 0; int len; + int value, count = 5; /* EHCI registers start at offset 0x100 */ ehci->caps = hcd->regs + 0x100; @@ -103,6 +104,29 @@ static int ci13612_ehci_init(struct usb_hcd *hcd) ehci->sbrn = 0x20; + /* Reset is only allowed on a stopped controller, + * ehci_reset assumes stopped state */ + value = ehci_readl(ehci, &ehci->regs->command); + if (value & 0x1) + { + pr_info("ehci-ci13612 (ci13612_ehci_init): Controller Running - Trying to stop\n"); + ehci_writel(ehci, value & 0xFFFE, &ehci->regs->command); + udelay(1); + + /* Timed loop to try and stop the running Controller */ + do { + value = ehci_readl(ehci, &ehci->regs->command); + udelay(1); + count--; + } while ((value & 0x1) && (count > 0)); + + if (value & 0x1) { + pr_err("ehci-ci13612: USB controller is in running state and cannot be" + "stopped\n"); + return -EFAULT; + } + } + /* reset and halt controller */ ehci_reset(ehci); -- 1.8.4.3 _______________________________________________ linux-yocto mailing list linux-yocto@yoctoproject.org https://lists.yoctoproject.org/listinfo/linux-yocto