On Wed, Jan 25, 2012 at 7:10 PM, Igor Grinberg <grinb...@compulab.co.il> wrote:
> Hi Govindraj,
>
> On 01/25/12 11:04, Govindraj wrote:
>> Hi Igor,
>>
>> On Sun, Jan 22, 2012 at 5:50 PM, Igor Grinberg <grinb...@compulab.co.il> 
>> wrote:
>>> On 01/19/12 10:15, Govindraj wrote:
>>>> On Wed, Jan 18, 2012 at 11:21 PM, Igor Grinberg <grinb...@compulab.co.il> 
>>>> wrote:
>>>>> Hi Govindraj,
>>>>>
>>>>> On 01/17/12 08:10, Govindraj wrote:
>>>>>>
>
> [...]
>
>>>>> and add an ability to pass some kind of private data to the viewport, 
>>>>> which
>>>>> in case of OMAP will be the port number.
>>
>>
>> I started on adding omap-ulpi-viewport.c which will work with ulpi.c
>> if omap_ehci.c is used.
>
> Good! Thanks for working on that.
>
>>
>> for port id can we just set a global data field that will inform the
>> omap_view port
>> on the port id, or we have to modify most api's syntax in
>> "drivers/usb/ulpi/ulpi.c"
>
> IMO, we should modify the API, because it does not make sense
> to use the generic layer, but workaround some missing feature...
>
> My suggestion for the change is:
> 1) introduce some kind of
> struct ulpi_viewport {
>        u32 viewport_addr;
>        uint portnum;
> }
>
> 2) use the above struct _instead_ of the "u32 ulpi_viewport" parameter
>
> Another way, would be instead of uint portnum, use void *private_data,
> but I think it will just complicate things too much and there will be no
> real benefit (and also will add, otherwise needless, castings).
> If the above structure will not be enough for some platform,
> it can be extended easily and without changing the API anymore.
>

Thanks for the suggestions.

Here [1] is the first attempt to implement the same.

sorry for late reply, as I was preempted with some other work.

--
Thanks,
Govindraj.R

[1]:

>From 2bc311c26572aff3ebaac035106434b444692f68 Mon Sep 17 00:00:00 2001
From: "Govindraj.R" <govindraj.r...@ti.com>
Date: Fri, 27 Jan 2012 18:34:11 +0530
Subject: [PATCH] ulpi: Modify the ulpi framework to accept port number

Based on discussion in the thread [1] this patch
attempts to modify the ulpi framework to accept the
port number along with view port address, adding the omap-ulpi
view port that helps us in using the generic ulpi
framework to configure ulpi phy using the INSNREG05_ULPI viewport
reg available on omap platform.

Tested on beagle-xm and Panda.
Compile tested on efikamx platform.

This patch is based on earlier posted patch series[1].

Prior to this patch ulpi reset was done directly now
it is done using ulpi_reset.

Thanks to Igor Grinberg <grinb...@compulab.co.il> for reviewing the
omap-ehci patches and suggesting this approach.

This patch along with the patch series [1] rebased on latest u-boot
is available here.
        git://gitorious.org/denx_u-boot/denx_uboot_omap.git v2_ehci_omap4

[1]: http://www.mail-archive.com/u-boot@lists.denx.de/msg76076.html
[2]: "[PATCH v2 0/4] Clean up ehci-omap and extend support for omap3/4 socs"

Signed-off-by: Govindraj.R <govindraj.r...@ti.com>
---
 board/efikamx/efikamx-usb.c           |   21 ++++---
 drivers/usb/host/ehci-omap.c          |   21 ++-----
 drivers/usb/ulpi/Makefile             |    1 +
 drivers/usb/ulpi/omap-ulpi-viewport.c |  110 +++++++++++++++++++++++++++++++++
 drivers/usb/ulpi/ulpi-viewport.c      |   30 +++++-----
 drivers/usb/ulpi/ulpi.c               |   54 ++++++++--------
 include/configs/omap3_beagle.h        |    3 +
 include/configs/omap4_panda.h         |    2 +
 include/usb/ulpi.h                    |   37 ++++++++----
 9 files changed, 202 insertions(+), 77 deletions(-)
 create mode 100644 drivers/usb/ulpi/omap-ulpi-viewport.c

