Message ID | 1364232811-30856-15-git-send-email-yorksun@freescale.com |
---|---|
State | Accepted, archived |
Delegated to: | Andy Fleming |
Headers | show |
On Mon, Mar 25, 2013 at 12:33 PM, York Sun <yorksun@freescale.com> wrote: > From: Roy Zang <tie-fei.zang@freescale.com> > > T4240 internal UTMI phy is different comparing to previous UTMI PHY > in P3041. > This patch adds USB 2.0 UTMI Dual PHY new memory map and enable it for > T4240. > The phy timing is very sensitive and moving the phy enable code to > cpu_init.c will not work. > > Signed-off-by: Roy Zang <tie-fei.zang@freescale.com> > --- > arch/powerpc/include/asm/config_mpc85xx.h | 3 +-- > arch/powerpc/include/asm/immap_85xx.h | 41 > +++++++++++++++++++++++++++++ > drivers/usb/host/ehci-fsl.c | 21 +++++++++++++++ > 3 files changed, 63 insertions(+), 2 deletions(-) > > diff --git a/arch/powerpc/include/asm/config_mpc85xx.h > b/arch/powerpc/include/asm/config_mpc85xx.h > index 3740785..ca235dc 100644 > --- a/arch/powerpc/include/asm/config_mpc85xx.h > +++ b/arch/powerpc/include/asm/config_mpc85xx.h > @@ -536,8 +536,7 @@ > #define CONFIG_SYS_FSL_SRIO_MAX_PORTS 2 > #define CONFIG_SYS_FSL_SRIO_OB_WIN_NUM 9 > #define CONFIG_SYS_FSL_SRIO_IB_WIN_NUM 5 > -#define CONFIG_SYS_FSL_USB1_PHY_ENABLE > -#define CONFIG_SYS_FSL_USB2_PHY_ENABLE > +#define CONFIG_SYS_FSL_USB_DUAL_PHY_ENABLE > #define CONFIG_SYS_FSL_USB_INTERNAL_UTMI_PHY > #define CONFIG_SYS_FSL_ERRATUM_A004468 > #define CONFIG_SYS_FSL_ERRATUM_A_004934 > diff --git a/arch/powerpc/include/asm/immap_85xx.h > b/arch/powerpc/include/asm/immap_85xx.h > index 8bc047b..29ee38f 100644 > --- a/arch/powerpc/include/asm/immap_85xx.h > +++ b/arch/powerpc/include/asm/immap_85xx.h > @@ -2828,12 +2828,53 @@ typedef struct ccsr_pme { > u8 res4[0x400]; > } ccsr_pme_t; > > +#ifdef CONFIG_SYS_FSL_USB_DUAL_PHY_ENABLE > +struct ccsr_usb_port_ctrl { > + u32 ctrl; > + u32 drvvbuscfg; > + u32 pwrfltcfg; > + u32 sts; > + u8 res_14[0xc]; > + u32 bistcfg; > + u32 biststs; > + u32 abistcfg; > + u32 abiststs; > + u8 res_30[0x10]; > + u32 xcvrprg; > + u32 anaprg; > + u32 anadrv; > + u32 anasts; > +}; > + > +struct ccsr_usb_phy { > + u32 id; > + struct ccsr_usb_port_ctrl port1; > + u8 res_50[0xc]; > + u32 tvr; > + u32 pllprg[4]; > + u8 res_70[0x4]; > + u32 anaccfg; > + u32 dbg; > + u8 res_7c[0x4]; > + struct ccsr_usb_port_ctrl port2; > + u8 res_dc[0x334]; > +} ccsr_usb_phy_t; > I get a build error whenever the code attempts to use ccsr_usb_phy_t. Was this even build-tested? Am I going to find a later patch that fixes this? Am I running into a compiler version thing, where it's ok to do struct foo { } foo_t, without "typedef" before? My impression is that's just for C++... I'm going to add "typedef" before this struct, and apply the patch, but please be more careful. Andy
diff --git a/arch/powerpc/include/asm/config_mpc85xx.h b/arch/powerpc/include/asm/config_mpc85xx.h index 3740785..ca235dc 100644 --- a/arch/powerpc/include/asm/config_mpc85xx.h +++ b/arch/powerpc/include/asm/config_mpc85xx.h @@ -536,8 +536,7 @@ #define CONFIG_SYS_FSL_SRIO_MAX_PORTS 2 #define CONFIG_SYS_FSL_SRIO_OB_WIN_NUM 9 #define CONFIG_SYS_FSL_SRIO_IB_WIN_NUM 5 -#define CONFIG_SYS_FSL_USB1_PHY_ENABLE -#define CONFIG_SYS_FSL_USB2_PHY_ENABLE +#define CONFIG_SYS_FSL_USB_DUAL_PHY_ENABLE #define CONFIG_SYS_FSL_USB_INTERNAL_UTMI_PHY #define CONFIG_SYS_FSL_ERRATUM_A004468 #define CONFIG_SYS_FSL_ERRATUM_A_004934 diff --git a/arch/powerpc/include/asm/immap_85xx.h b/arch/powerpc/include/asm/immap_85xx.h index 8bc047b..29ee38f 100644 --- a/arch/powerpc/include/asm/immap_85xx.h +++ b/arch/powerpc/include/asm/immap_85xx.h @@ -2828,12 +2828,53 @@ typedef struct ccsr_pme { u8 res4[0x400]; } ccsr_pme_t; +#ifdef CONFIG_SYS_FSL_USB_DUAL_PHY_ENABLE +struct ccsr_usb_port_ctrl { + u32 ctrl; + u32 drvvbuscfg; + u32 pwrfltcfg; + u32 sts; + u8 res_14[0xc]; + u32 bistcfg; + u32 biststs; + u32 abistcfg; + u32 abiststs; + u8 res_30[0x10]; + u32 xcvrprg; + u32 anaprg; + u32 anadrv; + u32 anasts; +}; + +struct ccsr_usb_phy { + u32 id; + struct ccsr_usb_port_ctrl port1; + u8 res_50[0xc]; + u32 tvr; + u32 pllprg[4]; + u8 res_70[0x4]; + u32 anaccfg; + u32 dbg; + u8 res_7c[0x4]; + struct ccsr_usb_port_ctrl port2; + u8 res_dc[0x334]; +} ccsr_usb_phy_t; + +#define CONFIG_SYS_FSL_USB_CTRL_PHY_EN (1 << 0) +#define CONFIG_SYS_FSL_USB_DRVVBUS_CR_EN (1 << 1) +#define CONFIG_SYS_FSL_USB_PWRFLT_CR_EN (1 << 1) +#define CONFIG_SYS_FSL_USB_PLLPRG2_PHY2_CLK_EN (1 << 0) +#define CONFIG_SYS_FSL_USB_PLLPRG2_PHY1_CLK_EN (1 << 1) +#define CONFIG_SYS_FSL_USB_PLLPRG2_MFI (5 << 16) +#define CONFIG_SYS_FSL_USB_PLLPRG2_PLL_EN (1 << 21) +#else typedef struct ccsr_usb_phy { u8 res0[0x18]; u32 usb_enable_override; u8 res[0xe4]; } ccsr_usb_phy_t; #define CONFIG_SYS_FSL_USB_ENABLE_OVERRIDE 1 +#endif #ifdef CONFIG_SYS_FSL_RAID_ENGINE struct ccsr_raide { diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c index f54b408..77c41f3 100644 --- a/drivers/usb/host/ehci-fsl.c +++ b/drivers/usb/host/ehci-fsl.c @@ -89,6 +89,27 @@ int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor) if (!strcmp(phy_type, "utmi")) { #if defined(CONFIG_SYS_FSL_USB_INTERNAL_UTMI_PHY) +#if defined(CONFIG_SYS_FSL_USB_DUAL_PHY_ENABLE) + ccsr_usb_phy_t *usb_phy = + (void *)CONFIG_SYS_MPC85xx_USB1_PHY_ADDR; + setbits_be32(&usb_phy->pllprg[1], + CONFIG_SYS_FSL_USB_PLLPRG2_PHY2_CLK_EN | + CONFIG_SYS_FSL_USB_PLLPRG2_PHY1_CLK_EN | + CONFIG_SYS_FSL_USB_PLLPRG2_MFI | + CONFIG_SYS_FSL_USB_PLLPRG2_PLL_EN); + setbits_be32(&usb_phy->port1.ctrl, + CONFIG_SYS_FSL_USB_CTRL_PHY_EN); + setbits_be32(&usb_phy->port1.drvvbuscfg, + CONFIG_SYS_FSL_USB_DRVVBUS_CR_EN); + setbits_be32(&usb_phy->port1.pwrfltcfg, + CONFIG_SYS_FSL_USB_PWRFLT_CR_EN); + setbits_be32(&usb_phy->port2.ctrl, + CONFIG_SYS_FSL_USB_CTRL_PHY_EN); + setbits_be32(&usb_phy->port2.drvvbuscfg, + CONFIG_SYS_FSL_USB_DRVVBUS_CR_EN); + setbits_be32(&usb_phy->port2.pwrfltcfg, + CONFIG_SYS_FSL_USB_PWRFLT_CR_EN); +#endif setbits_be32(&ehci->control, PHY_CLK_SEL_UTMI); setbits_be32(&ehci->control, UTMI_PHY_EN); udelay(1000); /* delay required for PHY Clk to appear */