diff mbox

powerpc/usb: fix bug of kernel hang when initializing usb

Message ID 1329386540-12341-1-git-send-email-Shengzhou.Liu@freescale.com (mailing list archive)
State Accepted, archived
Headers show

Commit Message

Shengzhou Liu Feb. 16, 2012, 10:02 a.m. UTC
If USB UTMI PHY is not enable, writing to portsc register will lead to
kernel hang during boot up.

Signed-off-by: Shengzhou Liu <Shengzhou.Liu@freescale.com>
---
Apply for master branch of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git 
Tested on P5020DS, the issue was reported by Benjamin Herrenschmidt. 

 drivers/usb/host/ehci-fsl.c |    4 ++++
 drivers/usb/host/ehci-fsl.h |    1 +
 2 files changed, 5 insertions(+), 0 deletions(-)

Comments

Benjamin Herrenschmidt Feb. 16, 2012, 10:39 a.m. UTC | #1
On Thu, 2012-02-16 at 18:02 +0800, Shengzhou Liu wrote:
> If USB UTMI PHY is not enable, writing to portsc register will lead to
> kernel hang during boot up.

Thanks, I'll try that tomorrow.

Greg, you're picking that up or should I ?

Cheers,
Ben.

> Signed-off-by: Shengzhou Liu <Shengzhou.Liu@freescale.com>
> ---
> Apply for master branch of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git 
> Tested on P5020DS, the issue was reported by Benjamin Herrenschmidt. 
> 
>  drivers/usb/host/ehci-fsl.c |    4 ++++
>  drivers/usb/host/ehci-fsl.h |    1 +
>  2 files changed, 5 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c
> index c26a82e..0090ed2 100644
> --- a/drivers/usb/host/ehci-fsl.c
> +++ b/drivers/usb/host/ehci-fsl.c
> @@ -216,6 +216,8 @@ static void ehci_fsl_setup_phy(struct ehci_hcd *ehci,
>  			       unsigned int port_offset)
>  {
>  	u32 portsc;
> +	struct usb_hcd *hcd = ehci_to_hcd(ehci);
> +	void __iomem *non_ehci = hcd->regs;
>  
>  	portsc = ehci_readl(ehci, &ehci->regs->port_status[port_offset]);
>  	portsc &= ~(PORT_PTS_MSK | PORT_PTS_PTW);
> @@ -231,6 +233,8 @@ static void ehci_fsl_setup_phy(struct ehci_hcd *ehci,
>  		portsc |= PORT_PTS_PTW;
>  		/* fall through */
>  	case FSL_USB2_PHY_UTMI:
> +		/* enable UTMI PHY */
> +		setbits32(non_ehci + FSL_SOC_USB_CTRL, CTRL_UTMI_PHY_EN);
>  		portsc |= PORT_PTS_UTMI;
>  		break;
>  	case FSL_USB2_PHY_NONE:
> diff --git a/drivers/usb/host/ehci-fsl.h b/drivers/usb/host/ehci-fsl.h
> index bdf43e2..0e400c2 100644
> --- a/drivers/usb/host/ehci-fsl.h
> +++ b/drivers/usb/host/ehci-fsl.h
> @@ -45,6 +45,7 @@
>  #define FSL_SOC_USB_PRICTRL	0x40c	/* NOTE: big-endian */
>  #define FSL_SOC_USB_SICTRL	0x410	/* NOTE: big-endian */
>  #define FSL_SOC_USB_CTRL	0x500	/* NOTE: big-endian */
> +#define CTRL_UTMI_PHY_EN	(1<<9)
>  #define CTRL_PHY_CLK_VALID	(1 << 17)
>  #define SNOOP_SIZE_2GB		0x1e
>  #endif				/* _EHCI_FSL_H */
Greg KH Feb. 16, 2012, 4:19 p.m. UTC | #2
On Thu, Feb 16, 2012 at 09:39:15PM +1100, Benjamin Herrenschmidt wrote:
> On Thu, 2012-02-16 at 18:02 +0800, Shengzhou Liu wrote:
> > If USB UTMI PHY is not enable, writing to portsc register will lead to
> > kernel hang during boot up.
> 
> Thanks, I'll try that tomorrow.
> 
> Greg, you're picking that up or should I ?

I can, if you let me know that this fixes your problem :)

thanks,

greg k-h
Benjamin Herrenschmidt Feb. 16, 2012, 10:58 p.m. UTC | #3
On Thu, 2012-02-16 at 18:02 +0800, Shengzhou Liu wrote:
> If USB UTMI PHY is not enable, writing to portsc register will lead to
> kernel hang during boot up.
> 
> Signed-off-by: Shengzhou Liu <Shengzhou.Liu@freescale.com>
> ---
> Apply for master branch of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git 
> Tested on P5020DS, the issue was reported by Benjamin Herrenschmidt. 

This fixes the hang, but sadly doesn't make USB work. I now get:

ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
/soc@ffe000000/usb@210000: Invalid 'dr_mode' property, fallback to host mode
fsl-ehci fsl-ehci.0: Freescale On-Chip EHCI Host Controller
fsl-ehci fsl-ehci.0: new USB bus registered, assigned bus number 1
fsl-ehci fsl-ehci.0: irq 44, io mem 0xffe210000
fsl-ehci fsl-ehci.0: USB 2.0 started, EHCI 1.00
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 1 port detected
fsl-ehci fsl-ehci.1: Freescale On-Chip EHCI Host Controller
fsl-ehci fsl-ehci.1: new USB bus registered, assigned bus number 2
fsl-ehci fsl-ehci.1: irq 45, io mem 0xffe211000
fsl-ehci fsl-ehci.1: USB 2.0 started, EHCI 1.00

 .../...

usb 1-1: device descriptor read/64, error -110
usb 1-1: device descriptor read/64, error -110

<remove device, re-plug it>

usb 1-1: new full-speed USB device number 3 using fsl-ehci
hub 1-0:1.0: unable to enumerate USB device on port 1

<remove again, re-plug it>

usb 1-1: new full-speed USB device number 4 using fsl-ehci
usb 1-1: device descriptor read/64, error -110

The blurb about "invalid dr_mode property" makes me think there's some
kind of disagreement between the device-tree coming with the machine and
what upstream expects. Basically the DT doesn't contain a dr_mode
property at all (which should be fine, host mode is what I want, but I
suspect some stuff aren't being configured properly by u-boot either...)

Cheers,
Ben.
Benjamin Herrenschmidt Feb. 17, 2012, 12:02 a.m. UTC | #4
On Fri, 2012-02-17 at 09:58 +1100, Benjamin Herrenschmidt wrote:
> On Thu, 2012-02-16 at 18:02 +0800, Shengzhou Liu wrote:
> > If USB UTMI PHY is not enable, writing to portsc register will lead to
> > kernel hang during boot up.
> > 
> > Signed-off-by: Shengzhou Liu <Shengzhou.Liu@freescale.com>
> > ---
> > Apply for master branch of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git 
> > Tested on P5020DS, the issue was reported by Benjamin Herrenschmidt. 
> 
> This fixes the hang, but sadly doesn't make USB work. I now get:

 .../...

Ok, found the problem.

First, the SDK kernel had a delay after setting that bit, I added that
back in. This is not what fixed it but it looks like the right thing to
do, though please, use msleep rather than udelay here if possible (not
in atomic context).

Then, the real culprit is (CC'ing Kumar and Scott to figure out why)
this statement:

#if defined(CONFIG_PPC32) && !defined(CONFIG_NOT_COHERENT_CACHE)
	/*
	 * Turn on cache snooping hardware, since some PowerPC platforms
	 * wholly rely on hardware to deal with cache coherent
	 */

	/* Setup Snooping for all the 4GB space */
	/* SNOOP1 starts from 0x0, size 2G */
	out_be32(non_ehci + FSL_SOC_USB_SNOOP1, 0x0 | SNOOP_SIZE_2GB);
	/* SNOOP2 starts from 0x80000000, size 2G */
	out_be32(non_ehci + FSL_SOC_USB_SNOOP2, 0x80000000 | SNOOP_SIZE_2GB);
#endif

I'm building a 64-bit kernel so this isn't compiled and it looks like
the EHCI is thus not snooping.

By removing the defined(CONFIG_PPC32) part of the statement, my problem
goes away.

Cheers,
Ben.
Liu Shengzhou-B36685 Feb. 17, 2012, 2:32 a.m. UTC | #5
> -----Original Message-----
> From: Benjamin Herrenschmidt [mailto:benh@kernel.crashing.org]
> Sent: Friday, February 17, 2012 8:03 AM
> To: Liu Shengzhou-B36685
> Cc: linux-usb@vger.kernel.org; linuxppc-dev@lists.ozlabs.org
> Subject: Re: [PATCH] powerpc/usb: fix bug of kernel hang when
> initializing usb
> 
> On Fri, 2012-02-17 at 09:58 +1100, Benjamin Herrenschmidt wrote:
> > On Thu, 2012-02-16 at 18:02 +0800, Shengzhou Liu wrote:
> > > If USB UTMI PHY is not enable, writing to portsc register will lead
> > > to kernel hang during boot up.
> > >
> > > Signed-off-by: Shengzhou Liu <Shengzhou.Liu@freescale.com>
> > > ---
> > > Apply for master branch of
> > > git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-
> 2.6.git
> > > Tested on P5020DS, the issue was reported by Benjamin Herrenschmidt.
> >
> > This fixes the hang, but sadly doesn't make USB work. I now get:
> 
>  .../...
> 
> Ok, found the problem.
> 
> First, the SDK kernel had a delay after setting that bit, I added that
> back in. This is not what fixed it but it looks like the right thing to
> do, though please, use msleep rather than udelay here if possible (not
> in atomic context).
> 
> Then, the real culprit is (CC'ing Kumar and Scott to figure out why)
> this statement:
> 
> #if defined(CONFIG_PPC32) && !defined(CONFIG_NOT_COHERENT_CACHE)
> 	/*
> 	 * Turn on cache snooping hardware, since some PowerPC platforms
> 	 * wholly rely on hardware to deal with cache coherent
> 	 */
> 
> 	/* Setup Snooping for all the 4GB space */
> 	/* SNOOP1 starts from 0x0, size 2G */
> 	out_be32(non_ehci + FSL_SOC_USB_SNOOP1, 0x0 | SNOOP_SIZE_2GB);
> 	/* SNOOP2 starts from 0x80000000, size 2G */
> 	out_be32(non_ehci + FSL_SOC_USB_SNOOP2, 0x80000000 |
> SNOOP_SIZE_2GB); #endif
> 
> I'm building a 64-bit kernel so this isn't compiled and it looks like
> the EHCI is thus not snooping.
> 
> By removing the defined(CONFIG_PPC32) part of the statement, my problem
> goes away.
> 
> Cheers,
> Ben.
> 
> 

[Shengzhou] I tested the patch with 32bit P5020DS, USB worked well. Not tested with 64-bit kernel.
Glad to you had found the problem in case of 64-bit, thanks!
Benjamin Herrenschmidt Feb. 17, 2012, 3:42 a.m. UTC | #6
On Fri, 2012-02-17 at 03:20 +0000, Pan Jiafei-B37022 wrote:
> FYI, I once fixed this issue when backport P5020 BSP for WR Linux, The
> following is the patch which I have submitted to linuxbj-internal.

Should I just apply this to upstream ?

Cheers,
Ben.

> From: linuxbj-internal-bounces@linux.freescale.net [mailto:linuxbj-internal-bounces@linux.freescale.net] On Behalf Of Pan Jiafei-B37022
> Sent: Friday, December 16, 2011 12:49 PM
> To: linuxbj-internal@linux.freescale.net
> Cc: Pan Jiafei-B37022
> Subject: [Linuxbj-internal] [PATCH] USB: ehci-fsl: Turn on cache snooping on MPC8xxx
> 
> If a MPC8xxx was being used, 'have_sysif_regs' should be set and
> it should setup cache snooping for all the 4GB space on both PPC32
> and PPC64.
> 
> Signed-off-by: Pan Jiafei <Jiafei.Pan@freescale.com>
> ---
> drivers/usb/host/ehci-fsl.c |   23 ++++++++++-------------
> 1 files changed, 10 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c
> index 90534cc..ee14fa7 100644
> --- a/drivers/usb/host/ehci-fsl.c
> +++ b/drivers/usb/host/ehci-fsl.c
> @@ -260,21 +260,18 @@ static void ehci_fsl_usb_setup(struct ehci_hcd *ehci)
>     if (pdata->have_sysif_regs) {
>           temp = in_be32(non_ehci + FSL_SOC_USB_CTRL);
>           out_be32(non_ehci + FSL_SOC_USB_CTRL, temp | 0x00000004);
> -          out_be32(non_ehci + FSL_SOC_USB_SNOOP1, 0x0000001b);
> -    }
> 
> -#if defined(CONFIG_PPC32) && !defined(CONFIG_NOT_COHERENT_CACHE)
> -    /*
> -    * Turn on cache snooping hardware, since some PowerPC platforms
> -    * wholly rely on hardware to deal with cache coherent
> -    */
> +          /*
> +          * Turn on cache snooping hardware, since some PowerPC platforms
> +          * wholly rely on hardware to deal with cache coherent
> +          */
> 
> -    /* Setup Snooping for all the 4GB space */
> -    /* SNOOP1 starts from 0x0, size 2G */
> -    out_be32(non_ehci + FSL_SOC_USB_SNOOP1, 0x0 | SNOOP_SIZE_2GB);
> -    /* SNOOP2 starts from 0x80000000, size 2G */
> -    out_be32(non_ehci + FSL_SOC_USB_SNOOP2, 0x80000000 | SNOOP_SIZE_2GB);
> -#endif
> +          /* Setup Snooping for all the 4GB space */
> +          /* SNOOP1 starts from 0x0, size 2G */
> +          out_be32(non_ehci + FSL_SOC_USB_SNOOP1, 0x0 | SNOOP_SIZE_2GB);
> +          /* SNOOP2 starts from 0x80000000, size 2G */
> +          out_be32(non_ehci + FSL_SOC_USB_SNOOP2, 0x80000000 | SNOOP_SIZE_2GB);
> +    }
> 
>      if ((pdata->operating_mode == FSL_USB2_DR_HOST) ||
>                (pdata->operating_mode == FSL_USB2_DR_OTG))
Pan Jiafei-B37022 Feb. 17, 2012, 3:46 a.m. UTC | #7
> -----Original Message-----
> From: Benjamin Herrenschmidt [mailto:benh@kernel.crashing.org]
> Sent: Friday, February 17, 2012 11:43 AM
> To: Pan Jiafei-B37022
> Cc: Liu Shengzhou-B36685; linux-usb@vger.kernel.org; linuxppc-
> dev@lists.ozlabs.org
> Subject: RE: [PATCH] powerpc/usb: fix bug of kernel hang when
> initializing usb
> 
> On Fri, 2012-02-17 at 03:20 +0000, Pan Jiafei-B37022 wrote:
> > FYI, I once fixed this issue when backport P5020 BSP for WR Linux, The
> > following is the patch which I have submitted to linuxbj-internal.
> 
> Should I just apply this to upstream ?
> 
> Cheers,
> Ben.
> 
[Pan Jiafei-B37022] 
Feel free to apply this to upstream, thanks

Best Regards.
Jiafei

> > From: linuxbj-internal-bounces@linux.freescale.net
> > [mailto:linuxbj-internal-bounces@linux.freescale.net] On Behalf Of Pan
> > Jiafei-B37022
> > Sent: Friday, December 16, 2011 12:49 PM
> > To: linuxbj-internal@linux.freescale.net
> > Cc: Pan Jiafei-B37022
> > Subject: [Linuxbj-internal] [PATCH] USB: ehci-fsl: Turn on cache
> > snooping on MPC8xxx
> >
> > If a MPC8xxx was being used, 'have_sysif_regs' should be set and it
> > should setup cache snooping for all the 4GB space on both PPC32 and
> > PPC64.
> >
> > Signed-off-by: Pan Jiafei <Jiafei.Pan@freescale.com>
> > ---
> > drivers/usb/host/ehci-fsl.c |   23 ++++++++++-------------
> > 1 files changed, 10 insertions(+), 13 deletions(-)
> >
> > diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c
> > index 90534cc..ee14fa7 100644
> > --- a/drivers/usb/host/ehci-fsl.c
> > +++ b/drivers/usb/host/ehci-fsl.c
> > @@ -260,21 +260,18 @@ static void ehci_fsl_usb_setup(struct ehci_hcd
> *ehci)
> >     if (pdata->have_sysif_regs) {
> >           temp = in_be32(non_ehci + FSL_SOC_USB_CTRL);
> >           out_be32(non_ehci + FSL_SOC_USB_CTRL, temp | 0x00000004);
> > -          out_be32(non_ehci + FSL_SOC_USB_SNOOP1, 0x0000001b);
> > -    }
> >
> > -#if defined(CONFIG_PPC32) && !defined(CONFIG_NOT_COHERENT_CACHE)
> > -    /*
> > -    * Turn on cache snooping hardware, since some PowerPC platforms
> > -    * wholly rely on hardware to deal with cache coherent
> > -    */
> > +          /*
> > +          * Turn on cache snooping hardware, since some PowerPC
> platforms
> > +          * wholly rely on hardware to deal with cache coherent
> > +          */
> >
> > -    /* Setup Snooping for all the 4GB space */
> > -    /* SNOOP1 starts from 0x0, size 2G */
> > -    out_be32(non_ehci + FSL_SOC_USB_SNOOP1, 0x0 | SNOOP_SIZE_2GB);
> > -    /* SNOOP2 starts from 0x80000000, size 2G */
> > -    out_be32(non_ehci + FSL_SOC_USB_SNOOP2, 0x80000000 |
> SNOOP_SIZE_2GB);
> > -#endif
> > +          /* Setup Snooping for all the 4GB space */
> > +          /* SNOOP1 starts from 0x0, size 2G */
> > +          out_be32(non_ehci + FSL_SOC_USB_SNOOP1, 0x0 |
> SNOOP_SIZE_2GB);
> > +          /* SNOOP2 starts from 0x80000000, size 2G */
> > +          out_be32(non_ehci + FSL_SOC_USB_SNOOP2, 0x80000000 |
> SNOOP_SIZE_2GB);
> > +    }
> >
> >      if ((pdata->operating_mode == FSL_USB2_DR_HOST) ||
> >                (pdata->operating_mode == FSL_USB2_DR_OTG))
> 
>
Pan Jiafei-B37022 Feb. 17, 2012, 3:54 a.m. UTC | #8
> -----Original Message-----
> From: Benjamin Herrenschmidt [mailto:benh@kernel.crashing.org]
> Sent: Friday, February 17, 2012 11:43 AM
> To: Pan Jiafei-B37022
> Cc: Liu Shengzhou-B36685; linux-usb@vger.kernel.org; linuxppc-
> dev@lists.ozlabs.org
> Subject: RE: [PATCH] powerpc/usb: fix bug of kernel hang when
> initializing usb
> 
> On Fri, 2012-02-17 at 03:20 +0000, Pan Jiafei-B37022 wrote:
> > FYI, I once fixed this issue when backport P5020 BSP for WR Linux, The
> > following is the patch which I have submitted to linuxbj-internal.
> 
> Should I just apply this to upstream ?
> 
> Cheers,
> Ben.
> 
[Pan Jiafei-B37022] 
Ok, thanks, I will resend the patch formally!

Best Regards.
Jiafei.

> > From: linuxbj-internal-bounces@linux.freescale.net
> > [mailto:linuxbj-internal-bounces@linux.freescale.net] On Behalf Of Pan
> > Jiafei-B37022
> > Sent: Friday, December 16, 2011 12:49 PM
> > To: linuxbj-internal@linux.freescale.net
> > Cc: Pan Jiafei-B37022
> > Subject: [Linuxbj-internal] [PATCH] USB: ehci-fsl: Turn on cache
> > snooping on MPC8xxx
> >
> > If a MPC8xxx was being used, 'have_sysif_regs' should be set and it
> > should setup cache snooping for all the 4GB space on both PPC32 and
> > PPC64.
> >
> > Signed-off-by: Pan Jiafei <Jiafei.Pan@freescale.com>
> > ---
> > drivers/usb/host/ehci-fsl.c |   23 ++++++++++-------------
> > 1 files changed, 10 insertions(+), 13 deletions(-)
> >
> > diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c
> > index 90534cc..ee14fa7 100644
> > --- a/drivers/usb/host/ehci-fsl.c
> > +++ b/drivers/usb/host/ehci-fsl.c
> > @@ -260,21 +260,18 @@ static void ehci_fsl_usb_setup(struct ehci_hcd
> *ehci)
> >     if (pdata->have_sysif_regs) {
> >           temp = in_be32(non_ehci + FSL_SOC_USB_CTRL);
> >           out_be32(non_ehci + FSL_SOC_USB_CTRL, temp | 0x00000004);
> > -          out_be32(non_ehci + FSL_SOC_USB_SNOOP1, 0x0000001b);
> > -    }
> >
> > -#if defined(CONFIG_PPC32) && !defined(CONFIG_NOT_COHERENT_CACHE)
> > -    /*
> > -    * Turn on cache snooping hardware, since some PowerPC platforms
> > -    * wholly rely on hardware to deal with cache coherent
> > -    */
> > +          /*
> > +          * Turn on cache snooping hardware, since some PowerPC
> platforms
> > +          * wholly rely on hardware to deal with cache coherent
> > +          */
> >
> > -    /* Setup Snooping for all the 4GB space */
> > -    /* SNOOP1 starts from 0x0, size 2G */
> > -    out_be32(non_ehci + FSL_SOC_USB_SNOOP1, 0x0 | SNOOP_SIZE_2GB);
> > -    /* SNOOP2 starts from 0x80000000, size 2G */
> > -    out_be32(non_ehci + FSL_SOC_USB_SNOOP2, 0x80000000 |
> SNOOP_SIZE_2GB);
> > -#endif
> > +          /* Setup Snooping for all the 4GB space */
> > +          /* SNOOP1 starts from 0x0, size 2G */
> > +          out_be32(non_ehci + FSL_SOC_USB_SNOOP1, 0x0 |
> SNOOP_SIZE_2GB);
> > +          /* SNOOP2 starts from 0x80000000, size 2G */
> > +          out_be32(non_ehci + FSL_SOC_USB_SNOOP2, 0x80000000 |
> SNOOP_SIZE_2GB);
> > +    }
> >
> >      if ((pdata->operating_mode == FSL_USB2_DR_HOST) ||
> >                (pdata->operating_mode == FSL_USB2_DR_OTG))
> 
>
Sergei Shtylyov Feb. 18, 2012, 3:39 p.m. UTC | #9
Hello.

On 16-02-2012 14:02, Shengzhou Liu wrote:

> If USB UTMI PHY is not enable, writing to portsc register will lead to
> kernel hang during boot up.

> Signed-off-by: Shengzhou Liu<Shengzhou.Liu@freescale.com>
[...]

> diff --git a/drivers/usb/host/ehci-fsl.h b/drivers/usb/host/ehci-fsl.h
> index bdf43e2..0e400c2 100644
> --- a/drivers/usb/host/ehci-fsl.h
> +++ b/drivers/usb/host/ehci-fsl.h
> @@ -45,6 +45,7 @@
>   #define FSL_SOC_USB_PRICTRL	0x40c	/* NOTE: big-endian */
>   #define FSL_SOC_USB_SICTRL	0x410	/* NOTE: big-endian */
>   #define FSL_SOC_USB_CTRL	0x500	/* NOTE: big-endian */
> +#define CTRL_UTMI_PHY_EN	(1<<9)

    Please put spaces around << like below.

>   #define CTRL_PHY_CLK_VALID	(1<<  17)
>   #define SNOOP_SIZE_2GB		0x1e
>   #endif				/* _EHCI_FSL_H */

WBR, Sergei
diff mbox

Patch

diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c
index c26a82e..0090ed2 100644
--- a/drivers/usb/host/ehci-fsl.c
+++ b/drivers/usb/host/ehci-fsl.c
@@ -216,6 +216,8 @@  static void ehci_fsl_setup_phy(struct ehci_hcd *ehci,
 			       unsigned int port_offset)
 {
 	u32 portsc;
+	struct usb_hcd *hcd = ehci_to_hcd(ehci);
+	void __iomem *non_ehci = hcd->regs;
 
 	portsc = ehci_readl(ehci, &ehci->regs->port_status[port_offset]);
 	portsc &= ~(PORT_PTS_MSK | PORT_PTS_PTW);
@@ -231,6 +233,8 @@  static void ehci_fsl_setup_phy(struct ehci_hcd *ehci,
 		portsc |= PORT_PTS_PTW;
 		/* fall through */
 	case FSL_USB2_PHY_UTMI:
+		/* enable UTMI PHY */
+		setbits32(non_ehci + FSL_SOC_USB_CTRL, CTRL_UTMI_PHY_EN);
 		portsc |= PORT_PTS_UTMI;
 		break;
 	case FSL_USB2_PHY_NONE:
diff --git a/drivers/usb/host/ehci-fsl.h b/drivers/usb/host/ehci-fsl.h
index bdf43e2..0e400c2 100644
--- a/drivers/usb/host/ehci-fsl.h
+++ b/drivers/usb/host/ehci-fsl.h
@@ -45,6 +45,7 @@ 
 #define FSL_SOC_USB_PRICTRL	0x40c	/* NOTE: big-endian */
 #define FSL_SOC_USB_SICTRL	0x410	/* NOTE: big-endian */
 #define FSL_SOC_USB_CTRL	0x500	/* NOTE: big-endian */
+#define CTRL_UTMI_PHY_EN	(1<<9)
 #define CTRL_PHY_CLK_VALID	(1 << 17)
 #define SNOOP_SIZE_2GB		0x1e
 #endif				/* _EHCI_FSL_H */