diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2013-02-05 15:50:31 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2013-02-15 16:19:56 +0100 |
commit | 0a643b3d426e606dd42678b87a1fe205aea2b9e7 (patch) | |
tree | 6ae97b9c6cb335c41dcc6936b0311336e245179f | |
parent | 8139fa78b9ab7c53e194679ec9855bfcd92b1f80 (diff) | |
download | barebox-0a643b3d426e606dd42678b87a1fe205aea2b9e7.tar.gz barebox-0a643b3d426e606dd42678b87a1fe205aea2b9e7.tar.xz |
USB i.MX: Add chipidea gadget support
This adds USB gadget support to the i.MX chipidea driver. Basically
we have to add a register function to the fsl udc driver and call
this from the chipidea driver if device mode is selected.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | drivers/usb/gadget/fsl_udc.c | 11 | ||||
-rw-r--r-- | drivers/usb/imx/chipidea-imx.c | 11 | ||||
-rw-r--r-- | include/usb/fsl_usb2.h | 6 |
3 files changed, 21 insertions, 7 deletions
diff --git a/drivers/usb/gadget/fsl_udc.c b/drivers/usb/gadget/fsl_udc.c index 0a7c3ae269..968c58f57f 100644 --- a/drivers/usb/gadget/fsl_udc.c +++ b/drivers/usb/gadget/fsl_udc.c @@ -2257,7 +2257,7 @@ static struct poller_struct poller = { .func = fsl_udc_poller }; -static int fsl_udc_probe(struct device_d *dev) +int ci_udc_register(struct device_d *dev, void __iomem *regs) { int ret, i; u32 dccparams; @@ -2265,7 +2265,7 @@ static int fsl_udc_probe(struct device_d *dev) udc_controller = xzalloc(sizeof(*udc_controller)); udc_controller->stopped = 1; - dr_regs = dev_request_mem_region(dev, 0); + dr_regs = regs; /* Read Device Controller Capability Parameters register */ dccparams = readl(&dr_regs->dccparams); @@ -2326,6 +2326,13 @@ err_out: return ret; } +static int fsl_udc_probe(struct device_d *dev) +{ + void __iomem *regs = dev_request_mem_region(dev, 0); + + return ci_udc_register(dev, regs); +} + static struct driver_d fsl_udc_driver = { .name = "fsl-udc", .probe = fsl_udc_probe, diff --git a/drivers/usb/imx/chipidea-imx.c b/drivers/usb/imx/chipidea-imx.c index de80c36166..ff6175f8c5 100644 --- a/drivers/usb/imx/chipidea-imx.c +++ b/drivers/usb/imx/chipidea-imx.c @@ -19,6 +19,7 @@ #include <usb/ehci.h> #include <usb/chipidea-imx.h> #include <usb/ulpi.h> +#include <usb/fsl_usb2.h> #define MXC_EHCI_PORTSC_MASK ((0xf << 28) | (1 << 25)) @@ -96,13 +97,13 @@ static int imx_chipidea_probe(struct device_d *dev) data.hcor = base + 0x140; data.flags = EHCI_HAS_TT; - if (pdata->mode == IMX_USB_MODE_HOST) { + if (pdata->mode == IMX_USB_MODE_HOST && IS_ENABLED(CONFIG_USB_EHCI)) { ret = ehci_register(dev, &data); + } else if (pdata->mode == IMX_USB_MODE_DEVICE && IS_ENABLED(CONFIG_USB_GADGET_DRIVER_ARC)) { + ret = ci_udc_register(dev, base); } else { - /* - * Not yet implemented. Register USB gadget driver here. - */ - ret = -ENOSYS; + dev_err(dev, "No supported role\n"); + ret = -ENODEV; } return ret; diff --git a/include/usb/fsl_usb2.h b/include/usb/fsl_usb2.h index fd37adebc8..dec3933d82 100644 --- a/include/usb/fsl_usb2.h +++ b/include/usb/fsl_usb2.h @@ -1,3 +1,6 @@ +#ifndef __USB_FSL_USB2_H +#define __USB_FSL_USB2_H + enum fsl_usb2_operating_modes { FSL_USB2_MPH_HOST, FSL_USB2_DR_HOST, @@ -20,3 +23,6 @@ struct fsl_usb2_platform_data { unsigned int port_enables; }; +int ci_udc_register(struct device_d *dev, void __iomem *regs); + +#endif /* __USB_FSL_USB2_H */ |