[ELDK] [PATCH] META-ELDK: linux-eldk: Add USB support for M53EVK
Marek Vasut
marex at denx.de
Tue Mar 18 01:40:40 CET 2014
Backport Linux patches necessary to get USB operational on i.MX5x
and backport a patch which enables USB support on M53. Moreover,
enable NOP PHY in the M53EVK defconfig, as that is the PHY type
used on i.MX5x .
The diffstat for the kernel part looks like below, so the changes
for the kernel part are contained:
Documentation/devicetree/bindings/usb/ci13xxx-imx.txt | 6 +++
arch/arm/boot/dts/imx51.dtsi | 23 ++++++++++
arch/arm/boot/dts/imx53-m53evk.dts | 22 +++++++++
arch/arm/boot/dts/imx53.dtsi | 31 +++++++++++++
drivers/usb/chipidea/bits.h | 16 ++++++-
drivers/usb/chipidea/ci13xxx_imx.c | 98 ++++++++++++----------------------------
drivers/usb/chipidea/core.c | 97 +++++++++++++++++++++++++++++++++++----
drivers/usb/chipidea/host.c | 23 +++++++++-
drivers/usb/chipidea/udc.c | 20 +++++++-
drivers/usb/chipidea/udc.h | 1 +
drivers/usb/chipidea/usbmisc_imx.c | 4 +-
drivers/usb/phy/Makefile | 1 +
drivers/usb/phy/of.c | 47 +++++++++++++++++++
drivers/usb/usb-common.c | 35 ++++++++++++++
include/linux/usb/chipidea.h | 4 +-
include/linux/usb/of.h | 28 ++++++++++++
include/linux/usb/otg.h | 7 +++
include/linux/usb/phy.h | 9 ++++
18 files changed, 388 insertions(+), 84 deletions(-)
Signed-off-by: Marek Vasut <marex at denx.de>
Cc: Wolfgang Denk <wd at denx.de>
---
...a-ci13xxx_imx-let-device-core-handle-pinc.patch | 55 ++++++
...a-usbmisc_imx-Staticize-usbmisc_imx_drv_i.patch | 41 ++++
...-usb-chipidea-udc-configure-iso-endpoints.patch | 100 ++++++++++
...9-usb-chipidea-ci13xxx_imx-fix-error-path.patch | 71 +++++++
...-usb-chipidea-ci13xxx_imx-remove-reg_vbus.patch | 72 +++++++
...a-ci13xxx_imx-check-if-data-phy_np-is-not.patch | 33 ++++
...32-usb-chipidea-ci13xxx_imx-remove-phy_np.patch | 55 ++++++
...usb-chipidea-add-PTW-PTS-and-STS-handling.patch | 170 ++++++++++++++++
...icetree-helpers-for-determining-dr_mode-a.patch | 217 +++++++++++++++++++++
...idea-introduce-dual-role-mode-pdata-flags.patch | 90 +++++++++
...a-ci13xxx-imx-move-static-pdata-into-prob.patch | 69 +++++++
...a-i.MX-use-devm_usb_get_phy_by_phandle-to.patch | 100 ++++++++++
...idea-move-hw_phymode_configure-into-probe.patch | 47 +++++
...a-ci_hdrc_imx-remove-an-unsolicited-modul.patch | 39 ++++
...a-prevent-endless-loop-registering-platfo.patch | 71 +++++++
...dea-move-vbus-regulator-operation-to-core.patch | 161 +++++++++++++++
...-chipidea-host-add-vbus-regulator-control.patch | 85 ++++++++
...043-ARM-dts-imx-add-imx5x-usbmisc-entries.patch | 105 ++++++++++
...RM-dts-imx-add-imx5x-usb-clock-DT-lookups.patch | 103 ++++++++++
...-use-usb-nop-xceiv-usbphy-entries-for-imx.patch | 81 ++++++++
...-ARM-dts-imx53-Add-USB-support-for-M53EVK.patch | 62 ++++++
.../linux/linux-eldk/m53evk/defconfig | 1 +
meta-eldk/recipes-kernel/linux/linux-eldk_3.10.bb | 21 ++
23 files changed, 1849 insertions(+)
create mode 100644 meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0026-usb-chipidea-ci13xxx_imx-let-device-core-handle-pinc.patch
create mode 100644 meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0027-usb-chipidea-usbmisc_imx-Staticize-usbmisc_imx_drv_i.patch
create mode 100644 meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0028-usb-chipidea-udc-configure-iso-endpoints.patch
create mode 100644 meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0029-usb-chipidea-ci13xxx_imx-fix-error-path.patch
create mode 100644 meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0030-usb-chipidea-ci13xxx_imx-remove-reg_vbus.patch
create mode 100644 meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0031-usb-chipidea-ci13xxx_imx-check-if-data-phy_np-is-not.patch
create mode 100644 meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0032-usb-chipidea-ci13xxx_imx-remove-phy_np.patch
create mode 100644 meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0033-usb-chipidea-add-PTW-PTS-and-STS-handling.patch
create mode 100644 meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0034-usb-add-devicetree-helpers-for-determining-dr_mode-a.patch
create mode 100644 meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0035-usb-chipidea-introduce-dual-role-mode-pdata-flags.patch
create mode 100644 meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0036-usb-chipidea-ci13xxx-imx-move-static-pdata-into-prob.patch
create mode 100644 meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0037-usb-chipidea-i.MX-use-devm_usb_get_phy_by_phandle-to.patch
create mode 100644 meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0038-usb-chipidea-move-hw_phymode_configure-into-probe.patch
create mode 100644 meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0039-usb-chipidea-ci_hdrc_imx-remove-an-unsolicited-modul.patch
create mode 100644 meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0040-usb-chipidea-prevent-endless-loop-registering-platfo.patch
create mode 100644 meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0041-usb-chipidea-move-vbus-regulator-operation-to-core.patch
create mode 100644 meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0042-usb-chipidea-host-add-vbus-regulator-control.patch
create mode 100644 meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0043-ARM-dts-imx-add-imx5x-usbmisc-entries.patch
create mode 100644 meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0044-ARM-dts-imx-add-imx5x-usb-clock-DT-lookups.patch
create mode 100644 meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0045-ARM-dts-imx-use-usb-nop-xceiv-usbphy-entries-for-imx.patch
create mode 100644 meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0046-ARM-dts-imx53-Add-USB-support-for-M53EVK.patch
diff --git a/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0026-usb-chipidea-ci13xxx_imx-let-device-core-handle-pinc.patch b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0026-usb-chipidea-ci13xxx_imx-let-device-core-handle-pinc.patch
new file mode 100644
index 0000000..6d4ff48
--- /dev/null
+++ b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0026-usb-chipidea-ci13xxx_imx-let-device-core-handle-pinc.patch
@@ -0,0 +1,55 @@
+From bc59b35f2f63d2466831821a647b679c2974bf0e Mon Sep 17 00:00:00 2001
+From: Fabio Estevam <fabio.estevam at freescale.com>
+Date: Thu, 13 Jun 2013 17:59:45 +0300
+Subject: [PATCH 01/21] usb: chipidea: ci13xxx_imx: let device core handle
+ pinctrl
+
+Since commit ab78029 (drivers/pinctrl: grab default handles from device core),
+we can rely on device core for handling pinctrl.
+
+So remove devm_pinctrl_get_select_default() from the driver.
+
+Cc: <linux-usb at vger.kernel.org>
+Signed-off-by: Fabio Estevam <fabio.estevam at freescale.com>
+Tested-by: Shawn Guo <shawn.guo at linaro.org>
+Signed-off-by: Alexander Shishkin <alexander.shishkin at linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
+---
+ drivers/usb/chipidea/ci13xxx_imx.c | 7 -------
+ 1 file changed, 7 deletions(-)
+
+diff --git a/drivers/usb/chipidea/ci13xxx_imx.c b/drivers/usb/chipidea/ci13xxx_imx.c
+index 73f9d5f..2e45ac8 100644
+--- a/drivers/usb/chipidea/ci13xxx_imx.c
++++ b/drivers/usb/chipidea/ci13xxx_imx.c
+@@ -20,7 +20,6 @@
+ #include <linux/usb/chipidea.h>
+ #include <linux/clk.h>
+ #include <linux/regulator/consumer.h>
+-#include <linux/pinctrl/consumer.h>
+
+ #include "ci.h"
+ #include "ci13xxx_imx.h"
+@@ -103,7 +102,6 @@ static int ci13xxx_imx_probe(struct platform_device *pdev)
+ struct device_node *phy_np;
+ struct resource *res;
+ struct regulator *reg_vbus;
+- struct pinctrl *pinctrl;
+ int ret;
+
+ if (of_find_property(pdev->dev.of_node, "fsl,usbmisc", NULL)
+@@ -122,11 +120,6 @@ static int ci13xxx_imx_probe(struct platform_device *pdev)
+ return -ENOENT;
+ }
+
+- pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
+- if (IS_ERR(pinctrl))
+- dev_warn(&pdev->dev, "pinctrl get/select failed, err=%ld\n",
+- PTR_ERR(pinctrl));
+-
+ data->clk = devm_clk_get(&pdev->dev, NULL);
+ if (IS_ERR(data->clk)) {
+ dev_err(&pdev->dev,
+--
+1.8.5.2
+
diff --git a/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0027-usb-chipidea-usbmisc_imx-Staticize-usbmisc_imx_drv_i.patch b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0027-usb-chipidea-usbmisc_imx-Staticize-usbmisc_imx_drv_i.patch
new file mode 100644
index 0000000..8da280b
--- /dev/null
+++ b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0027-usb-chipidea-usbmisc_imx-Staticize-usbmisc_imx_drv_i.patch
@@ -0,0 +1,41 @@
+From 91b03f59c8f63996d9620bd5391314fb9ac80ddf Mon Sep 17 00:00:00 2001
+From: Fabio Estevam <fabio.estevam at freescale.com>
+Date: Thu, 13 Jun 2013 17:59:46 +0300
+Subject: [PATCH 02/21] usb: chipidea: usbmisc_imx: Staticize
+ usbmisc_imx_drv_init/exit
+
+Fix the following sparse warnings:
+
+drivers/usb/chipidea/usbmisc_imx.c:246:5: warning: symbol 'usbmisc_imx_drv_init' was not declared. Should it be static?
+drivers/usb/chipidea/usbmisc_imx.c:252:6: warning: symbol 'usbmisc_imx_drv_exit' was not declared. Should it be static?
+
+Signed-off-by: Fabio Estevam <fabio.estevam at freescale.com>
+Signed-off-by: Alexander Shishkin <alexander.shishkin at linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
+---
+ drivers/usb/chipidea/usbmisc_imx.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/usb/chipidea/usbmisc_imx.c b/drivers/usb/chipidea/usbmisc_imx.c
+index 714a6bd..1c6610a 100644
+--- a/drivers/usb/chipidea/usbmisc_imx.c
++++ b/drivers/usb/chipidea/usbmisc_imx.c
+@@ -243,13 +243,13 @@ static struct platform_driver usbmisc_imx_driver = {
+ },
+ };
+
+-int usbmisc_imx_drv_init(void)
++static int usbmisc_imx_drv_init(void)
+ {
+ return platform_driver_register(&usbmisc_imx_driver);
+ }
+ subsys_initcall(usbmisc_imx_drv_init);
+
+-void usbmisc_imx_drv_exit(void)
++static void usbmisc_imx_drv_exit(void)
+ {
+ platform_driver_unregister(&usbmisc_imx_driver);
+ }
+--
+1.8.5.2
+
diff --git a/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0028-usb-chipidea-udc-configure-iso-endpoints.patch b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0028-usb-chipidea-udc-configure-iso-endpoints.patch
new file mode 100644
index 0000000..26d5cfe
--- /dev/null
+++ b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0028-usb-chipidea-udc-configure-iso-endpoints.patch
@@ -0,0 +1,100 @@
+From ae67a94cc318e786e4726def27103e6d6a9b4444 Mon Sep 17 00:00:00 2001
+From: Michael Grzeschik <mgr at pengutronix.de>
+Date: Thu, 13 Jun 2013 17:59:47 +0300
+Subject: [PATCH 03/21] usb: chipidea: udc: configure iso endpoints
+
+This patch adds iso endpoint support to the device controller.
+It makes use of the multiplication bits in the maxpacket field
+of the endpoint and calculates the multiplier bits for each
+transfer description on every request.
+
+Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Reviewed-by: Peter Chen <peter.chen at freescale.com>
+Signed-off-by: Alexander Shishkin <alexander.shishkin at linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
+---
+ drivers/usb/chipidea/core.c | 2 +-
+ drivers/usb/chipidea/udc.c | 20 +++++++++++++++++++-
+ drivers/usb/chipidea/udc.h | 1 +
+ 3 files changed, 21 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
+index 475c9c1..ade1b91 100644
+--- a/drivers/usb/chipidea/core.c
++++ b/drivers/usb/chipidea/core.c
+@@ -43,7 +43,7 @@
+ *
+ * TODO List
+ * - OTG
+- * - Isochronous & Interrupt Traffic
++ * - Interrupt Traffic
+ * - Handle requests which spawns into several TDs
+ * - GET_STATUS(device) - always reports 0
+ * - Gadget API (majority of optional features)
+diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
+index b501346..8aed288 100644
+--- a/drivers/usb/chipidea/udc.c
++++ b/drivers/usb/chipidea/udc.c
+@@ -466,6 +466,14 @@ static int _hardware_enqueue(struct ci13xxx_ep *mEp, struct ci13xxx_req *mReq)
+ mEp->qh.ptr->td.token &=
+ cpu_to_le32(~(TD_STATUS_HALTED|TD_STATUS_ACTIVE));
+
++ if (mEp->type == USB_ENDPOINT_XFER_ISOC) {
++ u32 mul = mReq->req.length / mEp->ep.maxpacket;
++
++ if (mReq->req.length % mEp->ep.maxpacket)
++ mul++;
++ mEp->qh.ptr->cap |= mul << __ffs(QH_MULT);
++ }
++
+ wmb(); /* synchronize before ep prime */
+
+ ret = hw_ep_prime(ci, mEp->num, mEp->dir,
+@@ -678,6 +686,12 @@ static int _ep_queue(struct usb_ep *ep, struct usb_request *req,
+ }
+ }
+
++ if (usb_endpoint_xfer_isoc(mEp->ep.desc) &&
++ mReq->req.length > (1 + mEp->ep.mult) * mEp->ep.maxpacket) {
++ dev_err(mEp->ci->dev, "request length too big for isochronous\n");
++ return -EMSGSIZE;
++ }
++
+ /* first nuke then test link, e.g. previous status has not sent */
+ if (!list_empty(&mReq->queue)) {
+ dev_err(mEp->ci->dev, "request already in queue\n");
+@@ -1060,7 +1074,8 @@ static int ep_enable(struct usb_ep *ep,
+ mEp->num = usb_endpoint_num(desc);
+ mEp->type = usb_endpoint_type(desc);
+
+- mEp->ep.maxpacket = usb_endpoint_maxp(desc);
++ mEp->ep.maxpacket = usb_endpoint_maxp(desc) & 0x07ff;
++ mEp->ep.mult = QH_ISO_MULT(usb_endpoint_maxp(desc));
+
+ if (mEp->type == USB_ENDPOINT_XFER_CONTROL)
+ cap |= QH_IOS;
+@@ -1246,6 +1261,9 @@ static int ep_set_halt(struct usb_ep *ep, int value)
+ if (ep == NULL || mEp->ep.desc == NULL)
+ return -EINVAL;
+
++ if (usb_endpoint_xfer_isoc(mEp->ep.desc))
++ return -EOPNOTSUPP;
++
+ spin_lock_irqsave(mEp->lock, flags);
+
+ #ifndef STALL_IN
+diff --git a/drivers/usb/chipidea/udc.h b/drivers/usb/chipidea/udc.h
+index d12e8b5..a75724a 100644
+--- a/drivers/usb/chipidea/udc.h
++++ b/drivers/usb/chipidea/udc.h
+@@ -50,6 +50,7 @@ struct ci13xxx_qh {
+ #define QH_MAX_PKT (0x07FFUL << 16)
+ #define QH_ZLT BIT(29)
+ #define QH_MULT (0x0003UL << 30)
++#define QH_ISO_MULT(x) ((x >> 11) & 0x03)
+ /* 1 */
+ u32 curr;
+ /* 2 - 8 */
+--
+1.8.5.2
+
diff --git a/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0029-usb-chipidea-ci13xxx_imx-fix-error-path.patch b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0029-usb-chipidea-ci13xxx_imx-fix-error-path.patch
new file mode 100644
index 0000000..f222833
--- /dev/null
+++ b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0029-usb-chipidea-ci13xxx_imx-fix-error-path.patch
@@ -0,0 +1,71 @@
+From 0fc4145ec13f24e9e5d241991aeaaeac84c1cedc Mon Sep 17 00:00:00 2001
+From: Fabio Estevam <fabio.estevam at freescale.com>
+Date: Thu, 13 Jun 2013 17:59:48 +0300
+Subject: [PATCH 04/21] usb: chipidea: ci13xxx_imx: fix error path
+
+If usbmisc_ops->post() fails it should point the error path to release all
+previously acquired resources, so adjust it to call ci13xxx_remove_device().
+
+While at it, remove the unnecessary 'plat_ci' indirection, as we can directly
+use the private structure.
+
+Signed-off-by: Fabio Estevam <fabio.estevam at freescale.com>
+Signed-off-by: Alexander Shishkin <alexander.shishkin at linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
+---
+ drivers/usb/chipidea/ci13xxx_imx.c | 13 +++++++------
+ 1 file changed, 7 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/usb/chipidea/ci13xxx_imx.c b/drivers/usb/chipidea/ci13xxx_imx.c
+index 2e45ac8..d0f505a 100644
+--- a/drivers/usb/chipidea/ci13xxx_imx.c
++++ b/drivers/usb/chipidea/ci13xxx_imx.c
+@@ -98,7 +98,7 @@ static struct ci13xxx_platform_data ci13xxx_imx_platdata = {
+ static int ci13xxx_imx_probe(struct platform_device *pdev)
+ {
+ struct ci13xxx_imx_data *data;
+- struct platform_device *plat_ci, *phy_pdev;
++ struct platform_device *phy_pdev;
+ struct device_node *phy_np;
+ struct resource *res;
+ struct regulator *reg_vbus;
+@@ -180,11 +180,11 @@ static int ci13xxx_imx_probe(struct platform_device *pdev)
+ }
+ }
+
+- plat_ci = ci13xxx_add_device(&pdev->dev,
++ data->ci_pdev = ci13xxx_add_device(&pdev->dev,
+ pdev->resource, pdev->num_resources,
+ &ci13xxx_imx_platdata);
+- if (IS_ERR(plat_ci)) {
+- ret = PTR_ERR(plat_ci);
++ if (IS_ERR(data->ci_pdev)) {
++ ret = PTR_ERR(data->ci_pdev);
+ dev_err(&pdev->dev,
+ "Can't register ci_hdrc platform device, err=%d\n",
+ ret);
+@@ -196,11 +196,10 @@ static int ci13xxx_imx_probe(struct platform_device *pdev)
+ if (ret) {
+ dev_err(&pdev->dev,
+ "usbmisc post failed, ret=%d\n", ret);
+- goto put_np;
++ goto disable_device;
+ }
+ }
+
+- data->ci_pdev = plat_ci;
+ platform_set_drvdata(pdev, data);
+
+ pm_runtime_no_callbacks(&pdev->dev);
+@@ -208,6 +207,8 @@ static int ci13xxx_imx_probe(struct platform_device *pdev)
+
+ return 0;
+
++disable_device:
++ ci13xxx_remove_device(data->ci_pdev);
+ err:
+ if (reg_vbus)
+ regulator_disable(reg_vbus);
+--
+1.8.5.2
+
diff --git a/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0030-usb-chipidea-ci13xxx_imx-remove-reg_vbus.patch b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0030-usb-chipidea-ci13xxx_imx-remove-reg_vbus.patch
new file mode 100644
index 0000000..981cb33
--- /dev/null
+++ b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0030-usb-chipidea-ci13xxx_imx-remove-reg_vbus.patch
@@ -0,0 +1,72 @@
+From 83128d822daf6c5ec9abfc5e070be56fb2a9c98e Mon Sep 17 00:00:00 2001
+From: Fabio Estevam <fabio.estevam at freescale.com>
+Date: Thu, 13 Jun 2013 17:59:49 +0300
+Subject: [PATCH 05/21] usb: chipidea: ci13xxx_imx: remove reg_vbus
+
+There is no need to keep a 'reg_vbus' indirection, so get rid of it.
+
+The motivation for doing this change is that in the case of error, the current
+code only sets the local reg_vbus to NULL instead of updating the private
+structure 'data->reg_vbus'.
+
+Updating only the local reg_vbus is wrong, since we currently check for
+data->reg_vbus in the ci13xxx_imx_remove() function.
+
+In order to avoid such issue, just use 'data->reg_vbus' directly.
+
+Signed-off-by: Fabio Estevam <fabio.estevam at freescale.com>
+Signed-off-by: Alexander Shishkin <alexander.shishkin at linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
+---
+ drivers/usb/chipidea/ci13xxx_imx.c | 14 ++++++--------
+ 1 file changed, 6 insertions(+), 8 deletions(-)
+
+diff --git a/drivers/usb/chipidea/ci13xxx_imx.c b/drivers/usb/chipidea/ci13xxx_imx.c
+index d0f505a..1d2897d 100644
+--- a/drivers/usb/chipidea/ci13xxx_imx.c
++++ b/drivers/usb/chipidea/ci13xxx_imx.c
+@@ -101,7 +101,6 @@ static int ci13xxx_imx_probe(struct platform_device *pdev)
+ struct platform_device *phy_pdev;
+ struct device_node *phy_np;
+ struct resource *res;
+- struct regulator *reg_vbus;
+ int ret;
+
+ if (of_find_property(pdev->dev.of_node, "fsl,usbmisc", NULL)
+@@ -150,18 +149,17 @@ static int ci13xxx_imx_probe(struct platform_device *pdev)
+ }
+
+ /* we only support host now, so enable vbus here */
+- reg_vbus = devm_regulator_get(&pdev->dev, "vbus");
+- if (!IS_ERR(reg_vbus)) {
+- ret = regulator_enable(reg_vbus);
++ data->reg_vbus = devm_regulator_get(&pdev->dev, "vbus");
++ if (!IS_ERR(data->reg_vbus)) {
++ ret = regulator_enable(data->reg_vbus);
+ if (ret) {
+ dev_err(&pdev->dev,
+ "Failed to enable vbus regulator, err=%d\n",
+ ret);
+ goto put_np;
+ }
+- data->reg_vbus = reg_vbus;
+ } else {
+- reg_vbus = NULL;
++ data->reg_vbus = NULL;
+ }
+
+ ci13xxx_imx_platdata.phy = data->phy;
+@@ -210,8 +208,8 @@ static int ci13xxx_imx_probe(struct platform_device *pdev)
+ disable_device:
+ ci13xxx_remove_device(data->ci_pdev);
+ err:
+- if (reg_vbus)
+- regulator_disable(reg_vbus);
++ if (data->reg_vbus)
++ regulator_disable(data->reg_vbus);
+ put_np:
+ if (phy_np)
+ of_node_put(phy_np);
+--
+1.8.5.2
+
diff --git a/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0031-usb-chipidea-ci13xxx_imx-check-if-data-phy_np-is-not.patch b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0031-usb-chipidea-ci13xxx_imx-check-if-data-phy_np-is-not.patch
new file mode 100644
index 0000000..c0f34cc
--- /dev/null
+++ b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0031-usb-chipidea-ci13xxx_imx-check-if-data-phy_np-is-not.patch
@@ -0,0 +1,33 @@
+From 619ff9b7baf407257b4a377444b6587ba3daccce Mon Sep 17 00:00:00 2001
+From: Fabio Estevam <fabio.estevam at freescale.com>
+Date: Thu, 13 Jun 2013 17:59:50 +0300
+Subject: [PATCH 06/21] usb: chipidea: ci13xxx_imx: check if 'data->phy_np' is
+ not NULL
+
+Similarly as it is done in ci13xxx_imx_remove(), only calls of_node_put if
+data->phy_np is not NULL.
+
+Signed-off-by: Fabio Estevam <fabio.estevam at freescale.com>
+Signed-off-by: Alexander Shishkin <alexander.shishkin at linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
+---
+ drivers/usb/chipidea/ci13xxx_imx.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/usb/chipidea/ci13xxx_imx.c b/drivers/usb/chipidea/ci13xxx_imx.c
+index 1d2897d..75f553b 100644
+--- a/drivers/usb/chipidea/ci13xxx_imx.c
++++ b/drivers/usb/chipidea/ci13xxx_imx.c
+@@ -232,7 +232,8 @@ static int ci13xxx_imx_remove(struct platform_device *pdev)
+ module_put(data->phy->dev->driver->owner);
+ }
+
+- of_node_put(data->phy_np);
++ if (data->phy_np)
++ of_node_put(data->phy_np);
+
+ clk_disable_unprepare(data->clk);
+
+--
+1.8.5.2
+
diff --git a/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0032-usb-chipidea-ci13xxx_imx-remove-phy_np.patch b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0032-usb-chipidea-ci13xxx_imx-remove-phy_np.patch
new file mode 100644
index 0000000..9bb741d
--- /dev/null
+++ b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0032-usb-chipidea-ci13xxx_imx-remove-phy_np.patch
@@ -0,0 +1,55 @@
+From c2053667582c9a504f6363e12616c1e15b9f8427 Mon Sep 17 00:00:00 2001
+From: Fabio Estevam <fabio.estevam at freescale.com>
+Date: Thu, 13 Jun 2013 17:59:51 +0300
+Subject: [PATCH 07/21] usb: chipidea: ci13xxx_imx: remove 'phy_np'
+
+There is no need to keep a local 'phy_np' as we can directly use the private
+structure in data->phy_np.
+
+Signed-off-by: Fabio Estevam <fabio.estevam at freescale.com>
+Signed-off-by: Alexander Shishkin <alexander.shishkin at linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
+---
+ drivers/usb/chipidea/ci13xxx_imx.c | 12 +++++-------
+ 1 file changed, 5 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/usb/chipidea/ci13xxx_imx.c b/drivers/usb/chipidea/ci13xxx_imx.c
+index 75f553b..aef5b5b 100644
+--- a/drivers/usb/chipidea/ci13xxx_imx.c
++++ b/drivers/usb/chipidea/ci13xxx_imx.c
+@@ -99,7 +99,6 @@ static int ci13xxx_imx_probe(struct platform_device *pdev)
+ {
+ struct ci13xxx_imx_data *data;
+ struct platform_device *phy_pdev;
+- struct device_node *phy_np;
+ struct resource *res;
+ int ret;
+
+@@ -133,10 +132,9 @@ static int ci13xxx_imx_probe(struct platform_device *pdev)
+ return ret;
+ }
+
+- phy_np = of_parse_phandle(pdev->dev.of_node, "fsl,usbphy", 0);
+- if (phy_np) {
+- data->phy_np = phy_np;
+- phy_pdev = of_find_device_by_node(phy_np);
++ data->phy_np = of_parse_phandle(pdev->dev.of_node, "fsl,usbphy", 0);
++ if (data->phy_np) {
++ phy_pdev = of_find_device_by_node(data->phy_np);
+ if (phy_pdev) {
+ struct usb_phy *phy;
+ phy = pdev_to_phy(phy_pdev);
+@@ -211,8 +209,8 @@ err:
+ if (data->reg_vbus)
+ regulator_disable(data->reg_vbus);
+ put_np:
+- if (phy_np)
+- of_node_put(phy_np);
++ if (data->phy_np)
++ of_node_put(data->phy_np);
+ clk_disable_unprepare(data->clk);
+ return ret;
+ }
+--
+1.8.5.2
+
diff --git a/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0033-usb-chipidea-add-PTW-PTS-and-STS-handling.patch b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0033-usb-chipidea-add-PTW-PTS-and-STS-handling.patch
new file mode 100644
index 0000000..62a7ec2
--- /dev/null
+++ b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0033-usb-chipidea-add-PTW-PTS-and-STS-handling.patch
@@ -0,0 +1,170 @@
+From 6b4995bec8ee213f178755161a77f8a15d3c2ba0 Mon Sep 17 00:00:00 2001
+From: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Date: Thu, 13 Jun 2013 17:59:56 +0300
+Subject: [PATCH 08/21] usb: chipidea: add PTW, PTS and STS handling
+
+This patch makes it possible to configure the PTW, PTS and STS bits
+inside the portsc register for host and device mode before the driver
+starts and the phy can be addressed as hardware implementation is
+designed.
+
+Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>
+Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
+Signed-off-by: Alexander Shishkin <alexander.shishkin at linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
+---
+ .../devicetree/bindings/usb/ci13xxx-imx.txt | 5 +++
+ drivers/usb/chipidea/bits.h | 16 +++++++-
+ drivers/usb/chipidea/core.c | 48 ++++++++++++++++++++++
+ include/linux/usb/chipidea.h | 1 +
+ 4 files changed, 69 insertions(+), 1 deletion(-)
+
+diff --git a/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt b/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
+index 1c04a4c..184a8e0 100644
+--- a/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
++++ b/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
+@@ -5,6 +5,11 @@ Required properties:
+ - reg: Should contain registers location and length
+ - interrupts: Should contain controller interrupt
+
++Recommended properies:
++- phy_type: the type of the phy connected to the core. Should be one
++ of "utmi", "utmi_wide", "ulpi", "serial" or "hsic". Without this
++ property the PORTSC register won't be touched
++
+ Optional properties:
+ - fsl,usbphy: phandler of usb phy that connects to the only one port
+ - fsl,usbmisc: phandler of non-core register device, with one argument
+diff --git a/drivers/usb/chipidea/bits.h b/drivers/usb/chipidea/bits.h
+index 050de85..aefa026 100644
+--- a/drivers/usb/chipidea/bits.h
++++ b/drivers/usb/chipidea/bits.h
+@@ -48,10 +48,24 @@
+ #define PORTSC_SUSP BIT(7)
+ #define PORTSC_HSP BIT(9)
+ #define PORTSC_PTC (0x0FUL << 16)
++/* PTS and PTW for non lpm version only */
++#define PORTSC_PTS(d) \
++ ((((d) & 0x3) << 30) | (((d) & 0x4) ? BIT(25) : 0))
++#define PORTSC_PTW BIT(28)
++#define PORTSC_STS BIT(29)
+
+ /* DEVLC */
+ #define DEVLC_PSPD (0x03UL << 25)
+-#define DEVLC_PSPD_HS (0x02UL << 25)
++#define DEVLC_PSPD_HS (0x02UL << 25)
++#define DEVLC_PTW BIT(27)
++#define DEVLC_STS BIT(28)
++#define DEVLC_PTS(d) (((d) & 0x7) << 29)
++
++/* Encoding for DEVLC_PTS and PORTSC_PTS */
++#define PTS_UTMI 0
++#define PTS_ULPI 2
++#define PTS_SERIAL 3
++#define PTS_HSIC 4
+
+ /* OTGSC */
+ #define OTGSC_IDPU BIT(5)
+diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
+index ade1b91..5740ac2 100644
+--- a/drivers/usb/chipidea/core.c
++++ b/drivers/usb/chipidea/core.c
+@@ -64,6 +64,8 @@
+ #include <linux/usb/gadget.h>
+ #include <linux/usb/otg.h>
+ #include <linux/usb/chipidea.h>
++#include <linux/usb/of.h>
++#include <linux/phy.h>
+
+ #include "ci.h"
+ #include "udc.h"
+@@ -208,6 +210,45 @@ static int hw_device_init(struct ci13xxx *ci, void __iomem *base)
+ return 0;
+ }
+
++static void hw_phymode_configure(struct ci13xxx *ci)
++{
++ u32 portsc, lpm, sts;
++
++ switch (ci->platdata->phy_mode) {
++ case USBPHY_INTERFACE_MODE_UTMI:
++ portsc = PORTSC_PTS(PTS_UTMI);
++ lpm = DEVLC_PTS(PTS_UTMI);
++ break;
++ case USBPHY_INTERFACE_MODE_UTMIW:
++ portsc = PORTSC_PTS(PTS_UTMI) | PORTSC_PTW;
++ lpm = DEVLC_PTS(PTS_UTMI) | DEVLC_PTW;
++ break;
++ case USBPHY_INTERFACE_MODE_ULPI:
++ portsc = PORTSC_PTS(PTS_ULPI);
++ lpm = DEVLC_PTS(PTS_ULPI);
++ break;
++ case USBPHY_INTERFACE_MODE_SERIAL:
++ portsc = PORTSC_PTS(PTS_SERIAL);
++ lpm = DEVLC_PTS(PTS_SERIAL);
++ sts = 1;
++ break;
++ case USBPHY_INTERFACE_MODE_HSIC:
++ portsc = PORTSC_PTS(PTS_HSIC);
++ lpm = DEVLC_PTS(PTS_HSIC);
++ break;
++ default:
++ return;
++ }
++
++ if (ci->hw_bank.lpm) {
++ hw_write(ci, OP_DEVLC, DEVLC_PTS(7) | DEVLC_PTW, lpm);
++ hw_write(ci, OP_DEVLC, DEVLC_STS, sts);
++ } else {
++ hw_write(ci, OP_PORTSC, PORTSC_PTS(7) | PORTSC_PTW, portsc);
++ hw_write(ci, OP_PORTSC, PORTSC_STS, sts);
++ }
++}
++
+ /**
+ * hw_device_reset: resets chip (execute without interruption)
+ * @ci: the controller
+@@ -224,6 +265,7 @@ int hw_device_reset(struct ci13xxx *ci, u32 mode)
+ while (hw_read(ci, OP_USBCMD, USBCMD_RST))
+ udelay(10); /* not RTOS friendly */
+
++ hw_phymode_configure(ci);
+
+ if (ci->platdata->notify_event)
+ ci->platdata->notify_event(ci,
+@@ -370,6 +412,9 @@ static int ci_hdrc_probe(struct platform_device *pdev)
+ return -ENODEV;
+ }
+
++ if (!dev->of_node && dev->parent)
++ dev->of_node = dev->parent->of_node;
++
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ base = devm_ioremap_resource(dev, res);
+ if (IS_ERR(base))
+@@ -409,6 +454,9 @@ static int ci_hdrc_probe(struct platform_device *pdev)
+ return -ENODEV;
+ }
+
++ if (!ci->platdata->phy_mode)
++ ci->platdata->phy_mode = of_usb_get_phy_mode(dev->of_node);
++
+ /* initialize role(s) before the interrupt is requested */
+ ret = ci_hdrc_host_init(ci);
+ if (ret)
+diff --git a/include/linux/usb/chipidea.h b/include/linux/usb/chipidea.h
+index 544825d..1a2aa18 100644
+--- a/include/linux/usb/chipidea.h
++++ b/include/linux/usb/chipidea.h
+@@ -14,6 +14,7 @@ struct ci13xxx_platform_data {
+ uintptr_t capoffset;
+ unsigned power_budget;
+ struct usb_phy *phy;
++ enum usb_phy_interface phy_mode;
+ unsigned long flags;
+ #define CI13XXX_REGS_SHARED BIT(0)
+ #define CI13XXX_REQUIRE_TRANSCEIVER BIT(1)
+--
+1.8.5.2
+
diff --git a/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0034-usb-add-devicetree-helpers-for-determining-dr_mode-a.patch b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0034-usb-add-devicetree-helpers-for-determining-dr_mode-a.patch
new file mode 100644
index 0000000..0670036
--- /dev/null
+++ b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0034-usb-add-devicetree-helpers-for-determining-dr_mode-a.patch
@@ -0,0 +1,217 @@
+From 9b61fe6abb94890ec47e567e2897f60e7239ed6f Mon Sep 17 00:00:00 2001
+From: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Date: Thu, 13 Jun 2013 17:59:55 +0300
+Subject: [PATCH 09/21] usb: add devicetree helpers for determining dr_mode and
+ phy_type
+
+This adds two little devicetree helper functions for determining the
+dr_mode (host, peripheral, otg) and phy_type (utmi, ulpi,...) from
+the devicetree.
+
+Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>
+Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
+Acked-by: Felipe Balbi <balbi at ti.com>
+Signed-off-by: Alexander Shishkin <alexander.shishkin at linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
+---
+ drivers/usb/phy/Makefile | 1 +
+ drivers/usb/phy/of.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
+ drivers/usb/usb-common.c | 35 +++++++++++++++++++++++++++++++++++
+ include/linux/usb/of.h | 28 ++++++++++++++++++++++++++++
+ include/linux/usb/otg.h | 7 +++++++
+ include/linux/usb/phy.h | 9 +++++++++
+ 6 files changed, 127 insertions(+)
+ create mode 100644 drivers/usb/phy/of.c
+ create mode 100644 include/linux/usb/of.h
+
+diff --git a/drivers/usb/phy/Makefile b/drivers/usb/phy/Makefile
+index a9169cb..070eca3 100644
+--- a/drivers/usb/phy/Makefile
++++ b/drivers/usb/phy/Makefile
+@@ -5,6 +5,7 @@
+ ccflags-$(CONFIG_USB_DEBUG) := -DDEBUG
+
+ obj-$(CONFIG_USB_PHY) += phy.o
++obj-$(CONFIG_OF) += of.o
+
+ # transceiver drivers, keep the list sorted
+
+diff --git a/drivers/usb/phy/of.c b/drivers/usb/phy/of.c
+new file mode 100644
+index 0000000..7ea0154
+--- /dev/null
++++ b/drivers/usb/phy/of.c
+@@ -0,0 +1,47 @@
++/*
++ * USB of helper code
++ *
++ * 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.
++ */
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/of.h>
++#include <linux/usb/of.h>
++#include <linux/usb/otg.h>
++
++static const char *const usbphy_modes[] = {
++ [USBPHY_INTERFACE_MODE_UNKNOWN] = "",
++ [USBPHY_INTERFACE_MODE_UTMI] = "utmi",
++ [USBPHY_INTERFACE_MODE_UTMIW] = "utmi_wide",
++ [USBPHY_INTERFACE_MODE_ULPI] = "ulpi",
++ [USBPHY_INTERFACE_MODE_SERIAL] = "serial",
++ [USBPHY_INTERFACE_MODE_HSIC] = "hsic",
++};
++
++/**
++ * of_usb_get_phy_mode - Get phy mode for given device_node
++ * @np: Pointer to the given device_node
++ *
++ * The function gets phy interface string from property 'phy_type',
++ * and returns the correspondig enum usb_phy_interface
++ */
++enum usb_phy_interface of_usb_get_phy_mode(struct device_node *np)
++{
++ const char *phy_type;
++ int err, i;
++
++ err = of_property_read_string(np, "phy_type", &phy_type);
++ if (err < 0)
++ return USBPHY_INTERFACE_MODE_UNKNOWN;
++
++ for (i = 0; i < ARRAY_SIZE(usbphy_modes); i++)
++ if (!strcmp(phy_type, usbphy_modes[i]))
++ return i;
++
++ return USBPHY_INTERFACE_MODE_UNKNOWN;
++}
++EXPORT_SYMBOL_GPL(of_usb_get_phy_mode);
+diff --git a/drivers/usb/usb-common.c b/drivers/usb/usb-common.c
+index 0db0a91..675384d 100644
+--- a/drivers/usb/usb-common.c
++++ b/drivers/usb/usb-common.c
+@@ -13,7 +13,9 @@
+
+ #include <linux/kernel.h>
+ #include <linux/module.h>
++#include <linux/of.h>
+ #include <linux/usb/ch9.h>
++#include <linux/usb/of.h>
+ #include <linux/usb/otg.h>
+
+ const char *usb_otg_state_string(enum usb_otg_state state)
+@@ -79,4 +81,37 @@ const char *usb_state_string(enum usb_device_state state)
+ }
+ EXPORT_SYMBOL_GPL(usb_state_string);
+
++#ifdef CONFIG_OF
++static const char *const usb_dr_modes[] = {
++ [USB_DR_MODE_UNKNOWN] = "",
++ [USB_DR_MODE_HOST] = "host",
++ [USB_DR_MODE_PERIPHERAL] = "peripheral",
++ [USB_DR_MODE_OTG] = "otg",
++};
++
++/**
++ * of_usb_get_dr_mode - Get dual role mode for given device_node
++ * @np: Pointer to the given device_node
++ *
++ * The function gets phy interface string from property 'dr_mode',
++ * and returns the correspondig enum usb_dr_mode
++ */
++enum usb_dr_mode of_usb_get_dr_mode(struct device_node *np)
++{
++ const char *dr_mode;
++ int err, i;
++
++ err = of_property_read_string(np, "dr_mode", &dr_mode);
++ if (err < 0)
++ return USB_DR_MODE_UNKNOWN;
++
++ for (i = 0; i < ARRAY_SIZE(usb_dr_modes); i++)
++ if (!strcmp(dr_mode, usb_dr_modes[i]))
++ return i;
++
++ return USB_DR_MODE_UNKNOWN;
++}
++EXPORT_SYMBOL_GPL(of_usb_get_dr_mode);
++#endif
++
+ MODULE_LICENSE("GPL");
+diff --git a/include/linux/usb/of.h b/include/linux/usb/of.h
+new file mode 100644
+index 0000000..e460a24
+--- /dev/null
++++ b/include/linux/usb/of.h
+@@ -0,0 +1,28 @@
++/*
++ * OF helpers for usb devices.
++ *
++ * This file is released under the GPLv2
++ */
++
++#ifndef __LINUX_USB_OF_H
++#define __LINUX_USB_OF_H
++
++#include <linux/usb/otg.h>
++#include <linux/usb/phy.h>
++
++#ifdef CONFIG_OF
++enum usb_phy_interface of_usb_get_phy_mode(struct device_node *np);
++enum usb_dr_mode of_usb_get_dr_mode(struct device_node *np);
++#else
++static inline enum usb_phy_interface of_usb_get_phy_mode(struct device_node *np)
++{
++ return USBPHY_INTERFACE_MODE_UNKNOWN;
++}
++
++static inline enum usb_dr_mode of_usb_get_dr_mode(struct device_node *np)
++{
++ return USB_DR_MODE_UNKNOWN;
++}
++#endif
++
++#endif /* __LINUX_USB_OF_H */
+diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h
+index 291e01b..154332b 100644
+--- a/include/linux/usb/otg.h
++++ b/include/linux/usb/otg.h
+@@ -92,4 +92,11 @@ otg_start_srp(struct usb_otg *otg)
+ /* for OTG controller drivers (and maybe other stuff) */
+ extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num);
+
++enum usb_dr_mode {
++ USB_DR_MODE_UNKNOWN,
++ USB_DR_MODE_HOST,
++ USB_DR_MODE_PERIPHERAL,
++ USB_DR_MODE_OTG,
++};
++
+ #endif /* __LINUX_USB_OTG_H */
+diff --git a/include/linux/usb/phy.h b/include/linux/usb/phy.h
+index 6b5978f..4403680 100644
+--- a/include/linux/usb/phy.h
++++ b/include/linux/usb/phy.h
+@@ -12,6 +12,15 @@
+ #include <linux/notifier.h>
+ #include <linux/usb.h>
+
++enum usb_phy_interface {
++ USBPHY_INTERFACE_MODE_UNKNOWN,
++ USBPHY_INTERFACE_MODE_UTMI,
++ USBPHY_INTERFACE_MODE_UTMIW,
++ USBPHY_INTERFACE_MODE_ULPI,
++ USBPHY_INTERFACE_MODE_SERIAL,
++ USBPHY_INTERFACE_MODE_HSIC,
++};
++
+ enum usb_phy_events {
+ USB_EVENT_NONE, /* no events or cable disconnected */
+ USB_EVENT_VBUS, /* vbus valid event */
+--
+1.8.5.2
+
diff --git a/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0035-usb-chipidea-introduce-dual-role-mode-pdata-flags.patch b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0035-usb-chipidea-introduce-dual-role-mode-pdata-flags.patch
new file mode 100644
index 0000000..064f8fb
--- /dev/null
+++ b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0035-usb-chipidea-introduce-dual-role-mode-pdata-flags.patch
@@ -0,0 +1,90 @@
+From def830ffbd488f87816f58fc09dae857c98ad354 Mon Sep 17 00:00:00 2001
+From: Sascha Hauer <s.hauer at pengutronix.de>
+Date: Thu, 13 Jun 2013 17:59:57 +0300
+Subject: [PATCH 10/21] usb: chipidea: introduce dual role mode pdata flags
+
+Even if a chipidea core is otg capable the board may not be. This allows
+to explicitly set the core to host/peripheral mode. Without these flags
+the driver falls back to the old behaviour.
+
+Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
+Signed-off-by: Alexander Shishkin <alexander.shishkin at linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
+---
+ .../devicetree/bindings/usb/ci13xxx-imx.txt | 1 +
+ drivers/usb/chipidea/core.c | 24 ++++++++++++++++------
+ include/linux/usb/chipidea.h | 2 +-
+ 3 files changed, 20 insertions(+), 7 deletions(-)
+
+diff --git a/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt b/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
+index 184a8e0..b4b5b79 100644
+--- a/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
++++ b/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
+@@ -9,6 +9,7 @@ Recommended properies:
+ - phy_type: the type of the phy connected to the core. Should be one
+ of "utmi", "utmi_wide", "ulpi", "serial" or "hsic". Without this
+ property the PORTSC register won't be touched
++- dr_mode: One of "host", "peripheral" or "otg". Defaults to "otg"
+
+ Optional properties:
+ - fsl,usbphy: phandler of usb phy that connects to the only one port
+diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
+index 5740ac2..8ade814 100644
+--- a/drivers/usb/chipidea/core.c
++++ b/drivers/usb/chipidea/core.c
+@@ -406,6 +406,7 @@ static int ci_hdrc_probe(struct platform_device *pdev)
+ struct resource *res;
+ void __iomem *base;
+ int ret;
++ enum usb_dr_mode dr_mode;
+
+ if (!dev->platform_data) {
+ dev_err(dev, "platform data missing\n");
+@@ -457,14 +458,25 @@ static int ci_hdrc_probe(struct platform_device *pdev)
+ if (!ci->platdata->phy_mode)
+ ci->platdata->phy_mode = of_usb_get_phy_mode(dev->of_node);
+
++ if (!ci->platdata->dr_mode)
++ ci->platdata->dr_mode = of_usb_get_dr_mode(dev->of_node);
++
++ if (ci->platdata->dr_mode == USB_DR_MODE_UNKNOWN)
++ ci->platdata->dr_mode = USB_DR_MODE_OTG;
++
++ dr_mode = ci->platdata->dr_mode;
+ /* initialize role(s) before the interrupt is requested */
+- ret = ci_hdrc_host_init(ci);
+- if (ret)
+- dev_info(dev, "doesn't support host\n");
++ if (dr_mode == USB_DR_MODE_OTG || dr_mode == USB_DR_MODE_HOST) {
++ ret = ci_hdrc_host_init(ci);
++ if (ret)
++ dev_info(dev, "doesn't support host\n");
++ }
+
+- ret = ci_hdrc_gadget_init(ci);
+- if (ret)
+- dev_info(dev, "doesn't support gadget\n");
++ if (dr_mode == USB_DR_MODE_OTG || dr_mode == USB_DR_MODE_PERIPHERAL) {
++ ret = ci_hdrc_gadget_init(ci);
++ if (ret)
++ dev_info(dev, "doesn't support gadget\n");
++ }
+
+ if (!ci->roles[CI_ROLE_HOST] && !ci->roles[CI_ROLE_GADGET]) {
+ dev_err(dev, "no supported roles\n");
+diff --git a/include/linux/usb/chipidea.h b/include/linux/usb/chipidea.h
+index 1a2aa18..b314647 100644
+--- a/include/linux/usb/chipidea.h
++++ b/include/linux/usb/chipidea.h
+@@ -20,7 +20,7 @@ struct ci13xxx_platform_data {
+ #define CI13XXX_REQUIRE_TRANSCEIVER BIT(1)
+ #define CI13XXX_PULLUP_ON_VBUS BIT(2)
+ #define CI13XXX_DISABLE_STREAMING BIT(3)
+-
++ enum usb_dr_mode dr_mode;
+ #define CI13XXX_CONTROLLER_RESET_EVENT 0
+ #define CI13XXX_CONTROLLER_STOPPED_EVENT 1
+ void (*notify_event) (struct ci13xxx *ci, unsigned event);
+--
+1.8.5.2
+
diff --git a/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0036-usb-chipidea-ci13xxx-imx-move-static-pdata-into-prob.patch b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0036-usb-chipidea-ci13xxx-imx-move-static-pdata-into-prob.patch
new file mode 100644
index 0000000..069594a
--- /dev/null
+++ b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0036-usb-chipidea-ci13xxx-imx-move-static-pdata-into-prob.patch
@@ -0,0 +1,69 @@
+From e3af21cb67aefd98a5292f58bcc80eaabad55707 Mon Sep 17 00:00:00 2001
+From: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Date: Thu, 13 Jun 2013 17:59:58 +0300
+Subject: [PATCH 11/21] usb: chipidea: ci13xxx-imx: move static pdata into
+ probe function
+
+The pdata structure gets copied anyway inside ci13xxx_add_device
+by platform_device_add. We don't need to have it static.
+
+Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>
+Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
+Reviewed-by: Peter Chen <peter.chen at freescale.com>
+Signed-off-by: Alexander Shishkin <alexander.shishkin at linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
+---
+ drivers/usb/chipidea/ci13xxx_imx.c | 19 +++++++++----------
+ 1 file changed, 9 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/usb/chipidea/ci13xxx_imx.c b/drivers/usb/chipidea/ci13xxx_imx.c
+index aef5b5b..43fa40a 100644
+--- a/drivers/usb/chipidea/ci13xxx_imx.c
++++ b/drivers/usb/chipidea/ci13xxx_imx.c
+@@ -87,17 +87,16 @@ EXPORT_SYMBOL_GPL(usbmisc_get_init_data);
+
+ /* End of common functions shared by usbmisc drivers*/
+
+-static struct ci13xxx_platform_data ci13xxx_imx_platdata = {
+- .name = "ci13xxx_imx",
+- .flags = CI13XXX_REQUIRE_TRANSCEIVER |
+- CI13XXX_PULLUP_ON_VBUS |
+- CI13XXX_DISABLE_STREAMING,
+- .capoffset = DEF_CAPOFFSET,
+-};
+-
+ static int ci13xxx_imx_probe(struct platform_device *pdev)
+ {
+ struct ci13xxx_imx_data *data;
++ struct ci13xxx_platform_data pdata = {
++ .name = "ci13xxx_imx",
++ .capoffset = DEF_CAPOFFSET,
++ .flags = CI13XXX_REQUIRE_TRANSCEIVER |
++ CI13XXX_PULLUP_ON_VBUS |
++ CI13XXX_DISABLE_STREAMING,
++ };
+ struct platform_device *phy_pdev;
+ struct resource *res;
+ int ret;
+@@ -160,7 +159,7 @@ static int ci13xxx_imx_probe(struct platform_device *pdev)
+ data->reg_vbus = NULL;
+ }
+
+- ci13xxx_imx_platdata.phy = data->phy;
++ pdata.phy = data->phy;
+
+ if (!pdev->dev.dma_mask)
+ pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask;
+@@ -178,7 +177,7 @@ static int ci13xxx_imx_probe(struct platform_device *pdev)
+
+ data->ci_pdev = ci13xxx_add_device(&pdev->dev,
+ pdev->resource, pdev->num_resources,
+- &ci13xxx_imx_platdata);
++ &pdata);
+ if (IS_ERR(data->ci_pdev)) {
+ ret = PTR_ERR(data->ci_pdev);
+ dev_err(&pdev->dev,
+--
+1.8.5.2
+
diff --git a/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0037-usb-chipidea-i.MX-use-devm_usb_get_phy_by_phandle-to.patch b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0037-usb-chipidea-i.MX-use-devm_usb_get_phy_by_phandle-to.patch
new file mode 100644
index 0000000..8248506
--- /dev/null
+++ b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0037-usb-chipidea-i.MX-use-devm_usb_get_phy_by_phandle-to.patch
@@ -0,0 +1,100 @@
+From 0585a578c9ec53ea1d2f5f0370a1e4e97f0ea7c0 Mon Sep 17 00:00:00 2001
+From: Sascha Hauer <s.hauer at pengutronix.de>
+Date: Thu, 13 Jun 2013 18:00:00 +0300
+Subject: [PATCH 12/21] usb: chipidea: i.MX: use devm_usb_get_phy_by_phandle to
+ get phy
+
+This patch converts the driver to use devm_usb_get_phy_by_phandle
+which makes the code smaller and a bit simpler.
+
+Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
+Signed-off-by: Alexander Shishkin <alexander.shishkin at linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
+---
+ drivers/usb/chipidea/ci13xxx_imx.c | 32 ++++++++++++--------------------
+ 1 file changed, 12 insertions(+), 20 deletions(-)
+
+diff --git a/drivers/usb/chipidea/ci13xxx_imx.c b/drivers/usb/chipidea/ci13xxx_imx.c
+index 43fa40a..2ec9052 100644
+--- a/drivers/usb/chipidea/ci13xxx_imx.c
++++ b/drivers/usb/chipidea/ci13xxx_imx.c
+@@ -28,7 +28,6 @@
+ ((struct usb_phy *)platform_get_drvdata(pdev))
+
+ struct ci13xxx_imx_data {
+- struct device_node *phy_np;
+ struct usb_phy *phy;
+ struct platform_device *ci_pdev;
+ struct clk *clk;
+@@ -97,9 +96,9 @@ static int ci13xxx_imx_probe(struct platform_device *pdev)
+ CI13XXX_PULLUP_ON_VBUS |
+ CI13XXX_DISABLE_STREAMING,
+ };
+- struct platform_device *phy_pdev;
+ struct resource *res;
+ int ret;
++ struct usb_phy *phy;
+
+ if (of_find_property(pdev->dev.of_node, "fsl,usbmisc", NULL)
+ && !usbmisc_ops)
+@@ -131,18 +130,16 @@ static int ci13xxx_imx_probe(struct platform_device *pdev)
+ return ret;
+ }
+
+- data->phy_np = of_parse_phandle(pdev->dev.of_node, "fsl,usbphy", 0);
+- if (data->phy_np) {
+- phy_pdev = of_find_device_by_node(data->phy_np);
+- if (phy_pdev) {
+- struct usb_phy *phy;
+- phy = pdev_to_phy(phy_pdev);
+- if (phy &&
+- try_module_get(phy_pdev->dev.driver->owner)) {
+- usb_phy_init(phy);
+- data->phy = phy;
+- }
++ phy = devm_usb_get_phy_by_phandle(&pdev->dev, "fsl,usbphy", 0);
++ if (!IS_ERR(phy)) {
++ ret = usb_phy_init(phy);
++ if (ret) {
++ dev_err(&pdev->dev, "unable to init phy: %d\n", ret);
++ goto err_clk;
+ }
++ } else if (PTR_ERR(phy) == -EPROBE_DEFER) {
++ ret = -EPROBE_DEFER;
++ goto err_clk;
+ }
+
+ /* we only support host now, so enable vbus here */
+@@ -153,7 +150,7 @@ static int ci13xxx_imx_probe(struct platform_device *pdev)
+ dev_err(&pdev->dev,
+ "Failed to enable vbus regulator, err=%d\n",
+ ret);
+- goto put_np;
++ goto err_clk;
+ }
+ } else {
+ data->reg_vbus = NULL;
+@@ -207,9 +204,7 @@ disable_device:
+ err:
+ if (data->reg_vbus)
+ regulator_disable(data->reg_vbus);
+-put_np:
+- if (data->phy_np)
+- of_node_put(data->phy_np);
++err_clk:
+ clk_disable_unprepare(data->clk);
+ return ret;
+ }
+@@ -229,9 +224,6 @@ static int ci13xxx_imx_remove(struct platform_device *pdev)
+ module_put(data->phy->dev->driver->owner);
+ }
+
+- if (data->phy_np)
+- of_node_put(data->phy_np);
+-
+ clk_disable_unprepare(data->clk);
+
+ platform_set_drvdata(pdev, NULL);
+--
+1.8.5.2
+
diff --git a/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0038-usb-chipidea-move-hw_phymode_configure-into-probe.patch b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0038-usb-chipidea-move-hw_phymode_configure-into-probe.patch
new file mode 100644
index 0000000..3f61700
--- /dev/null
+++ b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0038-usb-chipidea-move-hw_phymode_configure-into-probe.patch
@@ -0,0 +1,47 @@
+From 072376645f89dc99c42603c7f269a2a6be1cc489 Mon Sep 17 00:00:00 2001
+From: Fabio Estevam <fabio.estevam at freescale.com>
+Date: Wed, 14 Aug 2013 12:43:56 +0300
+Subject: [PATCH 13/21] usb: chipidea: move hw_phymode_configure() into probe
+
+Currently hw_phymode_configure() is located inside hw_device_reset(), which is
+only called by chipidea udc driver.
+
+When operating in host mode, we also need to call hw_phymode_configure() in
+order to properly configure the PHY mode, so move this function into probe.
+
+After this change, USB Host1 port on mx53qsb board is functional.
+
+Signed-off-by: Fabio Estevam <fabio.estevam at freescale.com>
+Tested-by: Arnaud Patard <arnaud.patard at rtp-net.org>
+Reviewed-by: Peter Chen <peter.chen at freescale.com>
+Signed-off-by: Alexander Shishkin <alexander.shishkin at linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
+---
+ drivers/usb/chipidea/core.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
+index 8ade814..4fdb4e2 100644
+--- a/drivers/usb/chipidea/core.c
++++ b/drivers/usb/chipidea/core.c
+@@ -265,8 +265,6 @@ int hw_device_reset(struct ci13xxx *ci, u32 mode)
+ while (hw_read(ci, OP_USBCMD, USBCMD_RST))
+ udelay(10); /* not RTOS friendly */
+
+- hw_phymode_configure(ci);
+-
+ if (ci->platdata->notify_event)
+ ci->platdata->notify_event(ci,
+ CI13XXX_CONTROLLER_RESET_EVENT);
+@@ -458,6 +456,8 @@ static int ci_hdrc_probe(struct platform_device *pdev)
+ if (!ci->platdata->phy_mode)
+ ci->platdata->phy_mode = of_usb_get_phy_mode(dev->of_node);
+
++ hw_phymode_configure(ci);
++
+ if (!ci->platdata->dr_mode)
+ ci->platdata->dr_mode = of_usb_get_dr_mode(dev->of_node);
+
+--
+1.8.5.2
+
diff --git a/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0039-usb-chipidea-ci_hdrc_imx-remove-an-unsolicited-modul.patch b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0039-usb-chipidea-ci_hdrc_imx-remove-an-unsolicited-modul.patch
new file mode 100644
index 0000000..c8b4d3b
--- /dev/null
+++ b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0039-usb-chipidea-ci_hdrc_imx-remove-an-unsolicited-modul.patch
@@ -0,0 +1,39 @@
+From 3ac1bf8ae9b41f47f5989f0a80b02a206efd19c6 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Lothar=20Wa=C3=9Fmann?= <LW at KARO-electronics.de>
+Date: Wed, 14 Aug 2013 12:43:59 +0300
+Subject: [PATCH 14/21] usb: chipidea: ci_hdrc_imx: remove an unsolicited
+ module_put() call from ci_hdrc_imx_remove()
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This prevents the USB PHY refcount to be decremented below zero upon
+unloading the ci-hdrc-imx module.
+
+Signed-off-by: Lothar Waßmann <LW at KARO-electronics.de>
+Acked-by: Peter Chen <peter.chen at freescale.com>
+Signed-off-by: Alexander Shishkin <alexander.shishkin at linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
+---
+ drivers/usb/chipidea/ci13xxx_imx.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/drivers/usb/chipidea/ci13xxx_imx.c b/drivers/usb/chipidea/ci13xxx_imx.c
+index 2ec9052..d81c6a8 100644
+--- a/drivers/usb/chipidea/ci13xxx_imx.c
++++ b/drivers/usb/chipidea/ci13xxx_imx.c
+@@ -219,10 +219,8 @@ static int ci13xxx_imx_remove(struct platform_device *pdev)
+ if (data->reg_vbus)
+ regulator_disable(data->reg_vbus);
+
+- if (data->phy) {
++ if (data->phy)
+ usb_phy_shutdown(data->phy);
+- module_put(data->phy->dev->driver->owner);
+- }
+
+ clk_disable_unprepare(data->clk);
+
+--
+1.8.5.2
+
diff --git a/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0040-usb-chipidea-prevent-endless-loop-registering-platfo.patch b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0040-usb-chipidea-prevent-endless-loop-registering-platfo.patch
new file mode 100644
index 0000000..05ff167
--- /dev/null
+++ b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0040-usb-chipidea-prevent-endless-loop-registering-platfo.patch
@@ -0,0 +1,71 @@
+From cd839fc541d83398f2aeaabc343229ff306df16e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Lothar=20Wa=C3=9Fmann?= <LW at KARO-electronics.de>
+Date: Wed, 14 Aug 2013 12:44:01 +0300
+Subject: [PATCH 15/21] usb: chipidea: prevent endless loop registering
+ platform_devices when probe fails
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Commit 40dcd0e ("usb: chipidea: add PTW, PTS and STS handling") introduced
+the following code to the ci_hdrc_probe() function:
+
++ if (!dev->of_node && dev->parent)
++ dev->of_node = dev->parent->of_node;
+
+This inadvertently associates the ci_hdrc device with the ci_hdrc_imx
+driver (which created the ci_hdrc device in the first place).
+
+This results in ci_hdrc_imx_probe() being run for the ci_hdrc device
+if ci_hdrc_probe() fails for some reason.
+ci_hdrc_imx_probe() will happily create a new ci_hdrc platform_device
+whose probing will likewise fail and trigger a new invocation of
+ci_hdrc_imx_probe() ... ad nauseam.
+
+Signed-off-by: Lothar Waßmann <LW at KARO-electronics.de>
+Reviewed-and-tested-by: Peter Chen <peter.chen at freescale.com>
+Signed-off-by: Alexander Shishkin <alexander.shishkin at linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
+---
+ drivers/usb/chipidea/core.c | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
+index 4fdb4e2..d0e0e2f 100644
+--- a/drivers/usb/chipidea/core.c
++++ b/drivers/usb/chipidea/core.c
+@@ -405,15 +405,13 @@ static int ci_hdrc_probe(struct platform_device *pdev)
+ void __iomem *base;
+ int ret;
+ enum usb_dr_mode dr_mode;
++ struct device_node *of_node = dev->of_node ?: dev->parent->of_node;
+
+ if (!dev->platform_data) {
+ dev_err(dev, "platform data missing\n");
+ return -ENODEV;
+ }
+
+- if (!dev->of_node && dev->parent)
+- dev->of_node = dev->parent->of_node;
+-
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ base = devm_ioremap_resource(dev, res);
+ if (IS_ERR(base))
+@@ -454,12 +452,12 @@ static int ci_hdrc_probe(struct platform_device *pdev)
+ }
+
+ if (!ci->platdata->phy_mode)
+- ci->platdata->phy_mode = of_usb_get_phy_mode(dev->of_node);
++ ci->platdata->phy_mode = of_usb_get_phy_mode(of_node);
+
+ hw_phymode_configure(ci);
+
+ if (!ci->platdata->dr_mode)
+- ci->platdata->dr_mode = of_usb_get_dr_mode(dev->of_node);
++ ci->platdata->dr_mode = of_usb_get_dr_mode(of_node);
+
+ if (ci->platdata->dr_mode == USB_DR_MODE_UNKNOWN)
+ ci->platdata->dr_mode = USB_DR_MODE_OTG;
+--
+1.8.5.2
+
diff --git a/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0041-usb-chipidea-move-vbus-regulator-operation-to-core.patch b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0041-usb-chipidea-move-vbus-regulator-operation-to-core.patch
new file mode 100644
index 0000000..654a8d7
--- /dev/null
+++ b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0041-usb-chipidea-move-vbus-regulator-operation-to-core.patch
@@ -0,0 +1,161 @@
+From c6f0b1db75ab03cd9113ed8a61049d6188737ebd Mon Sep 17 00:00:00 2001
+From: Peter Chen <peter.chen at freescale.com>
+Date: Wed, 14 Aug 2013 12:44:03 +0300
+Subject: [PATCH 16/21] usb: chipidea: move vbus regulator operation to core
+
+The vbus regulator is a common element for USB vbus operation,
+So, move it from glue layer to core.
+
+Tested-by: Marek Vasut <marex at denx.de>
+Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Signed-off-by: Peter Chen <peter.chen at freescale.com>
+Signed-off-by: Alexander Shishkin <alexander.shishkin at linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
+---
+ drivers/usb/chipidea/ci13xxx_imx.c | 26 ++------------------------
+ drivers/usb/chipidea/core.c | 23 +++++++++++++++++++++++
+ include/linux/usb/chipidea.h | 1 +
+ 3 files changed, 26 insertions(+), 24 deletions(-)
+
+diff --git a/drivers/usb/chipidea/ci13xxx_imx.c b/drivers/usb/chipidea/ci13xxx_imx.c
+index d81c6a8..557659c 100644
+--- a/drivers/usb/chipidea/ci13xxx_imx.c
++++ b/drivers/usb/chipidea/ci13xxx_imx.c
+@@ -19,7 +19,6 @@
+ #include <linux/dma-mapping.h>
+ #include <linux/usb/chipidea.h>
+ #include <linux/clk.h>
+-#include <linux/regulator/consumer.h>
+
+ #include "ci.h"
+ #include "ci13xxx_imx.h"
+@@ -31,7 +30,6 @@ struct ci13xxx_imx_data {
+ struct usb_phy *phy;
+ struct platform_device *ci_pdev;
+ struct clk *clk;
+- struct regulator *reg_vbus;
+ };
+
+ static const struct usbmisc_ops *usbmisc_ops;
+@@ -142,20 +140,6 @@ static int ci13xxx_imx_probe(struct platform_device *pdev)
+ goto err_clk;
+ }
+
+- /* we only support host now, so enable vbus here */
+- data->reg_vbus = devm_regulator_get(&pdev->dev, "vbus");
+- if (!IS_ERR(data->reg_vbus)) {
+- ret = regulator_enable(data->reg_vbus);
+- if (ret) {
+- dev_err(&pdev->dev,
+- "Failed to enable vbus regulator, err=%d\n",
+- ret);
+- goto err_clk;
+- }
+- } else {
+- data->reg_vbus = NULL;
+- }
+-
+ pdata.phy = data->phy;
+
+ if (!pdev->dev.dma_mask)
+@@ -168,7 +152,7 @@ static int ci13xxx_imx_probe(struct platform_device *pdev)
+ if (ret) {
+ dev_err(&pdev->dev,
+ "usbmisc init failed, ret=%d\n", ret);
+- goto err;
++ goto err_clk;
+ }
+ }
+
+@@ -180,7 +164,7 @@ static int ci13xxx_imx_probe(struct platform_device *pdev)
+ dev_err(&pdev->dev,
+ "Can't register ci_hdrc platform device, err=%d\n",
+ ret);
+- goto err;
++ goto err_clk;
+ }
+
+ if (usbmisc_ops && usbmisc_ops->post) {
+@@ -201,9 +185,6 @@ static int ci13xxx_imx_probe(struct platform_device *pdev)
+
+ disable_device:
+ ci13xxx_remove_device(data->ci_pdev);
+-err:
+- if (data->reg_vbus)
+- regulator_disable(data->reg_vbus);
+ err_clk:
+ clk_disable_unprepare(data->clk);
+ return ret;
+@@ -216,9 +197,6 @@ static int ci13xxx_imx_remove(struct platform_device *pdev)
+ pm_runtime_disable(&pdev->dev);
+ ci13xxx_remove_device(data->ci_pdev);
+
+- if (data->reg_vbus)
+- regulator_disable(data->reg_vbus);
+-
+ if (data->phy)
+ usb_phy_shutdown(data->phy);
+
+diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
+index d0e0e2f..aa7a3d6 100644
+--- a/drivers/usb/chipidea/core.c
++++ b/drivers/usb/chipidea/core.c
+@@ -66,6 +66,7 @@
+ #include <linux/usb/chipidea.h>
+ #include <linux/usb/of.h>
+ #include <linux/phy.h>
++#include <linux/regulator/consumer.h>
+
+ #include "ci.h"
+ #include "udc.h"
+@@ -343,6 +344,24 @@ static irqreturn_t ci_irq(int irq, void *data)
+ return ret;
+ }
+
++static int ci_get_platdata(struct device *dev,
++ struct ci13xxx_platform_data *platdata)
++{
++ /* Get the vbus regulator */
++ platdata->reg_vbus = devm_regulator_get(dev, "vbus");
++ if (PTR_ERR(platdata->reg_vbus) == -EPROBE_DEFER) {
++ return -EPROBE_DEFER;
++ } else if (PTR_ERR(platdata->reg_vbus) == -ENODEV) {
++ platdata->reg_vbus = NULL; /* no vbus regualator is needed */
++ } else if (IS_ERR(platdata->reg_vbus)) {
++ dev_err(dev, "Getting regulator error: %ld\n",
++ PTR_ERR(platdata->reg_vbus));
++ return PTR_ERR(platdata->reg_vbus);
++ }
++
++ return 0;
++}
++
+ static DEFINE_IDA(ci_ida);
+
+ struct platform_device *ci13xxx_add_device(struct device *dev,
+@@ -352,6 +371,10 @@ struct platform_device *ci13xxx_add_device(struct device *dev,
+ struct platform_device *pdev;
+ int id, ret;
+
++ ret = ci_get_platdata(dev, platdata);
++ if (ret)
++ return ERR_PTR(ret);
++
+ id = ida_simple_get(&ci_ida, 0, 0, GFP_KERNEL);
+ if (id < 0)
+ return ERR_PTR(id);
+diff --git a/include/linux/usb/chipidea.h b/include/linux/usb/chipidea.h
+index b314647..35901ed 100644
+--- a/include/linux/usb/chipidea.h
++++ b/include/linux/usb/chipidea.h
+@@ -24,6 +24,7 @@ struct ci13xxx_platform_data {
+ #define CI13XXX_CONTROLLER_RESET_EVENT 0
+ #define CI13XXX_CONTROLLER_STOPPED_EVENT 1
+ void (*notify_event) (struct ci13xxx *ci, unsigned event);
++ struct regulator *reg_vbus;
+ };
+
+ /* Default offset of capability registers */
+--
+1.8.5.2
+
diff --git a/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0042-usb-chipidea-host-add-vbus-regulator-control.patch b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0042-usb-chipidea-host-add-vbus-regulator-control.patch
new file mode 100644
index 0000000..32cb4b9
--- /dev/null
+++ b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0042-usb-chipidea-host-add-vbus-regulator-control.patch
@@ -0,0 +1,85 @@
+From 05f6cd40eeeb7cdba2db48fd094215fdcaf2a712 Mon Sep 17 00:00:00 2001
+From: Peter Chen <peter.chen at freescale.com>
+Date: Wed, 14 Aug 2013 12:44:04 +0300
+Subject: [PATCH 17/21] usb: chipidea: host: add vbus regulator control
+
+For boards which have board level vbus control (eg, through gpio), we
+need to vbus operation according to below rules:
+- For host, we need open vbus before start hcd, and close it
+after remove hcd.
+- For otg, the vbus needs to be on/off when usb role switches.
+When the host roles begins, it opens vbus; when the host role
+finishes, it closes vbus.
+
+We put vbus operation to host as host is the only vbus user,
+When we are at host mode, the vbus is on, when we are not at
+host mode, vbus should be off.
+
+Tested-by: Marek Vasut <marex at denx.de>
+Signed-off-by: Peter Chen <peter.chen at freescale.com>
+Signed-off-by: Alexander Shishkin <alexander.shishkin at linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
+---
+ drivers/usb/chipidea/host.c | 23 ++++++++++++++++++++++-
+ 1 file changed, 22 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/usb/chipidea/host.c b/drivers/usb/chipidea/host.c
+index 8e9d312..6dbbcc5 100644
+--- a/drivers/usb/chipidea/host.c
++++ b/drivers/usb/chipidea/host.c
+@@ -24,6 +24,7 @@
+ #include <linux/usb.h>
+ #include <linux/usb/hcd.h>
+ #include <linux/usb/chipidea.h>
++#include <linux/regulator/consumer.h>
+
+ #include "../host/ehci.h"
+
+@@ -64,9 +65,19 @@ static int host_start(struct ci13xxx *ci)
+ ehci->caps = ci->hw_bank.cap;
+ ehci->has_hostpc = ci->hw_bank.lpm;
+
++ if (ci->platdata->reg_vbus) {
++ ret = regulator_enable(ci->platdata->reg_vbus);
++ if (ret) {
++ dev_err(ci->dev,
++ "Failed to enable vbus regulator, ret=%d\n",
++ ret);
++ goto put_hcd;
++ }
++ }
++
+ ret = usb_add_hcd(hcd, 0, 0);
+ if (ret)
+- usb_put_hcd(hcd);
++ goto disable_reg;
+ else
+ ci->hcd = hcd;
+
+@@ -74,6 +85,14 @@ static int host_start(struct ci13xxx *ci)
+ hw_write(ci, OP_USBMODE, USBMODE_CI_SDIS, USBMODE_CI_SDIS);
+
+ return ret;
++
++disable_reg:
++ regulator_disable(ci->platdata->reg_vbus);
++
++put_hcd:
++ usb_put_hcd(hcd);
++
++ return ret;
+ }
+
+ static void host_stop(struct ci13xxx *ci)
+@@ -82,6 +101,8 @@ static void host_stop(struct ci13xxx *ci)
+
+ usb_remove_hcd(hcd);
+ usb_put_hcd(hcd);
++ if (ci->platdata->reg_vbus)
++ regulator_disable(ci->platdata->reg_vbus);
+ }
+
+ int ci_hdrc_host_init(struct ci13xxx *ci)
+--
+1.8.5.2
+
diff --git a/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0043-ARM-dts-imx-add-imx5x-usbmisc-entries.patch b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0043-ARM-dts-imx-add-imx5x-usbmisc-entries.patch
new file mode 100644
index 0000000..f8be301
--- /dev/null
+++ b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0043-ARM-dts-imx-add-imx5x-usbmisc-entries.patch
@@ -0,0 +1,105 @@
+From 988d6b3e41eabd200cea386299023167b84d66bc Mon Sep 17 00:00:00 2001
+From: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Date: Thu, 11 Apr 2013 12:13:14 +0200
+Subject: [PATCH 18/21] ARM: dts: imx: add imx5x usbmisc entries
+
+Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Signed-off-by: Shawn Guo <shawn.guo at linaro.org>
+---
+ arch/arm/boot/dts/imx51.dtsi | 10 ++++++++++
+ arch/arm/boot/dts/imx53.dtsi | 10 ++++++++++
+ 2 files changed, 20 insertions(+)
+
+diff --git a/arch/arm/boot/dts/imx51.dtsi b/arch/arm/boot/dts/imx51.dtsi
+index 5ef1b31..1dbf016 100644
+--- a/arch/arm/boot/dts/imx51.dtsi
++++ b/arch/arm/boot/dts/imx51.dtsi
+@@ -180,6 +180,7 @@
+ compatible = "fsl,imx51-usb", "fsl,imx27-usb";
+ reg = <0x73f80000 0x0200>;
+ interrupts = <18>;
++ fsl,usbmisc = <&usbmisc 0>;
+ status = "disabled";
+ };
+
+@@ -187,6 +188,7 @@
+ compatible = "fsl,imx51-usb", "fsl,imx27-usb";
+ reg = <0x73f80200 0x0200>;
+ interrupts = <14>;
++ fsl,usbmisc = <&usbmisc 1>;
+ status = "disabled";
+ };
+
+@@ -194,6 +196,7 @@
+ compatible = "fsl,imx51-usb", "fsl,imx27-usb";
+ reg = <0x73f80400 0x0200>;
+ interrupts = <16>;
++ fsl,usbmisc = <&usbmisc 2>;
+ status = "disabled";
+ };
+
+@@ -201,9 +204,16 @@
+ compatible = "fsl,imx51-usb", "fsl,imx27-usb";
+ reg = <0x73f80600 0x0200>;
+ interrupts = <17>;
++ fsl,usbmisc = <&usbmisc 3>;
+ status = "disabled";
+ };
+
++ usbmisc: usbmisc at 73f80800 {
++ #index-cells = <1>;
++ compatible = "fsl,imx51-usbmisc";
++ reg = <0x73f80800 0x200>;
++ };
++
+ gpio1: gpio at 73f84000 {
+ compatible = "fsl,imx51-gpio", "fsl,imx35-gpio";
+ reg = <0x73f84000 0x4000>;
+diff --git a/arch/arm/boot/dts/imx53.dtsi b/arch/arm/boot/dts/imx53.dtsi
+index 682be13..09d7c69 100644
+--- a/arch/arm/boot/dts/imx53.dtsi
++++ b/arch/arm/boot/dts/imx53.dtsi
+@@ -176,6 +176,7 @@
+ compatible = "fsl,imx53-usb", "fsl,imx27-usb";
+ reg = <0x53f80000 0x0200>;
+ interrupts = <18>;
++ fsl,usbmisc = <&usbmisc 0>;
+ status = "disabled";
+ };
+
+@@ -183,6 +184,7 @@
+ compatible = "fsl,imx53-usb", "fsl,imx27-usb";
+ reg = <0x53f80200 0x0200>;
+ interrupts = <14>;
++ fsl,usbmisc = <&usbmisc 1>;
+ status = "disabled";
+ };
+
+@@ -190,6 +192,7 @@
+ compatible = "fsl,imx53-usb", "fsl,imx27-usb";
+ reg = <0x53f80400 0x0200>;
+ interrupts = <16>;
++ fsl,usbmisc = <&usbmisc 2>;
+ status = "disabled";
+ };
+
+@@ -197,9 +200,16 @@
+ compatible = "fsl,imx53-usb", "fsl,imx27-usb";
+ reg = <0x53f80600 0x0200>;
+ interrupts = <17>;
++ fsl,usbmisc = <&usbmisc 3>;
+ status = "disabled";
+ };
+
++ usbmisc: usbmisc at 53f80800 {
++ #index-cells = <1>;
++ compatible = "fsl,imx53-usbmisc";
++ reg = <0x53f80800 0x200>;
++ };
++
+ gpio1: gpio at 53f84000 {
+ compatible = "fsl,imx53-gpio", "fsl,imx35-gpio";
+ reg = <0x53f84000 0x4000>;
+--
+1.8.5.2
+
diff --git a/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0044-ARM-dts-imx-add-imx5x-usb-clock-DT-lookups.patch b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0044-ARM-dts-imx-add-imx5x-usb-clock-DT-lookups.patch
new file mode 100644
index 0000000..278fdfb
--- /dev/null
+++ b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0044-ARM-dts-imx-add-imx5x-usb-clock-DT-lookups.patch
@@ -0,0 +1,103 @@
+From ce37aa95f40c19a7cac036ef161ac31e0f5002d8 Mon Sep 17 00:00:00 2001
+From: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Date: Thu, 11 Apr 2013 12:13:15 +0200
+Subject: [PATCH 19/21] ARM: dts: imx: add imx5x usb clock DT lookups
+
+Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Signed-off-by: Shawn Guo <shawn.guo at linaro.org>
+---
+ arch/arm/boot/dts/imx51.dtsi | 5 +++++
+ arch/arm/boot/dts/imx53.dtsi | 5 +++++
+ 2 files changed, 10 insertions(+)
+
+diff --git a/arch/arm/boot/dts/imx51.dtsi b/arch/arm/boot/dts/imx51.dtsi
+index 1dbf016..2f43dda 100644
+--- a/arch/arm/boot/dts/imx51.dtsi
++++ b/arch/arm/boot/dts/imx51.dtsi
+@@ -180,6 +180,7 @@
+ compatible = "fsl,imx51-usb", "fsl,imx27-usb";
+ reg = <0x73f80000 0x0200>;
+ interrupts = <18>;
++ clocks = <&clks 108>;
+ fsl,usbmisc = <&usbmisc 0>;
+ status = "disabled";
+ };
+@@ -188,6 +189,7 @@
+ compatible = "fsl,imx51-usb", "fsl,imx27-usb";
+ reg = <0x73f80200 0x0200>;
+ interrupts = <14>;
++ clocks = <&clks 108>;
+ fsl,usbmisc = <&usbmisc 1>;
+ status = "disabled";
+ };
+@@ -196,6 +198,7 @@
+ compatible = "fsl,imx51-usb", "fsl,imx27-usb";
+ reg = <0x73f80400 0x0200>;
+ interrupts = <16>;
++ clocks = <&clks 108>;
+ fsl,usbmisc = <&usbmisc 2>;
+ status = "disabled";
+ };
+@@ -204,6 +207,7 @@
+ compatible = "fsl,imx51-usb", "fsl,imx27-usb";
+ reg = <0x73f80600 0x0200>;
+ interrupts = <17>;
++ clocks = <&clks 108>;
+ fsl,usbmisc = <&usbmisc 3>;
+ status = "disabled";
+ };
+@@ -212,6 +216,7 @@
+ #index-cells = <1>;
+ compatible = "fsl,imx51-usbmisc";
+ reg = <0x73f80800 0x200>;
++ clocks = <&clks 108>;
+ };
+
+ gpio1: gpio at 73f84000 {
+diff --git a/arch/arm/boot/dts/imx53.dtsi b/arch/arm/boot/dts/imx53.dtsi
+index 09d7c69..83fbb2b 100644
+--- a/arch/arm/boot/dts/imx53.dtsi
++++ b/arch/arm/boot/dts/imx53.dtsi
+@@ -176,6 +176,7 @@
+ compatible = "fsl,imx53-usb", "fsl,imx27-usb";
+ reg = <0x53f80000 0x0200>;
+ interrupts = <18>;
++ clocks = <&clks 108>;
+ fsl,usbmisc = <&usbmisc 0>;
+ status = "disabled";
+ };
+@@ -184,6 +185,7 @@
+ compatible = "fsl,imx53-usb", "fsl,imx27-usb";
+ reg = <0x53f80200 0x0200>;
+ interrupts = <14>;
++ clocks = <&clks 108>;
+ fsl,usbmisc = <&usbmisc 1>;
+ status = "disabled";
+ };
+@@ -192,6 +194,7 @@
+ compatible = "fsl,imx53-usb", "fsl,imx27-usb";
+ reg = <0x53f80400 0x0200>;
+ interrupts = <16>;
++ clocks = <&clks 108>;
+ fsl,usbmisc = <&usbmisc 2>;
+ status = "disabled";
+ };
+@@ -200,6 +203,7 @@
+ compatible = "fsl,imx53-usb", "fsl,imx27-usb";
+ reg = <0x53f80600 0x0200>;
+ interrupts = <17>;
++ clocks = <&clks 108>;
+ fsl,usbmisc = <&usbmisc 3>;
+ status = "disabled";
+ };
+@@ -208,6 +212,7 @@
+ #index-cells = <1>;
+ compatible = "fsl,imx53-usbmisc";
+ reg = <0x53f80800 0x200>;
++ clocks = <&clks 108>;
+ };
+
+ gpio1: gpio at 53f84000 {
+--
+1.8.5.2
+
diff --git a/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0045-ARM-dts-imx-use-usb-nop-xceiv-usbphy-entries-for-imx.patch b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0045-ARM-dts-imx-use-usb-nop-xceiv-usbphy-entries-for-imx.patch
new file mode 100644
index 0000000..6e3ac5c
--- /dev/null
+++ b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0045-ARM-dts-imx-use-usb-nop-xceiv-usbphy-entries-for-imx.patch
@@ -0,0 +1,81 @@
+From 0861282b1d08164ad1a6477992ff40ba91422e2a Mon Sep 17 00:00:00 2001
+From: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Date: Thu, 11 Apr 2013 12:13:16 +0200
+Subject: [PATCH 20/21] ARM: dts: imx: use usb-nop-xceiv usbphy entries for
+ imx5x
+
+Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Signed-off-by: Shawn Guo <shawn.guo at linaro.org>
+---
+ arch/arm/boot/dts/imx51.dtsi | 8 ++++++++
+ arch/arm/boot/dts/imx53.dtsi | 16 ++++++++++++++++
+ 2 files changed, 24 insertions(+)
+
+diff --git a/arch/arm/boot/dts/imx51.dtsi b/arch/arm/boot/dts/imx51.dtsi
+index 2f43dda..c396094 100644
+--- a/arch/arm/boot/dts/imx51.dtsi
++++ b/arch/arm/boot/dts/imx51.dtsi
+@@ -176,12 +176,20 @@
+ };
+ };
+
++ usbphy0: usbphy at 0 {
++ compatible = "usb-nop-xceiv";
++ clocks = <&clks 124>;
++ clock-names = "main_clk";
++ status = "okay";
++ };
++
+ usbotg: usb at 73f80000 {
+ compatible = "fsl,imx51-usb", "fsl,imx27-usb";
+ reg = <0x73f80000 0x0200>;
+ interrupts = <18>;
+ clocks = <&clks 108>;
+ fsl,usbmisc = <&usbmisc 0>;
++ fsl,usbphy = <&usbphy0>;
+ status = "disabled";
+ };
+
+diff --git a/arch/arm/boot/dts/imx53.dtsi b/arch/arm/boot/dts/imx53.dtsi
+index 83fbb2b..b05aadc 100644
+--- a/arch/arm/boot/dts/imx53.dtsi
++++ b/arch/arm/boot/dts/imx53.dtsi
+@@ -172,12 +172,27 @@
+ };
+ };
+
++ usbphy0: usbphy at 0 {
++ compatible = "usb-nop-xceiv";
++ clocks = <&clks 124>;
++ clock-names = "main_clk";
++ status = "okay";
++ };
++
++ usbphy1: usbphy at 1 {
++ compatible = "usb-nop-xceiv";
++ clocks = <&clks 125>;
++ clock-names = "main_clk";
++ status = "okay";
++ };
++
+ usbotg: usb at 53f80000 {
+ compatible = "fsl,imx53-usb", "fsl,imx27-usb";
+ reg = <0x53f80000 0x0200>;
+ interrupts = <18>;
+ clocks = <&clks 108>;
+ fsl,usbmisc = <&usbmisc 0>;
++ fsl,usbphy = <&usbphy0>;
+ status = "disabled";
+ };
+
+@@ -187,6 +202,7 @@
+ interrupts = <14>;
+ clocks = <&clks 108>;
+ fsl,usbmisc = <&usbmisc 1>;
++ fsl,usbphy = <&usbphy1>;
+ status = "disabled";
+ };
+
+--
+1.8.5.2
+
diff --git a/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0046-ARM-dts-imx53-Add-USB-support-for-M53EVK.patch b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0046-ARM-dts-imx53-Add-USB-support-for-M53EVK.patch
new file mode 100644
index 0000000..6647910
--- /dev/null
+++ b/meta-eldk/recipes-kernel/linux/linux-eldk/eldk/0046-ARM-dts-imx53-Add-USB-support-for-M53EVK.patch
@@ -0,0 +1,62 @@
+From 6a887f0bef1b85387f651624e0719ae512db9d0f Mon Sep 17 00:00:00 2001
+From: Marek Vasut <marex at denx.de>
+Date: Sun, 17 Nov 2013 04:04:50 +0100
+Subject: [PATCH 21/21] ARM: dts: imx53: Add USB support for M53EVK
+
+Add USB support for M53EVK. The configuration is such that USB Host1
+port is used as Host and the USB OTG port is used as Peripheral thus
+far. Once OTG is properly fixed, the OTG will be further adjusted.
+
+Signed-off-by: Marek Vasut <marex at denx.de>
+Signed-off-by: Shawn Guo <shawn.guo at linaro.org>
+---
+ arch/arm/boot/dts/imx53-m53evk.dts | 22 ++++++++++++++++++++++
+ 1 file changed, 22 insertions(+)
+
+diff --git a/arch/arm/boot/dts/imx53-m53evk.dts b/arch/arm/boot/dts/imx53-m53evk.dts
+index b51bc9d..c16f451 100644
+--- a/arch/arm/boot/dts/imx53-m53evk.dts
++++ b/arch/arm/boot/dts/imx53-m53evk.dts
+@@ -75,6 +75,15 @@
+ regulator-max-microvolt = <3200000>;
+ regulator-always-on;
+ };
++
++ reg_usbh1_vbus: regulator {
++ compatible = "regulator-fixed";
++ regulator-name = "vbus";
++ regulator-min-microvolt = <5000000>;
++ regulator-max-microvolt = <5000000>;
++ gpio = <&gpio1 2 0>;
++ enable-active-low;
++ };
+ };
+
+ sound {
+@@ -149,6 +158,8 @@
+ MX53_PAD_EIM_EB3__GPIO2_31 0x80000000
+ MX53_PAD_PATA_DA_0__GPIO7_6 0x80000000
+ MX53_PAD_DISP0_DAT8__PWM1_PWMO 0x5
++ MX53_PAD_GPIO_2__GPIO1_2 0x84
++ MX53_PAD_GPIO_3__USBOH3_USBH1_OC 0x84
+ >;
+ };
+
+@@ -256,3 +267,14 @@
+ phy-mode = "rmii";
+ status = "okay";
+ };
++
++&usbh1 {
++ vbus-supply = <®_usbh1_vbus>;
++ phy_type = "utmi";
++ status = "okay";
++};
++
++&usbotg {
++ dr_mode = "peripheral";
++ status = "okay";
++};
+--
+1.8.5.2
+
diff --git a/meta-eldk/recipes-kernel/linux/linux-eldk/m53evk/defconfig b/meta-eldk/recipes-kernel/linux/linux-eldk/m53evk/defconfig
index 5415d0c..b7c2935 100644
--- a/meta-eldk/recipes-kernel/linux/linux-eldk/m53evk/defconfig
+++ b/meta-eldk/recipes-kernel/linux/linux-eldk/m53evk/defconfig
@@ -216,6 +216,7 @@ CONFIG_USB_STORAGE=y
CONFIG_USB_CHIPIDEA=y
CONFIG_USB_CHIPIDEA_HOST=y
CONFIG_USB_PHY=y
+CONFIG_NOP_USB_XCEIV=y
CONFIG_USB_MXS_PHY=y
CONFIG_MMC=y
CONFIG_MMC_SDHCI=y
diff --git a/meta-eldk/recipes-kernel/linux/linux-eldk_3.10.bb b/meta-eldk/recipes-kernel/linux/linux-eldk_3.10.bb
index b69b025..1b576da 100644
--- a/meta-eldk/recipes-kernel/linux/linux-eldk_3.10.bb
+++ b/meta-eldk/recipes-kernel/linux/linux-eldk_3.10.bb
@@ -45,6 +45,27 @@ SRC_URI = "git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
file://0023-ARM-dts-imx53-Switch-DISP_CLK-polarity-on-M53EVK.patch \
file://0024-ARM-dts-mxs-Fix-the-RTC-compatible-prop-on-M28EVK.patch \
file://0025-ARM-dts-imx-Add-alias-for-ethernet-controller.patch \
+ file://0026-usb-chipidea-ci13xxx_imx-let-device-core-handle-pinc.patch \
+ file://0027-usb-chipidea-usbmisc_imx-Staticize-usbmisc_imx_drv_i.patch \
+ file://0028-usb-chipidea-udc-configure-iso-endpoints.patch \
+ file://0029-usb-chipidea-ci13xxx_imx-fix-error-path.patch \
+ file://0030-usb-chipidea-ci13xxx_imx-remove-reg_vbus.patch \
+ file://0031-usb-chipidea-ci13xxx_imx-check-if-data-phy_np-is-not.patch \
+ file://0032-usb-chipidea-ci13xxx_imx-remove-phy_np.patch \
+ file://0033-usb-chipidea-add-PTW-PTS-and-STS-handling.patch \
+ file://0034-usb-add-devicetree-helpers-for-determining-dr_mode-a.patch \
+ file://0035-usb-chipidea-introduce-dual-role-mode-pdata-flags.patch \
+ file://0036-usb-chipidea-ci13xxx-imx-move-static-pdata-into-prob.patch \
+ file://0037-usb-chipidea-i.MX-use-devm_usb_get_phy_by_phandle-to.patch \
+ file://0038-usb-chipidea-move-hw_phymode_configure-into-probe.patch \
+ file://0039-usb-chipidea-ci_hdrc_imx-remove-an-unsolicited-modul.patch \
+ file://0040-usb-chipidea-prevent-endless-loop-registering-platfo.patch \
+ file://0041-usb-chipidea-move-vbus-regulator-operation-to-core.patch \
+ file://0042-usb-chipidea-host-add-vbus-regulator-control.patch \
+ file://0043-ARM-dts-imx-add-imx5x-usbmisc-entries.patch \
+ file://0044-ARM-dts-imx-add-imx5x-usb-clock-DT-lookups.patch \
+ file://0045-ARM-dts-imx-use-usb-nop-xceiv-usbphy-entries-for-imx.patch \
+ file://0046-ARM-dts-imx53-Add-USB-support-for-M53EVK.patch \
file://defconfig"
LINUX_VERSION ?= "3.10.28"
--
1.8.5.2
More information about the eldk
mailing list