From: Felipe Balbi <me@felipebalbi.com>
To: "Pandita, Vikram" <vikram.pandita@ti.com>
Cc: "me@felipebalbi.com" <me@felipebalbi.com>,
Tony Lindgren <tony@atomide.com>,
David Brownell <david-b@pacbell.net>,
"felipe.balbi@nokia.com" <felipe.balbi@nokia.com>,
Linux OMAP Mailing List <linux-omap@vger.kernel.org>
Subject: Re: [rfc] [patch] clean up to ehci-omap (Was: Re: [patch] omap: usb: ehci: fix use of hcd->regs)
Date: Sun, 14 Sep 2008 21:57:27 +0300 [thread overview]
Message-ID: <20080914185721.GB6943@frodo> (raw)
In-Reply-To: <FCCFB4CDC6E5564B9182F639FC356087022A25316B@dbde02.ent.ti.com>
[-- Attachment #1: Type: text/plain, Size: 701 bytes --]
Hi,
On Mon, Sep 15, 2008 at 12:11:46AM +0530, Pandita, Vikram wrote:
> The issues mentioned are _not_ of omap34xx silicon, but of the PHY (ISP1504 in SDP-USB expansion board).
Gotcha
> Better still is to move the PHY issues to platform/board specific function.
> Will try to submit a patch on that.
sounds good to me ;-)
If you can make your patch on top of the ones I have queued for sending,
I'd be glad. Also, if you could test them for me, that would be quite
nice since I only have a buggy version of beagleboard with one ehci
port.
I'm sending my patches attached for you, there's actually one from you
supporting the new version of the expansion board.
--
balbi
[-- Attachment #2: 0001-omap-usb-ehci-clean-up-ehci-omap.c.diff --]
[-- Type: text/x-diff, Size: 11278 bytes --]
From bfae28bb4dfa0198bd30584fcfa74682947053eb Mon Sep 17 00:00:00 2001
From: Felipe Balbi <felipe.balbi@nokia.com>
Date: Sat, 13 Sep 2008 18:21:37 +0300
Subject: [PATCH 1/4] omap: usb: ehci: clean up ehci-omap.c
General cleanup for ehci-omap.c
Signed-off-by: Felipe Balbi <felipe.balbi@nokia.com>
---
drivers/usb/host/ehci-omap.c | 135 +++++++++++++++++-------------------------
1 files changed, 55 insertions(+), 80 deletions(-)
diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c
index fff4195..f1b5ea5 100644
--- a/drivers/usb/host/ehci-omap.c
+++ b/drivers/usb/host/ehci-omap.c
@@ -5,7 +5,7 @@
* Tested on OMAP3430 ES2.0 SDP
*
* Copyright (C) 2007-2008 Texas Instruments, Inc.
- * Author: Vikram Pandita <vikram.pandita@ti.com>
+ * Author: Vikram Pandita <vikram.pandita@ti.com>
*
* Based on "ehci-fsl.c" and "ehci-au1xxx.c" ehci glue layers
*
@@ -31,7 +31,6 @@
#include "ehci-omap.h"
-
#ifdef CONFIG_OMAP_EHCI_PHY_MODE
/* EHCI connected to External PHY */
@@ -42,10 +41,10 @@
/* ISSUE1:
* ISP1504 for input clocking mode needs special reset handling
- * Hold the PHY in reset by asserting RESET_N signal
- * Then start the 60Mhz clock input to PHY
- * Release the reset after a delay -
- * to get the PHY state machine in working state
+ * Hold the PHY in reset by asserting RESET_N signal
+ * Then start the 60Mhz clock input to PHY
+ * Release the reset after a delay -
+ * to get the PHY state machine in working state
*/
#define EXTERNAL_PHY_RESET
#define EXT_PHY_RESET_GPIO_PORT1 (57)
@@ -89,16 +88,16 @@ static void omap_usb_utmi_init(struct usb_hcd *hcd, u8 tll_channel_mask)
/* Use UTMI Ports of TLL */
omap_writel((1 << OMAP_UHH_HOSTCONFIG_ULPI_BYPASS_SHIFT)|
- (1<<OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN_SHIFT)|
- (1<<OMAP_UHH_HOSTCONFIG_INCR8_BURST_EN_SHIFT)|
- (1<<OMAP_UHH_HOSTCONFIG_INCR16_BURST_EN_SHIFT)|
- (0<<OMAP_UHH_HOSTCONFIG_INCRX_ALIGN_EN_SHIFT),
+ (1 << OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN_SHIFT)|
+ (1 << OMAP_UHH_HOSTCONFIG_INCR8_BURST_EN_SHIFT)|
+ (1 << OMAP_UHH_HOSTCONFIG_INCR16_BURST_EN_SHIFT)|
+ (0 << OMAP_UHH_HOSTCONFIG_INCRX_ALIGN_EN_SHIFT),
OMAP_UHH_HOSTCONFIG);
- /* Enusre bit is set */
+ /* Ensure bit is set */
while (!(omap_readl(OMAP_UHH_HOSTCONFIG) &
(1 << OMAP_UHH_HOSTCONFIG_ULPI_BYPASS_SHIFT)));
- dev_dbg(hcd->self.controller, "\nEntered UTMI MODE: success\n");
+ dev_dbg(hcd->self.controller, "Entered UTMI MODE: success\n");
/* Program the 3 TLL channels upfront */
@@ -106,15 +105,15 @@ static void omap_usb_utmi_init(struct usb_hcd *hcd, u8 tll_channel_mask)
/* Disable AutoIdle */
omap_writel(omap_readl(OMAP_TLL_CHANNEL_CONF(i)) &
- ~(1<<OMAP_TLL_CHANNEL_CONF_UTMIAUTOIDLE_SHIFT),
+ ~(1 << OMAP_TLL_CHANNEL_CONF_UTMIAUTOIDLE_SHIFT),
OMAP_TLL_CHANNEL_CONF(i));
/* Disable BitStuffing */
omap_writel(omap_readl(OMAP_TLL_CHANNEL_CONF(i)) &
- ~(1<<OMAP_TLL_CHANNEL_CONF_ULPINOBITSTUFF_SHIFT),
+ ~(1 << OMAP_TLL_CHANNEL_CONF_ULPINOBITSTUFF_SHIFT),
OMAP_TLL_CHANNEL_CONF(i));
/* SDR Mode */
omap_writel(omap_readl(OMAP_TLL_CHANNEL_CONF(i)) &
- ~(1<<OMAP_TLL_CHANNEL_CONF_ULPIDDRMODE_SHIFT),
+ ~(1 << OMAP_TLL_CHANNEL_CONF_ULPIDDRMODE_SHIFT),
OMAP_TLL_CHANNEL_CONF(i));
}
@@ -130,17 +129,17 @@ static void omap_usb_utmi_init(struct usb_hcd *hcd, u8 tll_channel_mask)
for (i = 0; i < OMAP_TLL_CHANNEL_COUNT; i++) {
/* Enable only the channel that is needed */
- if (!(tll_channel_mask & 1<<i))
+ if (!(tll_channel_mask & 1 << i))
continue;
omap_writel(omap_readl(OMAP_TLL_CHANNEL_CONF(i)) |
- (1<<OMAP_TLL_CHANNEL_CONF_CHANEN_SHIFT),
+ (1 << OMAP_TLL_CHANNEL_CONF_CHANEN_SHIFT),
OMAP_TLL_CHANNEL_CONF(i));
omap_writeb(0xBE, OMAP_TLL_ULPI_SCRATCH_REGISTER(i));
- dev_dbg(hcd->self.controller, "\nULPI_SCRATCH_REG[ch=%d]"
- "= 0x%02x\n",
- i+1, omap_readb(OMAP_TLL_ULPI_SCRATCH_REGISTER(i)));
+ dev_dbg(hcd->self.controller, "ULPI_SCRATCH_REG[ch=%d]"
+ "= 0x%02x\n", i + 1,
+ omap_readb(OMAP_TLL_ULPI_SCRATCH_REGISTER(i)));
}
}
@@ -150,7 +149,7 @@ static void omap_usb_utmi_init(struct usb_hcd *hcd, u8 tll_channel_mask)
/* omap_start_ehc
- * - Start the TI USBHOST controller
+ * - Start the TI USBHOST controller
*/
static int omap_start_ehc(struct platform_device *dev, struct usb_hcd *hcd)
{
@@ -180,8 +179,7 @@ static int omap_start_ehc(struct platform_device *dev, struct usb_hcd *hcd)
while (!(cm_read_mod_reg(PLL_MOD, CM_IDLEST2) &
OMAP3430ES2_ST_PERIPH2_CLK_MASK))
- dev_dbg(hcd->self.controller,
- "idlest2 = 0x%x\n",
+ dev_dbg(hcd->self.controller, "idlest2 = 0x%x\n",
cm_read_mod_reg(PLL_MOD, CM_IDLEST2));
/* End DPLL5 programming */
@@ -260,9 +258,9 @@ static int omap_start_ehc(struct platform_device *dev, struct usb_hcd *hcd)
while (!(omap_readl(OMAP_USBTLL_SYSSTATUS) &
(1 << OMAP_USBTLL_SYSSTATUS_RESETDONE_SHIFT)));
- dev_dbg(hcd->self.controller, "\n TLL RESET DONE\n");
+ dev_dbg(hcd->self.controller, "TLL RESET DONE\n");
- /* (1<<3) = no idle mode only for initial debugging */
+ /* (1 << 3) = no idle mode only for initial debugging */
omap_writel((1 << OMAP_USBTLL_SYSCONFIG_ENAWAKEUP_SHIFT) |
(1 << OMAP_USBTLL_SYSCONFIG_SIDLEMODE_SHIFT) |
(1 << OMAP_USBTLL_SYSCONFIG_CACTIVITY_SHIFT),
@@ -280,10 +278,10 @@ static int omap_start_ehc(struct platform_device *dev, struct usb_hcd *hcd)
#ifdef CONFIG_OMAP_EHCI_PHY_MODE
/* Bypass the TLL module for PHY mode operation */
omap_writel((0 << OMAP_UHH_HOSTCONFIG_ULPI_BYPASS_SHIFT)|
- (1<<OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN_SHIFT)|
- (1<<OMAP_UHH_HOSTCONFIG_INCR8_BURST_EN_SHIFT)|
- (1<<OMAP_UHH_HOSTCONFIG_INCR16_BURST_EN_SHIFT)|
- (0<<OMAP_UHH_HOSTCONFIG_INCRX_ALIGN_EN_SHIFT),
+ (1 << OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN_SHIFT)|
+ (1 << OMAP_UHH_HOSTCONFIG_INCR8_BURST_EN_SHIFT)|
+ (1 << OMAP_UHH_HOSTCONFIG_INCR16_BURST_EN_SHIFT)|
+ (0 << OMAP_UHH_HOSTCONFIG_INCRX_ALIGN_EN_SHIFT),
OMAP_UHH_HOSTCONFIG);
/* Ensure that BYPASS is set */
while (omap_readl(OMAP_UHH_HOSTCONFIG) &
@@ -313,7 +311,7 @@ static int omap_start_ehc(struct platform_device *dev, struct usb_hcd *hcd)
/* Refer ISSUE2: LINK assumes external charge pump */
/* use Port1 VBUS to charge externally Port2:
- * So for PHY mode operation use Port2 only
+ * So for PHY mode operation use Port2 only
*/
omap_writel((0xA << EHCI_INSNREG05_ULPI_REGADD_SHIFT) |/* OTG ctrl reg*/
(2 << EHCI_INSNREG05_ULPI_OPSEL_SHIFT) |/* Write */
@@ -323,7 +321,7 @@ static int omap_start_ehc(struct platform_device *dev, struct usb_hcd *hcd)
EHCI_INSNREG05_ULPI);
while (!(omap_readl(EHCI_INSNREG05_ULPI) &
- (1<<EHCI_INSNREG05_ULPI_CONTROL_SHIFT)));
+ (1 << EHCI_INSNREG05_ULPI_CONTROL_SHIFT)));
#endif
@@ -342,17 +340,16 @@ static void omap_stop_ehc(struct platform_device *dev, struct usb_hcd *hcd)
dev_dbg(hcd->self.controller, ": stopping TI EHCI USB Controller\n");
/* Reset OMAP modules for insmod/rmmod to work */
- omap_writel((1<<1), OMAP_UHH_SYSCONFIG);
- while (!(omap_readl(OMAP_UHH_SYSSTATUS) & (1<<0)));
- while (!(omap_readl(OMAP_UHH_SYSSTATUS) & (1<<1)));
- while (!(omap_readl(OMAP_UHH_SYSSTATUS) & (1<<2)));
- dev_dbg(hcd->self.controller,
- "UHH RESET DONE OMAP_UHH_SYSSTATUS %x !!\n",
+ omap_writel((1 << 1), OMAP_UHH_SYSCONFIG);
+ while (!(omap_readl(OMAP_UHH_SYSSTATUS) & (1 << 0)));
+ while (!(omap_readl(OMAP_UHH_SYSSTATUS) & (1 << 1)));
+ while (!(omap_readl(OMAP_UHH_SYSSTATUS) & (1 << 2)));
+ dev_dbg(hcd->self.controller, "UHH RESET DONE OMAP_UHH_SYSSTATUS %x\n",
omap_readl(OMAP_UHH_SYSSTATUS));
- omap_writel((1<<1), OMAP_USBTLL_SYSCONFIG);
- while (!(omap_readl(OMAP_USBTLL_SYSSTATUS) & (1<<0)));
- dev_dbg(hcd->self.controller, ":TLL RESEET DONE");
+ omap_writel((1 << 1), OMAP_USBTLL_SYSCONFIG);
+ while (!(omap_readl(OMAP_USBTLL_SYSSTATUS) & (1 << 0)));
+ dev_dbg(hcd->self.controller, ": TLL RESEET DONE");
if (ehci_clocks->usbtll_fck_clk != NULL) {
clk_disable(ehci_clocks->usbtll_fck_clk);
@@ -452,7 +449,7 @@ static int ehci_hcd_omap_drv_probe(struct platform_device *dev)
ehci->hcs_params = readl(&ehci->caps->hcs_params);
/* SET 1 micro-frame Interrupt interval */
- writel(readl(&ehci->regs->command) | (1<<16), &ehci->regs->command);
+ writel(readl(&ehci->regs->command) | (1 << 16), &ehci->regs->command);
retval = usb_add_hcd(hcd, dev->resource[1].start,
IRQF_DISABLED | IRQF_SHARED);
@@ -497,18 +494,6 @@ static int ehci_hcd_omap_drv_remove(struct platform_device *dev)
}
/*-------------------------------------------------------------------------*/
-#ifdef CONFIG_PM
-static int omap_ehci_bus_suspend(struct usb_hcd *hcd)
-{
- return ehci_bus_suspend(hcd);
-}
-
-static int omap_ehci_bus_resume(struct usb_hcd *hcd)
-{
- return ehci_bus_resume(hcd);
-}
-#endif
-/*-------------------------------------------------------------------------*/
static const struct hc_driver ehci_omap_hc_driver = {
.description = hcd_name,
@@ -516,53 +501,43 @@ static const struct hc_driver ehci_omap_hc_driver = {
.hcd_priv_size = sizeof(struct ehci_hcd)
+ sizeof(struct ehci_omap_clock_defs),
- /*
- * generic hardware linkage
- */
+ /* generic hardware linkage */
.irq = ehci_irq,
.flags = HCD_MEMORY | HCD_USB2,
- /*
- * basic lifecycle operations
- */
+ /* basic lifecycle operations */
.reset = ehci_init,
.start = ehci_run,
.stop = ehci_stop,
.shutdown = ehci_shutdown,
- /*
- * managing i/o requests and associated device resources
- */
+ /* managing i/o requests and associated device resources */
.urb_enqueue = ehci_urb_enqueue,
.urb_dequeue = ehci_urb_dequeue,
.endpoint_disable = ehci_endpoint_disable,
- /*
- * scheduling support
- */
+ /* scheduling support */
.get_frame_number = ehci_get_frame,
- /*
- * root hub support
- */
+ /* root hub support */
.hub_status_data = ehci_hub_status_data,
.hub_control = ehci_hub_control,
#ifdef CONFIG_PM
- .bus_suspend = omap_ehci_bus_suspend,
- .bus_resume = omap_ehci_bus_resume,
+ .bus_suspend = ehci_bus_suspend,
+ .bus_resume = ehci_bus_resume,
#endif
};
-/*-------------------------------------------------------------------------*/
-MODULE_ALIAS("omap-ehci");
+MODULE_AUTHOR("Texas Instruments, Inc.");
+MODULE_ALIAS("plaform:omap-ehci");
+
static struct platform_driver ehci_hcd_omap_driver = {
- .probe = ehci_hcd_omap_drv_probe,
- .remove = ehci_hcd_omap_drv_remove,
- .shutdown = usb_hcd_platform_shutdown,
- /*.suspend = ehci_hcd_omap_drv_suspend, */
- /*.resume = ehci_hcd_omap_drv_resume, */
- .driver = {
- .name = "ehci-omap",
- .bus = &platform_bus_type
+ .probe = ehci_hcd_omap_drv_probe,
+ .remove = ehci_hcd_omap_drv_remove,
+ .shutdown = usb_hcd_platform_shutdown,
+ /*.suspend = ehci_hcd_omap_drv_suspend, */
+ /*.resume = ehci_hcd_omap_drv_resume, */
+ .driver = {
+ .name = "ehci-omap",
}
};
--
1.6.0.1.196.g01914
[-- Attachment #3: 0002-omap-usb-ehci-switch-to-use-gpiolib.diff --]
[-- Type: text/x-diff, Size: 2475 bytes --]
From 14a61159787a5797340445594f57f3921d3ab7e8 Mon Sep 17 00:00:00 2001
From: Felipe Balbi <felipe.balbi@nokia.com>
Date: Sat, 13 Sep 2008 18:14:00 +0300
Subject: [PATCH 2/4] omap: usb: ehci: switch to use gpiolib
Quit using omap-specific gpio handling and start using
gpiolib for ehci-omap.c
Signed-off-by: Felipe Balbi <felipe.balbi@nokia.com>
---
drivers/usb/host/ehci-omap.c | 20 +++++++++-----------
1 files changed, 9 insertions(+), 11 deletions(-)
diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c
index f1b5ea5..c73f832 100644
--- a/drivers/usb/host/ehci-omap.c
+++ b/drivers/usb/host/ehci-omap.c
@@ -27,7 +27,7 @@
#include <linux/platform_device.h>
#include <linux/clk.h>
-#include <mach/gpio.h>
+#include <linux/gpio.h>
#include "ehci-omap.h"
@@ -222,12 +222,10 @@ static int omap_start_ehc(struct platform_device *dev, struct usb_hcd *hcd)
#ifdef EXTERNAL_PHY_RESET
/* Refer: ISSUE1 */
- omap_request_gpio(EXT_PHY_RESET_GPIO_PORT1);
- omap_set_gpio_direction(EXT_PHY_RESET_GPIO_PORT1, 0);
- omap_request_gpio(EXT_PHY_RESET_GPIO_PORT2);
- omap_set_gpio_direction(EXT_PHY_RESET_GPIO_PORT2, 0);
- omap_set_gpio_dataout(EXT_PHY_RESET_GPIO_PORT1, 0);
- omap_set_gpio_dataout(EXT_PHY_RESET_GPIO_PORT2, 0);
+ gpio_request(EXT_PHY_RESET_GPIO_PORT1, "reset_port1");
+ gpio_direction_output(EXT_PHY_RESET_GPIO_PORT1, 0);
+ gpio_request(EXT_PHY_RESET_GPIO_PORT2, "reset_port2");
+ gpio_direction_output(EXT_PHY_RESET_GPIO_PORT2, 0);
/* Hold the PHY in RESET for enough time till DIR is high */
udelay(EXT_PHY_RESET_DELAY);
#endif
@@ -303,8 +301,8 @@ static int omap_start_ehc(struct platform_device *dev, struct usb_hcd *hcd)
* Hold the PHY in RESET for enough time till PHY is settled and ready
*/
udelay(EXT_PHY_RESET_DELAY);
- omap_set_gpio_dataout(EXT_PHY_RESET_GPIO_PORT1, 1);
- omap_set_gpio_dataout(EXT_PHY_RESET_GPIO_PORT2, 1);
+ gpio_direction_output(EXT_PHY_RESET_GPIO_PORT1, 1);
+ gpio_direction_output(EXT_PHY_RESET_GPIO_PORT2, 1);
#endif
#ifdef VBUS_INTERNAL_CHARGEPUMP_HACK
@@ -383,8 +381,8 @@ static void omap_stop_ehc(struct platform_device *dev, struct usb_hcd *hcd)
#ifdef EXTERNAL_PHY_RESET
- omap_free_gpio(EXT_PHY_RESET_GPIO_PORT1);
- omap_free_gpio(EXT_PHY_RESET_GPIO_PORT2);
+ gpio_free(EXT_PHY_RESET_GPIO_PORT1);
+ gpio_free(EXT_PHY_RESET_GPIO_PORT2);
#endif
dev_dbg(hcd->self.controller,
--
1.6.0.1.196.g01914
[-- Attachment #4: 0003-omap-usb-ehci-fix-usage-of-resources.diff --]
[-- Type: text/x-diff, Size: 3270 bytes --]
From 7e25b8e03aec867002163b8618c126f16682ff52 Mon Sep 17 00:00:00 2001
From: Felipe Balbi <felipe.balbi@nokia.com>
Date: Sat, 13 Sep 2008 18:25:00 +0300
Subject: [PATCH 3/4] omap: usb: ehci: fix usage of resources
use platform_get_irq() and platform_get_resource instead
of trying to access struct resource * directly.
Signed-off-by: Felipe Balbi <felipe.balbi@nokia.com>
---
drivers/usb/host/ehci-omap.c | 62 +++++++++++++++++++++++++++++-------------
1 files changed, 43 insertions(+), 19 deletions(-)
diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c
index c73f832..4ac18b2 100644
--- a/drivers/usb/host/ehci-omap.c
+++ b/drivers/usb/host/ehci-omap.c
@@ -407,36 +407,42 @@ static const struct hc_driver ehci_omap_hc_driver;
static int ehci_hcd_omap_drv_probe(struct platform_device *dev)
{
int retval = 0;
+ int irq = platform_get_irq(dev, 0);
struct usb_hcd *hcd;
struct ehci_hcd *ehci;
+ struct resource *resource;
dev_dbg(&dev->dev, "ehci_hcd_omap_drv_probe()");
- if (usb_disabled())
- return -ENODEV;
+ if (usb_disabled()) {
+ retval = -ENODEV;
+ goto err_disabled;
+ }
- if (dev->resource[1].flags != IORESOURCE_IRQ) {
- dev_dbg(&dev->dev, "resource[1] is not IORESOURCE_IRQ");
+ hcd = usb_create_hcd(&ehci_omap_hc_driver, &dev->dev, dev->dev.bus_id);
+ if (!hcd) {
retval = -ENOMEM;
+ goto err_hcd;
}
- hcd = usb_create_hcd(&ehci_omap_hc_driver, &dev->dev, dev->dev.bus_id);
- if (!hcd)
- return -ENOMEM;
+ resource = platform_get_resource(dev, IORESOURCE_MEM, 0);
+ if (!resource || irq == 0) {
+ retval = -EINVAL;
+ goto err_resource;
+ }
retval = omap_start_ehc(dev, hcd);
if (retval)
- return retval;
+ goto err_start;
- hcd->rsrc_start = 0;
- hcd->rsrc_len = 0;
- hcd->rsrc_start = dev->resource[0].start;
- hcd->rsrc_len = dev->resource[0].end - dev->resource[0].start + 1;
+ hcd->rsrc_start = resource->start;
+ hcd->rsrc_len = resource->end - resource->start + 1;
hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);
if (!hcd->regs) {
dev_err(&dev->dev, "ioremap failed\n");
- return -ENOMEM;
+ retval = -ENOMEM;
+ goto err_ioremap;
}
ehci = hcd_to_ehci(hcd);
@@ -449,16 +455,34 @@ static int ehci_hcd_omap_drv_probe(struct platform_device *dev)
/* SET 1 micro-frame Interrupt interval */
writel(readl(&ehci->regs->command) | (1 << 16), &ehci->regs->command);
- retval = usb_add_hcd(hcd, dev->resource[1].start,
- IRQF_DISABLED | IRQF_SHARED);
- if (retval == 0)
- return retval;
+ retval = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED);
+ if (retval) {
+ dev_err(&dev->dev, "failed to add hcd\n");
+ goto err_add_hcd;
+ }
- dev_dbg(hcd->self.controller, "ERR: add_hcd");
- omap_stop_ehc(dev, hcd);
+ return 0;
+
+err_add_hcd:
+ ehci->hcs_params = 0;
+ ehci->regs = NULL;
+ ehci->caps = NULL;
+ ehci = NULL;
iounmap(hcd->regs);
+ omap_stop_ehc(dev, hcd);
+
+err_ioremap:
+ hcd->rsrc_start = 0;
+ hcd->rsrc_len = 0;
+
+err_start:
+ usb_remove_hcd(hcd);
usb_put_hcd(hcd);
+err_hcd:
+err_resource:
+err_disabled:
+ dev_dbg(&dev->dev, "failed to initialized host controller\n");
return retval;
}
--
1.6.0.1.196.g01914
[-- Attachment #5: 0004-omap-usb-ehci-support-final-revision-of-usb-board.diff --]
[-- Type: text/x-diff, Size: 3525 bytes --]
From 775b30a9724fa3274702621b8e595ad35374bf3b Mon Sep 17 00:00:00 2001
From: Vikram Pandita <vikram.pandita@ti.com>
Date: Sat, 13 Sep 2008 18:31:04 +0300
Subject: [PATCH 4/4] omap: usb: ehci: support final revision of usb board
Code changes for final rev of EHCI/OHCI USB expansion board
750-2099-001(C) with hw bug fixes to support ISP1504 PHY in
input clocking mode.
The board has 12-pin ULPI Port1 and Port2 EHCI pins connected
to ISP1504's. Port3 is connected to ISP1301 for connection to
OHCI.
This is the final USB expansion board that will be released
and so the bug fixes are critical. Changes tested on SDP3430.
Signed-off-by: Vikram Pandita <vikram.pandita@ti.com>
Signed-off-by: Felipe Balbi <felipe.balbi@nokia.com>
---
drivers/usb/host/ehci-omap.c | 37 ++++++-------------------------------
1 files changed, 6 insertions(+), 31 deletions(-)
diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c
index 4ac18b2..f8316d5 100644
--- a/drivers/usb/host/ehci-omap.c
+++ b/drivers/usb/host/ehci-omap.c
@@ -34,7 +34,7 @@
#ifdef CONFIG_OMAP_EHCI_PHY_MODE
/* EHCI connected to External PHY */
-/* External USB connectivity board: 750-2083-001
+/* External USB connectivity board: 750-2099-001(C)
* Connected to OMAP3430 SDP
* The board has Port1 and Port2 connected to ISP1504 in 12-pin ULPI mode
*/
@@ -49,14 +49,7 @@
#define EXTERNAL_PHY_RESET
#define EXT_PHY_RESET_GPIO_PORT1 (57)
#define EXT_PHY_RESET_GPIO_PORT2 (61)
-#define EXT_PHY_RESET_DELAY (10)
-
-/* ISSUE2:
- * USBHOST supports External charge pump PHYs only
- * Use the VBUS from Port1 to power VBUS of Port2 externally
- * So use Port2 as the working ULPI port
- */
-#define VBUS_INTERNAL_CHARGEPUMP_HACK
+#define EXT_PHY_RESET_DELAY (500)
#endif /* CONFIG_OMAP_EHCI_PHY_MODE */
@@ -223,9 +216,9 @@ static int omap_start_ehc(struct platform_device *dev, struct usb_hcd *hcd)
#ifdef EXTERNAL_PHY_RESET
/* Refer: ISSUE1 */
gpio_request(EXT_PHY_RESET_GPIO_PORT1, "reset_port1");
- gpio_direction_output(EXT_PHY_RESET_GPIO_PORT1, 0);
+ gpio_direction_output(EXT_PHY_RESET_GPIO_PORT1, 1);
gpio_request(EXT_PHY_RESET_GPIO_PORT2, "reset_port2");
- gpio_direction_output(EXT_PHY_RESET_GPIO_PORT2, 0);
+ gpio_direction_output(EXT_PHY_RESET_GPIO_PORT2, 1);
/* Hold the PHY in RESET for enough time till DIR is high */
udelay(EXT_PHY_RESET_DELAY);
#endif
@@ -301,26 +294,8 @@ static int omap_start_ehc(struct platform_device *dev, struct usb_hcd *hcd)
* Hold the PHY in RESET for enough time till PHY is settled and ready
*/
udelay(EXT_PHY_RESET_DELAY);
- gpio_direction_output(EXT_PHY_RESET_GPIO_PORT1, 1);
- gpio_direction_output(EXT_PHY_RESET_GPIO_PORT2, 1);
-#endif
-
-#ifdef VBUS_INTERNAL_CHARGEPUMP_HACK
- /* Refer ISSUE2: LINK assumes external charge pump */
-
- /* use Port1 VBUS to charge externally Port2:
- * So for PHY mode operation use Port2 only
- */
- omap_writel((0xA << EHCI_INSNREG05_ULPI_REGADD_SHIFT) |/* OTG ctrl reg*/
- (2 << EHCI_INSNREG05_ULPI_OPSEL_SHIFT) |/* Write */
- (1 << EHCI_INSNREG05_ULPI_PORTSEL_SHIFT) |/* Port1 */
- (1 << EHCI_INSNREG05_ULPI_CONTROL_SHIFT) |/* Start */
- (0x26),
- EHCI_INSNREG05_ULPI);
-
- while (!(omap_readl(EHCI_INSNREG05_ULPI) &
- (1 << EHCI_INSNREG05_ULPI_CONTROL_SHIFT)));
-
+ gpio_direction_output(EXT_PHY_RESET_GPIO_PORT1, 0);
+ gpio_direction_output(EXT_PHY_RESET_GPIO_PORT2, 0);
#endif
return 0;
--
1.6.0.1.196.g01914
next prev parent reply other threads:[~2008-09-14 18:58 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-12 12:10 [patch] omap: usb: ehci: fix use of hcd->regs Felipe Balbi
2008-09-12 12:14 ` Hiroshi DOYU
2008-09-12 12:30 ` Felipe Balbi
2008-09-12 13:37 ` Hiroshi DOYU
2008-09-14 18:53 ` Pandita, Vikram
2008-09-12 16:32 ` David Brownell
2008-09-12 17:50 ` Felipe Balbi
2008-09-12 18:22 ` Felipe Balbi
2008-09-12 18:38 ` [rfc] [patch] clean up to ehci-omap (Was: Re: [patch] omap: usb: ehci: fix use of hcd->regs) Felipe Balbi
2008-09-12 19:16 ` David Brownell
2008-09-12 19:21 ` Tony Lindgren
2008-09-12 19:28 ` Felipe Balbi
2008-09-12 19:29 ` Felipe Balbi
2008-09-12 19:35 ` Felipe Balbi
2008-09-14 18:41 ` Pandita, Vikram
2008-09-14 18:57 ` Felipe Balbi [this message]
2008-09-16 5:47 ` David Brownell
2008-09-16 7:26 ` Felipe Balbi
2008-09-16 5:48 ` David Brownell
2008-09-16 6:05 ` Gadiyar, Anand
2008-09-16 6:35 ` David Brownell
2008-09-16 7:28 ` Felipe Balbi
2008-09-16 5:49 ` David Brownell
2008-09-16 8:28 ` Felipe Balbi
2008-09-18 9:35 ` Gadiyar, Anand
2008-09-21 23:28 ` Paul Walmsley
2008-09-22 15:17 ` Felipe Balbi
2008-09-22 15:21 ` Gadiyar, Anand
2008-09-22 15:26 ` Felipe Balbi
2008-09-22 15:30 ` Gadiyar, Anand
2008-09-22 15:32 ` Felipe Balbi
2008-09-12 20:01 ` Gadiyar, Anand
2008-09-12 20:30 ` David Brownell
2008-09-12 20:54 ` Gadiyar, Anand
2008-09-12 21:15 ` David Brownell
2008-09-12 20:38 ` Felipe Balbi
2008-09-12 21:06 ` Gadiyar, Anand
2008-09-12 22:18 ` Steve Sakoman
2008-09-12 23:54 ` [patch] omap: usb: ehci: fix use of hcd->regs Tony Lindgren
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080914185721.GB6943@frodo \
--to=me@felipebalbi.com \
--cc=david-b@pacbell.net \
--cc=felipe.balbi@nokia.com \
--cc=linux-omap@vger.kernel.org \
--cc=tony@atomide.com \
--cc=vikram.pandita@ti.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox