diff mbox

[U-Boot,v2,1/4] ehci-omap: Clean up added ehci-omap.c

Message ID 1325840641-26580-2-git-send-email-govindraj.raja@ti.com
State Accepted
Delegated to: Marek Vasut
Headers show

Commit Message

Govindraj.R Jan. 6, 2012, 9:03 a.m. UTC
From: "Govindraj.R" <govindraj.raja@ti.com>

Clean up added ehci-omap.c and make it generic for re-use across
soc having same ehci ip block. Also pass the modes to be configured
and configure the ports accordingly. All usb layers are not cache
aligned till then keep cache off for usb ops as ehci will use
internally dma for all usb ops.

* Add a generic common header ehci-omap.h having common ip block
  data and reg shifts.
* Rename and modify ehci-omap3 to ehci.h retain only conflicting
  sysc reg shifts remove others and move to common header file.

Signed-off-by: Govindraj.R <govindraj.raja@ti.com>
---
 arch/arm/include/asm/arch-omap3/ehci.h       |   55 ++++++
 arch/arm/include/asm/arch-omap3/ehci_omap3.h |   58 -------
 arch/arm/include/asm/arch-omap4/ehci.h       |   49 ++++++
 arch/arm/include/asm/ehci-omap.h             |  147 +++++++++++++++++
 drivers/usb/host/ehci-omap.c                 |  228 +++++++++++++++++++-------
 5 files changed, 423 insertions(+), 114 deletions(-)
 create mode 100644 arch/arm/include/asm/arch-omap3/ehci.h
 delete mode 100644 arch/arm/include/asm/arch-omap3/ehci_omap3.h
 create mode 100644 arch/arm/include/asm/arch-omap4/ehci.h
 create mode 100644 arch/arm/include/asm/ehci-omap.h

Comments

Marek Vasut Jan. 10, 2012, 4:07 p.m. UTC | #1
> From: "Govindraj.R" <govindraj.raja@ti.com>
> 
> Clean up added ehci-omap.c and make it generic for re-use across
> soc having same ehci ip block. Also pass the modes to be configured
> and configure the ports accordingly. All usb layers are not cache
> aligned till then keep cache off for usb ops as ehci will use
> internally dma for all usb ops.
> 
> * Add a generic common header ehci-omap.h having common ip block
>   data and reg shifts.
> * Rename and modify ehci-omap3 to ehci.h retain only conflicting
>   sysc reg shifts remove others and move to common header file.

Don't reimplement the ulpi stuff ... there's already some ulpi stuff in uboot 
that needs fixing, so fix it and use it.

> 
> Signed-off-by: Govindraj.R <govindraj.raja@ti.com>
> ---
>  arch/arm/include/asm/arch-omap3/ehci.h       |   55 ++++++
>  arch/arm/include/asm/arch-omap3/ehci_omap3.h |   58 -------
>  arch/arm/include/asm/arch-omap4/ehci.h       |   49 ++++++
>  arch/arm/include/asm/ehci-omap.h             |  147 +++++++++++++++++
>  drivers/usb/host/ehci-omap.c                 |  228
> +++++++++++++++++++------- 5 files changed, 423 insertions(+), 114
> deletions(-)
>  create mode 100644 arch/arm/include/asm/arch-omap3/ehci.h
>  delete mode 100644 arch/arm/include/asm/arch-omap3/ehci_omap3.h
>  create mode 100644 arch/arm/include/asm/arch-omap4/ehci.h
>  create mode 100644 arch/arm/include/asm/ehci-omap.h
> 
> diff --git a/arch/arm/include/asm/arch-omap3/ehci.h
> b/arch/arm/include/asm/arch-omap3/ehci.h new file mode 100644
> index 0000000..d622363
> --- /dev/null
> +++ b/arch/arm/include/asm/arch-omap3/ehci.h
> @@ -0,0 +1,55 @@
> +/*
> + * (C) Copyright 2011
> + * Alexander Holler <holler@ahsoftware.de>
> + *
> + * Based on "drivers/usb/host/ehci-omap.c" from Linux 2.6.37
> + *
> + * See there for additional Copyrights.
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
> + * MA 02110-1301 USA
> + */
> +#ifndef _EHCI_H_
> +#define _EHCI_H_
> +
> +/* USB/EHCI registers */
> +#define OMAP_USBTLL_BASE				0x48062000UL
> +#define OMAP_UHH_BASE					0x48064000UL
> +#define OMAP_EHCI_BASE					0x48064800UL
> +
> +/* TLL Register Set */
> +#define OMAP_USBTLL_SYSCONFIG_SOFTRESET			(1 << 1)
> +#define OMAP_USBTLL_SYSCONFIG_ENAWAKEUP			(1 << 2)
> +#define OMAP_USBTLL_SYSCONFIG_SIDLEMODE			(1 << 3)
> +#define OMAP_USBTLL_SYSCONFIG_CACTIVITY			(1 << 8)
> +#define OMAP_USBTLL_SYSSTATUS_RESETDONE			1
> +
> +/* UHH Register Set */
> +#define OMAP_UHH_SYSCONFIG_SOFTRESET			(1 << 1)
> +#define OMAP_UHH_SYSCONFIG_CACTIVITY			(1 << 8)
> +#define OMAP_UHH_SYSCONFIG_SIDLEMODE			(1 << 3)
> +#define OMAP_UHH_SYSCONFIG_ENAWAKEUP			(1 << 2)
> +#define OMAP_UHH_SYSCONFIG_MIDLEMODE			(1 << 12)
> +#define OMAP_UHH_SYSSTATUS_EHCI_RESETDONE		(1 << 2)
> +
> +#define OMAP_UHH_SYSCONFIG_VAL		(OMAP_UHH_SYSCONFIG_CACTIVITY | 
\
> +					OMAP_UHH_SYSCONFIG_SIDLEMODE | \
> +					OMAP_UHH_SYSCONFIG_ENAWAKEUP | \
> +					OMAP_UHH_SYSCONFIG_MIDLEMODE)
> +
> +#endif /* _EHCI_H_ */
> diff --git a/arch/arm/include/asm/arch-omap3/ehci_omap3.h
> b/arch/arm/include/asm/arch-omap3/ehci_omap3.h deleted file mode 100644
> index cd01f50..0000000
> --- a/arch/arm/include/asm/arch-omap3/ehci_omap3.h
> +++ /dev/null
> @@ -1,58 +0,0 @@
> -/*
> - * (C) Copyright 2011
> - * Alexander Holler <holler@ahsoftware.de>
> - *
> - * Based on "drivers/usb/host/ehci-omap.c" from Linux 2.6.37
> - *
> - * See there for additional Copyrights.
> - *
> - * See file CREDITS for list of people who contributed to this
> - * project.
> - *
> - * This program is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU General Public License as
> - * published by the Free Software Foundation; either version 2 of
> - * the License, or (at your option) any later version.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> - * GNU General Public License for more details.
> - *
> - * You should have received a copy of the GNU General Public License
> - * along with this program; if not, write to the Free Software
> - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
> - * MA 02110-1301 USA
> - */
> -#ifndef _EHCI_OMAP3_H_
> -#define _EHCI_OMAP3_H_
> -
> -/* USB/EHCI registers */
> -#define OMAP3_USBTLL_BASE				0x48062000UL
> -#define OMAP3_UHH_BASE					0x48064000UL
> -#define OMAP3_EHCI_BASE					0x48064800UL
> -
> -/* TLL Register Set */
> -#define	OMAP_USBTLL_SYSCONFIG				(0x10)
> -#define	OMAP_USBTLL_SYSCONFIG_SOFTRESET			(1 << 1)
> -#define	OMAP_USBTLL_SYSCONFIG_ENAWAKEUP			(1 << 2)
> -#define	OMAP_USBTLL_SYSCONFIG_SIDLEMODE			(1 << 3)
> -#define	OMAP_USBTLL_SYSCONFIG_CACTIVITY			(1 << 8)
> -
> -#define	OMAP_USBTLL_SYSSTATUS				(0x14)
> -#define	OMAP_USBTLL_SYSSTATUS_RESETDONE			(1 << 0)
> -
> -/* UHH Register Set */
> -#define	OMAP_UHH_SYSCONFIG				(0x10)
> -#define	OMAP_UHH_SYSCONFIG_SOFTRESET			(1 << 1)
> -#define	OMAP_UHH_SYSCONFIG_CACTIVITY			(1 << 8)
> -#define	OMAP_UHH_SYSCONFIG_SIDLEMODE			(1 << 3)
> -#define	OMAP_UHH_SYSCONFIG_ENAWAKEUP			(1 << 2)
> -#define	OMAP_UHH_SYSCONFIG_MIDLEMODE			(1 << 12)
> -
> -#define	OMAP_UHH_HOSTCONFIG				(0x40)
> -#define OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN		(1 << 2)
> -#define OMAP_UHH_HOSTCONFIG_INCR8_BURST_EN		(1 << 3)
> -#define OMAP_UHH_HOSTCONFIG_INCR16_BURST_EN		(1 << 4)
> -
> -#endif /* _EHCI_OMAP3_H_ */
> diff --git a/arch/arm/include/asm/arch-omap4/ehci.h
> b/arch/arm/include/asm/arch-omap4/ehci.h new file mode 100644
> index 0000000..3af171b
> --- /dev/null
> +++ b/arch/arm/include/asm/arch-omap4/ehci.h
> @@ -0,0 +1,49 @@
> +/*
> + * OMAP EHCI port support
> + * Based on LINUX KERNEL
> + * drivers/usb/host/ehci-omap.c and drivers/mfd/omap-usb-host.c
> + *
> + * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com*
> + * Author: Govindraj R <govindraj.raja@ti.com>
> + *
> + * This program is free software: you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2  of
> + * the License as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program. If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef _EHCI_H
> +#define _EHCI_H
> +
> +#define OMAP_EHCI_BASE				(OMAP44XX_L4_CORE_BASE + 
0x64C00)
> +#define OMAP_UHH_BASE				(OMAP44XX_L4_CORE_BASE + 
0x64000)
> +#define OMAP_USBTLL_BASE			(OMAP44XX_L4_CORE_BASE + 
0x62000)
> +
> +/* UHH, TLL and opt clocks */
> +#define CM_L3INIT_HSUSBHOST_CLKCTRL		0x4A009358UL
> +
> +#define HSUSBHOST_CLKCTRL_CLKSEL_UTMI_P1_MASK	(1 << 24)
> +
> +/* TLL Register Set */
> +#define OMAP_USBTLL_SYSCONFIG_SIDLEMODE		(1 << 3)
> +#define OMAP_USBTLL_SYSCONFIG_ENAWAKEUP		(1 << 2)
> +#define OMAP_USBTLL_SYSCONFIG_SOFTRESET		(1 << 1)
> +#define OMAP_USBTLL_SYSCONFIG_CACTIVITY		(1 << 8)
> +#define OMAP_USBTLL_SYSSTATUS_RESETDONE		1
> +
> +#define OMAP_UHH_SYSCONFIG_SOFTRESET		1
> +#define OMAP_UHH_SYSSTATUS_EHCI_RESETDONE	(1 << 2)
> +#define OMAP_UHH_SYSCONFIG_NOIDLE		(1 << 2)
> +#define OMAP_UHH_SYSCONFIG_NOSTDBY		(1 << 4)
> +
> +#define OMAP_UHH_SYSCONFIG_VAL	(OMAP_UHH_SYSCONFIG_NOIDLE | \
> +					OMAP_UHH_SYSCONFIG_NOSTDBY)
> +
> +#endif /* _EHCI_H */
> diff --git a/arch/arm/include/asm/ehci-omap.h
> b/arch/arm/include/asm/ehci-omap.h new file mode 100644
> index 0000000..336d77e
> --- /dev/null
> +++ b/arch/arm/include/asm/ehci-omap.h
> @@ -0,0 +1,147 @@
> +/*
> + * OMAP EHCI port support
> + * Based on LINUX KERNEL
> + * drivers/usb/host/ehci-omap.c and drivers/mfd/omap-usb-host.c
> + *
> + * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com*
> + * Author: Govindraj R <govindraj.raja@ti.com>
> + *
> + * This program is free software: you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2  of
> + * the License as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program. If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef EHCI_H
> +#define EHCI_H
> +
> +enum usbhs_omap_port_mode {
> +	OMAP_USBHS_PORT_MODE_UNUSED,
> +	OMAP_EHCI_PORT_MODE_PHY,
> +	OMAP_EHCI_PORT_MODE_TLL,
> +	OMAP_EHCI_PORT_MODE_HSIC,
> +};
> +
> +#ifdef CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS
> +#define OMAP_HS_USB_PORTS	CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS
> +#else
> +#define OMAP_HS_USB_PORTS	3
> +#endif
> +
> +#define is_ehci_phy_mode(x)	(x == OMAP_EHCI_PORT_MODE_PHY)
> +#define is_ehci_tll_mode(x)	(x == OMAP_EHCI_PORT_MODE_TLL)
> +#define is_ehci_hsic_mode(x)	(x == OMAP_EHCI_PORT_MODE_HSIC)

This is unsafe ... use ((x) == ...)

> +
> +/* Values of UHH_REVISION - Note: these are not given in the TRM */
> +#define OMAP_USBHS_REV1					0x00000010 /* 
OMAP3 */
> +#define OMAP_USBHS_REV2					0x50700100 /* 
OMAP4 */
> +
> +/* UHH Register Set */
> +#define OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN		(1 << 2)
> +#define OMAP_UHH_HOSTCONFIG_INCR8_BURST_EN		(1 << 3)
> +#define OMAP_UHH_HOSTCONFIG_INCR16_BURST_EN		(1 << 4)
> +#define OMAP_UHH_HOSTCONFIG_INCRX_ALIGN_EN		(1 << 5)
> +
> +#define OMAP_UHH_HOSTCONFIG_ULPI_P1_BYPASS		1
> +#define OMAP_UHH_HOSTCONFIG_ULPI_P2_BYPASS		(1 << 11)
> +#define OMAP_UHH_HOSTCONFIG_ULPI_P3_BYPASS		(1 << 12)
> +#define OMAP4_UHH_HOSTCONFIG_APP_START_CLK		(1 << 31)
> +
> +#define OMAP_P1_MODE_CLEAR				(3 << 16)
> +#define OMAP_P1_MODE_TLL				(1 << 16)
> +#define OMAP_P1_MODE_HSIC				(3 << 16)
> +#define OMAP_P2_MODE_CLEAR				(3 << 18)
> +#define OMAP_P2_MODE_TLL				(1 << 18)
> +#define OMAP_P2_MODE_HSIC				(3 << 18)
> +
> +/* EHCI Register Set */
> +#define EHCI_INSNREG04_DISABLE_UNSUSPEND		(1 << 5)
> +#define EHCI_INSNREG05_ULPI_CONTROL_SHIFT		31
> +#define EHCI_INSNREG05_ULPI_PORTSEL_SHIFT		24
> +#define EHCI_INSNREG05_ULPI_OPSEL_SHIFT			22
> +#define EHCI_INSNREG05_ULPI_REGADD_SHIFT		16
> +
> +#define OMAP_REV1_TLL_CHANNEL_COUNT			3
> +#define OMAP_REV2_TLL_CHANNEL_COUNT			2
> +
> +/* TLL Register Set */
> +#define OMAP_TLL_CHANNEL_CONF(num)			(0x004 * num)
> +#define OMAP_TLL_CHANNEL_CONF_DRVVBUS			(1 << 16)
> +#define OMAP_TLL_CHANNEL_CONF_CHRGVBUS			(1 << 15)
> +#define OMAP_TLL_CHANNEL_CONF_ULPINOBITSTUFF		(1 << 11)
> +#define OMAP_TLL_CHANNEL_CONF_CHANMODE_TRANSPARENT_UTMI	(2 << 1)
> +#define OMAP_TLL_CHANNEL_CONF_CHANEN			1
> +
> +/* ULPI */
> +#define ULPI_SET(a)					(a + 1)
> +#define ULPI_CLR(a)					(a + 2)

ULPI ... use generic stuff

> +#define ULPI_FUNC_CTRL					0x04
> +#define ULPI_FUNC_CTRL_RESET				(1 << 5)
> +
> +struct omap_usbhs_board_data {
> +	enum usbhs_omap_port_mode port_mode[OMAP_HS_USB_PORTS];
> +};
> +
> +struct omap_usbtll {
> +	u32 rev;		/* 0x00 */
> +	u32 hwinfo;		/* 0x04 */
> +	u8 pad1[0x8];

reserved1[] instead of pad1[], fix globally

> +	u32 sysc;		/* 0x10 */
> +	u32 syss;		/* 0x14 */
> +	u32 irqst;		/* 0x18 */
> +	u32 irqen;		/* 0x1c */
> +	u8 pad2[0x10];
> +	u32 shared_conf;	/* 0x30 */
> +	u8 pad3[0xc];
> +	u32 channel_conf;	/* 0x40 */
> +};
> +
> +struct omap_uhh {
> +	u32 rev;	/* 0x00 */
> +	u32 hwinfo;	/* 0x04 */
> +	u8 pad1[0x8];
> +	u32 sysc;	/* 0x10 */
> +	u32 syss;	/* 0x14 */
> +	u8 pad2[0x28];
> +	u32 hostconfig;	/* 0x40 */
> +	u32 debugcsr;	/* 0x44 */
> +};
> +
> +struct omap_ehci {
> +	u32 hccapbase;		/* 0x00 */
> +	u32 hcsparams;		/* 0x04 */
> +	u32 hccparams;		/* 0x08 */
> +	u8 pad1[0x04];
> +	u32 usbcmd;		/* 0x10 */
> +	u32 usbsts;		/* 0x14 */
> +	u32 usbintr;		/* 0x18 */
> +	u32 frindex;		/* 0x1c */
> +	u32 ctrldssegment;	/* 0x20 */
> +	u32 periodiclistbase;	/* 0x24 */
> +	u32 asysnclistaddr;	/* 0x28 */
> +	u8 pad2[0x24];
> +	u32 configflag;		/* 0x50 */
> +	u32 portsc_i;		/* 0x54 */
> +	u8 pad3[0x38];
> +	u32 insreg00;		/* 0x90 */
> +	u32 insreg01;		/* 0x94 */
> +	u32 insreg02;		/* 0x98 */
> +	u32 insreg03;		/* 0x9c */
> +	u32 insreg04;		/* 0xa0 */
> +	u32 insreg05_utmi_ulpi;	/* 0xa4 */
> +	u32 insreg06;		/* 0xa8 */
> +	u32 insreg07;		/* 0xac */
> +	u32 insreg08;		/* 0xb0 */
> +};
> +
> +int omap_ehci_hcd_init(struct omap_usbhs_board_data *usbhs_pdata);
> +int omap_ehci_hcd_stop(void);
> +
> +#endif /* EHCI_H */
> diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c
> index 93d3bb7..97c9fa3 100644
> --- a/drivers/usb/host/ehci-omap.c
> +++ b/drivers/usb/host/ehci-omap.c
> @@ -27,14 +27,93 @@
>   */
>  #include <common.h>
>  #include <usb.h>
> +#include <errno.h>
>  #include <asm/io.h>
>  #include <asm/gpio.h>
> -#include <asm/arch/clocks.h>
> -#include <asm/arch/clocks_omap3.h>
> -#include <asm/arch/ehci_omap3.h>
> -#include <asm/arch/sys_proto.h>
> +#include <asm/arch/ehci.h>
> +#include <asm/ehci-omap.h>
>  #include "ehci-core.h"
> 
> +struct omap_uhh *const uhh = (struct omap_uhh *)OMAP_UHH_BASE;
> +struct omap_usbtll *const usbtll = (struct omap_usbtll *)OMAP_USBTLL_BASE;
> +struct omap_ehci *const ehci = (struct omap_ehci *)OMAP_EHCI_BASE;

static

> +
> +static int omap_uhh_reset(void)
> +{
> +	unsigned long init = get_timer(0);
> +
> +	/* perform UHH soft reset, and wait until reset is complete */
> +	writel(OMAP_UHH_SYSCONFIG_SOFTRESET, &uhh->sysc);
> +
> +	/* Wait for UHH reset to complete */
> +	while (!(readl(&uhh->syss) & OMAP_UHH_SYSSTATUS_EHCI_RESETDONE))
> +		if (get_timer(init) > CONFIG_SYS_HZ) {
> +			debug("OMAP UHH error: timeout resetting ehci\n");
> +			return -EL3RST;
> +		}
> +
> +	return 0;
> +}
> +
> +static int omap_ehci_tll_reset(void)
> +{
> +	unsigned long init = get_timer(0);
> +
> +	/* perform TLL soft reset, and wait until reset is complete */
> +	writel(OMAP_USBTLL_SYSCONFIG_SOFTRESET, &usbtll->sysc);
> +
> +	/* Wait for TLL reset to complete */
> +	while (!(readl(&usbtll->syss) & OMAP_USBTLL_SYSSTATUS_RESETDONE))

Add timeout, fix globally

> +		if (get_timer(init) > CONFIG_SYS_HZ) {
> +			debug("OMAP EHCI error: timeout resetting TLL\n");
> +			return -EL3RST;
> +	}
> +
> +	return 0;
> +}
> +
> +static void omap_usbhs_hsic_init(int tll_cnt)
> +{
> +	unsigned int reg;
> +	int i;
> +
> +	/* Enable channels now */
> +	for (i = 0; i < tll_cnt; i++) {
> +		reg = readl(&usbtll->channel_conf + OMAP_TLL_CHANNEL_CONF(i));
> +
> +		reg |= OMAP_TLL_CHANNEL_CONF_CHANMODE_TRANSPARENT_UTMI
> +			| OMAP_TLL_CHANNEL_CONF_ULPINOBITSTUFF
> +			| OMAP_TLL_CHANNEL_CONF_DRVVBUS
> +			| OMAP_TLL_CHANNEL_CONF_CHRGVBUS
> +			| OMAP_TLL_CHANNEL_CONF_CHANEN;
> +
> +		writel(reg, &usbtll->channel_conf + OMAP_TLL_CHANNEL_CONF(i));
> +	}
> +}
> +
> +static void omap_ehci_soft_phy_reset(int port)
> +{
> +	unsigned int reg = 0;
> +	unsigned long init = get_timer(0);
> +
> +	/* FUNCTION_CTRL_SET register */
> +	reg = ULPI_FUNC_CTRL_RESET |
> +		(ULPI_SET(ULPI_FUNC_CTRL) << EHCI_INSNREG05_ULPI_REGADD_SHIFT) |
> +		(2 << EHCI_INSNREG05_ULPI_OPSEL_SHIFT) |
> +		((port + 1) << EHCI_INSNREG05_ULPI_PORTSEL_SHIFT) |
> +		(1 << EHCI_INSNREG05_ULPI_CONTROL_SHIFT);
> +
> +	writel(reg, &ehci->insreg05_utmi_ulpi);
> +
> +	/* Wait for ULPI access completion */
> +	while ((readl(&ehci->insreg05_utmi_ulpi) &
> +			(1 << EHCI_INSNREG05_ULPI_CONTROL_SHIFT)))
> +		if (get_timer(init) > CONFIG_SYS_HZ) {
> +			debug("OMAP EHCI error: timeout resetting phy\n");
> +			break;
> +		}
> +}
> +
>  inline int __board_usb_init(void)
>  {
>  	return 0;
> @@ -72,31 +151,31 @@ static inline void omap_ehci_phy_reset(int on, int
> delay) #endif
> 
>  /* Reset is needed otherwise the kernel-driver will throw an error. */
> -int ehci_hcd_stop(void)
> +int omap_ehci_hcd_stop(void)
>  {
> -	debug("Resetting OMAP3 EHCI\n");
> +	debug("Resetting OMAP EHCI\n");
>  	omap_ehci_phy_reset(1, 0);
> -	writel(OMAP_UHH_SYSCONFIG_SOFTRESET,
> -			OMAP3_UHH_BASE + OMAP_UHH_SYSCONFIG);
> -	/* disable USB clocks */
> -	struct prcm *prcm_base = (struct prcm *)PRCM_BASE;
> -	sr32(&prcm_base->iclken_usbhost, 0, 1, 0);
> -	sr32(&prcm_base->fclken_usbhost, 0, 2, 0);
> -	sr32(&prcm_base->iclken3_core, 2, 1, 0);
> -	sr32(&prcm_base->fclken3_core, 2, 1, 0);
> +
> +	if (omap_uhh_reset() < 0)
> +		return -1;
> +
> +	if (omap_ehci_tll_reset() < 0)
> +		return -1;
> +
>  	return 0;
>  }
> 
>  /*
> - * Initialize the OMAP3 EHCI controller and PHY.
> - * Based on "drivers/usb/host/ehci-omap.c" from Linux 2.6.37.
> + * Initialize the OMAP EHCI controller and PHY.
> + * Based on "drivers/usb/host/ehci-omap.c" from Linux 3.1
>   * See there for additional Copyrights.
>   */
> -int ehci_hcd_init(void)
> +int omap_ehci_hcd_init(struct omap_usbhs_board_data *usbhs_pdata)
>  {
> -	int ret;
> +	int ret = 0;
> +	unsigned int i, reg = 0, rev = 0, tll_cnt = 0;
> 
> -	debug("Initializing OMAP3 EHCI\n");
> +	debug("Initializing OMAP EHCI\n");
> 
>  	ret = board_usb_init();
>  	if (ret < 0)
> @@ -105,52 +184,89 @@ int ehci_hcd_init(void)
>  	/* Put the PHY in RESET */
>  	omap_ehci_phy_reset(1, 10);
> 
> -	struct prcm *prcm_base = (struct prcm *)PRCM_BASE;
> -	/* Enable USBHOST_L3_ICLK (USBHOST_MICLK) */
> -	sr32(&prcm_base->iclken_usbhost, 0, 1, 1);
> -	/*
> -	 * Enable USBHOST_48M_FCLK (USBHOST_FCLK1)
> -	 * and USBHOST_120M_FCLK (USBHOST_FCLK2)
> -	 */
> -	sr32(&prcm_base->fclken_usbhost, 0, 2, 3);
> -	/* Enable USBTTL_ICLK */
> -	sr32(&prcm_base->iclken3_core, 2, 1, 1);
> -	/* Enable USBTTL_FCLK */
> -	sr32(&prcm_base->fclken3_core, 2, 1, 1);
> -	debug("USB clocks enabled\n");
> +	ret = omap_uhh_reset();
> +	if (ret < 0)
> +		return ret;
> 
> -	/* perform TLL soft reset, and wait until reset is complete */
> -	writel(OMAP_USBTLL_SYSCONFIG_SOFTRESET,
> -		OMAP3_USBTLL_BASE + OMAP_USBTLL_SYSCONFIG);
> -	/* Wait for TLL reset to complete */
> -	while (!(readl(OMAP3_USBTLL_BASE + OMAP_USBTLL_SYSSTATUS)
> -			& OMAP_USBTLL_SYSSTATUS_RESETDONE))
> -		;
> -	debug("TLL reset done\n");
> +	ret = omap_ehci_tll_reset();
> +	if (ret)
> +		return ret;
> 
>  	writel(OMAP_USBTLL_SYSCONFIG_ENAWAKEUP |
>  		OMAP_USBTLL_SYSCONFIG_SIDLEMODE |
> -		OMAP_USBTLL_SYSCONFIG_CACTIVITY,
> -		OMAP3_USBTLL_BASE + OMAP_USBTLL_SYSCONFIG);
> +		OMAP_USBTLL_SYSCONFIG_CACTIVITY, &usbtll->sysc);
> 
>  	/* Put UHH in NoIdle/NoStandby mode */
> -	writel(OMAP_UHH_SYSCONFIG_ENAWAKEUP
> -		| OMAP_UHH_SYSCONFIG_SIDLEMODE
> -		| OMAP_UHH_SYSCONFIG_CACTIVITY
> -		| OMAP_UHH_SYSCONFIG_MIDLEMODE,
> -		OMAP3_UHH_BASE + OMAP_UHH_SYSCONFIG);
> -
> -	/* setup burst configurations */
> -	writel(OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN
> -		| OMAP_UHH_HOSTCONFIG_INCR8_BURST_EN
> -		| OMAP_UHH_HOSTCONFIG_INCR16_BURST_EN,
> -		OMAP3_UHH_BASE + OMAP_UHH_HOSTCONFIG);
> +	writel(OMAP_UHH_SYSCONFIG_VAL, &uhh->sysc);
> +
> +	/* setup ULPI bypass and burst configurations */
> +	reg |= (OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN |
> +		OMAP_UHH_HOSTCONFIG_INCR8_BURST_EN |
> +		OMAP_UHH_HOSTCONFIG_INCR16_BURST_EN);
> +	reg &= ~OMAP_UHH_HOSTCONFIG_INCRX_ALIGN_EN;

clrsetbits_le32 ?

> +
> +	rev = readl(&uhh->rev);
> +	if (rev == OMAP_USBHS_REV1) {
> +		if (is_ehci_phy_mode(usbhs_pdata->port_mode[0]))
> +			reg &= ~OMAP_UHH_HOSTCONFIG_ULPI_P1_BYPASS;
> +		else
> +			reg |= OMAP_UHH_HOSTCONFIG_ULPI_P1_BYPASS;
> +
> +		if (is_ehci_phy_mode(usbhs_pdata->port_mode[1]))
> +			reg &= ~OMAP_UHH_HOSTCONFIG_ULPI_P2_BYPASS;
> +		else
> +			reg |= OMAP_UHH_HOSTCONFIG_ULPI_P2_BYPASS;
> +
> +		if (is_ehci_phy_mode(usbhs_pdata->port_mode[2]))
> +			reg &= ~OMAP_UHH_HOSTCONFIG_ULPI_P3_BYPASS;
> +		else
> +			reg |= OMAP_UHH_HOSTCONFIG_ULPI_P3_BYPASS;
> +
> +		tll_cnt = OMAP_REV1_TLL_CHANNEL_COUNT;
> +	} else if (rev == OMAP_USBHS_REV2) {
> +
> +		reg |= OMAP4_UHH_HOSTCONFIG_APP_START_CLK;
> +		/* Clear port mode fields for PHY mode*/
> +		reg &= ~OMAP_P1_MODE_CLEAR;
> +		reg &= ~OMAP_P2_MODE_CLEAR;
> +
> +		if (is_ehci_hsic_mode(usbhs_pdata->port_mode[0]))
> +			reg |= OMAP_P1_MODE_HSIC;
> +
> +		if (is_ehci_hsic_mode(usbhs_pdata->port_mode[1]))
> +			reg |= OMAP_P2_MODE_HSIC;
> +
> +		tll_cnt = OMAP_REV2_TLL_CHANNEL_COUNT;
> +	}
> +
> +	debug("OMAP UHH_REVISION 0x%x\n", rev);
> +	writel(reg, &uhh->hostconfig);
> +
> +	if (is_ehci_hsic_mode(usbhs_pdata->port_mode[0]) ||
> +			is_ehci_hsic_mode(usbhs_pdata->port_mode[1]))
> +		omap_usbhs_hsic_init(tll_cnt);
> 
>  	omap_ehci_phy_reset(0, 10);
> 
> -	hccr = (struct ehci_hccr *)(OMAP3_EHCI_BASE);
> -	hcor = (struct ehci_hcor *)(OMAP3_EHCI_BASE + 0x10);
> +	/*
> +	 * An undocumented "feature" in the OMAP3 EHCI controller,
> +	 * causes suspended ports to be taken out of suspend when
> +	 * the USBCMD.Run/Stop bit is cleared (for example when
> +	 * we do ehci_bus_suspend).
> +	 * This breaks suspend-resume if the root-hub is allowed
> +	 * to suspend. Writing 1 to this undocumented register bit
> +	 * disables this feature and restores normal behavior.
> +	 */
> +	writel(EHCI_INSNREG04_DISABLE_UNSUSPEND, &ehci->insreg04);
> +
> +	for (i = 0; i < OMAP_HS_USB_PORTS; i++)
> +		if (is_ehci_phy_mode(usbhs_pdata->port_mode[i]))
> +			omap_ehci_soft_phy_reset(i);
> +
> +	dcache_disable();
> +	hccr = (struct ehci_hccr *)(OMAP_EHCI_BASE);
> +	hcor = (struct ehci_hcor *)(OMAP_EHCI_BASE + 0x10);
> 
> -	debug("OMAP3 EHCI init done\n");
> +	debug("OMAP EHCI init done\n");
>  	return 0;
>  }

M
Govindraj Jan. 11, 2012, 6:07 a.m. UTC | #2
Hi Marek,

Thanks for you review.

On Tue, Jan 10, 2012 at 9:37 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
>> From: "Govindraj.R" <govindraj.raja@ti.com>
>>
>> Clean up added ehci-omap.c and make it generic for re-use across
>> soc having same ehci ip block. Also pass the modes to be configured
>> and configure the ports accordingly. All usb layers are not cache
>> aligned till then keep cache off for usb ops as ehci will use
>> internally dma for all usb ops.
>>
>> * Add a generic common header ehci-omap.h having common ip block
>>   data and reg shifts.
>> * Rename and modify ehci-omap3 to ehci.h retain only conflicting
>>   sysc reg shifts remove others and move to common header file.
>
> Don't reimplement the ulpi stuff ... there's already some ulpi stuff in uboot
> that needs fixing, so fix it and use it.
>

I am not implementing any ulpi stuff I am just configuring OMAP on
soc usb host controller (ehci). All the configuration stuff
is OMAP specific things which are done in ehci-omap.c file

stuffs done are like soft-reset, port mode to be used and putting
port in no -idle mode(omap specific pm implementation) etc.

>>
>> Signed-off-by: Govindraj.R <govindraj.raja@ti.com>
>> ---
>>  arch/arm/include/asm/arch-omap3/ehci.h       |   55 ++++++
>>  arch/arm/include/asm/arch-omap3/ehci_omap3.h |   58 -------
>>  arch/arm/include/asm/arch-omap4/ehci.h       |   49 ++++++
>>  arch/arm/include/asm/ehci-omap.h             |  147 +++++++++++++++++
>>  drivers/usb/host/ehci-omap.c                 |  228

[...]

>> +
>> +#ifdef CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS
>> +#define OMAP_HS_USB_PORTS    CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS
>> +#else
>> +#define OMAP_HS_USB_PORTS    3
>> +#endif
>> +
>> +#define is_ehci_phy_mode(x)  (x == OMAP_EHCI_PORT_MODE_PHY)
>> +#define is_ehci_tll_mode(x)  (x == OMAP_EHCI_PORT_MODE_TLL)
>> +#define is_ehci_hsic_mode(x) (x == OMAP_EHCI_PORT_MODE_HSIC)
>
> This is unsafe ... use ((x) == ...)

Okay, will correct this.

>
>> +
>> +/* Values of UHH_REVISION - Note: these are not given in the TRM */
>> +#define OMAP_USBHS_REV1                                      0x00000010 /*
> OMAP3 */
>> +#define OMAP_USBHS_REV2                                      0x50700100 /*
> OMAP4 */
>> +

[...]

>> +/* ULPI */
>> +#define ULPI_SET(a)                                  (a + 1)
>> +#define ULPI_CLR(a)                                  (a + 2)
>
> ULPI ... use generic stuff

Actually this for omap specific configuration done with omap
reg map.

EHCI register INSNREG05_ULPI needs to be configured if we
are in ulpi-phy mode same is done here.

>
>> +#define ULPI_FUNC_CTRL                                       0x04
>> +#define ULPI_FUNC_CTRL_RESET                         (1 << 5)
>> +
>> +struct omap_usbhs_board_data {
>> +     enum usbhs_omap_port_mode port_mode[OMAP_HS_USB_PORTS];
>> +};
>> +
>> +struct omap_usbtll {
>> +     u32 rev;                /* 0x00 */
>> +     u32 hwinfo;             /* 0x04 */
>> +     u8 pad1[0x8];
>
> reserved1[] instead of pad1[], fix globally

yes fine, will correct this.

[..]

>>
>> +struct omap_uhh *const uhh = (struct omap_uhh *)OMAP_UHH_BASE;
>> +struct omap_usbtll *const usbtll = (struct omap_usbtll *)OMAP_USBTLL_BASE;
>> +struct omap_ehci *const ehci = (struct omap_ehci *)OMAP_EHCI_BASE;
>
> static
>

yes correct, will change this.

>> +
>> +static int omap_uhh_reset(void)
>> +{

[...]

>> +     /* perform TLL soft reset, and wait until reset is complete */
>> +     writel(OMAP_USBTLL_SYSCONFIG_SOFTRESET, &usbtll->sysc);
>> +
>> +     /* Wait for TLL reset to complete */
>> +     while (!(readl(&usbtll->syss) & OMAP_USBTLL_SYSSTATUS_RESETDONE))
>
> Add timeout, fix globally

Sorry I didn't get you here.

The function uses a timeout value init and then same init
value to used to poll for CONFIG_SYS_HZ time for reset to be
done else prints timeout failure.

>> +             if (get_timer(init) > CONFIG_SYS_HZ) {
>> +                     debug("OMAP EHCI error: timeout resetting TLL\n");
>> +                     return -EL3RST;
>> +     }
>> +

[...]

>> +     /* setup ULPI bypass and burst configurations */
>> +     reg |= (OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN |
>> +             OMAP_UHH_HOSTCONFIG_INCR8_BURST_EN |
>> +             OMAP_UHH_HOSTCONFIG_INCR16_BURST_EN);
>> +     reg &= ~OMAP_UHH_HOSTCONFIG_INCRX_ALIGN_EN;
>
> clrsetbits_le32 ?

yes can be used.

--
Thanks,
Govindraj.R
Marek Vasut Jan. 11, 2012, 10:52 a.m. UTC | #3
> Hi Marek,
> 
> Thanks for you review.
> 
> On Tue, Jan 10, 2012 at 9:37 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
> >> From: "Govindraj.R" <govindraj.raja@ti.com>
> >> 
> >> Clean up added ehci-omap.c and make it generic for re-use across
> >> soc having same ehci ip block. Also pass the modes to be configured
> >> and configure the ports accordingly. All usb layers are not cache
> >> aligned till then keep cache off for usb ops as ehci will use
> >> internally dma for all usb ops.
> >> 
> >> * Add a generic common header ehci-omap.h having common ip block
> >>   data and reg shifts.
> >> * Rename and modify ehci-omap3 to ehci.h retain only conflicting
> >>   sysc reg shifts remove others and move to common header file.
> > 
> > Don't reimplement the ulpi stuff ... there's already some ulpi stuff in
> > uboot that needs fixing, so fix it and use it.
> 
> I am not implementing any ulpi stuff I am just configuring OMAP on
> soc usb host controller (ehci). All the configuration stuff
> is OMAP specific things which are done in ehci-omap.c file
> 
> stuffs done are like soft-reset, port mode to be used and putting
> port in no -idle mode(omap specific pm implementation) etc.
> 

This stuff:

+/* ULPI */
+#define ULPI_SET(a)                                    (a + 1)
+#define ULPI_CLR(a)                                    (a + 2)
+#define ULPI_FUNC_CTRL                                 0x04
+#define ULPI_FUNC_CTRL_RESET                           (1 << 5)

is just accidentally conforming to ULPI spec?

M

btw. somewhere in the patch is one more asterisk at the end of line:
+ * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com*

[...]

> >> +     /* perform TLL soft reset, and wait until reset is complete */
> >> +     writel(OMAP_USBTLL_SYSCONFIG_SOFTRESET, &usbtll->sysc);
> >> +
> >> +     /* Wait for TLL reset to complete */
> >> +     while (!(readl(&usbtll->syss) & OMAP_USBTLL_SYSSTATUS_RESETDONE))
> > 
> > Add timeout, fix globally
> 
> Sorry I didn't get you here.
> 
> The function uses a timeout value init and then same init
> value to used to poll for CONFIG_SYS_HZ time for reset to be
> done else prints timeout failure.

Ah sorry, I didn't notice. OK.
> 
> >> +             if (get_timer(init) > CONFIG_SYS_HZ) {
> >> +                     debug("OMAP EHCI error: timeout resetting TLL\n");
> >> +                     return -EL3RST;
> >> +     }
> >> +
> 
> [...]
> 
> >> +     /* setup ULPI bypass and burst configurations */
> >> +     reg |= (OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN |
> >> +             OMAP_UHH_HOSTCONFIG_INCR8_BURST_EN |
> >> +             OMAP_UHH_HOSTCONFIG_INCR16_BURST_EN);
> >> +     reg &= ~OMAP_UHH_HOSTCONFIG_INCRX_ALIGN_EN;
> > 
> > clrsetbits_le32 ?
> 
> yes can be used.

Use where applicable
> 
> --
> Thanks,
> Govindraj.R
Govindraj Jan. 11, 2012, 11:32 a.m. UTC | #4
On Wed, Jan 11, 2012 at 4:22 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
>> Hi Marek,
>>
>> Thanks for you review.
>>
>> On Tue, Jan 10, 2012 at 9:37 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
>> >> From: "Govindraj.R" <govindraj.raja@ti.com>
>> >>
>> >> Clean up added ehci-omap.c and make it generic for re-use across
>> >> soc having same ehci ip block. Also pass the modes to be configured
>> >> and configure the ports accordingly. All usb layers are not cache
>> >> aligned till then keep cache off for usb ops as ehci will use
>> >> internally dma for all usb ops.
>> >>
>> >> * Add a generic common header ehci-omap.h having common ip block
>> >>   data and reg shifts.
>> >> * Rename and modify ehci-omap3 to ehci.h retain only conflicting
>> >>   sysc reg shifts remove others and move to common header file.
>> >
>> > Don't reimplement the ulpi stuff ... there's already some ulpi stuff in
>> > uboot that needs fixing, so fix it and use it.
>>
>> I am not implementing any ulpi stuff I am just configuring OMAP on
>> soc usb host controller (ehci). All the configuration stuff
>> is OMAP specific things which are done in ehci-omap.c file
>>
>> stuffs done are like soft-reset, port mode to be used and putting
>> port in no -idle mode(omap specific pm implementation) etc.
>>
>
> This stuff:
>
> +/* ULPI */
> +#define ULPI_SET(a)                                    (a + 1)
> +#define ULPI_CLR(a)                                    (a + 2)
> +#define ULPI_FUNC_CTRL                                 0x04
> +#define ULPI_FUNC_CTRL_RESET                           (1 << 5)
>
> is just accidentally conforming to ULPI spec?
>

These are for configuring INSNREG05_ULPI reg in EHCI reg map
of omap while configuring in ulpi-phy mode.

looking into struct ulpi_regs {..}
then it doesn't map this configuration.

btw,
IIUC that ulpi_regs struct is for otg transceiver that uses a ulpi phy chip
for communication.

> M
>
> btw. somewhere in the patch is one more asterisk at the end of line:

Will check that

--
Thanks,
Govindraj.R
Marek Vasut Jan. 11, 2012, 12:46 p.m. UTC | #5
> On Wed, Jan 11, 2012 at 4:22 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
> >> Hi Marek,
> >> 
> >> Thanks for you review.
> >> 
> >> On Tue, Jan 10, 2012 at 9:37 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
> >> >> From: "Govindraj.R" <govindraj.raja@ti.com>
> >> >> 
> >> >> Clean up added ehci-omap.c and make it generic for re-use across
> >> >> soc having same ehci ip block. Also pass the modes to be configured
> >> >> and configure the ports accordingly. All usb layers are not cache
> >> >> aligned till then keep cache off for usb ops as ehci will use
> >> >> internally dma for all usb ops.
> >> >> 
> >> >> * Add a generic common header ehci-omap.h having common ip block
> >> >>   data and reg shifts.
> >> >> * Rename and modify ehci-omap3 to ehci.h retain only conflicting
> >> >>   sysc reg shifts remove others and move to common header file.
> >> > 
> >> > Don't reimplement the ulpi stuff ... there's already some ulpi stuff
> >> > in uboot that needs fixing, so fix it and use it.
> >> 
> >> I am not implementing any ulpi stuff I am just configuring OMAP on
> >> soc usb host controller (ehci). All the configuration stuff
> >> is OMAP specific things which are done in ehci-omap.c file
> >> 
> >> stuffs done are like soft-reset, port mode to be used and putting
> >> port in no -idle mode(omap specific pm implementation) etc.
> > 
> > This stuff:
> > 
> > +/* ULPI */
> > +#define ULPI_SET(a)                                    (a + 1)
> > +#define ULPI_CLR(a)                                    (a + 2)
> > +#define ULPI_FUNC_CTRL                                 0x04
> > +#define ULPI_FUNC_CTRL_RESET                           (1 << 5)
> > 
> > is just accidentally conforming to ULPI spec?
> 
> These are for configuring INSNREG05_ULPI reg in EHCI reg map
> of omap while configuring in ulpi-phy mode.
> 
> looking into struct ulpi_regs {..}
> then it doesn't map this configuration.

Can you point me to some documentation about this please? It's not that I don't 
trust you, I'd rather prefer to avoid unnecessary duplication.

> 
> btw,
> IIUC that ulpi_regs struct is for otg transceiver that uses a ulpi phy chip
> for communication.
> 
> > M
> 
> > btw. somewhere in the patch is one more asterisk at the end of line:
> Will check that

It was on the line I pointed out 
> 
> --
> Thanks,
> Govindraj.R
Govindraj Jan. 11, 2012, 1 p.m. UTC | #6
On Wed, Jan 11, 2012 at 6:16 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
>> On Wed, Jan 11, 2012 at 4:22 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
>> >> Hi Marek,
>> >>
>> >> Thanks for you review.
>> >>
>> >> On Tue, Jan 10, 2012 at 9:37 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
>> >> >> From: "Govindraj.R" <govindraj.raja@ti.com>
>> >> >>
>> >> >> Clean up added ehci-omap.c and make it generic for re-use across
>> >> >> soc having same ehci ip block. Also pass the modes to be configured
>> >> >> and configure the ports accordingly. All usb layers are not cache
>> >> >> aligned till then keep cache off for usb ops as ehci will use
>> >> >> internally dma for all usb ops.
>> >> >>
>> >> >> * Add a generic common header ehci-omap.h having common ip block
>> >> >>   data and reg shifts.
>> >> >> * Rename and modify ehci-omap3 to ehci.h retain only conflicting
>> >> >>   sysc reg shifts remove others and move to common header file.
>> >> >
>> >> > Don't reimplement the ulpi stuff ... there's already some ulpi stuff
>> >> > in uboot that needs fixing, so fix it and use it.
>> >>
>> >> I am not implementing any ulpi stuff I am just configuring OMAP on
>> >> soc usb host controller (ehci). All the configuration stuff
>> >> is OMAP specific things which are done in ehci-omap.c file
>> >>
>> >> stuffs done are like soft-reset, port mode to be used and putting
>> >> port in no -idle mode(omap specific pm implementation) etc.
>> >
>> > This stuff:
>> >
>> > +/* ULPI */
>> > +#define ULPI_SET(a)                                    (a + 1)
>> > +#define ULPI_CLR(a)                                    (a + 2)
>> > +#define ULPI_FUNC_CTRL                                 0x04
>> > +#define ULPI_FUNC_CTRL_RESET                           (1 << 5)
>> >
>> > is just accidentally conforming to ULPI spec?
>>
>> These are for configuring INSNREG05_ULPI reg in EHCI reg map
>> of omap while configuring in ulpi-phy mode.
>>
>> looking into struct ulpi_regs {..}
>> then it doesn't map this configuration.
>
> Can you point me to some documentation about this please? It's not that I don't
> trust you, I'd rather prefer to avoid unnecessary duplication.
>

Yes that would be fine.

You can download the omap4460 public trm from here:

http://www.ti.com/pdfs/wtbu/OMAP4460_ES.1x_PUBLIC_TRM_vM.zip

Go to chapter 23.11.6.6.1 EHCI Register Summary
(page number 5171 and 5186/87)

click INSNREG05_ULPI

this for configuring in ulpi mode for external ulpi phy.
reference
chapter 23.11.4.1 refer to Figure 23-252. HS USB Host Controller Architecture
(page number 5096)

>>
>> btw,
>> IIUC that ulpi_regs struct is for otg transceiver that uses a ulpi phy chip
>> for communication.
>>
>> > M
>>
>> > btw. somewhere in the patch is one more asterisk at the end of line:
>> Will check that
>
> It was on the line I pointed out

okay, got it.

--
Thanks,
Govindraj.R
Marek Vasut Jan. 11, 2012, 1:28 p.m. UTC | #7
> On Wed, Jan 11, 2012 at 6:16 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
> >> On Wed, Jan 11, 2012 at 4:22 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
> >> >> Hi Marek,
> >> >> 
> >> >> Thanks for you review.
> >> >> 
> >> >> On Tue, Jan 10, 2012 at 9:37 PM, Marek Vasut <marek.vasut@gmail.com> 
wrote:
> >> >> >> From: "Govindraj.R" <govindraj.raja@ti.com>
> >> >> >> 
> >> >> >> Clean up added ehci-omap.c and make it generic for re-use across
> >> >> >> soc having same ehci ip block. Also pass the modes to be
> >> >> >> configured and configure the ports accordingly. All usb layers
> >> >> >> are not cache aligned till then keep cache off for usb ops as
> >> >> >> ehci will use internally dma for all usb ops.
> >> >> >> 
> >> >> >> * Add a generic common header ehci-omap.h having common ip block
> >> >> >>   data and reg shifts.
> >> >> >> * Rename and modify ehci-omap3 to ehci.h retain only conflicting
> >> >> >>   sysc reg shifts remove others and move to common header file.
> >> >> > 
> >> >> > Don't reimplement the ulpi stuff ... there's already some ulpi
> >> >> > stuff in uboot that needs fixing, so fix it and use it.
> >> >> 
> >> >> I am not implementing any ulpi stuff I am just configuring OMAP on
> >> >> soc usb host controller (ehci). All the configuration stuff
> >> >> is OMAP specific things which are done in ehci-omap.c file
> >> >> 
> >> >> stuffs done are like soft-reset, port mode to be used and putting
> >> >> port in no -idle mode(omap specific pm implementation) etc.
> >> > 
> >> > This stuff:
> >> > 
> >> > +/* ULPI */
> >> > +#define ULPI_SET(a)                                    (a + 1)
> >> > +#define ULPI_CLR(a)                                    (a + 2)
> >> > +#define ULPI_FUNC_CTRL                                 0x04
> >> > +#define ULPI_FUNC_CTRL_RESET                           (1 << 5)
> >> > 
> >> > is just accidentally conforming to ULPI spec?
> >> 
> >> These are for configuring INSNREG05_ULPI reg in EHCI reg map
> >> of omap while configuring in ulpi-phy mode.
> >> 
> >> looking into struct ulpi_regs {..}
> >> then it doesn't map this configuration.
> > 
> > Can you point me to some documentation about this please? It's not that I
> > don't trust you, I'd rather prefer to avoid unnecessary duplication.
> 
> Yes that would be fine.
> 
> You can download the omap4460 public trm from here:
> 
> http://www.ti.com/pdfs/wtbu/OMAP4460_ES.1x_PUBLIC_TRM_vM.zip
> 
> Go to chapter 23.11.6.6.1 EHCI Register Summary
> (page number 5171 and 5186/87)

Sure, but the macro above looks more like 23.11.6.3, doesn't it ? And for that 
purpose, the struct ulpi_regs is fitting ok.

Actually ... can you check the ulpi_read and ulpi_write stuff that's already in 
u-boot and explain why they can not be used with this port?

M

> 
> click INSNREG05_ULPI
> 
> this for configuring in ulpi mode for external ulpi phy.
> reference
> chapter 23.11.4.1 refer to Figure 23-252. HS USB Host Controller
> Architecture (page number 5096)
> 
> >> btw,
> >> IIUC that ulpi_regs struct is for otg transceiver that uses a ulpi phy
> >> chip for communication.
> >> 
> >> > M
> >> 
> >> > btw. somewhere in the patch is one more asterisk at the end of line:
> >> Will check that
> > 
> > It was on the line I pointed out
> 
> okay, got it.
> 
> --
> Thanks,
> Govindraj.R
Govindraj Jan. 11, 2012, 2:13 p.m. UTC | #8
On Wed, Jan 11, 2012 at 6:58 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
>> On Wed, Jan 11, 2012 at 6:16 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
>> >> On Wed, Jan 11, 2012 at 4:22 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
>> >> >> Hi Marek,
>> >> >>
>> >> >> Thanks for you review.
>> >> >>
>> >> >> On Tue, Jan 10, 2012 at 9:37 PM, Marek Vasut <marek.vasut@gmail.com>
> wrote:
>> >> >> >> From: "Govindraj.R" <govindraj.raja@ti.com>
>> >> >> >>
>> >> >> >> Clean up added ehci-omap.c and make it generic for re-use across
>> >> >> >> soc having same ehci ip block. Also pass the modes to be
>> >> >> >> configured and configure the ports accordingly. All usb layers
>> >> >> >> are not cache aligned till then keep cache off for usb ops as
>> >> >> >> ehci will use internally dma for all usb ops.
>> >> >> >>
>> >> >> >> * Add a generic common header ehci-omap.h having common ip block
>> >> >> >>   data and reg shifts.
>> >> >> >> * Rename and modify ehci-omap3 to ehci.h retain only conflicting
>> >> >> >>   sysc reg shifts remove others and move to common header file.
>> >> >> >
>> >> >> > Don't reimplement the ulpi stuff ... there's already some ulpi
>> >> >> > stuff in uboot that needs fixing, so fix it and use it.
>> >> >>
>> >> >> I am not implementing any ulpi stuff I am just configuring OMAP on
>> >> >> soc usb host controller (ehci). All the configuration stuff
>> >> >> is OMAP specific things which are done in ehci-omap.c file
>> >> >>
>> >> >> stuffs done are like soft-reset, port mode to be used and putting
>> >> >> port in no -idle mode(omap specific pm implementation) etc.
>> >> >
>> >> > This stuff:
>> >> >
>> >> > +/* ULPI */
>> >> > +#define ULPI_SET(a)                                    (a + 1)
>> >> > +#define ULPI_CLR(a)                                    (a + 2)
>> >> > +#define ULPI_FUNC_CTRL                                 0x04
>> >> > +#define ULPI_FUNC_CTRL_RESET                           (1 << 5)
>> >> >
>> >> > is just accidentally conforming to ULPI spec?
>> >>
>> >> These are for configuring INSNREG05_ULPI reg in EHCI reg map
>> >> of omap while configuring in ulpi-phy mode.
>> >>
>> >> looking into struct ulpi_regs {..}
>> >> then it doesn't map this configuration.
>> >
>> > Can you point me to some documentation about this please? It's not that I
>> > don't trust you, I'd rather prefer to avoid unnecessary duplication.
>>
>> Yes that would be fine.
>>
>> You can download the omap4460 public trm from here:
>>
>> http://www.ti.com/pdfs/wtbu/OMAP4460_ES.1x_PUBLIC_TRM_vM.zip
>>
>> Go to chapter 23.11.6.6.1 EHCI Register Summary
>> (page number 5171 and 5186/87)
>
> Sure, but the macro above looks more like 23.11.6.3, doesn't it ? And for that
> purpose, the struct ulpi_regs is fitting ok.
>
> Actually ... can you check the ulpi_read and ulpi_write stuff that's already in
> u-boot and explain why they can not be used with this port?
>

echi-omap.c is no where writing to those registers
and the macro was used only to configure INSNREG05_ULPI reg in EHCI reg map

reg map in 23.11.6.3 used only for a external ulpi-phy communication.
and debug purpose(to view vid, pid etc) and to hack external phy
configuration through ulpi commands
from omap - usb host controller point of view only needs
INSNREG05_ULPI reg in EHCI reg configuration
rest on soc host controller takes care of it.

--
Thanks,
Govindraj.R
Marek Vasut Jan. 11, 2012, 2:34 p.m. UTC | #9
> On Wed, Jan 11, 2012 at 6:58 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
> >> On Wed, Jan 11, 2012 at 6:16 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
> >> >> On Wed, Jan 11, 2012 at 4:22 PM, Marek Vasut <marek.vasut@gmail.com> 
wrote:
> >> >> >> Hi Marek,
> >> >> >> 
> >> >> >> Thanks for you review.
> >> >> >> 
> >> >> >> On Tue, Jan 10, 2012 at 9:37 PM, Marek Vasut
> >> >> >> <marek.vasut@gmail.com>
> > 
> > wrote:
> >> >> >> >> From: "Govindraj.R" <govindraj.raja@ti.com>
> >> >> >> >> 
> >> >> >> >> Clean up added ehci-omap.c and make it generic for re-use
> >> >> >> >> across soc having same ehci ip block. Also pass the modes to
> >> >> >> >> be configured and configure the ports accordingly. All usb
> >> >> >> >> layers are not cache aligned till then keep cache off for usb
> >> >> >> >> ops as ehci will use internally dma for all usb ops.
> >> >> >> >> 
> >> >> >> >> * Add a generic common header ehci-omap.h having common ip
> >> >> >> >> block data and reg shifts.
> >> >> >> >> * Rename and modify ehci-omap3 to ehci.h retain only
> >> >> >> >> conflicting sysc reg shifts remove others and move to common
> >> >> >> >> header file.
> >> >> >> > 
> >> >> >> > Don't reimplement the ulpi stuff ... there's already some ulpi
> >> >> >> > stuff in uboot that needs fixing, so fix it and use it.
> >> >> >> 
> >> >> >> I am not implementing any ulpi stuff I am just configuring OMAP on
> >> >> >> soc usb host controller (ehci). All the configuration stuff
> >> >> >> is OMAP specific things which are done in ehci-omap.c file
> >> >> >> 
> >> >> >> stuffs done are like soft-reset, port mode to be used and putting
> >> >> >> port in no -idle mode(omap specific pm implementation) etc.
> >> >> > 
> >> >> > This stuff:
> >> >> > 
> >> >> > +/* ULPI */
> >> >> > +#define ULPI_SET(a)                                    (a + 1)
> >> >> > +#define ULPI_CLR(a)                                    (a + 2)
> >> >> > +#define ULPI_FUNC_CTRL                                 0x04
> >> >> > +#define ULPI_FUNC_CTRL_RESET                           (1 << 5)
> >> >> > 
> >> >> > is just accidentally conforming to ULPI spec?
> >> >> 
> >> >> These are for configuring INSNREG05_ULPI reg in EHCI reg map
> >> >> of omap while configuring in ulpi-phy mode.
> >> >> 
> >> >> looking into struct ulpi_regs {..}
> >> >> then it doesn't map this configuration.
> >> > 
> >> > Can you point me to some documentation about this please? It's not
> >> > that I don't trust you, I'd rather prefer to avoid unnecessary
> >> > duplication.
> >> 
> >> Yes that would be fine.
> >> 
> >> You can download the omap4460 public trm from here:
> >> 
> >> http://www.ti.com/pdfs/wtbu/OMAP4460_ES.1x_PUBLIC_TRM_vM.zip
> >> 
> >> Go to chapter 23.11.6.6.1 EHCI Register Summary
> >> (page number 5171 and 5186/87)
> > 
> > Sure, but the macro above looks more like 23.11.6.3, doesn't it ? And for
> > that purpose, the struct ulpi_regs is fitting ok.
> > 
> > Actually ... can you check the ulpi_read and ulpi_write stuff that's
> > already in u-boot and explain why they can not be used with this port?
> 
> echi-omap.c is no where writing to those registers
> and the macro was used only to configure INSNREG05_ULPI reg in EHCI reg map
> 
> reg map in 23.11.6.3 used only for a external ulpi-phy communication.
> and debug purpose(to view vid, pid etc) and to hack external phy
> configuration through ulpi commands
> from omap - usb host controller point of view only needs
> INSNREG05_ULPI reg in EHCI reg configuration
> rest on soc host controller takes care of it.

Can someone else comment on this? I think I don't understand well (as I'm not 
OMAP guy).

M
> 
> --
> Thanks,
> Govindraj.R
Igor Grinberg Jan. 11, 2012, 3:03 p.m. UTC | #10
Hi Guys,

On 01/11/12 16:34, Marek Vasut wrote:
>> On Wed, Jan 11, 2012 at 6:58 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
>>>> On Wed, Jan 11, 2012 at 6:16 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
>>>>>> On Wed, Jan 11, 2012 at 4:22 PM, Marek Vasut <marek.vasut@gmail.com> 
> wrote:
>>>>>>>> Hi Marek,
>>>>>>>>
>>>>>>>> Thanks for you review.
>>>>>>>>
>>>>>>>> On Tue, Jan 10, 2012 at 9:37 PM, Marek Vasut
>>>>>>>> <marek.vasut@gmail.com>
>>>
>>> wrote:
>>>>>>>>>> From: "Govindraj.R" <govindraj.raja@ti.com>
>>>>>>>>>>
>>>>>>>>>> Clean up added ehci-omap.c and make it generic for re-use
>>>>>>>>>> across soc having same ehci ip block. Also pass the modes to
>>>>>>>>>> be configured and configure the ports accordingly. All usb
>>>>>>>>>> layers are not cache aligned till then keep cache off for usb
>>>>>>>>>> ops as ehci will use internally dma for all usb ops.
>>>>>>>>>>
>>>>>>>>>> * Add a generic common header ehci-omap.h having common ip
>>>>>>>>>> block data and reg shifts.
>>>>>>>>>> * Rename and modify ehci-omap3 to ehci.h retain only
>>>>>>>>>> conflicting sysc reg shifts remove others and move to common
>>>>>>>>>> header file.
>>>>>>>>>
>>>>>>>>> Don't reimplement the ulpi stuff ... there's already some ulpi
>>>>>>>>> stuff in uboot that needs fixing, so fix it and use it.
>>>>>>>>
>>>>>>>> I am not implementing any ulpi stuff I am just configuring OMAP on
>>>>>>>> soc usb host controller (ehci). All the configuration stuff
>>>>>>>> is OMAP specific things which are done in ehci-omap.c file
>>>>>>>>
>>>>>>>> stuffs done are like soft-reset, port mode to be used and putting
>>>>>>>> port in no -idle mode(omap specific pm implementation) etc.
>>>>>>>
>>>>>>> This stuff:
>>>>>>>
>>>>>>> +/* ULPI */
>>>>>>> +#define ULPI_SET(a)                                    (a + 1)
>>>>>>> +#define ULPI_CLR(a)                                    (a + 2)
>>>>>>> +#define ULPI_FUNC_CTRL                                 0x04
>>>>>>> +#define ULPI_FUNC_CTRL_RESET                           (1 << 5)
>>>>>>>
>>>>>>> is just accidentally conforming to ULPI spec?
>>>>>>
>>>>>> These are for configuring INSNREG05_ULPI reg in EHCI reg map
>>>>>> of omap while configuring in ulpi-phy mode.
>>>>>>
>>>>>> looking into struct ulpi_regs {..}
>>>>>> then it doesn't map this configuration.
>>>>>
>>>>> Can you point me to some documentation about this please? It's not
>>>>> that I don't trust you, I'd rather prefer to avoid unnecessary
>>>>> duplication.
>>>>
>>>> Yes that would be fine.
>>>>
>>>> You can download the omap4460 public trm from here:
>>>>
>>>> http://www.ti.com/pdfs/wtbu/OMAP4460_ES.1x_PUBLIC_TRM_vM.zip
>>>>
>>>> Go to chapter 23.11.6.6.1 EHCI Register Summary
>>>> (page number 5171 and 5186/87)
>>>
>>> Sure, but the macro above looks more like 23.11.6.3, doesn't it ? And for
>>> that purpose, the struct ulpi_regs is fitting ok.
>>>
>>> Actually ... can you check the ulpi_read and ulpi_write stuff that's
>>> already in u-boot and explain why they can not be used with this port?
>>
>> echi-omap.c is no where writing to those registers
>> and the macro was used only to configure INSNREG05_ULPI reg in EHCI reg map
>>
>> reg map in 23.11.6.3 used only for a external ulpi-phy communication.
>> and debug purpose(to view vid, pid etc) and to hack external phy
>> configuration through ulpi commands
>> from omap - usb host controller point of view only needs
>> INSNREG05_ULPI reg in EHCI reg configuration
>> rest on soc host controller takes care of it.
> 
> Can someone else comment on this? I think I don't understand well (as I'm not 
> OMAP guy).

Well, it is on my list, actually,
but I will be able to get to it only in a couple of days.
(I'm really busy right now).
Marek Vasut Jan. 11, 2012, 6:50 p.m. UTC | #11
> Hi Guys,
> 
> On 01/11/12 16:34, Marek Vasut wrote:
> >> On Wed, Jan 11, 2012 at 6:58 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
> >>>> On Wed, Jan 11, 2012 at 6:16 PM, Marek Vasut <marek.vasut@gmail.com> 
wrote:
> >>>>>> On Wed, Jan 11, 2012 at 4:22 PM, Marek Vasut <marek.vasut@gmail.com>
> > 
> > wrote:
> >>>>>>>> Hi Marek,
> >>>>>>>> 
> >>>>>>>> Thanks for you review.
> >>>>>>>> 
> >>>>>>>> On Tue, Jan 10, 2012 at 9:37 PM, Marek Vasut
> >>>>>>>> <marek.vasut@gmail.com>
> >>> 
> >>> wrote:
> >>>>>>>>>> From: "Govindraj.R" <govindraj.raja@ti.com>
> >>>>>>>>>> 
> >>>>>>>>>> Clean up added ehci-omap.c and make it generic for re-use
> >>>>>>>>>> across soc having same ehci ip block. Also pass the modes to
> >>>>>>>>>> be configured and configure the ports accordingly. All usb
> >>>>>>>>>> layers are not cache aligned till then keep cache off for usb
> >>>>>>>>>> ops as ehci will use internally dma for all usb ops.
> >>>>>>>>>> 
> >>>>>>>>>> * Add a generic common header ehci-omap.h having common ip
> >>>>>>>>>> block data and reg shifts.
> >>>>>>>>>> * Rename and modify ehci-omap3 to ehci.h retain only
> >>>>>>>>>> conflicting sysc reg shifts remove others and move to common
> >>>>>>>>>> header file.
> >>>>>>>>> 
> >>>>>>>>> Don't reimplement the ulpi stuff ... there's already some ulpi
> >>>>>>>>> stuff in uboot that needs fixing, so fix it and use it.
> >>>>>>>> 
> >>>>>>>> I am not implementing any ulpi stuff I am just configuring OMAP on
> >>>>>>>> soc usb host controller (ehci). All the configuration stuff
> >>>>>>>> is OMAP specific things which are done in ehci-omap.c file
> >>>>>>>> 
> >>>>>>>> stuffs done are like soft-reset, port mode to be used and putting
> >>>>>>>> port in no -idle mode(omap specific pm implementation) etc.
> >>>>>>> 
> >>>>>>> This stuff:
> >>>>>>> 
> >>>>>>> +/* ULPI */
> >>>>>>> +#define ULPI_SET(a)                                    (a + 1)
> >>>>>>> +#define ULPI_CLR(a)                                    (a + 2)
> >>>>>>> +#define ULPI_FUNC_CTRL                                 0x04
> >>>>>>> +#define ULPI_FUNC_CTRL_RESET                           (1 << 5)
> >>>>>>> 
> >>>>>>> is just accidentally conforming to ULPI spec?
> >>>>>> 
> >>>>>> These are for configuring INSNREG05_ULPI reg in EHCI reg map
> >>>>>> of omap while configuring in ulpi-phy mode.
> >>>>>> 
> >>>>>> looking into struct ulpi_regs {..}
> >>>>>> then it doesn't map this configuration.
> >>>>> 
> >>>>> Can you point me to some documentation about this please? It's not
> >>>>> that I don't trust you, I'd rather prefer to avoid unnecessary
> >>>>> duplication.
> >>>> 
> >>>> Yes that would be fine.
> >>>> 
> >>>> You can download the omap4460 public trm from here:
> >>>> 
> >>>> http://www.ti.com/pdfs/wtbu/OMAP4460_ES.1x_PUBLIC_TRM_vM.zip
> >>>> 
> >>>> Go to chapter 23.11.6.6.1 EHCI Register Summary
> >>>> (page number 5171 and 5186/87)
> >>> 
> >>> Sure, but the macro above looks more like 23.11.6.3, doesn't it ? And
> >>> for that purpose, the struct ulpi_regs is fitting ok.
> >>> 
> >>> Actually ... can you check the ulpi_read and ulpi_write stuff that's
> >>> already in u-boot and explain why they can not be used with this port?
> >> 
> >> echi-omap.c is no where writing to those registers
> >> and the macro was used only to configure INSNREG05_ULPI reg in EHCI reg
> >> map
> >> 
> >> reg map in 23.11.6.3 used only for a external ulpi-phy communication.
> >> and debug purpose(to view vid, pid etc) and to hack external phy
> >> configuration through ulpi commands
> >> from omap - usb host controller point of view only needs
> >> INSNREG05_ULPI reg in EHCI reg configuration
> >> rest on soc host controller takes care of it.
> > 
> > Can someone else comment on this? I think I don't understand well (as I'm
> > not OMAP guy).
> 
> Well, it is on my list, actually,
> but I will be able to get to it only in a couple of days.
> (I'm really busy right now).

Good, please keep me updated, Igor. Thank you
Govindraj Jan. 12, 2012, 5:45 a.m. UTC | #12
Hi Igor,

On Wed, Jan 11, 2012 at 8:33 PM, Igor Grinberg <grinberg@compulab.co.il> wrote:
> Hi Guys,
>
> On 01/11/12 16:34, Marek Vasut wrote:
>>> On Wed, Jan 11, 2012 at 6:58 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
>>>>> On Wed, Jan 11, 2012 at 6:16 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
>>>>>>> On Wed, Jan 11, 2012 at 4:22 PM, Marek Vasut <marek.vasut@gmail.com>
>> wrote:
>>>>>>>>> Hi Marek,
>>>>>>>>>
>>>>>>>>> Thanks for you review.
>>>>>>>>>
>>>>>>>>> On Tue, Jan 10, 2012 at 9:37 PM, Marek Vasut
>>>>>>>>> <marek.vasut@gmail.com>
>>>>
>>>> wrote:
>>>>>>>>>>> From: "Govindraj.R" <govindraj.raja@ti.com>
>>>>>>>>>>>
>>>>>>>>>>> Clean up added ehci-omap.c and make it generic for re-use
>>>>>>>>>>> across soc having same ehci ip block. Also pass the modes to
>>>>>>>>>>> be configured and configure the ports accordingly. All usb
>>>>>>>>>>> layers are not cache aligned till then keep cache off for usb
>>>>>>>>>>> ops as ehci will use internally dma for all usb ops.
>>>>>>>>>>>
>>>>>>>>>>> * Add a generic common header ehci-omap.h having common ip
>>>>>>>>>>> block data and reg shifts.
>>>>>>>>>>> * Rename and modify ehci-omap3 to ehci.h retain only
>>>>>>>>>>> conflicting sysc reg shifts remove others and move to common
>>>>>>>>>>> header file.
>>>>>>>>>>
>>>>>>>>>> Don't reimplement the ulpi stuff ... there's already some ulpi
>>>>>>>>>> stuff in uboot that needs fixing, so fix it and use it.
>>>>>>>>>
>>>>>>>>> I am not implementing any ulpi stuff I am just configuring OMAP on
>>>>>>>>> soc usb host controller (ehci). All the configuration stuff
>>>>>>>>> is OMAP specific things which are done in ehci-omap.c file
>>>>>>>>>
>>>>>>>>> stuffs done are like soft-reset, port mode to be used and putting
>>>>>>>>> port in no -idle mode(omap specific pm implementation) etc.
>>>>>>>>
>>>>>>>> This stuff:
>>>>>>>>
>>>>>>>> +/* ULPI */
>>>>>>>> +#define ULPI_SET(a)                                    (a + 1)
>>>>>>>> +#define ULPI_CLR(a)                                    (a + 2)
>>>>>>>> +#define ULPI_FUNC_CTRL                                 0x04
>>>>>>>> +#define ULPI_FUNC_CTRL_RESET                           (1 << 5)
>>>>>>>>
>>>>>>>> is just accidentally conforming to ULPI spec?
>>>>>>>
>>>>>>> These are for configuring INSNREG05_ULPI reg in EHCI reg map
>>>>>>> of omap while configuring in ulpi-phy mode.
>>>>>>>
>>>>>>> looking into struct ulpi_regs {..}
>>>>>>> then it doesn't map this configuration.
>>>>>>
>>>>>> Can you point me to some documentation about this please? It's not
>>>>>> that I don't trust you, I'd rather prefer to avoid unnecessary
>>>>>> duplication.
>>>>>
>>>>> Yes that would be fine.
>>>>>
>>>>> You can download the omap4460 public trm from here:
>>>>>
>>>>> http://www.ti.com/pdfs/wtbu/OMAP4460_ES.1x_PUBLIC_TRM_vM.zip
>>>>>
>>>>> Go to chapter 23.11.6.6.1 EHCI Register Summary
>>>>> (page number 5171 and 5186/87)
>>>>
>>>> Sure, but the macro above looks more like 23.11.6.3, doesn't it ? And for
>>>> that purpose, the struct ulpi_regs is fitting ok.
>>>>
>>>> Actually ... can you check the ulpi_read and ulpi_write stuff that's
>>>> already in u-boot and explain why they can not be used with this port?
>>>
>>> echi-omap.c is no where writing to those registers
>>> and the macro was used only to configure INSNREG05_ULPI reg in EHCI reg map
>>>
>>> reg map in 23.11.6.3 used only for a external ulpi-phy communication.
>>> and debug purpose(to view vid, pid etc) and to hack external phy
>>> configuration through ulpi commands
>>> from omap - usb host controller point of view only needs
>>> INSNREG05_ULPI reg in EHCI reg configuration
>>> rest on soc host controller takes care of it.
>>
>> Can someone else comment on this? I think I don't understand well (as I'm not
>> OMAP guy).
>
> Well, it is on my list, actually,
> but I will be able to get to it only in a couple of days.
> (I'm really busy right now).
>

Could you please let me know what exactly that you will be
updating?

So that I can accordingly post my v3 of this patch fixing comments
from Marek Vasut <marek.vasut@gmail.com>

--
Thanks,
Govindraj.R
Igor Grinberg Jan. 12, 2012, 9:23 a.m. UTC | #13
Hi Govindraj,

On 01/12/12 07:45, Govindraj wrote:
> Hi Igor,
> 
> On Wed, Jan 11, 2012 at 8:33 PM, Igor Grinberg <grinberg@compulab.co.il> wrote:
>> Hi Guys,
>>
>> On 01/11/12 16:34, Marek Vasut wrote:
>>>> On Wed, Jan 11, 2012 at 6:58 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
>>>>>> On Wed, Jan 11, 2012 at 6:16 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
>>>>>>>> On Wed, Jan 11, 2012 at 4:22 PM, Marek Vasut <marek.vasut@gmail.com>
>>> wrote:
>>>>>>>>>> Hi Marek,
>>>>>>>>>>
>>>>>>>>>> Thanks for you review.
>>>>>>>>>>
>>>>>>>>>> On Tue, Jan 10, 2012 at 9:37 PM, Marek Vasut
>>>>>>>>>> <marek.vasut@gmail.com>
>>>>>
>>>>> wrote:
>>>>>>>>>>>> From: "Govindraj.R" <govindraj.raja@ti.com>
>>>>>>>>>>>>
>>>>>>>>>>>> Clean up added ehci-omap.c and make it generic for re-use
>>>>>>>>>>>> across soc having same ehci ip block. Also pass the modes to
>>>>>>>>>>>> be configured and configure the ports accordingly. All usb
>>>>>>>>>>>> layers are not cache aligned till then keep cache off for usb
>>>>>>>>>>>> ops as ehci will use internally dma for all usb ops.
>>>>>>>>>>>>
>>>>>>>>>>>> * Add a generic common header ehci-omap.h having common ip
>>>>>>>>>>>> block data and reg shifts.
>>>>>>>>>>>> * Rename and modify ehci-omap3 to ehci.h retain only
>>>>>>>>>>>> conflicting sysc reg shifts remove others and move to common
>>>>>>>>>>>> header file.
>>>>>>>>>>>
>>>>>>>>>>> Don't reimplement the ulpi stuff ... there's already some ulpi
>>>>>>>>>>> stuff in uboot that needs fixing, so fix it and use it.
>>>>>>>>>>
>>>>>>>>>> I am not implementing any ulpi stuff I am just configuring OMAP on
>>>>>>>>>> soc usb host controller (ehci). All the configuration stuff
>>>>>>>>>> is OMAP specific things which are done in ehci-omap.c file
>>>>>>>>>>
>>>>>>>>>> stuffs done are like soft-reset, port mode to be used and putting
>>>>>>>>>> port in no -idle mode(omap specific pm implementation) etc.
>>>>>>>>>
>>>>>>>>> This stuff:
>>>>>>>>>
>>>>>>>>> +/* ULPI */
>>>>>>>>> +#define ULPI_SET(a)                                    (a + 1)
>>>>>>>>> +#define ULPI_CLR(a)                                    (a + 2)
>>>>>>>>> +#define ULPI_FUNC_CTRL                                 0x04
>>>>>>>>> +#define ULPI_FUNC_CTRL_RESET                           (1 << 5)
>>>>>>>>>
>>>>>>>>> is just accidentally conforming to ULPI spec?
>>>>>>>>
>>>>>>>> These are for configuring INSNREG05_ULPI reg in EHCI reg map
>>>>>>>> of omap while configuring in ulpi-phy mode.
>>>>>>>>
>>>>>>>> looking into struct ulpi_regs {..}
>>>>>>>> then it doesn't map this configuration.
>>>>>>>
>>>>>>> Can you point me to some documentation about this please? It's not
>>>>>>> that I don't trust you, I'd rather prefer to avoid unnecessary
>>>>>>> duplication.
>>>>>>
>>>>>> Yes that would be fine.
>>>>>>
>>>>>> You can download the omap4460 public trm from here:
>>>>>>
>>>>>> http://www.ti.com/pdfs/wtbu/OMAP4460_ES.1x_PUBLIC_TRM_vM.zip
>>>>>>
>>>>>> Go to chapter 23.11.6.6.1 EHCI Register Summary
>>>>>> (page number 5171 and 5186/87)
>>>>>
>>>>> Sure, but the macro above looks more like 23.11.6.3, doesn't it ? And for
>>>>> that purpose, the struct ulpi_regs is fitting ok.
>>>>>
>>>>> Actually ... can you check the ulpi_read and ulpi_write stuff that's
>>>>> already in u-boot and explain why they can not be used with this port?
>>>>
>>>> echi-omap.c is no where writing to those registers
>>>> and the macro was used only to configure INSNREG05_ULPI reg in EHCI reg map
>>>>
>>>> reg map in 23.11.6.3 used only for a external ulpi-phy communication.
>>>> and debug purpose(to view vid, pid etc) and to hack external phy
>>>> configuration through ulpi commands
>>>> from omap - usb host controller point of view only needs
>>>> INSNREG05_ULPI reg in EHCI reg configuration
>>>> rest on soc host controller takes care of it.
>>>
>>> Can someone else comment on this? I think I don't understand well (as I'm not
>>> OMAP guy).
>>
>> Well, it is on my list, actually,
>> but I will be able to get to it only in a couple of days.
>> (I'm really busy right now).
>>
> 
> Could you please let me know what exactly that you will be
> updating?
> 
> So that I can accordingly post my v3 of this patch fixing comments
> from Marek Vasut <marek.vasut@gmail.com>

Well, I did not say, I'm going to update anything.
What I meant is that I'm going to look into TI's documentation
regarding EHCI and the ULPI to understand the dependencies and see
how your code meets those and if the generic ULPI layer can be used
for that.

So to lower the work load from from you, I'd suggest you to wait
till Monday (if you can of course) to let me look into this.
It is also possible that I will be able to check the above today
or tomorrow, but I can't promise, as I'm really busy now.

Thanks.
Govindraj Jan. 12, 2012, 10:52 a.m. UTC | #14
On Thu, Jan 12, 2012 at 2:53 PM, Igor Grinberg <grinberg@compulab.co.il> wrote:
> Hi Govindraj,
>
> On 01/12/12 07:45, Govindraj wrote:
>> Hi Igor,
>>
>> On Wed, Jan 11, 2012 at 8:33 PM, Igor Grinberg <grinberg@compulab.co.il> wrote:
>>> Hi Guys,
>>>
>>> On 01/11/12 16:34, Marek Vasut wrote:
>>>>> On Wed, Jan 11, 2012 at 6:58 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
>>>>>>> On Wed, Jan 11, 2012 at 6:16 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
>>>>>>>>> On Wed, Jan 11, 2012 at 4:22 PM, Marek Vasut <marek.vasut@gmail.com>
>>>> wrote:
>>>>>>>>>>> Hi Marek,
>>>>>>>>>>>
>>>>>>>>>>> Thanks for you review.
>>>>>>>>>>>
>>>>>>>>>>> On Tue, Jan 10, 2012 at 9:37 PM, Marek Vasut
>>>>>>>>>>> <marek.vasut@gmail.com>
>>>>>>
>>>>>> wrote:
>>>>>>>>>>>>> From: "Govindraj.R" <govindraj.raja@ti.com>
>>>>>>>>>>>>>
>>>>>>>>>>>>> Clean up added ehci-omap.c and make it generic for re-use
>>>>>>>>>>>>> across soc having same ehci ip block. Also pass the modes to
>>>>>>>>>>>>> be configured and configure the ports accordingly. All usb
>>>>>>>>>>>>> layers are not cache aligned till then keep cache off for usb
>>>>>>>>>>>>> ops as ehci will use internally dma for all usb ops.
>>>>>>>>>>>>>
>>>>>>>>>>>>> * Add a generic common header ehci-omap.h having common ip
>>>>>>>>>>>>> block data and reg shifts.
>>>>>>>>>>>>> * Rename and modify ehci-omap3 to ehci.h retain only
>>>>>>>>>>>>> conflicting sysc reg shifts remove others and move to common
>>>>>>>>>>>>> header file.
>>>>>>>>>>>>
>>>>>>>>>>>> Don't reimplement the ulpi stuff ... there's already some ulpi
>>>>>>>>>>>> stuff in uboot that needs fixing, so fix it and use it.
>>>>>>>>>>>
>>>>>>>>>>> I am not implementing any ulpi stuff I am just configuring OMAP on
>>>>>>>>>>> soc usb host controller (ehci). All the configuration stuff
>>>>>>>>>>> is OMAP specific things which are done in ehci-omap.c file
>>>>>>>>>>>
>>>>>>>>>>> stuffs done are like soft-reset, port mode to be used and putting
>>>>>>>>>>> port in no -idle mode(omap specific pm implementation) etc.
>>>>>>>>>>
>>>>>>>>>> This stuff:
>>>>>>>>>>
>>>>>>>>>> +/* ULPI */
>>>>>>>>>> +#define ULPI_SET(a)                                    (a + 1)
>>>>>>>>>> +#define ULPI_CLR(a)                                    (a + 2)
>>>>>>>>>> +#define ULPI_FUNC_CTRL                                 0x04
>>>>>>>>>> +#define ULPI_FUNC_CTRL_RESET                           (1 << 5)
>>>>>>>>>>
>>>>>>>>>> is just accidentally conforming to ULPI spec?
>>>>>>>>>
>>>>>>>>> These are for configuring INSNREG05_ULPI reg in EHCI reg map
>>>>>>>>> of omap while configuring in ulpi-phy mode.
>>>>>>>>>
>>>>>>>>> looking into struct ulpi_regs {..}
>>>>>>>>> then it doesn't map this configuration.
>>>>>>>>
>>>>>>>> Can you point me to some documentation about this please? It's not
>>>>>>>> that I don't trust you, I'd rather prefer to avoid unnecessary
>>>>>>>> duplication.
>>>>>>>
>>>>>>> Yes that would be fine.
>>>>>>>
>>>>>>> You can download the omap4460 public trm from here:
>>>>>>>
>>>>>>> http://www.ti.com/pdfs/wtbu/OMAP4460_ES.1x_PUBLIC_TRM_vM.zip
>>>>>>>
>>>>>>> Go to chapter 23.11.6.6.1 EHCI Register Summary
>>>>>>> (page number 5171 and 5186/87)
>>>>>>
>>>>>> Sure, but the macro above looks more like 23.11.6.3, doesn't it ? And for
>>>>>> that purpose, the struct ulpi_regs is fitting ok.
>>>>>>
>>>>>> Actually ... can you check the ulpi_read and ulpi_write stuff that's
>>>>>> already in u-boot and explain why they can not be used with this port?
>>>>>
>>>>> echi-omap.c is no where writing to those registers
>>>>> and the macro was used only to configure INSNREG05_ULPI reg in EHCI reg map
>>>>>
>>>>> reg map in 23.11.6.3 used only for a external ulpi-phy communication.
>>>>> and debug purpose(to view vid, pid etc) and to hack external phy
>>>>> configuration through ulpi commands
>>>>> from omap - usb host controller point of view only needs
>>>>> INSNREG05_ULPI reg in EHCI reg configuration
>>>>> rest on soc host controller takes care of it.
>>>>
>>>> Can someone else comment on this? I think I don't understand well (as I'm not
>>>> OMAP guy).
>>>
>>> Well, it is on my list, actually,
>>> but I will be able to get to it only in a couple of days.
>>> (I'm really busy right now).
>>>
>>
>> Could you please let me know what exactly that you will be
>> updating?
>>
>> So that I can accordingly post my v3 of this patch fixing comments
>> from Marek Vasut <marek.vasut@gmail.com>
>
> Well, I did not say, I'm going to update anything.
> What I meant is that I'm going to look into TI's documentation
> regarding EHCI and the ULPI to understand the dependencies and see
> how your code meets those and if the generic ULPI layer can be used
> for that.
>

okay, Thanks,

> So to lower the work load from from you, I'd suggest you to wait
> till Monday (if you can of course) to let me look into this.

Yes Sure.

--
Thanks,
Govindraj.R
Igor Grinberg Jan. 17, 2012, 6:17 p.m. UTC | #15
Hi Govindraj,

I'm sorry it took me so much time, I just was very busy these days...
I've looked in the TRMs of both OMAP3 and OMAP4, please see below.

On 01/12/12 12:52, Govindraj wrote:
> On Thu, Jan 12, 2012 at 2:53 PM, Igor Grinberg <grinberg@compulab.co.il> wrote:
>> Hi Govindraj,
>>
>> On 01/12/12 07:45, Govindraj wrote:
>>> Hi Igor,
>>>
>>> On Wed, Jan 11, 2012 at 8:33 PM, Igor Grinberg <grinberg@compulab.co.il> wrote:
>>>> Hi Guys,
>>>>
>>>> On 01/11/12 16:34, Marek Vasut wrote:
>>>>>> On Wed, Jan 11, 2012 at 6:58 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
>>>>>>>> On Wed, Jan 11, 2012 at 6:16 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
>>>>>>>>>> On Wed, Jan 11, 2012 at 4:22 PM, Marek Vasut <marek.vasut@gmail.com>
>>>>> wrote:
>>>>>>>>>>>> Hi Marek,
>>>>>>>>>>>>
>>>>>>>>>>>> Thanks for you review.
>>>>>>>>>>>>
>>>>>>>>>>>> On Tue, Jan 10, 2012 at 9:37 PM, Marek Vasut
>>>>>>>>>>>> <marek.vasut@gmail.com>
>>>>>>>
>>>>>>> wrote:
>>>>>>>>>>>>>> From: "Govindraj.R" <govindraj.raja@ti.com>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Clean up added ehci-omap.c and make it generic for re-use
>>>>>>>>>>>>>> across soc having same ehci ip block. Also pass the modes to
>>>>>>>>>>>>>> be configured and configure the ports accordingly. All usb
>>>>>>>>>>>>>> layers are not cache aligned till then keep cache off for usb
>>>>>>>>>>>>>> ops as ehci will use internally dma for all usb ops.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> * Add a generic common header ehci-omap.h having common ip
>>>>>>>>>>>>>> block data and reg shifts.
>>>>>>>>>>>>>> * Rename and modify ehci-omap3 to ehci.h retain only
>>>>>>>>>>>>>> conflicting sysc reg shifts remove others and move to common
>>>>>>>>>>>>>> header file.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Don't reimplement the ulpi stuff ... there's already some ulpi
>>>>>>>>>>>>> stuff in uboot that needs fixing, so fix it and use it.

Why do you keep saying that it needs fixing?
Can you point to a specific problem?

>>>>>>>>>>>>
>>>>>>>>>>>> I am not implementing any ulpi stuff I am just configuring OMAP on
>>>>>>>>>>>> soc usb host controller (ehci). All the configuration stuff
>>>>>>>>>>>> is OMAP specific things which are done in ehci-omap.c file

Yes, it is OMAP specific, but only the INSNREG05_ULPI register part...

>>>>>>>>>>>>
>>>>>>>>>>>> stuffs done are like soft-reset, port mode to be used and putting
>>>>>>>>>>>> port in no -idle mode(omap specific pm implementation) etc.

Well, the soft-reset, does not fit here...
The soft reset is defined by the ULPI spec and there is already an
implementation for this (as defined by the ULPI spec.)

>>>>>>>>>>>
>>>>>>>>>>> This stuff:
>>>>>>>>>>>
>>>>>>>>>>> +/* ULPI */
>>>>>>>>>>> +#define ULPI_SET(a)                                    (a + 1)
>>>>>>>>>>> +#define ULPI_CLR(a)                                    (a + 2)
>>>>>>>>>>> +#define ULPI_FUNC_CTRL                                 0x04
>>>>>>>>>>> +#define ULPI_FUNC_CTRL_RESET                           (1 << 5)
>>>>>>>>>>>
>>>>>>>>>>> is just accidentally conforming to ULPI spec?
>>>>>>>>>>
>>>>>>>>>> These are for configuring INSNREG05_ULPI reg in EHCI reg map
>>>>>>>>>> of omap while configuring in ulpi-phy mode.

By writing to the INSNREG05_ULPI register, you do not configure it,
but rather initiate the ULPI transaction to the ULPI PHY.

>>>>>>>>>>
>>>>>>>>>> looking into struct ulpi_regs {..}
>>>>>>>>>> then it doesn't map this configuration.

ulpi_regs {...} provides a kind of virtual mapping (to conform to U-Boot
way of accessing the registers) for the ULPI registers inside the ULPI PHY,
which are accessible in a platform specific manner which is sometimes called
a ULPI viewport.
In case of OMAP, the ULPI viewport is the INSNREG05_ULPI register.

>>>>>>>>>
>>>>>>>>> Can you point me to some documentation about this please? It's not
>>>>>>>>> that I don't trust you, I'd rather prefer to avoid unnecessary
>>>>>>>>> duplication.
>>>>>>>>
>>>>>>>> Yes that would be fine.
>>>>>>>>
>>>>>>>> You can download the omap4460 public trm from here:
>>>>>>>>
>>>>>>>> http://www.ti.com/pdfs/wtbu/OMAP4460_ES.1x_PUBLIC_TRM_vM.zip
>>>>>>>>
>>>>>>>> Go to chapter 23.11.6.6.1 EHCI Register Summary
>>>>>>>> (page number 5171 and 5186/87)
>>>>>>>
>>>>>>> Sure, but the macro above looks more like 23.11.6.3, doesn't it ? And for
>>>>>>> that purpose, the struct ulpi_regs is fitting ok.

No, Marek, there is another thing inside OMAP, which is called TLL.
It provides a kind of virtual ULPI interface and can be used instead of ULPI
PHY for the on-board connected devices.
TLL is not related to this discussion.

>>>>>>>
>>>>>>> Actually ... can you check the ulpi_read and ulpi_write stuff that's
>>>>>>> already in u-boot and explain why they can not be used with this port?

Marek, OMAP has a different ULPI viewport register structure, so
to reuse the ULPI layer, the omap-ulpi-viewport.c should be implemented
with its own ULPI accessors (e.g. ulpi_{read|write}()).

>>>>>>
>>>>>> echi-omap.c is no where writing to those registers
>>>>>> and the macro was used only to configure INSNREG05_ULPI reg in EHCI reg map

This is not exactly true...
Indeed, the INSNREG05_ULPI register is in EHCI registers address space.
In fact it does not meter where that register is located.

After those macros was written to the INSNREG05_ULPI register,
the ULPI transaction is issued to write the value inside the ULPI register.

>>>>>>
>>>>>> reg map in 23.11.6.3 used only for a external ulpi-phy communication.
>>>>>> and debug purpose(to view vid, pid etc) and to hack external phy
>>>>>> configuration through ulpi commands

Almost... TLL is exactly the opposite... It is a PHY-less configuration.
It is the TLL ULPI pseudo registers and it is not related to the discussion.

>>>>>> from omap - usb host controller point of view only needs
>>>>>> INSNREG05_ULPI reg in EHCI reg configuration
>>>>>> rest on soc host controller takes care of it.

right, but it is the ULPI PHY access register and you do not
configure it, but access the ULPI PHY registers through this register.

>>>>>
>>>>> Can someone else comment on this? I think I don't understand well (as I'm not
>>>>> OMAP guy).
>>>>
>>>> Well, it is on my list, actually,
>>>> but I will be able to get to it only in a couple of days.
>>>> (I'm really busy right now).
>>>>
>>>
>>> Could you please let me know what exactly that you will be
>>> updating?
>>>
>>> So that I can accordingly post my v3 of this patch fixing comments
>>> from Marek Vasut <marek.vasut@gmail.com>
>>
>> Well, I did not say, I'm going to update anything.
>> What I meant is that I'm going to look into TI's documentation
>> regarding EHCI and the ULPI to understand the dependencies and see
>> how your code meets those and if the generic ULPI layer can be used
>> for that.

Ok, now I've done that, and commented above.
So, IMO, yes the ULPI layer should be reused for the ULPI access, but
we have here a problem which needs a solution:
Current ULPI implementation does not support the multi-port mode of the
ULPI viewport register (PORTSEL bit on OMAP or ULPIPORT bit on iMX35).
Apparently, on iMX (e.g. efikamx) it is used in non-multi port mode
or the port is always 0.
Currently, there is no way to pass this parameter to the ULPI
viewport implementation.

I will send some more feedback on your latest patch tomorrow.
diff mbox

Patch

diff --git a/arch/arm/include/asm/arch-omap3/ehci.h b/arch/arm/include/asm/arch-omap3/ehci.h
new file mode 100644
index 0000000..d622363
--- /dev/null
+++ b/arch/arm/include/asm/arch-omap3/ehci.h
@@ -0,0 +1,55 @@ 
+/*
+ * (C) Copyright 2011
+ * Alexander Holler <holler@ahsoftware.de>
+ *
+ * Based on "drivers/usb/host/ehci-omap.c" from Linux 2.6.37
+ *
+ * See there for additional Copyrights.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+#ifndef _EHCI_H_
+#define _EHCI_H_
+
+/* USB/EHCI registers */
+#define OMAP_USBTLL_BASE				0x48062000UL
+#define OMAP_UHH_BASE					0x48064000UL
+#define OMAP_EHCI_BASE					0x48064800UL
+
+/* TLL Register Set */
+#define OMAP_USBTLL_SYSCONFIG_SOFTRESET			(1 << 1)
+#define OMAP_USBTLL_SYSCONFIG_ENAWAKEUP			(1 << 2)
+#define OMAP_USBTLL_SYSCONFIG_SIDLEMODE			(1 << 3)
+#define OMAP_USBTLL_SYSCONFIG_CACTIVITY			(1 << 8)
+#define OMAP_USBTLL_SYSSTATUS_RESETDONE			1
+
+/* UHH Register Set */
+#define OMAP_UHH_SYSCONFIG_SOFTRESET			(1 << 1)
+#define OMAP_UHH_SYSCONFIG_CACTIVITY			(1 << 8)
+#define OMAP_UHH_SYSCONFIG_SIDLEMODE			(1 << 3)
+#define OMAP_UHH_SYSCONFIG_ENAWAKEUP			(1 << 2)
+#define OMAP_UHH_SYSCONFIG_MIDLEMODE			(1 << 12)
+#define OMAP_UHH_SYSSTATUS_EHCI_RESETDONE		(1 << 2)
+
+#define OMAP_UHH_SYSCONFIG_VAL		(OMAP_UHH_SYSCONFIG_CACTIVITY | \
+					OMAP_UHH_SYSCONFIG_SIDLEMODE | \
+					OMAP_UHH_SYSCONFIG_ENAWAKEUP | \
+					OMAP_UHH_SYSCONFIG_MIDLEMODE)
+
+#endif /* _EHCI_H_ */
diff --git a/arch/arm/include/asm/arch-omap3/ehci_omap3.h b/arch/arm/include/asm/arch-omap3/ehci_omap3.h
deleted file mode 100644
index cd01f50..0000000
--- a/arch/arm/include/asm/arch-omap3/ehci_omap3.h
+++ /dev/null
@@ -1,58 +0,0 @@ 
-/*
- * (C) Copyright 2011
- * Alexander Holler <holler@ahsoftware.de>
- *
- * Based on "drivers/usb/host/ehci-omap.c" from Linux 2.6.37
- *
- * See there for additional Copyrights.
- *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-#ifndef _EHCI_OMAP3_H_
-#define _EHCI_OMAP3_H_
-
-/* USB/EHCI registers */
-#define OMAP3_USBTLL_BASE				0x48062000UL
-#define OMAP3_UHH_BASE					0x48064000UL
-#define OMAP3_EHCI_BASE					0x48064800UL
-
-/* TLL Register Set */
-#define	OMAP_USBTLL_SYSCONFIG				(0x10)
-#define	OMAP_USBTLL_SYSCONFIG_SOFTRESET			(1 << 1)
-#define	OMAP_USBTLL_SYSCONFIG_ENAWAKEUP			(1 << 2)
-#define	OMAP_USBTLL_SYSCONFIG_SIDLEMODE			(1 << 3)
-#define	OMAP_USBTLL_SYSCONFIG_CACTIVITY			(1 << 8)
-
-#define	OMAP_USBTLL_SYSSTATUS				(0x14)
-#define	OMAP_USBTLL_SYSSTATUS_RESETDONE			(1 << 0)
-
-/* UHH Register Set */
-#define	OMAP_UHH_SYSCONFIG				(0x10)
-#define	OMAP_UHH_SYSCONFIG_SOFTRESET			(1 << 1)
-#define	OMAP_UHH_SYSCONFIG_CACTIVITY			(1 << 8)
-#define	OMAP_UHH_SYSCONFIG_SIDLEMODE			(1 << 3)
-#define	OMAP_UHH_SYSCONFIG_ENAWAKEUP			(1 << 2)
-#define	OMAP_UHH_SYSCONFIG_MIDLEMODE			(1 << 12)
-
-#define	OMAP_UHH_HOSTCONFIG				(0x40)
-#define OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN		(1 << 2)
-#define OMAP_UHH_HOSTCONFIG_INCR8_BURST_EN		(1 << 3)
-#define OMAP_UHH_HOSTCONFIG_INCR16_BURST_EN		(1 << 4)
-
-#endif /* _EHCI_OMAP3_H_ */
diff --git a/arch/arm/include/asm/arch-omap4/ehci.h b/arch/arm/include/asm/arch-omap4/ehci.h
new file mode 100644
index 0000000..3af171b
--- /dev/null
+++ b/arch/arm/include/asm/arch-omap4/ehci.h
@@ -0,0 +1,49 @@ 
+/*
+ * OMAP EHCI port support
+ * Based on LINUX KERNEL
+ * drivers/usb/host/ehci-omap.c and drivers/mfd/omap-usb-host.c
+ *
+ * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com*
+ * Author: Govindraj R <govindraj.raja@ti.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2  of
+ * the License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _EHCI_H
+#define _EHCI_H
+
+#define OMAP_EHCI_BASE				(OMAP44XX_L4_CORE_BASE + 0x64C00)
+#define OMAP_UHH_BASE				(OMAP44XX_L4_CORE_BASE + 0x64000)
+#define OMAP_USBTLL_BASE			(OMAP44XX_L4_CORE_BASE + 0x62000)
+
+/* UHH, TLL and opt clocks */
+#define CM_L3INIT_HSUSBHOST_CLKCTRL		0x4A009358UL
+
+#define HSUSBHOST_CLKCTRL_CLKSEL_UTMI_P1_MASK	(1 << 24)
+
+/* TLL Register Set */
+#define OMAP_USBTLL_SYSCONFIG_SIDLEMODE		(1 << 3)
+#define OMAP_USBTLL_SYSCONFIG_ENAWAKEUP		(1 << 2)
+#define OMAP_USBTLL_SYSCONFIG_SOFTRESET		(1 << 1)
+#define OMAP_USBTLL_SYSCONFIG_CACTIVITY		(1 << 8)
+#define OMAP_USBTLL_SYSSTATUS_RESETDONE		1
+
+#define OMAP_UHH_SYSCONFIG_SOFTRESET		1
+#define OMAP_UHH_SYSSTATUS_EHCI_RESETDONE	(1 << 2)
+#define OMAP_UHH_SYSCONFIG_NOIDLE		(1 << 2)
+#define OMAP_UHH_SYSCONFIG_NOSTDBY		(1 << 4)
+
+#define OMAP_UHH_SYSCONFIG_VAL	(OMAP_UHH_SYSCONFIG_NOIDLE | \
+					OMAP_UHH_SYSCONFIG_NOSTDBY)
+
+#endif /* _EHCI_H */
diff --git a/arch/arm/include/asm/ehci-omap.h b/arch/arm/include/asm/ehci-omap.h
new file mode 100644
index 0000000..336d77e
--- /dev/null
+++ b/arch/arm/include/asm/ehci-omap.h
@@ -0,0 +1,147 @@ 
+/*
+ * OMAP EHCI port support
+ * Based on LINUX KERNEL
+ * drivers/usb/host/ehci-omap.c and drivers/mfd/omap-usb-host.c
+ *
+ * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com*
+ * Author: Govindraj R <govindraj.raja@ti.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2  of
+ * the License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef EHCI_H
+#define EHCI_H
+
+enum usbhs_omap_port_mode {
+	OMAP_USBHS_PORT_MODE_UNUSED,
+	OMAP_EHCI_PORT_MODE_PHY,
+	OMAP_EHCI_PORT_MODE_TLL,
+	OMAP_EHCI_PORT_MODE_HSIC,
+};
+
+#ifdef CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS
+#define OMAP_HS_USB_PORTS	CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS
+#else
+#define OMAP_HS_USB_PORTS	3
+#endif
+
+#define is_ehci_phy_mode(x)	(x == OMAP_EHCI_PORT_MODE_PHY)
+#define is_ehci_tll_mode(x)	(x == OMAP_EHCI_PORT_MODE_TLL)
+#define is_ehci_hsic_mode(x)	(x == OMAP_EHCI_PORT_MODE_HSIC)
+
+/* Values of UHH_REVISION - Note: these are not given in the TRM */
+#define OMAP_USBHS_REV1					0x00000010 /* OMAP3 */
+#define OMAP_USBHS_REV2					0x50700100 /* OMAP4 */
+
+/* UHH Register Set */
+#define OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN		(1 << 2)
+#define OMAP_UHH_HOSTCONFIG_INCR8_BURST_EN		(1 << 3)
+#define OMAP_UHH_HOSTCONFIG_INCR16_BURST_EN		(1 << 4)
+#define OMAP_UHH_HOSTCONFIG_INCRX_ALIGN_EN		(1 << 5)
+
+#define OMAP_UHH_HOSTCONFIG_ULPI_P1_BYPASS		1
+#define OMAP_UHH_HOSTCONFIG_ULPI_P2_BYPASS		(1 << 11)
+#define OMAP_UHH_HOSTCONFIG_ULPI_P3_BYPASS		(1 << 12)
+#define OMAP4_UHH_HOSTCONFIG_APP_START_CLK		(1 << 31)
+
+#define OMAP_P1_MODE_CLEAR				(3 << 16)
+#define OMAP_P1_MODE_TLL				(1 << 16)
+#define OMAP_P1_MODE_HSIC				(3 << 16)
+#define OMAP_P2_MODE_CLEAR				(3 << 18)
+#define OMAP_P2_MODE_TLL				(1 << 18)
+#define OMAP_P2_MODE_HSIC				(3 << 18)
+
+/* EHCI Register Set */
+#define EHCI_INSNREG04_DISABLE_UNSUSPEND		(1 << 5)
+#define EHCI_INSNREG05_ULPI_CONTROL_SHIFT		31
+#define EHCI_INSNREG05_ULPI_PORTSEL_SHIFT		24
+#define EHCI_INSNREG05_ULPI_OPSEL_SHIFT			22
+#define EHCI_INSNREG05_ULPI_REGADD_SHIFT		16
+
+#define OMAP_REV1_TLL_CHANNEL_COUNT			3
+#define OMAP_REV2_TLL_CHANNEL_COUNT			2
+
+/* TLL Register Set */
+#define OMAP_TLL_CHANNEL_CONF(num)			(0x004 * num)
+#define OMAP_TLL_CHANNEL_CONF_DRVVBUS			(1 << 16)
+#define OMAP_TLL_CHANNEL_CONF_CHRGVBUS			(1 << 15)
+#define OMAP_TLL_CHANNEL_CONF_ULPINOBITSTUFF		(1 << 11)
+#define OMAP_TLL_CHANNEL_CONF_CHANMODE_TRANSPARENT_UTMI	(2 << 1)
+#define OMAP_TLL_CHANNEL_CONF_CHANEN			1
+
+/* ULPI */
+#define ULPI_SET(a)					(a + 1)
+#define ULPI_CLR(a)					(a + 2)
+#define ULPI_FUNC_CTRL					0x04
+#define ULPI_FUNC_CTRL_RESET				(1 << 5)
+
+struct omap_usbhs_board_data {
+	enum usbhs_omap_port_mode port_mode[OMAP_HS_USB_PORTS];
+};
+
+struct omap_usbtll {
+	u32 rev;		/* 0x00 */
+	u32 hwinfo;		/* 0x04 */
+	u8 pad1[0x8];
+	u32 sysc;		/* 0x10 */
+	u32 syss;		/* 0x14 */
+	u32 irqst;		/* 0x18 */
+	u32 irqen;		/* 0x1c */
+	u8 pad2[0x10];
+	u32 shared_conf;	/* 0x30 */
+	u8 pad3[0xc];
+	u32 channel_conf;	/* 0x40 */
+};
+
+struct omap_uhh {
+	u32 rev;	/* 0x00 */
+	u32 hwinfo;	/* 0x04 */
+	u8 pad1[0x8];
+	u32 sysc;	/* 0x10 */
+	u32 syss;	/* 0x14 */
+	u8 pad2[0x28];
+	u32 hostconfig;	/* 0x40 */
+	u32 debugcsr;	/* 0x44 */
+};
+
+struct omap_ehci {
+	u32 hccapbase;		/* 0x00 */
+	u32 hcsparams;		/* 0x04 */
+	u32 hccparams;		/* 0x08 */
+	u8 pad1[0x04];
+	u32 usbcmd;		/* 0x10 */
+	u32 usbsts;		/* 0x14 */
+	u32 usbintr;		/* 0x18 */
+	u32 frindex;		/* 0x1c */
+	u32 ctrldssegment;	/* 0x20 */
+	u32 periodiclistbase;	/* 0x24 */
+	u32 asysnclistaddr;	/* 0x28 */
+	u8 pad2[0x24];
+	u32 configflag;		/* 0x50 */
+	u32 portsc_i;		/* 0x54 */
+	u8 pad3[0x38];
+	u32 insreg00;		/* 0x90 */
+	u32 insreg01;		/* 0x94 */
+	u32 insreg02;		/* 0x98 */
+	u32 insreg03;		/* 0x9c */
+	u32 insreg04;		/* 0xa0 */
+	u32 insreg05_utmi_ulpi;	/* 0xa4 */
+	u32 insreg06;		/* 0xa8 */
+	u32 insreg07;		/* 0xac */
+	u32 insreg08;		/* 0xb0 */
+};
+
+int omap_ehci_hcd_init(struct omap_usbhs_board_data *usbhs_pdata);
+int omap_ehci_hcd_stop(void);
+
+#endif /* EHCI_H */
diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c
index 93d3bb7..97c9fa3 100644
--- a/drivers/usb/host/ehci-omap.c
+++ b/drivers/usb/host/ehci-omap.c
@@ -27,14 +27,93 @@ 
  */
 #include <common.h>
 #include <usb.h>
