|
|
|
@ -21,10 +21,13 @@ |
|
|
|
|
#include <linux/clk.h> |
|
|
|
|
#include <linux/delay.h> |
|
|
|
|
#include <linux/usb/otg.h> |
|
|
|
|
#include <linux/usb/ulpi.h> |
|
|
|
|
#include <linux/slab.h> |
|
|
|
|
|
|
|
|
|
#include <mach/mxc_ehci.h> |
|
|
|
|
|
|
|
|
|
#include <asm/mach-types.h> |
|
|
|
|
|
|
|
|
|
#define ULPI_VIEWPORT_OFFSET 0x170 |
|
|
|
|
|
|
|
|
|
struct ehci_mxc_priv { |
|
|
|
@ -114,6 +117,7 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev) |
|
|
|
|
struct usb_hcd *hcd; |
|
|
|
|
struct resource *res; |
|
|
|
|
int irq, ret; |
|
|
|
|
unsigned int flags; |
|
|
|
|
struct ehci_mxc_priv *priv; |
|
|
|
|
struct device *dev = &pdev->dev; |
|
|
|
|
struct ehci_hcd *ehci; |
|
|
|
@ -240,6 +244,23 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev) |
|
|
|
|
if (ret) |
|
|
|
|
goto err_add; |
|
|
|
|
|
|
|
|
|
if (pdata->otg) { |
|
|
|
|
/*
|
|
|
|
|
* efikamx and efikasb have some hardware bug which is |
|
|
|
|
* preventing usb to work unless CHRGVBUS is set. |
|
|
|
|
* It's in violation of USB specs |
|
|
|
|
*/ |
|
|
|
|
if (machine_is_mx51_efikamx() || machine_is_mx51_efikasb()) { |
|
|
|
|
flags = otg_io_read(pdata->otg, ULPI_OTG_CTRL); |
|
|
|
|
flags |= ULPI_OTG_CTRL_CHRGVBUS; |
|
|
|
|
ret = otg_io_write(pdata->otg, flags, ULPI_OTG_CTRL); |
|
|
|
|
if (ret) { |
|
|
|
|
dev_err(dev, "unable to set CHRVBUS\n"); |
|
|
|
|
goto err_add; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
err_add: |
|
|
|
|