diff --git a/board/efikamx/efikamx-usb.c b/board/efikamx/efikamx-usb.c
index 840bd9a..bb1398b 100644
--- a/board/efikamx/efikamx-usb.c
+++ b/board/efikamx/efikamx-usb.c
@@ -120,6 +120,7 @@ static void efika_ehci_init(struct usb_ehci *ehci,
uint32_t stp_gpio,
 {
        int ret;
        struct ulpi_regs *ulpi = (struct ulpi_regs *)0;
+       struct ulpi_viewport ulpi_vp;

        mxc_request_iomux(stp_gpio, alt0);
        mxc_iomux_set_pad(stp_gpio, PAD_CTL_DRV_HIGH |
@@ -133,23 +134,25 @@ static void efika_ehci_init(struct usb_ehci
*ehci, uint32_t stp_gpio,
        mxc_iomux_set_pad(stp_gpio, USB_PAD_CONFIG);
        udelay(10000);

-       ret = ulpi_init((u32)&ehci->ulpi_viewpoint);
+       ulpi_vp.viewport_addr = (u32)&ehci->ulpi_viewpoint;
+
+       ret = ulpi_init(&ulpi_vp);
        if (ret) {
                printf("Efika USB ULPI initialization failed\n");
                return;
        }

        /* ULPI set flags */
-       ulpi_write((u32)&ehci->ulpi_viewpoint, &ulpi->otg_ctrl,
+       ulpi_write(&ulpi_vp, &ulpi->otg_ctrl,
                        ULPI_OTG_DP_PULLDOWN | ULPI_OTG_DM_PULLDOWN |
                        ULPI_OTG_EXTVBUSIND);
-       ulpi_write((u32)&ehci->ulpi_viewpoint, &ulpi->function_ctrl,
+       ulpi_write(&ulpi_vp, &ulpi->function_ctrl,
                        ULPI_FC_FULL_SPEED | ULPI_FC_OPMODE_NORMAL |
                        ULPI_FC_SUSPENDM);
-       ulpi_write((u32)&ehci->ulpi_viewpoint, &ulpi->iface_ctrl, 0);
+       ulpi_write(&ulpi_vp, &ulpi->iface_ctrl, 0);

        /* Set VBus */
-       ulpi_write((u32)&ehci->ulpi_viewpoint, &ulpi->otg_ctrl_set,
+       ulpi_write(&ulpi_vp, &ulpi->otg_ctrl_set,
                        ULPI_OTG_DRVVBUS | ULPI_OTG_DRVVBUS_EXT);

        /*
@@ -158,7 +161,7 @@ static void efika_ehci_init(struct usb_ehci *ehci,
uint32_t stp_gpio,
         * NOTE: This violates USB specification, but otherwise, USB on Efika
         * doesn't work.
         */
-       ulpi_write((u32)&ehci->ulpi_viewpoint, &ulpi->otg_ctrl_set,
+       ulpi_write(&ulpi_vp, &ulpi->otg_ctrl_set,
                        ULPI_OTG_CHRGVBUS);
 }

@@ -177,9 +180,11 @@ void ehci_powerup_fixup(uint32_t *status_reg,
uint32_t *reg)
        uint32_t port = OTG_BASE_ADDR + (0x200 * CONFIG_MXC_USB_PORT);
        struct usb_ehci *ehci = (struct usb_ehci *)port;
        struct ulpi_regs *ulpi = (struct ulpi_regs *)0;
+       struct ulpi_viewport ulpi_vp;

-       ulpi_write((u32)&ehci->ulpi_viewpoint, &ulpi->otg_ctrl_set,
-                       ULPI_OTG_CHRGVBUS);
+       ulpi_vp.viewport_addr = (u32)&ehci->ulpi_viewpoint;
+
+       ulpi_write(&ulpi_vp, &ulpi->otg_ctrl_set, ULPI_OTG_CHRGVBUS);

        wait_ms(50);

diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c
index 01c22e6..f68ceb2 100644
--- a/drivers/usb/host/ehci-omap.c
+++ b/drivers/usb/host/ehci-omap.c
@@ -27,6 +27,7 @@
  */
 #include <common.h>
 #include <usb.h>
+#include <usb/ulpi.h>
 #include <errno.h>
 #include <asm/io.h>
 #include <asm/gpio.h>
@@ -93,25 +94,13 @@ static void omap_usbhs_hsic_init(int tll_cnt)

 static void omap_ehci_soft_phy_reset(int port)
 {
-       unsigned int reg = 0;
-       unsigned long init = get_timer(0);
+       struct ulpi_viewport ulpi_vp;

-       /* 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);
+       ulpi_vp.viewport_addr = (u32)&ehci->insreg05_utmi_ulpi;
+       ulpi_vp.port_num = port;

-       writel(reg, &ehci->insreg05_utmi_ulpi);
+       ulpi_reset(&ulpi_vp);

-       /* 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)
diff --git a/drivers/usb/ulpi/Makefile b/drivers/usb/ulpi/Makefile
index d43b229..67d5e5e 100644
--- a/drivers/usb/ulpi/Makefile
+++ b/drivers/usb/ulpi/Makefile
@@ -24,6 +24,7 @@ LIB   := $(obj)libusb_ulpi.o

 COBJS-$(CONFIG_USB_ULPI)               += ulpi.o
 COBJS-$(CONFIG_USB_ULPI_VIEWPORT)      += ulpi-viewport.o
+COBJS-$(CONFIG_USB_OMAP_ULPI_VIEWPORT) += omap-ulpi-viewport.o

 COBJS  := $(COBJS-y)
 SRCS   := $(COBJS:.o=.c)
diff --git a/drivers/usb/ulpi/omap-ulpi-viewport.c
b/drivers/usb/ulpi/omap-ulpi-viewport.c
new file mode 100644
index 0000000..1718788
--- /dev/null
+++ b/drivers/usb/ulpi/omap-ulpi-viewport.c
@@ -0,0 +1,110 @@
+/*
+ * OMAP ulpi viewport support
+ * Based on drivers/usb/ulpi/ulpi-viewport.c
+ *
+ * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com
+ * Author: Govindraj R <govindraj.r...@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/>.
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <usb/ulpi.h>
+
+/* ULPI viewport control bits */
+#define OMAP_ULPI_PORT_SHIFT   24
+
+#define OMAP_ULPI_WR_OPSEL     (3 << 21)
+#define OMAP_ULPI_ACCESS       (1 << 31)
+
+/*
+ * Wait for the ULPI Access to complete
+ */
+static int ulpi_wait(struct ulpi_viewport *ulpi_vp, u32 mask)
+{
+       int timeout = CONFIG_USB_ULPI_TIMEOUT;
+
+       while (--timeout) {
+               if ((readl(ulpi_vp->viewport_addr) & mask))
+                       return 0;
+
+               udelay(1);
+       }
+
+       return ULPI_ERROR;
+}
+
+/*
+ * Wake the ULPI PHY up for communication
+ *
+ * returns 0 on success.
+ */
+static int ulpi_wakeup(struct ulpi_viewport *ulpi_vp)
+{
+       int err;
+
+       if (readl(ulpi_vp->viewport_addr) & OMAP_ULPI_ACCESS)
+               return 0; /* already awake */
+
+       writel(OMAP_ULPI_ACCESS, ulpi_vp->viewport_addr);
+
+       err = ulpi_wait(ulpi_vp, OMAP_ULPI_ACCESS);
+       if (err)
+               debug("ULPI wakeup timed out\n");
+
+       return err;
+}
+
+/*
+ * Issue a ULPI read/write request
+ */
+static int ulpi_request(struct ulpi_viewport *ulpi_vp, u32 value)
+{
+       int err;
+
+       err = ulpi_wakeup(ulpi_vp);
+       if (err)
+               return err;
+
+       writel(value, ulpi_vp->viewport_addr);
+
+       err = ulpi_wait(ulpi_vp, OMAP_ULPI_ACCESS);
+       if (err)
+               debug("ULPI request timed out\n");
+
+       return err;
+}
+
+int ulpi_write(struct ulpi_viewport *ulpi_vp, u8 *reg, u32 value)
+{
+       u32 val = (ulpi_vp->port_num << OMAP_ULPI_PORT_SHIFT) |
+                       OMAP_ULPI_WR_OPSEL |
+                       ((u32)reg << 16) | (value & 0xff);
+
+       return ulpi_request(ulpi_vp, val);
+}
+
+u32 ulpi_read(struct ulpi_viewport *ulpi_vp, u8 *reg)
+{
+       int err;
+       u32 val = (ulpi_vp->port_num << OMAP_ULPI_PORT_SHIFT) |
+                        OMAP_ULPI_WR_OPSEL |
+                       ((u32)reg << 16);
+
+       err = ulpi_request(ulpi_vp, val);
+       if (err)
+               return err;
+
+       return readl(ulpi_vp->viewport_addr) & 0xff;
+}
diff --git a/drivers/usb/ulpi/ulpi-viewport.c b/drivers/usb/ulpi/ulpi-viewport.c
index 490fb0e..6f03f08 100644
--- a/drivers/usb/ulpi/ulpi-viewport.c
+++ b/drivers/usb/ulpi/ulpi-viewport.c
@@ -40,13 +40,13 @@
  *
  * returns 0 on mask match, ULPI_ERROR on time out.
  */
-static int ulpi_wait(u32 ulpi_viewport, u32 mask)
+static int ulpi_wait(struct ulpi_viewport *ulpi_vp, u32 mask)
 {
        int timeout = CONFIG_USB_ULPI_TIMEOUT;

        /* Wait for the bits in mask to become zero. */
        while (--timeout) {
-               if ((readl(ulpi_viewport) & mask) == 0)
+               if ((readl(ulpi_vp->viewport_addr) & mask) == 0)
                        return 0;

                udelay(1);
@@ -60,16 +60,16 @@ static int ulpi_wait(u32 ulpi_viewport, u32 mask)
  *
  * returns 0 on success.
  */
-static int ulpi_wakeup(u32 ulpi_viewport)
+static int ulpi_wakeup(struct ulpi_viewport *ulpi_vp)
 {
        int err;

-       if (readl(ulpi_viewport) & ULPI_SS)
+       if (readl(ulpi_vp->viewport_addr) & ULPI_SS)
                return 0; /* already awake */

-       writel(ULPI_WU, ulpi_viewport);
+       writel(ULPI_WU, ulpi_vp->viewport_addr);

-       err = ulpi_wait(ulpi_viewport, ULPI_WU);
+       err = ulpi_wait(ulpi_vp, ULPI_WU);
        if (err)
                printf("ULPI wakeup timed out\n");

@@ -81,38 +81,38 @@ static int ulpi_wakeup(u32 ulpi_viewport)
  *
  * @value - the ULPI request
  */
-static int ulpi_request(u32 ulpi_viewport, u32 value)
+static int ulpi_request(struct ulpi_viewport *ulpi_vp, u32 value)
 {
        int err;

-       err = ulpi_wakeup(ulpi_viewport);
+       err = ulpi_wakeup(ulpi_vp);
        if (err)
                return err;

-       writel(value, ulpi_viewport);
+       writel(value, ulpi_vp->viewport_addr);

-       err = ulpi_wait(ulpi_viewport, ULPI_RWRUN);
+       err = ulpi_wait(ulpi_vp, ULPI_RWRUN);
        if (err)
                printf("ULPI request timed out\n");

        return err;
 }

-int ulpi_write(u32 ulpi_viewport, u8 *reg, u32 value)
+int ulpi_write(struct ulpi_viewport *ulpi_vp, u8 *reg, u32 value)
 {
        u32 val = ULPI_RWRUN | ULPI_RWCTRL | ((u32)reg << 16) | (value & 0xff);

-       return ulpi_request(ulpi_viewport, val);
+       return ulpi_request(ulpi_vp, val);
 }

-u32 ulpi_read(u32 ulpi_viewport, u8 *reg)
+u32 ulpi_read(struct ulpi_viewport *ulpi_vp, u8 *reg)
 {
        int err;
        u32 val = ULPI_RWRUN | ((u32)reg << 16);

-       err = ulpi_request(ulpi_viewport, val);
+       err = ulpi_request(ulpi_vp, val);
        if (err)
                return err;

-       return (readl(ulpi_viewport) >> 8) & 0xff;
+       return (readl(ulpi_vp->viewport_addr) >> 8) & 0xff;
 }
diff --git a/drivers/usb/ulpi/ulpi.c b/drivers/usb/ulpi/ulpi.c
index 6202227..dde2585 100644
--- a/drivers/usb/ulpi/ulpi.c
+++ b/drivers/usb/ulpi/ulpi.c
@@ -37,18 +37,18 @@

 static struct ulpi_regs *ulpi = (struct ulpi_regs *)0;

-static int ulpi_integrity_check(u32 ulpi_viewport)
+static int ulpi_integrity_check(struct ulpi_viewport *ulpi_vp)
 {
        u32 val, tval = ULPI_TEST_VALUE;
        int err, i;

        /* Use the 'special' test value to check all bits */
        for (i = 0; i < 2; i++, tval <<= 1) {
-               err = ulpi_write(ulpi_viewport, &ulpi->scratch, tval);
+               err = ulpi_write(ulpi_vp, &ulpi->scratch, tval);
                if (err)
                        return err;

-               val = ulpi_read(ulpi_viewport, &ulpi->scratch);
+               val = ulpi_read(ulpi_vp, &ulpi->scratch);
                if (val != tval) {
                        printf("ULPI integrity check failed\n");
                        return val;
@@ -58,7 +58,7 @@ static int ulpi_integrity_check(u32 ulpi_viewport)
        return 0;
 }

-int ulpi_init(u32 ulpi_viewport)
+int ulpi_init(struct ulpi_viewport *ulpi_vp)
 {
        u32 val, id = 0;
        u8 *reg = &ulpi->product_id_high;
@@ -66,7 +66,7 @@ int ulpi_init(u32 ulpi_viewport)

        /* Assemble ID from four ULPI ID registers (8 bits each). */
        for (i = 0; i < ULPI_ID_REGS_COUNT; i++) {
-               val = ulpi_read(ulpi_viewport, reg - i);
+               val = ulpi_read(ulpi_vp, reg - i);
                if (val == ULPI_ERROR)
                        return val;

@@ -76,10 +76,10 @@ int ulpi_init(u32 ulpi_viewport)
        /* Split ID into vendor and product ID. */
        debug("ULPI transceiver ID 0x%04x:0x%04x\n", id >> 16, id & 0xffff);

-       return ulpi_integrity_check(ulpi_viewport);
+       return ulpi_integrity_check(ulpi_vp);
 }

-int ulpi_select_transceiver(u32 ulpi_viewport, unsigned speed)
+int ulpi_select_transceiver(struct ulpi_viewport *ulpi_vp, unsigned speed)
 {
        u32 tspeed = ULPI_FC_FULL_SPEED;
        u32 val;
@@ -96,17 +96,18 @@ int ulpi_select_transceiver(u32 ulpi_viewport,
unsigned speed)
                        "falling back to full speed\n", __func__, speed);
        }

-       val = ulpi_read(ulpi_viewport, &ulpi->function_ctrl);
+       val = ulpi_read(ulpi_vp, &ulpi->function_ctrl);
        if (val == ULPI_ERROR)
                return val;

        /* clear the previous speed setting */
        val = (val & ~ULPI_FC_XCVRSEL_MASK) | tspeed;

-       return ulpi_write(ulpi_viewport, &ulpi->function_ctrl, val);
+       return ulpi_write(ulpi_vp, &ulpi->function_ctrl, val);
 }

-int ulpi_set_vbus(u32 ulpi_viewport, int on, int ext_power, int ext_ind)
+int ulpi_set_vbus(struct ulpi_viewport *ulpi_vp, int on, int ext_power,
+                       int ext_ind)
 {
        u32 flags = ULPI_OTG_DRVVBUS;
        u8 *reg = on ? &ulpi->otg_ctrl_set : &ulpi->otg_ctrl_clear;
@@ -116,18 +117,18 @@ int ulpi_set_vbus(u32 ulpi_viewport, int on, int
ext_power, int ext_ind)
        if (ext_ind)
                flags |= ULPI_OTG_EXTVBUSIND;

-       return ulpi_write(ulpi_viewport, reg, flags);
+       return ulpi_write(ulpi_vp, reg, flags);
 }

-int ulpi_set_pd(u32 ulpi_viewport, int enable)
+int ulpi_set_pd(struct ulpi_viewport *ulpi_vp, int enable)
 {
        u32 val = ULPI_OTG_DP_PULLDOWN | ULPI_OTG_DM_PULLDOWN;
        u8 *reg = enable ? &ulpi->otg_ctrl_set : &ulpi->otg_ctrl_clear;

-       return ulpi_write(ulpi_viewport, reg, val);
+       return ulpi_write(ulpi_vp, reg, val);
 }

-int ulpi_opmode_sel(u32 ulpi_viewport, unsigned opmode)
+int ulpi_opmode_sel(struct ulpi_viewport *ulpi_vp, unsigned opmode)
 {
        u32 topmode = ULPI_FC_OPMODE_NORMAL;
        u32 val;
@@ -144,17 +145,17 @@ int ulpi_opmode_sel(u32 ulpi_viewport, unsigned opmode)
                        "falling back to OpMode Normal\n", __func__, opmode);
        }

-       val = ulpi_read(ulpi_viewport, &ulpi->function_ctrl);
+       val = ulpi_read(ulpi_vp, &ulpi->function_ctrl);
        if (val == ULPI_ERROR)
                return val;

        /* clear the previous opmode setting */
        val = (val & ~ULPI_FC_OPMODE_MASK) | topmode;

-       return ulpi_write(ulpi_viewport, &ulpi->function_ctrl, val);
+       return ulpi_write(ulpi_vp, &ulpi->function_ctrl, val);
 }

-int ulpi_serial_mode_enable(u32 ulpi_viewport, unsigned smode)
+int ulpi_serial_mode_enable(struct ulpi_viewport *ulpi_vp, unsigned smode)
 {
        switch (smode) {
        case ULPI_IFACE_6_PIN_SERIAL_MODE:
@@ -166,14 +167,14 @@ int ulpi_serial_mode_enable(u32 ulpi_viewport,
unsigned smode)
                return ULPI_ERROR;
        }

-       return ulpi_write(ulpi_viewport, &ulpi->iface_ctrl_set, smode);
+       return ulpi_write(ulpi_vp, &ulpi->iface_ctrl_set, smode);
 }

-int ulpi_suspend(u32 ulpi_viewport)
+int ulpi_suspend(struct ulpi_viewport *ulpi_vp)
 {
        int err;

-       err = ulpi_write(ulpi_viewport, &ulpi->function_ctrl_clear,
+       err = ulpi_write(ulpi_vp, &ulpi->function_ctrl_clear,
                        ULPI_FC_SUSPENDM);
        if (err)
                printf("ULPI: %s: failed writing the suspend bit\n", __func__);
@@ -186,7 +187,7 @@ int ulpi_suspend(u32 ulpi_viewport)
  * Actual wait for reset must be done in a view port specific way,
  * because it involves checking the DIR line.
  */
-static int __ulpi_reset_wait(u32 ulpi_viewport)
+static int __ulpi_reset_wait(struct ulpi_viewport *ulpi_vp)
 {
        u32 val;
        int timeout = CONFIG_USB_ULPI_TIMEOUT;
@@ -199,7 +200,7 @@ static int __ulpi_reset_wait(u32 ulpi_viewport)
                 * for the error of ulpi_read(), if there is one, then
                 * there will be a timeout.
                 */
-               val = ulpi_read(ulpi_viewport, &ulpi->function_ctrl);
+               val = ulpi_read(ulpi_vp, &ulpi->function_ctrl);
                if (!(val & ULPI_FC_RESET))
                        return 0;

@@ -210,18 +211,19 @@ static int __ulpi_reset_wait(u32 ulpi_viewport)

        return ULPI_ERROR;
 }
-int ulpi_reset_wait(u32) __attribute__((weak, alias("__ulpi_reset_wait")));
+int ulpi_reset_wait(struct ulpi_viewport *ulpi_vp)
+       __attribute__((weak, alias("__ulpi_reset_wait")));

-int ulpi_reset(u32 ulpi_viewport)
+int ulpi_reset(struct ulpi_viewport *ulpi_vp)
 {
        int err;

-       err = ulpi_write(ulpi_viewport,
+       err = ulpi_write(ulpi_vp,
                        &ulpi->function_ctrl_set, ULPI_FC_RESET);
        if (err) {
                printf("ULPI: %s: failed writing reset bit\n", __func__);
                return err;
        }

-       return ulpi_reset_wait(ulpi_viewport);
+       return ulpi_reset_wait(ulpi_vp);
 }
diff --git a/include/configs/omap3_beagle.h b/include/configs/omap3_beagle.h
index b4d6443..2183ea6 100644
--- a/include/configs/omap3_beagle.h
+++ b/include/configs/omap3_beagle.h
@@ -130,6 +130,9 @@
 #define CONFIG_CMD_USB
 #define CONFIG_USB_EHCI
 #define CONFIG_USB_EHCI_OMAP
+#define CONFIG_USB_ULPI
+#define CONFIG_USB_OMAP_ULPI_VIEWPORT
+
 /*#define CONFIG_EHCI_DCACHE*/ /* leave it disabled for now */
 #define CONFIG_OMAP_EHCI_PHY1_RESET_GPIO       147
 #define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS 3
diff --git a/include/configs/omap4_panda.h b/include/configs/omap4_panda.h
index 23c0230..0228a66 100644
--- a/include/configs/omap4_panda.h
+++ b/include/configs/omap4_panda.h
@@ -38,6 +38,8 @@
 #define CONFIG_USB_HOST
 #define CONFIG_USB_EHCI
 #define CONFIG_USB_EHCI_OMAP
+#define CONFIG_USB_ULPI
+#define CONFIG_USB_OMAP_ULPI_VIEWPORT
 #define CONFIG_USB_STORAGE
 #define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS 3

diff --git a/include/usb/ulpi.h b/include/usb/ulpi.h
index 802f077..1da43ae 100644
--- a/include/usb/ulpi.h
+++ b/include/usb/ulpi.h
@@ -28,12 +28,24 @@
 #endif

 /*
+ * ulpi view port address and
+ * Port_number that can be passed.
+ * Any additional data to be passed can
+ * be extended from this structure
+ */
+struct ulpi_viewport {
+       u32 viewport_addr;
+       u8 port_num;
+};
+
+/*
  * Initialize the ULPI transciever and check the interface integrity.
- * @ulpi_viewport -  the address of the ULPI viewport register.
+ * @ulpi_viewport -  structure containing the address of the ULPI viewport
+                       register and port number to access.
  *
  * returns 0 on success, ULPI_ERROR on failure.
  */
-int ulpi_init(u32 ulpi_viewport);
+int ulpi_init(struct ulpi_viewport *ulpi_vp);

 /*
  * Select transceiver speed.
@@ -41,7 +53,7 @@ int ulpi_init(u32 ulpi_viewport);
  *                ULPI_FC_LOW_SPEED,  ULPI_FC_FS4LS
  * returns 0 on success, ULPI_ERROR on failure.
  */
-int ulpi_select_transceiver(u32 ulpi_viewport, unsigned speed);
+int ulpi_select_transceiver(struct ulpi_viewport *ulpi_vp, unsigned speed);

 /*
  * Enable/disable VBUS.
@@ -50,14 +62,15 @@ int ulpi_select_transceiver(u32 ulpi_viewport,
unsigned speed);
  *
  * returns 0 on success, ULPI_ERROR on failure.
  */
-int ulpi_enable_vbus(u32 ulpi_viewport, int on, int ext_power, int ext_ind);
+int ulpi_enable_vbus(struct ulpi_viewport *ulpi_vp,
+                       int on, int ext_power, int ext_ind);

 /*
  * Enable/disable pull-down resistors on D+ and D- USB lines.
  *
  * returns 0 on success, ULPI_ERROR on failure.
  */
-int ulpi_set_pd(u32 ulpi_viewport, int enable);
+int ulpi_set_pd(struct ulpi_viewport *ulpi_vp, int enable);

 /*
  * Select OpMode.
@@ -66,7 +79,7 @@ int ulpi_set_pd(u32 ulpi_viewport, int enable);
  *
  * returns 0 on success, ULPI_ERROR on failure.
  */
-int ulpi_opmode_sel(u32 ulpi_viewport, unsigned opmode);
+int ulpi_opmode_sel(struct ulpi_viewport *ulpi_vp, unsigned opmode);

 /*
  * Switch to Serial Mode.
@@ -78,7 +91,7 @@ int ulpi_opmode_sel(u32 ulpi_viewport, unsigned opmode);
  * Switches immediately to Serial Mode.
  * To return from Serial Mode, STP line needs to be asserted.
  */
-int ulpi_serial_mode_enable(u32 ulpi_viewport, unsigned smode);
+int ulpi_serial_mode_enable(struct ulpi_viewport *ulpi_vp, unsigned smode);

 /*
  * Put PHY into low power mode.
@@ -89,14 +102,14 @@ int ulpi_serial_mode_enable(u32 ulpi_viewport,
unsigned smode);
  * STP line must be driven low to keep the PHY in suspend.
  * To resume the PHY, STP line needs to be asserted.
  */
-int ulpi_suspend(u32 ulpi_viewport);
+int ulpi_suspend(struct ulpi_viewport *ulpi_vp);

 /*
  * Reset the transceiver. ULPI interface and registers are not affected.
  *
  * returns 0 on success, ULPI_ERROR on failure.
  */
-int ulpi_reset(u32 ulpi_viewport);
+int ulpi_reset(struct ulpi_viewport *ulpi_vp);


 /* ULPI access methods below must be implemented for each ULPI viewport. */
@@ -108,7 +121,7 @@ int ulpi_reset(u32 ulpi_viewport);
  *
  * returns 0 on success, ULPI_ERROR on failure.
  */
-int ulpi_write(u32 ulpi_viewport, u8 *reg, u32 value);
+int ulpi_write(struct ulpi_viewport *ulpi_vp, u8 *reg, u32 value);

 /*
  * Read the ULPI PHY register content via the viewport.
@@ -116,14 +129,14 @@ int ulpi_write(u32 ulpi_viewport, u8 *reg, u32 value);
  *
  * returns register content on success, ULPI_ERROR on failure.
  */
-u32 ulpi_read(u32 ulpi_viewport, u8 *reg);
+u32 ulpi_read(struct ulpi_viewport *ulpi_vp, u8 *reg);

 /*
  * Wait for the reset to complete.
  * The Link must not attempt to access the PHY until the reset has
  * completed and DIR line is de-asserted.
  */
-int ulpi_reset_wait(u32 ulpi_viewport);
+int ulpi_reset_wait(struct ulpi_viewport *ulpi_vp);

 /* Access Extended Register Set (indicator) */
 #define ACCESS_EXT_REGS_OFFSET 0x2f    /* read-write */
-- 
1.7.5.4
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to