+#include <errno.h>
 #include <asm/io.h>
 #include <asm/gpio.h>
-#include <asm/arch/clocks.h>
-#include <asm/arch/clocks_omap3.h>
-#include <asm/arch/ehci_omap3.h>
-#include <asm/arch/sys_proto.h>
+#include <asm/arch/ehci.h>
+#include <asm/ehci-omap.h>
 #include "ehci-core.h"
 
+struct omap_uhh *const uhh = (struct omap_uhh *)OMAP_UHH_BASE;
+struct omap_usbtll *const usbtll = (struct omap_usbtll *)OMAP_USBTLL_BASE;
+struct omap_ehci *const ehci = (struct omap_ehci *)OMAP_EHCI_BASE;
+
+static int omap_uhh_reset(void)
+{
+	unsigned long init = get_timer(0);
+
+	/* perform UHH soft reset, and wait until reset is complete */
+	writel(OMAP_UHH_SYSCONFIG_SOFTRESET, &uhh->sysc);
+
+	/* Wait for UHH reset to complete */
+	while (!(readl(&uhh->syss) & OMAP_UHH_SYSSTATUS_EHCI_RESETDONE))
+		if (get_timer(init) > CONFIG_SYS_HZ) {
+			debug("OMAP UHH error: timeout resetting ehci\n");
+			return -EL3RST;
+		}
+
+	return 0;
+}
+
+static int omap_ehci_tll_reset(void)
+{
+	unsigned long init = get_timer(0);
+
+	/* perform TLL soft reset, and wait until reset is complete */
+	writel(OMAP_USBTLL_SYSCONFIG_SOFTRESET, &usbtll->sysc);
+
+	/* Wait for TLL reset to complete */
+	while (!(readl(&usbtll->syss) & OMAP_USBTLL_SYSSTATUS_RESETDONE))
+		if (get_timer(init) > CONFIG_SYS_HZ) {
+			debug("OMAP EHCI error: timeout resetting TLL\n");
+			return -EL3RST;
+	}
+
+	return 0;
+}
+
+static void omap_usbhs_hsic_init(int tll_cnt)
+{
+	unsigned int reg;
+	int i;
+
+	/* Enable channels now */
+	for (i = 0; i < tll_cnt; i++) {
+		reg = readl(&usbtll->channel_conf + OMAP_TLL_CHANNEL_CONF(i));
+
+		reg |= OMAP_TLL_CHANNEL_CONF_CHANMODE_TRANSPARENT_UTMI
+			| OMAP_TLL_CHANNEL_CONF_ULPINOBITSTUFF
+			| OMAP_TLL_CHANNEL_CONF_DRVVBUS
+			| OMAP_TLL_CHANNEL_CONF_CHRGVBUS
+			| OMAP_TLL_CHANNEL_CONF_CHANEN;
+
+		writel(reg, &usbtll->channel_conf + OMAP_TLL_CHANNEL_CONF(i));
+	}
+}
+
+static void omap_ehci_soft_phy_reset(int port)
+{
+	unsigned int reg = 0;
+	unsigned long init = get_timer(0);
+
+	/* FUNCTION_CTRL_SET register */
+	reg = ULPI_FUNC_CTRL_RESET |
+		(ULPI_SET(ULPI_FUNC_CTRL) << EHCI_INSNREG05_ULPI_REGADD_SHIFT) |
+		(2 << EHCI_INSNREG05_ULPI_OPSEL_SHIFT) |
+		((port + 1) << EHCI_INSNREG05_ULPI_PORTSEL_SHIFT) |
+		(1 << EHCI_INSNREG05_ULPI_CONTROL_SHIFT);
+
+	writel(reg, &ehci->insreg05_utmi_ulpi);
+
+	/* Wait for ULPI access completion */
+	while ((readl(&ehci->insreg05_utmi_ulpi) &
+			(1 << EHCI_INSNREG05_ULPI_CONTROL_SHIFT)))
+		if (get_timer(init) > CONFIG_SYS_HZ) {
+			debug("OMAP EHCI error: timeout resetting phy\n");
+			break;
+		}
+}
+
 inline int __board_usb_init(void)
 {
 	return 0;
@@ -72,31 +151,31 @@  static inline void omap_ehci_phy_reset(int on, int delay)
 #endif
 
 /* Reset is needed otherwise the kernel-driver will throw an error. */
-int ehci_hcd_stop(void)
+int omap_ehci_hcd_stop(void)
 {
-	debug("Resetting OMAP3 EHCI\n");
+	debug("Resetting OMAP EHCI\n");
 	omap_ehci_phy_reset(1, 0);
-	writel(OMAP_UHH_SYSCONFIG_SOFTRESET,
-			OMAP3_UHH_BASE + OMAP_UHH_SYSCONFIG);
-	/* disable USB clocks */
-	struct prcm *prcm_base = (struct prcm *)PRCM_BASE;
-	sr32(&prcm_base->iclken_usbhost, 0, 1, 0);
-	sr32(&prcm_base->fclken_usbhost, 0, 2, 0);
-	sr32(&prcm_base->iclken3_core, 2, 1, 0);
-	sr32(&prcm_base->fclken3_core, 2, 1, 0);
+
+	if (omap_uhh_reset() < 0)
+		return -1;
+
+	if (omap_ehci_tll_reset() < 0)
+		return -1;
+
 	return 0;
 }
 
 /*
- * Initialize the OMAP3 EHCI controller and PHY.
- * Based on "drivers/usb/host/ehci-omap.c" from Linux 2.6.37.
+ * Initialize the OMAP EHCI controller and PHY.
+ * Based on "drivers/usb/host/ehci-omap.c" from Linux 3.1
  * See there for additional Copyrights.
  */
-int ehci_hcd_init(void)
+int omap_ehci_hcd_init(struct omap_usbhs_board_data *usbhs_pdata)
 {
-	int ret;
+	int ret = 0;
+	unsigned int i, reg = 0, rev = 0, tll_cnt = 0;
 
-	debug("Initializing OMAP3 EHCI\n");
+	debug("Initializing OMAP EHCI\n");
 
 	ret = board_usb_init();
 	if (ret < 0)
@@ -105,52 +184,89 @@  int ehci_hcd_init(void)
 	/* Put the PHY in RESET */
 	omap_ehci_phy_reset(1, 10);
 
-	struct prcm *prcm_base = (struct prcm *)PRCM_BASE;
-	/* Enable USBHOST_L3_ICLK (USBHOST_MICLK) */
-	sr32(&prcm_base->iclken_usbhost, 0, 1, 1);
-	/*
-	 * Enable USBHOST_48M_FCLK (USBHOST_FCLK1)
-	 * and USBHOST_120M_FCLK (USBHOST_FCLK2)
-	 */
-	sr32(&prcm_base->fclken_usbhost, 0, 2, 3);
-	/* Enable USBTTL_ICLK */
-	sr32(&prcm_base->iclken3_core, 2, 1, 1);
-	/* Enable USBTTL_FCLK */
-	sr32(&prcm_base->fclken3_core, 2, 1, 1);
-	debug("USB clocks enabled\n");
+	ret = omap_uhh_reset();
+	if (ret < 0)
+		return ret;
 
-	/* perform TLL soft reset, and wait until reset is complete */
-	writel(OMAP_USBTLL_SYSCONFIG_SOFTRESET,
-		OMAP3_USBTLL_BASE + OMAP_USBTLL_SYSCONFIG);
-	/* Wait for TLL reset to complete */
-	while (!(readl(OMAP3_USBTLL_BASE + OMAP_USBTLL_SYSSTATUS)
-			& OMAP_USBTLL_SYSSTATUS_RESETDONE))
-		;
-	debug("TLL reset done\n");
+	ret = omap_ehci_tll_reset();
+	if (ret)
+		return ret;
 
 	writel(OMAP_USBTLL_SYSCONFIG_ENAWAKEUP |
 		OMAP_USBTLL_SYSCONFIG_SIDLEMODE |
-		OMAP_USBTLL_SYSCONFIG_CACTIVITY,
-		OMAP3_USBTLL_BASE + OMAP_USBTLL_SYSCONFIG);
+		OMAP_USBTLL_SYSCONFIG_CACTIVITY, &usbtll->sysc);
 
 	/* Put UHH in NoIdle/NoStandby mode */
-	writel(OMAP_UHH_SYSCONFIG_ENAWAKEUP
-		| OMAP_UHH_SYSCONFIG_SIDLEMODE
-		| OMAP_UHH_SYSCONFIG_CACTIVITY
-		| OMAP_UHH_SYSCONFIG_MIDLEMODE,
-		OMAP3_UHH_BASE + OMAP_UHH_SYSCONFIG);
-
-	/* setup burst configurations */
-	writel(OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN
-		| OMAP_UHH_HOSTCONFIG_INCR8_BURST_EN
-		| OMAP_UHH_HOSTCONFIG_INCR16_BURST_EN,
-		OMAP3_UHH_BASE + OMAP_UHH_HOSTCONFIG);
+	writel(OMAP_UHH_SYSCONFIG_VAL, &uhh->sysc);
+
+	/* setup ULPI bypass and burst configurations */
+	reg |= (OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN |
+		OMAP_UHH_HOSTCONFIG_INCR8_BURST_EN |
+		OMAP_UHH_HOSTCONFIG_INCR16_BURST_EN);
+	reg &= ~OMAP_UHH_HOSTCONFIG_INCRX_ALIGN_EN;
+
+	rev = readl(&uhh->rev);
+	if (rev == OMAP_USBHS_REV1) {
+		if (is_ehci_phy_mode(usbhs_pdata->port_mode[0]))
+			reg &= ~OMAP_UHH_HOSTCONFIG_ULPI_P1_BYPASS;
+		else
+			reg |= OMAP_UHH_HOSTCONFIG_ULPI_P1_BYPASS;
+
+		if (is_ehci_phy_mode(usbhs_pdata->port_mode[1]))
+			reg &= ~OMAP_UHH_HOSTCONFIG_ULPI_P2_BYPASS;
+		else
+			reg |= OMAP_UHH_HOSTCONFIG_ULPI_P2_BYPASS;
+
+		if (is_ehci_phy_mode(usbhs_pdata->port_mode[2]))
+			reg &= ~OMAP_UHH_HOSTCONFIG_ULPI_P3_BYPASS;
+		else
+			reg |= OMAP_UHH_HOSTCONFIG_ULPI_P3_BYPASS;
+
+		tll_cnt = OMAP_REV1_TLL_CHANNEL_COUNT;
+	} else if (rev == OMAP_USBHS_REV2) {
+
+		reg |= OMAP4_UHH_HOSTCONFIG_APP_START_CLK;
+		/* Clear port mode fields for PHY mode*/
+		reg &= ~OMAP_P1_MODE_CLEAR;
+		reg &= ~OMAP_P2_MODE_CLEAR;
+
+		if (is_ehci_hsic_mode(usbhs_pdata->port_mode[0]))
+			reg |= OMAP_P1_MODE_HSIC;
+
+		if (is_ehci_hsic_mode(usbhs_pdata->port_mode[1]))
+			reg |= OMAP_P2_MODE_HSIC;
+
+		tll_cnt = OMAP_REV2_TLL_CHANNEL_COUNT;
+	}
+
+	debug("OMAP UHH_REVISION 0x%x\n", rev);
+	writel(reg, &uhh->hostconfig);
+
+	if (is_ehci_hsic_mode(usbhs_pdata->port_mode[0]) ||
+			is_ehci_hsic_mode(usbhs_pdata->port_mode[1]))
+		omap_usbhs_hsic_init(tll_cnt);
 
 	omap_ehci_phy_reset(0, 10);
 
-	hccr = (struct ehci_hccr *)(OMAP3_EHCI_BASE);
-	hcor = (struct ehci_hcor *)(OMAP3_EHCI_BASE + 0x10);
+	/*
+	 * An undocumented "feature" in the OMAP3 EHCI controller,
+	 * causes suspended ports to be taken out of suspend when
+	 * the USBCMD.Run/Stop bit is cleared (for example when
+	 * we do ehci_bus_suspend).
+	 * This breaks suspend-resume if the root-hub is allowed
+	 * to suspend. Writing 1 to this undocumented register bit
+	 * disables this feature and restores normal behavior.
+	 */
+	writel(EHCI_INSNREG04_DISABLE_UNSUSPEND, &ehci->insreg04);
+
+	for (i = 0; i < OMAP_HS_USB_PORTS; i++)
+		if (is_ehci_phy_mode(usbhs_pdata->port_mode[i]))
+			omap_ehci_soft_phy_reset(i);
+
+	dcache_disable();
+	hccr = (struct ehci_hccr *)(OMAP_EHCI_BASE);
+	hcor = (struct ehci_hcor *)(OMAP_EHCI_BASE + 0x10);
 
-	debug("OMAP3 EHCI init done\n");
+	debug("OMAP EHCI init done\n");
 	return 0;
 }