[kernel] r20160 - in dists/sid/linux/debian/patches: . bugfix/arm features/arm

Arnaud Patard rtp-guest at alioth.debian.org
Fri May 31 22:09:45 UTC 2013


Author: rtp-guest
Date: Fri May 31 22:09:44 2013
New Revision: 20160

Log:
- backport fixes/support from newer kernels needed by some arm platforms
- add some fixes to make some arm-related drivers work when used as module and not built-in

Added:
   dists/sid/linux/debian/patches/bugfix/arm/i2c-imx-add-module_device_table.patch
   dists/sid/linux/debian/patches/bugfix/arm/imx-sgtl5000-probe-defer.patch
   dists/sid/linux/debian/patches/bugfix/arm/mvneta-module-fix.patch
   dists/sid/linux/debian/patches/features/arm/0001-ARM-mvebu-Add-thermal-support-to-Armada-XP-device-tr.patch
   dists/sid/linux/debian/patches/features/arm/0001-thermal-Add-driver-for-Armada-370-XP-SoC-thermal-man.patch
   dists/sid/linux/debian/patches/features/arm/0001-usb-chipidea-usbmisc-add-mx53-support.patch
   dists/sid/linux/debian/patches/features/arm/0001-usb-chipidea-usbmisc-add-post-handling-and-errata-fi.patch
   dists/sid/linux/debian/patches/features/arm/0001-usb-chipidea-usbmisc-fix-a-potential-race-condition.patch
   dists/sid/linux/debian/patches/features/arm/0001-usb-chipidea-usbmisc-prepare-driver-to-handle-more-t.patch
   dists/sid/linux/debian/patches/features/arm/0001-usb-chipidea-usbmisc-rename-file-struct-and-function.patch
   dists/sid/linux/debian/patches/features/arm/0001-usb-chipidea-usbmisc-unset-global-varibale-usbmisc-o.patch
   dists/sid/linux/debian/patches/features/arm/0001-usb-phy-nop-Add-some-parameters-to-platform-data.patch
   dists/sid/linux/debian/patches/features/arm/0001-usb-phy-nop-Manage-PHY-clock.patch
   dists/sid/linux/debian/patches/features/arm/0001-usb-phy-nop-use-devm_kzalloc.patch
   dists/sid/linux/debian/patches/features/arm/0002-usb-phy-nop-Handle-power-supply-regulator-for-the-PH.patch
   dists/sid/linux/debian/patches/features/arm/0003-usb-phy-nop-Handle-RESET-for-the-PHY.patch
   dists/sid/linux/debian/patches/features/arm/0004-usb-phy-nop-use-new-PHY-API-to-register-PHY.patch
   dists/sid/linux/debian/patches/features/arm/0005-usb-phy-nop-Add-device-tree-support-and-binding-info.patch
   dists/sid/linux/debian/patches/features/arm/0006-USB-phy-nop-Defer-probe-if-device-needs-VCC-RESET.patch
   dists/sid/linux/debian/patches/features/arm/0009-USB-EHCI-split-ehci-omap-out-to-a-separate-driver.patch
   dists/sid/linux/debian/patches/features/arm/0010-USB-EHCI-make-ehci-orion-a-separate-driver.patch
   dists/sid/linux/debian/patches/features/arm/ARM-dts-imx-add-imx5x-usb-clock-DT-lookups.patch
   dists/sid/linux/debian/patches/features/arm/ARM-dts-imx-add-imx5x-usbmisc-entries.patch
   dists/sid/linux/debian/patches/features/arm/ARM-dts-imx-imx53-qsb.dts-enable-usbotg-and-usbh1.patch
   dists/sid/linux/debian/patches/features/arm/ARM-dts-imx-use-usb-nop-xceiv-usbphy-entries-for-imx5x.patch
   dists/sid/linux/debian/patches/features/arm/imx53-qsb-usb-power.patch
   dists/sid/linux/debian/patches/features/arm/usbmisc-imx-add-module_device_table.patch
Modified:
   dists/sid/linux/debian/patches/series

Added: dists/sid/linux/debian/patches/bugfix/arm/i2c-imx-add-module_device_table.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/bugfix/arm/i2c-imx-add-module_device_table.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,19 @@
+i2c-imx: allow autoloading on according to dt ids
+
+[ not yet sent upstream ]
+
+Allow udev to autoload the module when booting with device-tree
+
+Signed-off-by: Arnaud Patard <arnaud.patard at rtp-net.org>
+Index: linux/drivers/i2c/busses/i2c-imx.c
+===================================================================
+--- linux.orig/drivers/i2c/busses/i2c-imx.c	2013-04-29 02:36:01.000000000 +0200
++++ linux/drivers/i2c/busses/i2c-imx.c	2013-05-16 08:56:06.000000000 +0200
+@@ -148,6 +148,7 @@ static const struct of_device_id i2c_imx
+ 	{ .compatible = "fsl,imx21-i2c", .data = &imx_i2c_devtype[IMX21_I2C], },
+ 	{ /* sentinel */ }
+ };
++MODULE_DEVICE_TABLE(of, i2c_imx_dt_ids);
+ 
+ static inline int is_imx1_i2c(struct imx_i2c_struct *i2c_imx)
+ {

Added: dists/sid/linux/debian/patches/bugfix/arm/imx-sgtl5000-probe-defer.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/bugfix/arm/imx-sgtl5000-probe-defer.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,30 @@
+imx-sgtl5000: return E_PROBE_DEFER if ssi/codec not found
+
+If the ssi or codec drivers are not loaded (for instance, because spi or i2c
+bus drivers are not loaded), returning -EINVAL will for people to unload and
+then reload the module to get sound working. Returning E_PROBE_DEFER will
+mitigate this.
+
+[ not sure if upstream will like that ]
+Signed-off-by: Arnaud Patard <arnaud.patard at rtp-net.org>
+
+Index: linux/sound/soc/fsl/imx-sgtl5000.c
+===================================================================
+--- linux.orig/sound/soc/fsl/imx-sgtl5000.c	2013-05-16 09:33:01.000000000 +0200
++++ linux/sound/soc/fsl/imx-sgtl5000.c	2013-05-16 09:35:14.000000000 +0200
+@@ -113,13 +113,13 @@ static int imx_sgtl5000_probe(struct pla
+ 	ssi_pdev = of_find_device_by_node(ssi_np);
+ 	if (!ssi_pdev) {
+ 		dev_err(&pdev->dev, "failed to find SSI platform device\n");
+-		ret = -EINVAL;
++		ret = -EPROBE_DEFER;
+ 		goto fail;
+ 	}
+ 	codec_dev = of_find_i2c_device_by_node(codec_np);
+ 	if (!codec_dev) {
+ 		dev_err(&pdev->dev, "failed to find codec platform device\n");
+-		return -EINVAL;
++		return -EPROBE_DEFER;
+ 	}
+ 
+ 	data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);

Added: dists/sid/linux/debian/patches/bugfix/arm/mvneta-module-fix.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/bugfix/arm/mvneta-module-fix.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,69 @@
+Try to fix mvneta when compiled as module
+
+- set "sgmii serdes configuration" register to magical value
+- enable clock earlier
+- move timer callback after setting timer.data
+
+[ discussions about this patch currently done with upstream ] 
+
+Signed-off-by: Arnaud Patard <arnaud.patard at rtp-net.org>
+
+--- a/drivers/net/ethernet/marvell/mvneta.c	2013-04-14 22:17:41.073749379 +0200
++++ b/drivers/net/ethernet/marvell/mvneta.c	2013-04-14 23:22:16.033578898 +0200
+@@ -89,6 +89,8 @@
+ #define      MVNETA_TX_IN_PRGRS                  BIT(1)
+ #define      MVNETA_TX_FIFO_EMPTY                BIT(8)
+ #define MVNETA_RX_MIN_FRAME_SIZE                 0x247c
++#define MVETH_SGMII_SERDES_CFG			 0x24A0
++#define MVETH_SGMII_SERDES_STAT			 0x24A4
+ #define MVNETA_TYPE_PRIO                         0x24bc
+ #define      MVNETA_FORCE_UNI                    BIT(21)
+ #define MVNETA_TXQ_CMD_1                         0x24e4
+@@ -657,6 +659,9 @@ static void mvneta_port_sgmii_config(str
+ 	val = mvreg_read(pp, MVNETA_GMAC_CTRL_2);
+ 	val |= MVNETA_GMAC2_PSC_ENABLE;
+ 	mvreg_write(pp, MVNETA_GMAC_CTRL_2, val);
++
++	/* magic value from https://github.com/yellowback/ubuntu-precise-armadaxp/blob/master/arch/arm/mach-armadaxp/armada_xp_family/ctrlEnv/mvCtrlEnvLib.c:2189 */
++	mvreg_write(pp, MVETH_SGMII_SERDES_CFG, 0xcc7);
+ }
+ 
+ /* Start the Ethernet port RX and TX activity */
+@@ -2729,20 +2734,10 @@ static int mvneta_probe(struct platform_
+ 
+ 	pp = netdev_priv(dev);
+ 
+-	pp->tx_done_timer.function = mvneta_tx_done_timer_callback;
+-	init_timer(&pp->tx_done_timer);
+-	clear_bit(MVNETA_F_TX_DONE_TIMER_BIT, &pp->flags);
+-
+ 	pp->weight = MVNETA_RX_POLL_WEIGHT;
+ 	pp->phy_node = phy_node;
+ 	pp->phy_interface = phy_mode;
+ 
+-	pp->base = of_iomap(dn, 0);
+-	if (pp->base == NULL) {
+-		err = -ENOMEM;
+-		goto err_free_irq;
+-	}
+-
+ 	pp->clk = devm_clk_get(&pdev->dev, NULL);
+ 	if (IS_ERR(pp->clk)) {
+ 		err = PTR_ERR(pp->clk);
+@@ -2751,7 +2746,16 @@ static int mvneta_probe(struct platform_
+ 
+ 	clk_prepare_enable(pp->clk);
+ 
++	pp->base = of_iomap(dn, 0);
++	if (pp->base == NULL) {
++		err = -ENOMEM;
++		goto err_free_irq;
++	}
++
+ 	pp->tx_done_timer.data = (unsigned long)dev;
++	pp->tx_done_timer.function = mvneta_tx_done_timer_callback;
++	init_timer(&pp->tx_done_timer);
++	clear_bit(MVNETA_F_TX_DONE_TIMER_BIT, &pp->flags);
+ 
+ 	pp->tx_ring_size = MVNETA_MAX_TXD;
+ 	pp->rx_ring_size = MVNETA_MAX_RXD;

Added: dists/sid/linux/debian/patches/features/arm/0001-ARM-mvebu-Add-thermal-support-to-Armada-XP-device-tr.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/arm/0001-ARM-mvebu-Add-thermal-support-to-Armada-XP-device-tr.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,35 @@
+From 693a56eaf487140adbe114248e3cd22002fc867d Mon Sep 17 00:00:00 2001
+From: Ezequiel Garcia <ezequiel.garcia at free-electrons.com>
+Date: Tue, 26 Mar 2013 07:16:26 -0300
+Subject: [PATCH] ARM: mvebu: Add thermal support to Armada XP device tree
+
+This patch adds support for the thermal controller available in
+all Armada XP boards. This controller has two 4-byte registers:
+one to read the thermal sensor, the other for sensor initialization.
+
+Signed-off-by: Ezequiel Garcia <ezequiel.garcia at free-electrons.com>
+Acked-by: Andrew Lunn <andrew at lunn.ch>
+Signed-off-by: Jason Cooper <jason at lakedaemon.net>
+---
+ arch/arm/boot/dts/armada-xp.dtsi |    6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/arch/arm/boot/dts/armada-xp.dtsi b/arch/arm/boot/dts/armada-xp.dtsi
+index 1443949..d85fa6a 100644
+--- a/arch/arm/boot/dts/armada-xp.dtsi
++++ b/arch/arm/boot/dts/armada-xp.dtsi
+@@ -151,5 +151,11 @@
+ 			status = "disabled";
+ 		};
+ 
++		thermal at d00182b0 {
++			compatible = "marvell,armadaxp-thermal";
++			reg = <0xd00182b0 0x4
++			       0xd00184d0 0x4>;
++			status = "okay";
++		};
+ 	};
+ };
+-- 
+1.7.9.5
+

Added: dists/sid/linux/debian/patches/features/arm/0001-thermal-Add-driver-for-Armada-370-XP-SoC-thermal-man.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/arm/0001-thermal-Add-driver-for-Armada-370-XP-SoC-thermal-man.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,330 @@
+From fa0d654c84c7705d90a2492b4611e1da7ccdf69c Mon Sep 17 00:00:00 2001
+From: Ezequiel Garcia <ezequiel.garcia at free-electrons.com>
+Date: Tue, 2 Apr 2013 01:37:41 +0000
+Subject: [PATCH] thermal: Add driver for Armada 370/XP SoC thermal management
+
+This driver supports both Armada 370 and Armada XP SoC
+thermal management controllers.
+
+Armada 370 has a register to check a valid temperature, whereas
+Armada XP does not. Each has a different initialization (i.e. calibration)
+function. The temperature conversion formula is the same for both.
+
+The controller present in each SoC have a very similar feature set,
+so it corresponds to have one driver to support both of them.
+
+Although this driver may present similarities to Dove and Kirkwood
+thermal driver, the exact differences and coincidences are not fully
+known. For this reason, support is given through a separate driver.
+
+Signed-off-by: Ezequiel Garcia <ezequiel.garcia at free-electrons.com>
+Signed-off-by: Zhang Rui <rui.zhang at intel.com>
+---
+ .../devicetree/bindings/thermal/armada-thermal.txt |   22 ++
+ drivers/thermal/Kconfig                            |    8 +
+ drivers/thermal/Makefile                           |    1 +
+ drivers/thermal/armada_thermal.c                   |  232 ++++++++++++++++++++
+ 4 files changed, 263 insertions(+)
+ create mode 100644 Documentation/devicetree/bindings/thermal/armada-thermal.txt
+ create mode 100644 drivers/thermal/armada_thermal.c
+
+diff --git a/Documentation/devicetree/bindings/thermal/armada-thermal.txt b/Documentation/devicetree/bindings/thermal/armada-thermal.txt
+new file mode 100644
+index 0000000..fff93d5
+--- /dev/null
++++ b/Documentation/devicetree/bindings/thermal/armada-thermal.txt
+@@ -0,0 +1,22 @@
++* Marvell Armada 370/XP thermal management
++
++Required properties:
++
++- compatible:	Should be set to one of the following:
++		marvell,armada370-thermal
++		marvell,armadaxp-thermal
++
++- reg:		Device's register space.
++		Two entries are expected, see the examples below.
++		The first one is required for the sensor register;
++		the second one is required for the control register
++		to be used for sensor initialization (a.k.a. calibration).
++
++Example:
++
++	thermal at d0018300 {
++		compatible = "marvell,armada370-thermal";
++                reg = <0xd0018300 0x4
++		       0xd0018304 0x4>;
++		status = "okay";
++	};
+diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig
+index a764f16..9eddf74 100644
+--- a/drivers/thermal/Kconfig
++++ b/drivers/thermal/Kconfig
+@@ -144,6 +144,14 @@ config DB8500_THERMAL
+ 	  created. Cooling devices can be bound to the trip points to cool this
+ 	  thermal zone if trip points reached.
+ 
++config ARMADA_THERMAL
++	tristate "Armada 370/XP thermal management"
++	depends on ARCH_MVEBU
++	depends on OF
++	help
++	  Enable this option if you want to have support for thermal management
++	  controller present in Armada 370 and Armada XP SoC.
++
+ config DB8500_CPUFREQ_COOLING
+ 	tristate "DB8500 cpufreq cooling"
+ 	depends on ARCH_U8500
+diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile
+index d3a2b38..7f6509a 100644
+--- a/drivers/thermal/Makefile
++++ b/drivers/thermal/Makefile
+@@ -19,6 +19,7 @@ obj-$(CONFIG_KIRKWOOD_THERMAL)  += kirkwood_thermal.o
+ obj-$(CONFIG_EXYNOS_THERMAL)	+= exynos_thermal.o
+ obj-$(CONFIG_DOVE_THERMAL)  	+= dove_thermal.o
+ obj-$(CONFIG_DB8500_THERMAL)	+= db8500_thermal.o
++obj-$(CONFIG_ARMADA_THERMAL)	+= armada_thermal.o
+ obj-$(CONFIG_DB8500_CPUFREQ_COOLING)	+= db8500_cpufreq_cooling.o
+ obj-$(CONFIG_INTEL_POWERCLAMP)	+= intel_powerclamp.o
+ 
+diff --git a/drivers/thermal/armada_thermal.c b/drivers/thermal/armada_thermal.c
+new file mode 100644
+index 0000000..5b4d75f
+--- /dev/null
++++ b/drivers/thermal/armada_thermal.c
+@@ -0,0 +1,232 @@
++/*
++ * Marvell Armada 370/XP thermal sensor driver
++ *
++ * Copyright (C) 2013 Marvell
++ *
++ * This software is licensed under the terms of the GNU General Public
++ * License version 2, as published by the Free Software Foundation, and
++ * may be copied, distributed, and modified under those terms.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ */
++#include <linux/device.h>
++#include <linux/err.h>
++#include <linux/io.h>
++#include <linux/kernel.h>
++#include <linux/of.h>
++#include <linux/module.h>
++#include <linux/delay.h>
++#include <linux/platform_device.h>
++#include <linux/of_device.h>
++#include <linux/thermal.h>
++
++#define THERMAL_VALID_OFFSET		9
++#define THERMAL_VALID_MASK		0x1
++#define THERMAL_TEMP_OFFSET		10
++#define THERMAL_TEMP_MASK		0x1ff
++
++/* Thermal Manager Control and Status Register */
++#define PMU_TDC0_SW_RST_MASK		(0x1 << 1)
++#define PMU_TM_DISABLE_OFFS		0
++#define PMU_TM_DISABLE_MASK		(0x1 << PMU_TM_DISABLE_OFFS)
++#define PMU_TDC0_REF_CAL_CNT_OFFS	11
++#define PMU_TDC0_REF_CAL_CNT_MASK	(0x1ff << PMU_TDC0_REF_CAL_CNT_OFFS)
++#define PMU_TDC0_OTF_CAL_MASK		(0x1 << 30)
++#define PMU_TDC0_START_CAL_MASK		(0x1 << 25)
++
++struct armada_thermal_ops;
++
++/* Marvell EBU Thermal Sensor Dev Structure */
++struct armada_thermal_priv {
++	void __iomem *sensor;
++	void __iomem *control;
++	struct armada_thermal_ops *ops;
++};
++
++struct armada_thermal_ops {
++	/* Initialize the sensor */
++	void (*init_sensor)(struct armada_thermal_priv *);
++
++	/* Test for a valid sensor value (optional) */
++	bool (*is_valid)(struct armada_thermal_priv *);
++};
++
++static void armadaxp_init_sensor(struct armada_thermal_priv *priv)
++{
++	unsigned long reg;
++
++	reg = readl_relaxed(priv->control);
++	reg |= PMU_TDC0_OTF_CAL_MASK;
++	writel(reg, priv->control);
++
++	/* Reference calibration value */
++	reg &= ~PMU_TDC0_REF_CAL_CNT_MASK;
++	reg |= (0xf1 << PMU_TDC0_REF_CAL_CNT_OFFS);
++	writel(reg, priv->control);
++
++	/* Reset the sensor */
++	reg = readl_relaxed(priv->control);
++	writel((reg | PMU_TDC0_SW_RST_MASK), priv->control);
++
++	writel(reg, priv->control);
++
++	/* Enable the sensor */
++	reg = readl_relaxed(priv->sensor);
++	reg &= ~PMU_TM_DISABLE_MASK;
++	writel(reg, priv->sensor);
++}
++
++static void armada370_init_sensor(struct armada_thermal_priv *priv)
++{
++	unsigned long reg;
++
++	reg = readl_relaxed(priv->control);
++	reg |= PMU_TDC0_OTF_CAL_MASK;
++	writel(reg, priv->control);
++
++	/* Reference calibration value */
++	reg &= ~PMU_TDC0_REF_CAL_CNT_MASK;
++	reg |= (0xf1 << PMU_TDC0_REF_CAL_CNT_OFFS);
++	writel(reg, priv->control);
++
++	reg &= ~PMU_TDC0_START_CAL_MASK;
++	writel(reg, priv->control);
++
++	mdelay(10);
++}
++
++static bool armada_is_valid(struct armada_thermal_priv *priv)
++{
++	unsigned long reg = readl_relaxed(priv->sensor);
++
++	return (reg >> THERMAL_VALID_OFFSET) & THERMAL_VALID_MASK;
++}
++
++static int armada_get_temp(struct thermal_zone_device *thermal,
++			  unsigned long *temp)
++{
++	struct armada_thermal_priv *priv = thermal->devdata;
++	unsigned long reg;
++
++	/* Valid check */
++	if (priv->ops->is_valid && !priv->ops->is_valid(priv)) {
++		dev_err(&thermal->device,
++			"Temperature sensor reading not valid\n");
++		return -EIO;
++	}
++
++	reg = readl_relaxed(priv->sensor);
++	reg = (reg >> THERMAL_TEMP_OFFSET) & THERMAL_TEMP_MASK;
++	*temp = (3153000000UL - (10000000UL*reg)) / 13825;
++	return 0;
++}
++
++static struct thermal_zone_device_ops ops = {
++	.get_temp = armada_get_temp,
++};
++
++static const struct armada_thermal_ops armadaxp_ops = {
++	.init_sensor = armadaxp_init_sensor,
++};
++
++static const struct armada_thermal_ops armada370_ops = {
++	.is_valid = armada_is_valid,
++	.init_sensor = armada370_init_sensor,
++};
++
++static const struct of_device_id armada_thermal_id_table[] = {
++	{
++		.compatible = "marvell,armadaxp-thermal",
++		.data       = &armadaxp_ops,
++	},
++	{
++		.compatible = "marvell,armada370-thermal",
++		.data       = &armada370_ops,
++	},
++	{
++		/* sentinel */
++	},
++};
++MODULE_DEVICE_TABLE(of, armada_thermal_id_table);
++
++static int armada_thermal_probe(struct platform_device *pdev)
++{
++	struct thermal_zone_device *thermal;
++	const struct of_device_id *match;
++	struct armada_thermal_priv *priv;
++	struct resource *res;
++
++	match = of_match_device(armada_thermal_id_table, &pdev->dev);
++	if (!match)
++		return -ENODEV;
++
++	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
++	if (!priv)
++		return -ENOMEM;
++
++	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++	if (!res) {
++		dev_err(&pdev->dev, "Failed to get platform resource\n");
++		return -ENODEV;
++	}
++
++	priv->sensor = devm_ioremap_resource(&pdev->dev, res);
++	if (IS_ERR(priv->sensor))
++		return PTR_ERR(priv->sensor);
++
++	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
++	if (!res) {
++		dev_err(&pdev->dev, "Failed to get platform resource\n");
++		return -ENODEV;
++	}
++
++	priv->control = devm_ioremap_resource(&pdev->dev, res);
++	if (IS_ERR(priv->control))
++		return PTR_ERR(priv->control);
++
++	priv->ops = (struct armada_thermal_ops *)match->data;
++	priv->ops->init_sensor(priv);
++
++	thermal = thermal_zone_device_register("armada_thermal", 0, 0,
++					       priv, &ops, NULL, 0, 0);
++	if (IS_ERR(thermal)) {
++		dev_err(&pdev->dev,
++			"Failed to register thermal zone device\n");
++		return PTR_ERR(thermal);
++	}
++
++	platform_set_drvdata(pdev, thermal);
++
++	return 0;
++}
++
++static int armada_thermal_exit(struct platform_device *pdev)
++{
++	struct thermal_zone_device *armada_thermal =
++		platform_get_drvdata(pdev);
++
++	thermal_zone_device_unregister(armada_thermal);
++	platform_set_drvdata(pdev, NULL);
++
++	return 0;
++}
++
++static struct platform_driver armada_thermal_driver = {
++	.probe = armada_thermal_probe,
++	.remove = armada_thermal_exit,
++	.driver = {
++		.name = "armada_thermal",
++		.owner = THIS_MODULE,
++		.of_match_table = of_match_ptr(armada_thermal_id_table),
++	},
++};
++
++module_platform_driver(armada_thermal_driver);
++
++MODULE_AUTHOR("Ezequiel Garcia <ezequiel.garcia at free-electrons.com>");
++MODULE_DESCRIPTION("Armada 370/XP thermal driver");
++MODULE_LICENSE("GPL v2");
+-- 
+1.7.9.5
+

Added: dists/sid/linux/debian/patches/features/arm/0001-usb-chipidea-usbmisc-add-mx53-support.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/arm/0001-usb-chipidea-usbmisc-add-mx53-support.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,105 @@
+From f0c910b63cc273c239964776fae1aaa58ed4ad2b Mon Sep 17 00:00:00 2001
+From: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Date: Sat, 30 Mar 2013 12:54:00 +0200
+Subject: [PATCH] usb: chipidea: usbmisc: add mx53 support
+
+This adds mx53 as the next user of the usbmisc driver and makes it
+possible to disable the overcurrent-detection of the internal phy.
+
+Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>
+[Alex: fixed another set of line-too-long and void pointer cast]
+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 |   54 ++++++++++++++++++++++++++++++++++++
+ 1 file changed, 54 insertions(+)
+
+diff --git a/drivers/usb/chipidea/usbmisc_imx.c b/drivers/usb/chipidea/usbmisc_imx.c
+index 08b046f..746013d 100644
+--- a/drivers/usb/chipidea/usbmisc_imx.c
++++ b/drivers/usb/chipidea/usbmisc_imx.c
+@@ -19,6 +19,13 @@
+ 
+ #define USB_DEV_MAX 4
+ 
++#define MX53_USB_OTG_PHY_CTRL_0_OFFSET	0x08
++#define MX53_USB_UH2_CTRL_OFFSET	0x14
++#define MX53_USB_UH3_CTRL_OFFSET	0x18
++#define MX53_BM_OVER_CUR_DIS_H1		BIT(5)
++#define MX53_BM_OVER_CUR_DIS_OTG	BIT(8)
++#define MX53_BM_OVER_CUR_DIS_UHx	BIT(30)
++
+ #define MX6_BM_OVER_CUR_DIS		BIT(7)
+ 
+ struct imx_usbmisc {
+@@ -52,6 +59,45 @@ static struct usbmisc_usb_device *get_usbdev(struct device *dev)
+ 	return &usbmisc->usbdev[i];
+ }
+ 
++static int usbmisc_imx53_init(struct device *dev)
++{
++	struct usbmisc_usb_device *usbdev;
++	void __iomem *reg = NULL;
++	unsigned long flags;
++	u32 val = 0;
++
++	usbdev = get_usbdev(dev);
++	if (IS_ERR(usbdev))
++		return PTR_ERR(usbdev);
++
++	if (usbdev->disable_oc) {
++		spin_lock_irqsave(&usbmisc->lock, flags);
++		switch (usbdev->index) {
++		case 0:
++			reg = usbmisc->base + MX53_USB_OTG_PHY_CTRL_0_OFFSET;
++			val = readl(reg) | MX53_BM_OVER_CUR_DIS_OTG;
++			break;
++		case 1:
++			reg = usbmisc->base + MX53_USB_OTG_PHY_CTRL_0_OFFSET;
++			val = readl(reg) | MX53_BM_OVER_CUR_DIS_H1;
++			break;
++		case 2:
++			reg = usbmisc->base + MX53_USB_UH2_CTRL_OFFSET;
++			val = readl(reg) | MX53_BM_OVER_CUR_DIS_UHx;
++			break;
++		case 3:
++			reg = usbmisc->base + MX53_USB_UH3_CTRL_OFFSET;
++			val = readl(reg) | MX53_BM_OVER_CUR_DIS_UHx;
++			break;
++		}
++		if (reg && val)
++			writel(val, reg);
++		spin_unlock_irqrestore(&usbmisc->lock, flags);
++	}
++
++	return 0;
++}
++
+ static int usbmisc_imx6q_init(struct device *dev)
+ {
+ 
+@@ -74,12 +120,20 @@ static int usbmisc_imx6q_init(struct device *dev)
+ 	return 0;
+ }
+ 
++static const struct usbmisc_ops imx53_usbmisc_ops = {
++	.init = usbmisc_imx53_init,
++};
++
+ static const struct usbmisc_ops imx6q_usbmisc_ops = {
+ 	.init = usbmisc_imx6q_init,
+ };
+ 
+ static const struct of_device_id usbmisc_imx_dt_ids[] = {
+ 	{
++		.compatible = "fsl,imx53-usbmisc",
++		.data = &imx53_usbmisc_ops,
++	},
++	{
+ 		.compatible = "fsl,imx6q-usbmisc",
+ 		.data = &imx6q_usbmisc_ops,
+ 	},
+-- 
+1.7.9.5
+

Added: dists/sid/linux/debian/patches/features/arm/0001-usb-chipidea-usbmisc-add-post-handling-and-errata-fi.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/arm/0001-usb-chipidea-usbmisc-add-post-handling-and-errata-fi.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,168 @@
+From a068533079a0a1be53c78c89e65adfbd3c687591 Mon Sep 17 00:00:00 2001
+From: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Date: Sat, 30 Mar 2013 12:54:01 +0200
+Subject: [PATCH] usb: chipidea: usbmisc: add post handling and errata fix for
+ mx25
+
+This adds a post handling routine which is called after
+ci13xxx_add_device was called. The first user is the mx25, which has to
+disable the external-vbus-divider after the udc has started.
+
+Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>
+[Alex: also fixed a signed one-bit bitfield a whitespace error and yet
+ another set of line-too-long and void pointer casting errors]
+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        |    2 ++
+ drivers/usb/chipidea/ci13xxx_imx.c                 |   12 +++++++
+ drivers/usb/chipidea/ci13xxx_imx.h                 |    3 ++
+ drivers/usb/chipidea/usbmisc_imx.c                 |   36 ++++++++++++++++++++
+ 4 files changed, 53 insertions(+)
+
+diff --git a/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt b/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
+index 5778b9c..1c04a4c 100644
+--- a/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
++++ b/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
+@@ -11,6 +11,7 @@ Optional properties:
+   that indicate usb controller index
+ - vbus-supply: regulator for vbus
+ - disable-over-current: disable over current detect
++- external-vbus-divider: enables off-chip resistor divider for Vbus
+ 
+ Examples:
+ usb at 02184000 { /* USB OTG */
+@@ -20,4 +21,5 @@ usb at 02184000 { /* USB OTG */
+ 	fsl,usbphy = <&usbphy1>;
+ 	fsl,usbmisc = <&usbmisc 0>;
+ 	disable-over-current;
++	external-vbus-divider;
+ };
+diff --git a/drivers/usb/chipidea/ci13xxx_imx.c b/drivers/usb/chipidea/ci13xxx_imx.c
+index 8c29122..8faec9d 100644
+--- a/drivers/usb/chipidea/ci13xxx_imx.c
++++ b/drivers/usb/chipidea/ci13xxx_imx.c
+@@ -79,6 +79,9 @@ int usbmisc_get_init_data(struct device *dev, struct usbmisc_usb_device *usbdev)
+ 	if (of_find_property(np, "disable-over-current", NULL))
+ 		usbdev->disable_oc = 1;
+ 
++	if (of_find_property(np, "external-vbus-divider", NULL))
++		usbdev->evdo = 1;
++
+ 	return 0;
+ }
+ EXPORT_SYMBOL_GPL(usbmisc_get_init_data);
+@@ -202,6 +205,15 @@ static int ci13xxx_imx_probe(struct platform_device *pdev)
+ 		goto err;
+ 	}
+ 
++	if (usbmisc_ops && usbmisc_ops->post) {
++		ret = usbmisc_ops->post(&pdev->dev);
++		if (ret) {
++			dev_err(&pdev->dev,
++				"usbmisc post failed, ret=%d\n", ret);
++			goto put_np;
++		}
++	}
++
+ 	data->ci_pdev = plat_ci;
+ 	platform_set_drvdata(pdev, data);
+ 
+diff --git a/drivers/usb/chipidea/ci13xxx_imx.h b/drivers/usb/chipidea/ci13xxx_imx.h
+index 9cd2e91..550bfa4 100644
+--- a/drivers/usb/chipidea/ci13xxx_imx.h
++++ b/drivers/usb/chipidea/ci13xxx_imx.h
+@@ -13,6 +13,8 @@
+ struct usbmisc_ops {
+ 	/* It's called once when probe a usb device */
+ 	int (*init)(struct device *dev);
++	/* It's called once after adding a usb device */
++	int (*post)(struct device *dev);
+ };
+ 
+ struct usbmisc_usb_device {
+@@ -20,6 +22,7 @@ struct usbmisc_usb_device {
+ 	int index;
+ 
+ 	unsigned int disable_oc:1; /* over current detect disabled */
++	unsigned int evdo:1; /* set external vbus divider option */
+ };
+ 
+ int usbmisc_set_ops(const struct usbmisc_ops *ops);
+diff --git a/drivers/usb/chipidea/usbmisc_imx.c b/drivers/usb/chipidea/usbmisc_imx.c
+index 746013d..714a6bd 100644
+--- a/drivers/usb/chipidea/usbmisc_imx.c
++++ b/drivers/usb/chipidea/usbmisc_imx.c
+@@ -14,11 +14,15 @@
+ #include <linux/clk.h>
+ #include <linux/err.h>
+ #include <linux/io.h>
++#include <linux/delay.h>
+ 
+ #include "ci13xxx_imx.h"
+ 
+ #define USB_DEV_MAX 4
+ 
++#define MX25_USB_PHY_CTRL_OFFSET	0x08
++#define MX25_BM_EXTERNAL_VBUS_DIVIDER	BIT(23)
++
+ #define MX53_USB_OTG_PHY_CTRL_0_OFFSET	0x08
+ #define MX53_USB_UH2_CTRL_OFFSET	0x14
+ #define MX53_USB_UH3_CTRL_OFFSET	0x18
+@@ -59,6 +63,30 @@ static struct usbmisc_usb_device *get_usbdev(struct device *dev)
+ 	return &usbmisc->usbdev[i];
+ }
+ 
++static int usbmisc_imx25_post(struct device *dev)
++{
++	struct usbmisc_usb_device *usbdev;
++	void __iomem *reg;
++	unsigned long flags;
++	u32 val;
++
++	usbdev = get_usbdev(dev);
++	if (IS_ERR(usbdev))
++		return PTR_ERR(usbdev);
++
++	reg = usbmisc->base + MX25_USB_PHY_CTRL_OFFSET;
++
++	if (usbdev->evdo) {
++		spin_lock_irqsave(&usbmisc->lock, flags);
++		val = readl(reg);
++		writel(val | MX25_BM_EXTERNAL_VBUS_DIVIDER, reg);
++		spin_unlock_irqrestore(&usbmisc->lock, flags);
++		usleep_range(5000, 10000); /* needed to stabilize voltage */
++	}
++
++	return 0;
++}
++
+ static int usbmisc_imx53_init(struct device *dev)
+ {
+ 	struct usbmisc_usb_device *usbdev;
+@@ -120,6 +148,10 @@ static int usbmisc_imx6q_init(struct device *dev)
+ 	return 0;
+ }
+ 
++static const struct usbmisc_ops imx25_usbmisc_ops = {
++	.post = usbmisc_imx25_post,
++};
++
+ static const struct usbmisc_ops imx53_usbmisc_ops = {
+ 	.init = usbmisc_imx53_init,
+ };
+@@ -130,6 +162,10 @@ static const struct usbmisc_ops imx6q_usbmisc_ops = {
+ 
+ static const struct of_device_id usbmisc_imx_dt_ids[] = {
+ 	{
++		.compatible = "fsl,imx25-usbmisc",
++		.data = &imx25_usbmisc_ops,
++	},
++	{
+ 		.compatible = "fsl,imx53-usbmisc",
+ 		.data = &imx53_usbmisc_ops,
+ 	},
+-- 
+1.7.9.5
+

Added: dists/sid/linux/debian/patches/features/arm/0001-usb-chipidea-usbmisc-fix-a-potential-race-condition.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/arm/0001-usb-chipidea-usbmisc-fix-a-potential-race-condition.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,42 @@
+From 00b9a1f97dbdfbdc1d268bf8d878937b150ce2d4 Mon Sep 17 00:00:00 2001
+From: Marc Kleine-Budde <mkl at pengutronix.de>
+Date: Sat, 30 Mar 2013 12:53:58 +0200
+Subject: [PATCH] usb: chipidea: usbmisc: fix a potential race condition
+
+This fixes a potential race condition where the ci13xxx_imx glue code
+could be fast enough to call one of the usbmisc_ops before he got a
+valid value on the static usbmisc pointer. To fix that we first set
+usbmisc, then call usbmisc_set_ops().
+
+Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>
+Signed-off-by: Michael Grzeschik <m.grzeschik 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/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 fd4d339..d77e712 100644
+--- a/drivers/usb/chipidea/usbmisc_imx.c
++++ b/drivers/usb/chipidea/usbmisc_imx.c
+@@ -116,14 +116,14 @@ static int usbmisc_imx_probe(struct platform_device *pdev)
+ 		return ret;
+ 	}
+ 
++	usbmisc = data;
+ 	ret = usbmisc_set_ops(&imx6q_usbmisc_ops);
+ 	if (ret) {
++		usbmisc = NULL;
+ 		clk_disable_unprepare(data->clk);
+ 		return ret;
+ 	}
+ 
+-	usbmisc = data;
+-
+ 	return 0;
+ }
+ 
+-- 
+1.7.9.5
+

Added: dists/sid/linux/debian/patches/features/arm/0001-usb-chipidea-usbmisc-prepare-driver-to-handle-more-t.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/arm/0001-usb-chipidea-usbmisc-prepare-driver-to-handle-more-t.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,92 @@
+From e609108a5ba70ecf3b1b6a7e09e5a56244e92926 Mon Sep 17 00:00:00 2001
+From: Marc Kleine-Budde <mkl at pengutronix.de>
+Date: Sat, 30 Mar 2013 12:53:59 +0200
+Subject: [PATCH] usb: chipidea: usbmisc: prepare driver to handle more than
+ one soc
+
+This attaches the usbmisc_ops to the of_device_id data and
+makes it possible to define special functions per soc.
+
+Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>
+Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
+[Alex: fixed one case of line-too-long and one bogus cast to void ptr]
+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 |   18 +++++++++++++-----
+ 1 file changed, 13 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/usb/chipidea/usbmisc_imx.c b/drivers/usb/chipidea/usbmisc_imx.c
+index d77e712..08b046f 100644
+--- a/drivers/usb/chipidea/usbmisc_imx.c
++++ b/drivers/usb/chipidea/usbmisc_imx.c
+@@ -19,13 +19,14 @@
+ 
+ #define USB_DEV_MAX 4
+ 
+-#define BM_OVER_CUR_DIS		BIT(7)
++#define MX6_BM_OVER_CUR_DIS		BIT(7)
+ 
+ struct imx_usbmisc {
+ 	void __iomem *base;
+ 	spinlock_t lock;
+ 	struct clk *clk;
+ 	struct usbmisc_usb_device usbdev[USB_DEV_MAX];
++	const struct usbmisc_ops *ops;
+ };
+ 
+ static struct imx_usbmisc *usbmisc;
+@@ -65,7 +66,7 @@ static int usbmisc_imx6q_init(struct device *dev)
+ 	if (usbdev->disable_oc) {
+ 		spin_lock_irqsave(&usbmisc->lock, flags);
+ 		reg = readl(usbmisc->base + usbdev->index * 4);
+-		writel(reg | BM_OVER_CUR_DIS,
++		writel(reg | MX6_BM_OVER_CUR_DIS,
+ 			usbmisc->base + usbdev->index * 4);
+ 		spin_unlock_irqrestore(&usbmisc->lock, flags);
+ 	}
+@@ -78,7 +79,10 @@ static const struct usbmisc_ops imx6q_usbmisc_ops = {
+ };
+ 
+ static const struct of_device_id usbmisc_imx_dt_ids[] = {
+-	{ .compatible = "fsl,imx6q-usbmisc"},
++	{
++		.compatible = "fsl,imx6q-usbmisc",
++		.data = &imx6q_usbmisc_ops,
++	},
+ 	{ /* sentinel */ }
+ };
+ 
+@@ -87,6 +91,7 @@ static int usbmisc_imx_probe(struct platform_device *pdev)
+ 	struct resource	*res;
+ 	struct imx_usbmisc *data;
+ 	int ret;
++	struct of_device_id *tmp_dev;
+ 
+ 	if (usbmisc)
+ 		return -EBUSY;
+@@ -116,8 +121,11 @@ static int usbmisc_imx_probe(struct platform_device *pdev)
+ 		return ret;
+ 	}
+ 
++	tmp_dev = (struct of_device_id *)
++		of_match_device(usbmisc_imx_dt_ids, &pdev->dev);
++	data->ops = (const struct usbmisc_ops *)tmp_dev->data;
+ 	usbmisc = data;
+-	ret = usbmisc_set_ops(&imx6q_usbmisc_ops);
++	ret = usbmisc_set_ops(data->ops);
+ 	if (ret) {
+ 		usbmisc = NULL;
+ 		clk_disable_unprepare(data->clk);
+@@ -129,7 +137,7 @@ static int usbmisc_imx_probe(struct platform_device *pdev)
+ 
+ static int usbmisc_imx_remove(struct platform_device *pdev)
+ {
+-	usbmisc_unset_ops(&imx6q_usbmisc_ops);
++	usbmisc_unset_ops(usbmisc->ops);
+ 	clk_disable_unprepare(usbmisc->clk);
+ 	usbmisc = NULL;
+ 	return 0;
+-- 
+1.7.9.5
+

Added: dists/sid/linux/debian/patches/features/arm/0001-usb-chipidea-usbmisc-rename-file-struct-and-function.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/arm/0001-usb-chipidea-usbmisc-rename-file-struct-and-function.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,368 @@
+From a7bc2fdf003c55f8e00e1e7e6fff51a4876779ef Mon Sep 17 00:00:00 2001
+From: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Date: Sat, 30 Mar 2013 12:53:56 +0200
+Subject: [PATCH] usb: chipidea: usbmisc: rename file, struct and functions to
+ usbmisc_imx
+
+This driver will be used for every Freescale SoC which has this misc
+memory layout to control the basic usb handling. So better name this
+driver, function and struct names in a more generic way.
+
+Reported-by: Fabio Estevam <festevam at gmail.com>
+Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Signed-off-by: Marc Kleine-Budde <mkl 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/Makefile        |    2 +-
+ drivers/usb/chipidea/usbmisc_imx.c   |  162 ++++++++++++++++++++++++++++++++++
+ drivers/usb/chipidea/usbmisc_imx6q.c |  162 ----------------------------------
+ 3 files changed, 163 insertions(+), 163 deletions(-)
+ create mode 100644 drivers/usb/chipidea/usbmisc_imx.c
+ delete mode 100644 drivers/usb/chipidea/usbmisc_imx6q.c
+
+Index: linux/drivers/usb/chipidea/Makefile
+===================================================================
+--- linux.orig/drivers/usb/chipidea/Makefile	2013-05-16 00:43:05.000000000 +0200
++++ linux/drivers/usb/chipidea/Makefile	2013-05-16 00:45:22.000000000 +0200
+@@ -17,5 +17,5 @@ ifneq ($(CONFIG_PCI),)
+ endif
+ 
+ ifneq ($(CONFIG_OF_DEVICE),)
+-	obj-$(CONFIG_USB_CHIPIDEA)	+= ci13xxx_imx.o usbmisc_imx6q.o
++	obj-$(CONFIG_USB_CHIPIDEA)	+= ci13xxx_imx.o usbmisc_imx.o
+ endif
+Index: linux/drivers/usb/chipidea/usbmisc_imx.c
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ linux/drivers/usb/chipidea/usbmisc_imx.c	2013-05-16 00:45:22.000000000 +0200
+@@ -0,0 +1,162 @@
++/*
++ * Copyright 2012 Freescale Semiconductor, Inc.
++ *
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ */
++
++#include <linux/module.h>
++#include <linux/of_platform.h>
++#include <linux/clk.h>
++#include <linux/err.h>
++#include <linux/io.h>
++
++#include "ci13xxx_imx.h"
++
++#define USB_DEV_MAX 4
++
++#define BM_OVER_CUR_DIS		BIT(7)
++
++struct imx_usbmisc {
++	void __iomem *base;
++	spinlock_t lock;
++	struct clk *clk;
++	struct usbmisc_usb_device usbdev[USB_DEV_MAX];
++};
++
++static struct imx_usbmisc *usbmisc;
++
++static struct usbmisc_usb_device *get_usbdev(struct device *dev)
++{
++	int i, ret;
++
++	for (i = 0; i < USB_DEV_MAX; i++) {
++		if (usbmisc->usbdev[i].dev == dev)
++			return &usbmisc->usbdev[i];
++		else if (!usbmisc->usbdev[i].dev)
++			break;
++	}
++
++	if (i >= USB_DEV_MAX)
++		return ERR_PTR(-EBUSY);
++
++	ret = usbmisc_get_init_data(dev, &usbmisc->usbdev[i]);
++	if (ret)
++		return ERR_PTR(ret);
++
++	return &usbmisc->usbdev[i];
++}
++
++static int usbmisc_imx6q_init(struct device *dev)
++{
++
++	struct usbmisc_usb_device *usbdev;
++	unsigned long flags;
++	u32 reg;
++
++	usbdev = get_usbdev(dev);
++	if (IS_ERR(usbdev))
++		return PTR_ERR(usbdev);
++
++	if (usbdev->disable_oc) {
++		spin_lock_irqsave(&usbmisc->lock, flags);
++		reg = readl(usbmisc->base + usbdev->index * 4);
++		writel(reg | BM_OVER_CUR_DIS,
++			usbmisc->base + usbdev->index * 4);
++		spin_unlock_irqrestore(&usbmisc->lock, flags);
++	}
++
++	return 0;
++}
++
++static const struct usbmisc_ops imx6q_usbmisc_ops = {
++	.init = usbmisc_imx6q_init,
++};
++
++static const struct of_device_id usbmisc_imx_dt_ids[] = {
++	{ .compatible = "fsl,imx6q-usbmisc"},
++	{ /* sentinel */ }
++};
++
++static int usbmisc_imx_probe(struct platform_device *pdev)
++{
++	struct resource	*res;
++	struct imx_usbmisc *data;
++	int ret;
++
++	if (usbmisc)
++		return -EBUSY;
++
++	data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
++	if (!data)
++		return -ENOMEM;
++
++	spin_lock_init(&data->lock);
++
++	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++	data->base = devm_ioremap_resource(&pdev->dev, res);
++	if (IS_ERR(data->base))
++		return PTR_ERR(data->base);
++
++	data->clk = devm_clk_get(&pdev->dev, NULL);
++	if (IS_ERR(data->clk)) {
++		dev_err(&pdev->dev,
++			"failed to get clock, err=%ld\n", PTR_ERR(data->clk));
++		return PTR_ERR(data->clk);
++	}
++
++	ret = clk_prepare_enable(data->clk);
++	if (ret) {
++		dev_err(&pdev->dev,
++			"clk_prepare_enable failed, err=%d\n", ret);
++		return ret;
++	}
++
++	ret = usbmisc_set_ops(&imx6q_usbmisc_ops);
++	if (ret) {
++		clk_disable_unprepare(data->clk);
++		return ret;
++	}
++
++	usbmisc = data;
++
++	return 0;
++}
++
++static int usbmisc_imx_remove(struct platform_device *pdev)
++{
++	usbmisc_unset_ops(&imx6q_usbmisc_ops);
++	clk_disable_unprepare(usbmisc->clk);
++	return 0;
++}
++
++static struct platform_driver usbmisc_imx_driver = {
++	.probe = usbmisc_imx_probe,
++	.remove = usbmisc_imx_remove,
++	.driver = {
++		.name = "usbmisc_imx",
++		.owner = THIS_MODULE,
++		.of_match_table = usbmisc_imx_dt_ids,
++	 },
++};
++
++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)
++{
++	platform_driver_unregister(&usbmisc_imx_driver);
++}
++module_exit(usbmisc_imx_drv_exit);
++
++MODULE_ALIAS("platform:usbmisc-imx");
++MODULE_LICENSE("GPL v2");
++MODULE_DESCRIPTION("driver for imx usb non-core registers");
++MODULE_AUTHOR("Richard Zhao <richard.zhao at freescale.com>");
+Index: linux/drivers/usb/chipidea/usbmisc_imx6q.c
+===================================================================
+--- linux.orig/drivers/usb/chipidea/usbmisc_imx6q.c	2013-05-16 00:45:18.000000000 +0200
++++ /dev/null	1970-01-01 00:00:00.000000000 +0000
+@@ -1,162 +0,0 @@
+-/*
+- * Copyright 2012 Freescale Semiconductor, Inc.
+- *
+- * The code contained herein is licensed under the GNU General Public
+- * License. You may obtain a copy of the GNU General Public License
+- * Version 2 or later at the following locations:
+- *
+- * http://www.opensource.org/licenses/gpl-license.html
+- * http://www.gnu.org/copyleft/gpl.html
+- */
+-
+-#include <linux/module.h>
+-#include <linux/of_platform.h>
+-#include <linux/clk.h>
+-#include <linux/err.h>
+-#include <linux/io.h>
+-
+-#include "ci13xxx_imx.h"
+-
+-#define USB_DEV_MAX 4
+-
+-#define BM_OVER_CUR_DIS		BIT(7)
+-
+-struct imx6q_usbmisc {
+-	void __iomem *base;
+-	spinlock_t lock;
+-	struct clk *clk;
+-	struct usbmisc_usb_device usbdev[USB_DEV_MAX];
+-};
+-
+-static struct imx6q_usbmisc *usbmisc;
+-
+-static struct usbmisc_usb_device *get_usbdev(struct device *dev)
+-{
+-	int i, ret;
+-
+-	for (i = 0; i < USB_DEV_MAX; i++) {
+-		if (usbmisc->usbdev[i].dev == dev)
+-			return &usbmisc->usbdev[i];
+-		else if (!usbmisc->usbdev[i].dev)
+-			break;
+-	}
+-
+-	if (i >= USB_DEV_MAX)
+-		return ERR_PTR(-EBUSY);
+-
+-	ret = usbmisc_get_init_data(dev, &usbmisc->usbdev[i]);
+-	if (ret)
+-		return ERR_PTR(ret);
+-
+-	return &usbmisc->usbdev[i];
+-}
+-
+-static int usbmisc_imx6q_init(struct device *dev)
+-{
+-
+-	struct usbmisc_usb_device *usbdev;
+-	unsigned long flags;
+-	u32 reg;
+-
+-	usbdev = get_usbdev(dev);
+-	if (IS_ERR(usbdev))
+-		return PTR_ERR(usbdev);
+-
+-	if (usbdev->disable_oc) {
+-		spin_lock_irqsave(&usbmisc->lock, flags);
+-		reg = readl(usbmisc->base + usbdev->index * 4);
+-		writel(reg | BM_OVER_CUR_DIS,
+-			usbmisc->base + usbdev->index * 4);
+-		spin_unlock_irqrestore(&usbmisc->lock, flags);
+-	}
+-
+-	return 0;
+-}
+-
+-static const struct usbmisc_ops imx6q_usbmisc_ops = {
+-	.init = usbmisc_imx6q_init,
+-};
+-
+-static const struct of_device_id usbmisc_imx6q_dt_ids[] = {
+-	{ .compatible = "fsl,imx6q-usbmisc"},
+-	{ /* sentinel */ }
+-};
+-
+-static int usbmisc_imx6q_probe(struct platform_device *pdev)
+-{
+-	struct resource	*res;
+-	struct imx6q_usbmisc *data;
+-	int ret;
+-
+-	if (usbmisc)
+-		return -EBUSY;
+-
+-	data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
+-	if (!data)
+-		return -ENOMEM;
+-
+-	spin_lock_init(&data->lock);
+-
+-	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+-	data->base = devm_ioremap_resource(&pdev->dev, res);
+-	if (IS_ERR(data->base))
+-		return PTR_ERR(data->base);
+-
+-	data->clk = devm_clk_get(&pdev->dev, NULL);
+-	if (IS_ERR(data->clk)) {
+-		dev_err(&pdev->dev,
+-			"failed to get clock, err=%ld\n", PTR_ERR(data->clk));
+-		return PTR_ERR(data->clk);
+-	}
+-
+-	ret = clk_prepare_enable(data->clk);
+-	if (ret) {
+-		dev_err(&pdev->dev,
+-			"clk_prepare_enable failed, err=%d\n", ret);
+-		return ret;
+-	}
+-
+-	ret = usbmisc_set_ops(&imx6q_usbmisc_ops);
+-	if (ret) {
+-		clk_disable_unprepare(data->clk);
+-		return ret;
+-	}
+-
+-	usbmisc = data;
+-
+-	return 0;
+-}
+-
+-static int usbmisc_imx6q_remove(struct platform_device *pdev)
+-{
+-	usbmisc_unset_ops(&imx6q_usbmisc_ops);
+-	clk_disable_unprepare(usbmisc->clk);
+-	return 0;
+-}
+-
+-static struct platform_driver usbmisc_imx6q_driver = {
+-	.probe = usbmisc_imx6q_probe,
+-	.remove = usbmisc_imx6q_remove,
+-	.driver = {
+-		.name = "usbmisc_imx6q",
+-		.owner = THIS_MODULE,
+-		.of_match_table = usbmisc_imx6q_dt_ids,
+-	 },
+-};
+-
+-int __init usbmisc_imx6q_drv_init(void)
+-{
+-	return platform_driver_register(&usbmisc_imx6q_driver);
+-}
+-subsys_initcall(usbmisc_imx6q_drv_init);
+-
+-void __exit usbmisc_imx6q_drv_exit(void)
+-{
+-	platform_driver_unregister(&usbmisc_imx6q_driver);
+-}
+-module_exit(usbmisc_imx6q_drv_exit);
+-
+-MODULE_ALIAS("platform:usbmisc-imx6q");
+-MODULE_LICENSE("GPL v2");
+-MODULE_DESCRIPTION("driver for imx6q usb non-core registers");
+-MODULE_AUTHOR("Richard Zhao <richard.zhao at freescale.com>");

Added: dists/sid/linux/debian/patches/features/arm/0001-usb-chipidea-usbmisc-unset-global-varibale-usbmisc-o.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/arm/0001-usb-chipidea-usbmisc-unset-global-varibale-usbmisc-o.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,32 @@
+From d48a24dbc0d3f21cbd594bcc2553d40cc5ed4fd9 Mon Sep 17 00:00:00 2001
+From: Marc Kleine-Budde <mkl at pengutronix.de>
+Date: Sat, 30 Mar 2013 12:53:57 +0200
+Subject: [PATCH] usb: chipidea: usbmisc: unset global varibale usbmisc on
+ driver remove
+
+The probe function checks usbmisc to be NULL in the beginning. Without
+this patch the can only be loaded once.
+
+Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>
+Signed-off-by: Michael Grzeschik <m.grzeschik 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/usbmisc_imx.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/usb/chipidea/usbmisc_imx.c b/drivers/usb/chipidea/usbmisc_imx.c
+index 3c42446..fd4d339 100644
+--- a/drivers/usb/chipidea/usbmisc_imx.c
++++ b/drivers/usb/chipidea/usbmisc_imx.c
+@@ -131,6 +131,7 @@ static int usbmisc_imx_remove(struct platform_device *pdev)
+ {
+ 	usbmisc_unset_ops(&imx6q_usbmisc_ops);
+ 	clk_disable_unprepare(usbmisc->clk);
++	usbmisc = NULL;
+ 	return 0;
+ }
+ 
+-- 
+1.7.9.5
+

Added: dists/sid/linux/debian/patches/features/arm/0001-usb-phy-nop-Add-some-parameters-to-platform-data.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/arm/0001-usb-phy-nop-Add-some-parameters-to-platform-data.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,38 @@
+From 1f0972f5b05a674d73e4eb314fa1b6c78e37aef1 Mon Sep 17 00:00:00 2001
+From: Roger Quadros <rogerq at ti.com>
+Date: Tue, 12 Mar 2013 13:24:19 +0200
+Subject: [PATCH] usb: phy: nop: Add some parameters to platform data
+
+Add clk_rate parameter to platform data. If supplied, the
+NOP phy driver will program the clock to that rate during probe.
+
+Also add 2 flags, needs_vcc and needs_reset.
+If the flag is set and the regulator couldn't be found
+then the driver will bail out with -EPROBE_DEFER.
+
+Signed-off-by: Roger Quadros <rogerq at ti.com>
+Acked-by: Felipe Balbi <balbi at ti.com>
+Signed-off-by: Felipe Balbi <balbi at ti.com>
+---
+ include/linux/usb/nop-usb-xceiv.h |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/include/linux/usb/nop-usb-xceiv.h b/include/linux/usb/nop-usb-xceiv.h
+index 28884c7..148d351 100644
+--- a/include/linux/usb/nop-usb-xceiv.h
++++ b/include/linux/usb/nop-usb-xceiv.h
+@@ -5,6 +5,11 @@
+ 
+ struct nop_usb_xceiv_platform_data {
+ 	enum usb_phy_type type;
++	unsigned long clk_rate;
++
++	/* if set fails with -EPROBE_DEFER if can't get regulator */
++	unsigned int needs_vcc:1;
++	unsigned int needs_reset:1;
+ };
+ 
+ #if defined(CONFIG_NOP_USB_XCEIV) || (defined(CONFIG_NOP_USB_XCEIV_MODULE) && defined(MODULE))
+-- 
+1.7.9.5
+

Added: dists/sid/linux/debian/patches/features/arm/0001-usb-phy-nop-Manage-PHY-clock.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/arm/0001-usb-phy-nop-Manage-PHY-clock.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,127 @@
+From 2319fb88e16e56c64d4f3ab50af69ed6dadbc7b5 Mon Sep 17 00:00:00 2001
+From: Roger Quadros <rogerq at ti.com>
+Date: Tue, 12 Mar 2013 13:24:21 +0200
+Subject: [PATCH 1/6] usb: phy: nop: Manage PHY clock
+
+If the PHY has a clock associated to it then manage the clock.
+We just enable the clock in .init() and disable it in .shutdown().
+
+Add clk_rate parameter in platform data and configure the
+clock rate during probe if supplied.
+
+Signed-off-by: Roger Quadros <rogerq at ti.com>
+Signed-off-by: Felipe Balbi <balbi at ti.com>
+---
+ drivers/usb/otg/nop-usb-xceiv.c |   54 ++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 53 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/usb/otg/nop-usb-xceiv.c b/drivers/usb/otg/nop-usb-xceiv.c
+index af52870..17c174f 100644
+--- a/drivers/usb/otg/nop-usb-xceiv.c
++++ b/drivers/usb/otg/nop-usb-xceiv.c
+@@ -32,10 +32,12 @@
+ #include <linux/usb/otg.h>
+ #include <linux/usb/nop-usb-xceiv.h>
+ #include <linux/slab.h>
++#include <linux/clk.h>
+ 
+ struct nop_usb_xceiv {
+ 	struct usb_phy		phy;
+ 	struct device		*dev;
++	struct clk		*clk;
+ };
+ 
+ static struct platform_device *pd;
+@@ -64,6 +66,24 @@ static int nop_set_suspend(struct usb_phy *x, int suspend)
+ 	return 0;
+ }
+ 
++static int nop_init(struct usb_phy *phy)
++{
++	struct nop_usb_xceiv *nop = dev_get_drvdata(phy->dev);
++
++	if (!IS_ERR(nop->clk))
++		clk_enable(nop->clk);
++
++	return 0;
++}
++
++static void nop_shutdown(struct usb_phy *phy)
++{
++	struct nop_usb_xceiv *nop = dev_get_drvdata(phy->dev);
++
++	if (!IS_ERR(nop->clk))
++		clk_disable(nop->clk);
++}
++
+ static int nop_set_peripheral(struct usb_otg *otg, struct usb_gadget *gadget)
+ {
+ 	if (!otg)
+@@ -112,10 +132,34 @@ static int nop_usb_xceiv_probe(struct platform_device *pdev)
+ 	if (pdata)
+ 		type = pdata->type;
+ 
++	nop->clk = devm_clk_get(&pdev->dev, "main_clk");
++	if (IS_ERR(nop->clk)) {
++		dev_dbg(&pdev->dev, "Can't get phy clock: %ld\n",
++					PTR_ERR(nop->clk));
++	}
++
++	if (!IS_ERR(nop->clk) && pdata && pdata->clk_rate) {
++		err = clk_set_rate(nop->clk, pdata->clk_rate);
++		if (err) {
++			dev_err(&pdev->dev, "Error setting clock rate\n");
++			return err;
++		}
++	}
++
++	if (!IS_ERR(nop->clk)) {
++		err = clk_prepare(nop->clk);
++		if (err) {
++			dev_err(&pdev->dev, "Error preparing clock\n");
++			return err;
++		}
++	}
++
+ 	nop->dev		= &pdev->dev;
+ 	nop->phy.dev		= nop->dev;
+ 	nop->phy.label		= "nop-xceiv";
+ 	nop->phy.set_suspend	= nop_set_suspend;
++	nop->phy.init		= nop_init;
++	nop->phy.shutdown	= nop_shutdown;
+ 	nop->phy.state		= OTG_STATE_UNDEFINED;
+ 
+ 	nop->phy.otg->phy		= &nop->phy;
+@@ -126,7 +170,7 @@ static int nop_usb_xceiv_probe(struct platform_device *pdev)
+ 	if (err) {
+ 		dev_err(&pdev->dev, "can't register transceiver, err: %d\n",
+ 			err);
+-		return err;
++		goto err_add;
+ 	}
+ 
+ 	platform_set_drvdata(pdev, nop);
+@@ -134,12 +178,20 @@ static int nop_usb_xceiv_probe(struct platform_device *pdev)
+ 	ATOMIC_INIT_NOTIFIER_HEAD(&nop->phy.notifier);
+ 
+ 	return 0;
++
++err_add:
++	if (!IS_ERR(nop->clk))
++		clk_unprepare(nop->clk);
++	return err;
+ }
+ 
+ static int nop_usb_xceiv_remove(struct platform_device *pdev)
+ {
+ 	struct nop_usb_xceiv *nop = platform_get_drvdata(pdev);
+ 
++	if (!IS_ERR(nop->clk))
++		clk_unprepare(nop->clk);
++
+ 	usb_remove_phy(&nop->phy);
+ 
+ 	platform_set_drvdata(pdev, NULL);
+-- 
+1.7.9.5
+

Added: dists/sid/linux/debian/patches/features/arm/0001-usb-phy-nop-use-devm_kzalloc.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/arm/0001-usb-phy-nop-use-devm_kzalloc.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,69 @@
+From e4d7dc6674efd798792adbd689986cde5422aa62 Mon Sep 17 00:00:00 2001
+From: Roger Quadros <rogerq at ti.com>
+Date: Tue, 12 Mar 2013 13:24:20 +0200
+Subject: [PATCH] usb: phy: nop: use devm_kzalloc()
+
+Use resource managed kzalloc.
+
+Signed-off-by: Roger Quadros <rogerq at ti.com>
+Signed-off-by: Felipe Balbi <balbi at ti.com>
+---
+ drivers/usb/otg/nop-usb-xceiv.c |   17 +++++------------
+ 1 file changed, 5 insertions(+), 12 deletions(-)
+
+diff --git a/drivers/usb/otg/nop-usb-xceiv.c b/drivers/usb/otg/nop-usb-xceiv.c
+index a3ce24b..af52870 100644
+--- a/drivers/usb/otg/nop-usb-xceiv.c
++++ b/drivers/usb/otg/nop-usb-xceiv.c
+@@ -100,15 +100,14 @@ static int nop_usb_xceiv_probe(struct platform_device *pdev)
+ 	enum usb_phy_type	type = USB_PHY_TYPE_USB2;
+ 	int err;
+ 
+-	nop = kzalloc(sizeof *nop, GFP_KERNEL);
++	nop = devm_kzalloc(&pdev->dev, sizeof(*nop), GFP_KERNEL);
+ 	if (!nop)
+ 		return -ENOMEM;
+ 
+-	nop->phy.otg = kzalloc(sizeof *nop->phy.otg, GFP_KERNEL);
+-	if (!nop->phy.otg) {
+-		kfree(nop);
++	nop->phy.otg = devm_kzalloc(&pdev->dev, sizeof(*nop->phy.otg),
++							GFP_KERNEL);
++	if (!nop->phy.otg)
+ 		return -ENOMEM;
+-	}
+ 
+ 	if (pdata)
+ 		type = pdata->type;
+@@ -127,7 +126,7 @@ static int nop_usb_xceiv_probe(struct platform_device *pdev)
+ 	if (err) {
+ 		dev_err(&pdev->dev, "can't register transceiver, err: %d\n",
+ 			err);
+-		goto exit;
++		return err;
+ 	}
+ 
+ 	platform_set_drvdata(pdev, nop);
+@@ -135,10 +134,6 @@ static int nop_usb_xceiv_probe(struct platform_device *pdev)
+ 	ATOMIC_INIT_NOTIFIER_HEAD(&nop->phy.notifier);
+ 
+ 	return 0;
+-exit:
+-	kfree(nop->phy.otg);
+-	kfree(nop);
+-	return err;
+ }
+ 
+ static int nop_usb_xceiv_remove(struct platform_device *pdev)
+@@ -148,8 +143,6 @@ static int nop_usb_xceiv_remove(struct platform_device *pdev)
+ 	usb_remove_phy(&nop->phy);
+ 
+ 	platform_set_drvdata(pdev, NULL);
+-	kfree(nop->phy.otg);
+-	kfree(nop);
+ 
+ 	return 0;
+ }
+-- 
+1.7.9.5
+

Added: dists/sid/linux/debian/patches/features/arm/0002-usb-phy-nop-Handle-power-supply-regulator-for-the-PH.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/arm/0002-usb-phy-nop-Handle-power-supply-regulator-for-the-PH.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,73 @@
+From 58f735fe4778d34d9d1e37bcdd59325d66a8793e Mon Sep 17 00:00:00 2001
+From: Roger Quadros <rogerq at ti.com>
+Date: Tue, 12 Mar 2013 13:24:22 +0200
+Subject: [PATCH 2/6] usb: phy: nop: Handle power supply regulator for the PHY
+
+We use "vcc" as the supply name for the PHY's power supply.
+The power supply will be enabled during .init() and disabled
+during .shutdown()
+
+Signed-off-by: Roger Quadros <rogerq at ti.com>
+Signed-off-by: Felipe Balbi <balbi at ti.com>
+---
+ drivers/usb/otg/nop-usb-xceiv.c |   18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+diff --git a/drivers/usb/otg/nop-usb-xceiv.c b/drivers/usb/otg/nop-usb-xceiv.c
+index 17c174f..fbdcfef 100644
+--- a/drivers/usb/otg/nop-usb-xceiv.c
++++ b/drivers/usb/otg/nop-usb-xceiv.c
+@@ -33,11 +33,13 @@
+ #include <linux/usb/nop-usb-xceiv.h>
+ #include <linux/slab.h>
+ #include <linux/clk.h>
++#include <linux/regulator/consumer.h>
+ 
+ struct nop_usb_xceiv {
+ 	struct usb_phy		phy;
+ 	struct device		*dev;
+ 	struct clk		*clk;
++	struct regulator	*vcc;
+ };
+ 
+ static struct platform_device *pd;
+@@ -70,6 +72,11 @@ static int nop_init(struct usb_phy *phy)
+ {
+ 	struct nop_usb_xceiv *nop = dev_get_drvdata(phy->dev);
+ 
++	if (!IS_ERR(nop->vcc)) {
++		if (regulator_enable(nop->vcc))
++			dev_err(phy->dev, "Failed to enable power\n");
++	}
++
+ 	if (!IS_ERR(nop->clk))
+ 		clk_enable(nop->clk);
+ 
+@@ -82,6 +89,11 @@ static void nop_shutdown(struct usb_phy *phy)
+ 
+ 	if (!IS_ERR(nop->clk))
+ 		clk_disable(nop->clk);
++
++	if (!IS_ERR(nop->vcc)) {
++		if (regulator_disable(nop->vcc))
++			dev_err(phy->dev, "Failed to disable power\n");
++	}
+ }
+ 
+ static int nop_set_peripheral(struct usb_otg *otg, struct usb_gadget *gadget)
+@@ -154,6 +166,12 @@ static int nop_usb_xceiv_probe(struct platform_device *pdev)
+ 		}
+ 	}
+ 
++	nop->vcc = devm_regulator_get(&pdev->dev, "vcc");
++	if (IS_ERR(nop->vcc)) {
++		dev_dbg(&pdev->dev, "Error getting vcc regulator: %ld\n",
++					PTR_ERR(nop->vcc));
++	}
++
+ 	nop->dev		= &pdev->dev;
+ 	nop->phy.dev		= nop->dev;
+ 	nop->phy.label		= "nop-xceiv";
+-- 
+1.7.9.5
+

Added: dists/sid/linux/debian/patches/features/arm/0003-usb-phy-nop-Handle-RESET-for-the-PHY.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/arm/0003-usb-phy-nop-Handle-RESET-for-the-PHY.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,73 @@
+From ad63ebfc3565bbdec87ee4e30e4d40d164c1d3b8 Mon Sep 17 00:00:00 2001
+From: Roger Quadros <rogerq at ti.com>
+Date: Tue, 12 Mar 2013 13:24:23 +0200
+Subject: [PATCH 3/6] usb: phy: nop: Handle RESET for the PHY
+
+We expect the RESET line to be modeled as a regulator with supply
+name "reset". The regulator should be modeled such that enabling
+the regulator brings the PHY device out of RESET and disabling the
+regulator holds the device in RESET.
+
+They PHY will be held in RESET in .shutdown() and brought out of
+RESET in .init().
+
+Signed-off-by: Roger Quadros <rogerq at ti.com>
+Signed-off-by: Felipe Balbi <balbi at ti.com>
+---
+ drivers/usb/otg/nop-usb-xceiv.c |   19 +++++++++++++++++++
+ 1 file changed, 19 insertions(+)
+
+diff --git a/drivers/usb/otg/nop-usb-xceiv.c b/drivers/usb/otg/nop-usb-xceiv.c
+index fbdcfef..6efc9b7 100644
+--- a/drivers/usb/otg/nop-usb-xceiv.c
++++ b/drivers/usb/otg/nop-usb-xceiv.c
+@@ -40,6 +40,7 @@ struct nop_usb_xceiv {
+ 	struct device		*dev;
+ 	struct clk		*clk;
+ 	struct regulator	*vcc;
++	struct regulator	*reset;
+ };
+ 
+ static struct platform_device *pd;
+@@ -80,6 +81,12 @@ static int nop_init(struct usb_phy *phy)
+ 	if (!IS_ERR(nop->clk))
+ 		clk_enable(nop->clk);
+ 
++	if (!IS_ERR(nop->reset)) {
++		/* De-assert RESET */
++		if (regulator_enable(nop->reset))
++			dev_err(phy->dev, "Failed to de-assert reset\n");
++	}
++
+ 	return 0;
+ }
+ 
+@@ -87,6 +94,12 @@ static void nop_shutdown(struct usb_phy *phy)
+ {
+ 	struct nop_usb_xceiv *nop = dev_get_drvdata(phy->dev);
+ 
++	if (!IS_ERR(nop->reset)) {
++		/* Assert RESET */
++		if (regulator_disable(nop->reset))
++			dev_err(phy->dev, "Failed to assert reset\n");
++	}
++
+ 	if (!IS_ERR(nop->clk))
+ 		clk_disable(nop->clk);
+ 
+@@ -172,6 +185,12 @@ static int nop_usb_xceiv_probe(struct platform_device *pdev)
+ 					PTR_ERR(nop->vcc));
+ 	}
+ 
++	nop->reset = devm_regulator_get(&pdev->dev, "reset");
++	if (IS_ERR(nop->reset)) {
++		dev_dbg(&pdev->dev, "Error getting reset regulator: %ld\n",
++					PTR_ERR(nop->reset));
++	}
++
+ 	nop->dev		= &pdev->dev;
+ 	nop->phy.dev		= nop->dev;
+ 	nop->phy.label		= "nop-xceiv";
+-- 
+1.7.9.5
+

Added: dists/sid/linux/debian/patches/features/arm/0004-usb-phy-nop-use-new-PHY-API-to-register-PHY.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/arm/0004-usb-phy-nop-use-new-PHY-API-to-register-PHY.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,36 @@
+From 90f4232f31f087f86667da03b1a4f3c90a32cb4a Mon Sep 17 00:00:00 2001
+From: Roger Quadros <rogerq at ti.com>
+Date: Tue, 12 Mar 2013 13:24:24 +0200
+Subject: [PATCH 4/6] usb: phy: nop: use new PHY API to register PHY
+
+We would need to support multiple PHYs of the same type
+so use the new PHY API usb_add_phy_dev() to register the PHY.
+
+Signed-off-by: Roger Quadros <rogerq at ti.com>
+Signed-off-by: Felipe Balbi <balbi at ti.com>
+---
+ drivers/usb/otg/nop-usb-xceiv.c |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/usb/otg/nop-usb-xceiv.c b/drivers/usb/otg/nop-usb-xceiv.c
+index 6efc9b7..fe7a460 100644
+--- a/drivers/usb/otg/nop-usb-xceiv.c
++++ b/drivers/usb/otg/nop-usb-xceiv.c
+@@ -198,12 +198,13 @@ static int nop_usb_xceiv_probe(struct platform_device *pdev)
+ 	nop->phy.init		= nop_init;
+ 	nop->phy.shutdown	= nop_shutdown;
+ 	nop->phy.state		= OTG_STATE_UNDEFINED;
++	nop->phy.type		= type;
+ 
+ 	nop->phy.otg->phy		= &nop->phy;
+ 	nop->phy.otg->set_host		= nop_set_host;
+ 	nop->phy.otg->set_peripheral	= nop_set_peripheral;
+ 
+-	err = usb_add_phy(&nop->phy, type);
++	err = usb_add_phy_dev(&nop->phy);
+ 	if (err) {
+ 		dev_err(&pdev->dev, "can't register transceiver, err: %d\n",
+ 			err);
+-- 
+1.7.9.5
+

Added: dists/sid/linux/debian/patches/features/arm/0005-usb-phy-nop-Add-device-tree-support-and-binding-info.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/arm/0005-usb-phy-nop-Add-device-tree-support-and-binding-info.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,147 @@
+From 0eba387973f521e57f00584e5e840e5328a61dda Mon Sep 17 00:00:00 2001
+From: Roger Quadros <rogerq at ti.com>
+Date: Tue, 12 Mar 2013 13:24:25 +0200
+Subject: [PATCH 5/6] usb: phy: nop: Add device tree support and binding
+ information
+
+The PHY clock, clock rate, VCC regulator and RESET regulator
+can now be provided via device tree.
+
+Signed-off-by: Roger Quadros <rogerq at ti.com>
+Signed-off-by: Felipe Balbi <balbi at ti.com>
+---
+ .../devicetree/bindings/usb/usb-nop-xceiv.txt      |   34 +++++++++++++++++++
+ drivers/usb/otg/nop-usb-xceiv.c                    |   35 +++++++++++++++-----
+ 2 files changed, 61 insertions(+), 8 deletions(-)
+ create mode 100644 Documentation/devicetree/bindings/usb/usb-nop-xceiv.txt
+
+diff --git a/Documentation/devicetree/bindings/usb/usb-nop-xceiv.txt b/Documentation/devicetree/bindings/usb/usb-nop-xceiv.txt
+new file mode 100644
+index 0000000..d7e2726
+--- /dev/null
++++ b/Documentation/devicetree/bindings/usb/usb-nop-xceiv.txt
+@@ -0,0 +1,34 @@
++USB NOP PHY
++
++Required properties:
++- compatible: should be usb-nop-xceiv
++
++Optional properties:
++- clocks: phandle to the PHY clock. Use as per Documentation/devicetree
++  /bindings/clock/clock-bindings.txt
++  This property is required if clock-frequency is specified.
++
++- clock-names: Should be "main_clk"
++
++- clock-frequency: the clock frequency (in Hz) that the PHY clock must
++  be configured to.
++
++- vcc-supply: phandle to the regulator that provides RESET to the PHY.
++
++- reset-supply: phandle to the regulator that provides power to the PHY.
++
++Example:
++
++	hsusb1_phy {
++		compatible = "usb-nop-xceiv";
++		clock-frequency = <19200000>;
++		clocks = <&osc 0>;
++		clock-names = "main_clk";
++		vcc-supply = <&hsusb1_vcc_regulator>;
++		reset-supply = <&hsusb1_reset_regulator>;
++	};
++
++hsusb1_phy is a NOP USB PHY device that gets its clock from an oscillator
++and expects that clock to be configured to 19.2MHz by the NOP PHY driver.
++hsusb1_vcc_regulator provides power to the PHY and hsusb1_reset_regulator
++controls RESET.
+diff --git a/drivers/usb/otg/nop-usb-xceiv.c b/drivers/usb/otg/nop-usb-xceiv.c
+index fe7a460..b26b1c2 100644
+--- a/drivers/usb/otg/nop-usb-xceiv.c
++++ b/drivers/usb/otg/nop-usb-xceiv.c
+@@ -34,13 +34,14 @@
+ #include <linux/slab.h>
+ #include <linux/clk.h>
+ #include <linux/regulator/consumer.h>
++#include <linux/of.h>
+ 
+ struct nop_usb_xceiv {
+-	struct usb_phy		phy;
+-	struct device		*dev;
+-	struct clk		*clk;
+-	struct regulator	*vcc;
+-	struct regulator	*reset;
++	struct usb_phy phy;
++	struct device *dev;
++	struct clk *clk;
++	struct regulator *vcc;
++	struct regulator *reset;
+ };
+ 
+ static struct platform_device *pd;
+@@ -140,10 +141,12 @@ static int nop_set_host(struct usb_otg *otg, struct usb_bus *host)
+ 
+ static int nop_usb_xceiv_probe(struct platform_device *pdev)
+ {
++	struct device *dev = &pdev->dev;
+ 	struct nop_usb_xceiv_platform_data *pdata = pdev->dev.platform_data;
+ 	struct nop_usb_xceiv	*nop;
+ 	enum usb_phy_type	type = USB_PHY_TYPE_USB2;
+ 	int err;
++	u32 clk_rate = 0;
+ 
+ 	nop = devm_kzalloc(&pdev->dev, sizeof(*nop), GFP_KERNEL);
+ 	if (!nop)
+@@ -154,8 +157,16 @@ static int nop_usb_xceiv_probe(struct platform_device *pdev)
+ 	if (!nop->phy.otg)
+ 		return -ENOMEM;
+ 
+-	if (pdata)
++	if (dev->of_node) {
++		struct device_node *node = dev->of_node;
++
++		if (of_property_read_u32(node, "clock-frequency", &clk_rate))
++			clk_rate = 0;
++
++	} else if (pdata) {
+ 		type = pdata->type;
++		clk_rate = pdata->clk_rate;
++	}
+ 
+ 	nop->clk = devm_clk_get(&pdev->dev, "main_clk");
+ 	if (IS_ERR(nop->clk)) {
+@@ -163,8 +174,8 @@ static int nop_usb_xceiv_probe(struct platform_device *pdev)
+ 					PTR_ERR(nop->clk));
+ 	}
+ 
+-	if (!IS_ERR(nop->clk) && pdata && pdata->clk_rate) {
+-		err = clk_set_rate(nop->clk, pdata->clk_rate);
++	if (!IS_ERR(nop->clk) && clk_rate) {
++		err = clk_set_rate(nop->clk, clk_rate);
+ 		if (err) {
+ 			dev_err(&pdev->dev, "Error setting clock rate\n");
+ 			return err;
+@@ -237,12 +248,20 @@ static int nop_usb_xceiv_remove(struct platform_device *pdev)
+ 	return 0;
+ }
+ 
++static const struct of_device_id nop_xceiv_dt_ids[] = {
++	{ .compatible = "usb-nop-xceiv" },
++	{ }
++};
++
++MODULE_DEVICE_TABLE(of, nop_xceiv_dt_ids);
++
+ static struct platform_driver nop_usb_xceiv_driver = {
+ 	.probe		= nop_usb_xceiv_probe,
+ 	.remove		= nop_usb_xceiv_remove,
+ 	.driver		= {
+ 		.name	= "nop_usb_xceiv",
+ 		.owner	= THIS_MODULE,
++		.of_match_table = of_match_ptr(nop_xceiv_dt_ids),
+ 	},
+ };
+ 
+-- 
+1.7.9.5
+

Added: dists/sid/linux/debian/patches/features/arm/0006-USB-phy-nop-Defer-probe-if-device-needs-VCC-RESET.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/arm/0006-USB-phy-nop-Defer-probe-if-device-needs-VCC-RESET.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,71 @@
+From b54b5f56531d9fcbb30908373ba842af4de6a26b Mon Sep 17 00:00:00 2001
+From: Roger Quadros <rogerq at ti.com>
+Date: Tue, 12 Mar 2013 13:24:26 +0200
+Subject: [PATCH 6/6] USB: phy: nop: Defer probe if device needs VCC/RESET
+
+Add 2 flags, needs_vcc and needs_reset to platform data.
+If the flag is set and the regulator couldn't be found
+then we bail out with -EPROBE_DEFER.
+
+For device tree boot we depend on presensce of vcc-supply/
+reset-supply properties to decide if we should bail out
+with -EPROBE_DEFER or just continue in case the regulator
+can't be found.
+
+This is required for proper functionality in cases where the
+regulator is needed but is probed later than the PHY device.
+
+Signed-off-by: Roger Quadros <rogerq at ti.com>
+Signed-off-by: Felipe Balbi <balbi at ti.com>
+---
+ drivers/usb/otg/nop-usb-xceiv.c |   11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+diff --git a/drivers/usb/otg/nop-usb-xceiv.c b/drivers/usb/otg/nop-usb-xceiv.c
+index b26b1c2..2b10cc9 100644
+--- a/drivers/usb/otg/nop-usb-xceiv.c
++++ b/drivers/usb/otg/nop-usb-xceiv.c
+@@ -147,6 +147,8 @@ static int nop_usb_xceiv_probe(struct platform_device *pdev)
+ 	enum usb_phy_type	type = USB_PHY_TYPE_USB2;
+ 	int err;
+ 	u32 clk_rate = 0;
++	bool needs_vcc = false;
++	bool needs_reset = false;
+ 
+ 	nop = devm_kzalloc(&pdev->dev, sizeof(*nop), GFP_KERNEL);
+ 	if (!nop)
+@@ -163,9 +165,14 @@ static int nop_usb_xceiv_probe(struct platform_device *pdev)
+ 		if (of_property_read_u32(node, "clock-frequency", &clk_rate))
+ 			clk_rate = 0;
+ 
++		needs_vcc = of_property_read_bool(node, "vcc-supply");
++		needs_reset = of_property_read_bool(node, "reset-supply");
++
+ 	} else if (pdata) {
+ 		type = pdata->type;
+ 		clk_rate = pdata->clk_rate;
++		needs_vcc = pdata->needs_vcc;
++		needs_reset = pdata->needs_reset;
+ 	}
+ 
+ 	nop->clk = devm_clk_get(&pdev->dev, "main_clk");
+@@ -194,12 +201,16 @@ static int nop_usb_xceiv_probe(struct platform_device *pdev)
+ 	if (IS_ERR(nop->vcc)) {
+ 		dev_dbg(&pdev->dev, "Error getting vcc regulator: %ld\n",
+ 					PTR_ERR(nop->vcc));
++		if (needs_vcc)
++			return -EPROBE_DEFER;
+ 	}
+ 
+ 	nop->reset = devm_regulator_get(&pdev->dev, "reset");
+ 	if (IS_ERR(nop->reset)) {
+ 		dev_dbg(&pdev->dev, "Error getting reset regulator: %ld\n",
+ 					PTR_ERR(nop->reset));
++		if (needs_reset)
++			return -EPROBE_DEFER;
+ 	}
+ 
+ 	nop->dev		= &pdev->dev;
+-- 
+1.7.9.5
+

Added: dists/sid/linux/debian/patches/features/arm/0009-USB-EHCI-split-ehci-omap-out-to-a-separate-driver.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/arm/0009-USB-EHCI-split-ehci-omap-out-to-a-separate-driver.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,197 @@
+From a07cc53bf037c028e5f01419ab335de9a12f6bc4 Mon Sep 17 00:00:00 2001
+From: Alan Stern <stern at rowland.harvard.edu>
+Date: Tue, 12 Mar 2013 10:44:39 +0000
+Subject: [PATCH 09/10] USB: EHCI: split ehci-omap out to a separate driver
+
+This patch (as1645) converts ehci-omap over to the new "ehci-hcd is a
+library" approach, so that it can coexist peacefully with other EHCI
+platform drivers and can make use of the private area allocated at
+the end of struct ehci_hcd.
+
+Signed-off-by: Alan Stern <stern at rowland.harvard.edu>
+Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
+---
+ drivers/usb/host/Kconfig     |    2 +-
+ drivers/usb/host/Makefile    |    1 +
+ drivers/usb/host/ehci-hcd.c  |    6 +---
+ drivers/usb/host/ehci-omap.c |   76 +++++++++++++++++++-----------------------
+ 4 files changed, 37 insertions(+), 48 deletions(-)
+
+diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
+index 3a21c5d..11e102e 100644
+--- a/drivers/usb/host/Kconfig
++++ b/drivers/usb/host/Kconfig
+@@ -155,7 +155,7 @@ config USB_EHCI_MXC
+ 	  Variation of ARC USB block used in some Freescale chips.
+ 
+ config USB_EHCI_HCD_OMAP
+-	bool "EHCI support for OMAP3 and later chips"
++	tristate "EHCI support for OMAP3 and later chips"
+ 	depends on USB_EHCI_HCD && ARCH_OMAP
+ 	default y
+ 	---help---
+diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile
+index 001fbff..56de410 100644
+--- a/drivers/usb/host/Makefile
++++ b/drivers/usb/host/Makefile
+@@ -27,6 +27,7 @@ obj-$(CONFIG_USB_EHCI_HCD)	+= ehci-hcd.o
+ obj-$(CONFIG_USB_EHCI_PCI)	+= ehci-pci.o
+ obj-$(CONFIG_USB_EHCI_HCD_PLATFORM)	+= ehci-platform.o
+ obj-$(CONFIG_USB_EHCI_MXC)	+= ehci-mxc.o
++obj-$(CONFIG_USB_EHCI_HCD_OMAP)	+= ehci-omap.o
+ 
+ obj-$(CONFIG_USB_OXU210HP_HCD)	+= oxu210hp-hcd.o
+ obj-$(CONFIG_USB_ISP116X_HCD)	+= isp116x-hcd.o
+diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
+index b416a3f..303b022 100644
+--- a/drivers/usb/host/ehci-hcd.c
++++ b/drivers/usb/host/ehci-hcd.c
+@@ -1252,11 +1252,6 @@ MODULE_LICENSE ("GPL");
+ #define PLATFORM_DRIVER		ehci_hcd_sh_driver
+ #endif
+ 
+-#ifdef CONFIG_USB_EHCI_HCD_OMAP
+-#include "ehci-omap.c"
+-#define        PLATFORM_DRIVER         ehci_hcd_omap_driver
+-#endif
+-
+ #ifdef CONFIG_PPC_PS3
+ #include "ehci-ps3.c"
+ #define	PS3_SYSTEM_BUS_DRIVER	ps3_ehci_driver
+@@ -1346,6 +1341,7 @@ MODULE_LICENSE ("GPL");
+ 	!IS_ENABLED(CONFIG_USB_EHCI_HCD_PLATFORM) && \
+ 	!IS_ENABLED(CONFIG_USB_CHIPIDEA_HOST) && \
+ 	!IS_ENABLED(CONFIG_USB_EHCI_MXC) && \
++	!IS_ENABLED(CONFIG_USB_EHCI_HCD_OMAP) && \
+ 	!defined(PLATFORM_DRIVER) && \
+ 	!defined(PS3_SYSTEM_BUS_DRIVER) && \
+ 	!defined(OF_PLATFORM_DRIVER) && \
+diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c
+index 82052fa..9e85ce1 100644
+--- a/drivers/usb/host/ehci-omap.c
++++ b/drivers/usb/host/ehci-omap.c
+@@ -36,6 +36,9 @@
+  *	- convert to use hwmod and runtime PM
+  */
+ 
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/io.h>
+ #include <linux/platform_device.h>
+ #include <linux/slab.h>
+ #include <linux/usb/ulpi.h>
+@@ -43,6 +46,10 @@
+ #include <linux/pm_runtime.h>
+ #include <linux/gpio.h>
+ #include <linux/clk.h>
++#include <linux/usb.h>
++#include <linux/usb/hcd.h>
++
++#include "ehci.h"
+ 
+ #include <linux/platform_data/usb-omap.h>
+ 
+@@ -57,9 +64,11 @@
+ #define	EHCI_INSNREG05_ULPI_EXTREGADD_SHIFT		8
+ #define	EHCI_INSNREG05_ULPI_WRDATA_SHIFT		0
+ 
+-/*-------------------------------------------------------------------------*/
++#define DRIVER_DESC "OMAP-EHCI Host Controller driver"
+ 
+-static const struct hc_driver ehci_omap_hc_driver;
++static const char hcd_name[] = "ehci-omap";
++
++/*-------------------------------------------------------------------------*/
+ 
+ 
+ static inline void ehci_write(void __iomem *base, u32 reg, u32 val)
+@@ -166,6 +175,12 @@ static void disable_put_regulator(
+ /* configure so an HC device and id are always provided */
+ /* always called with process context; sleeping is OK */
+ 
++static struct hc_driver __read_mostly ehci_omap_hc_driver;
++
++static const struct ehci_driver_overrides ehci_omap_overrides __initdata = {
++	.reset =		omap_ehci_init,
++};
++
+ /**
+  * ehci_hcd_omap_probe - initialize TI-based HCDs
+  *
+@@ -323,56 +338,33 @@ static struct platform_driver ehci_hcd_omap_driver = {
+ 	/*.suspend		= ehci_hcd_omap_suspend, */
+ 	/*.resume		= ehci_hcd_omap_resume, */
+ 	.driver = {
+-		.name		= "ehci-omap",
++		.name		= hcd_name,
+ 	}
+ };
+ 
+ /*-------------------------------------------------------------------------*/
+ 
+-static const struct hc_driver ehci_omap_hc_driver = {
+-	.description		= hcd_name,
+-	.product_desc		= "OMAP-EHCI Host Controller",
+-	.hcd_priv_size		= sizeof(struct ehci_hcd),
+-
+-	/*
+-	 * generic hardware linkage
+-	 */
+-	.irq			= ehci_irq,
+-	.flags			= HCD_MEMORY | HCD_USB2,
+-
+-	/*
+-	 * basic lifecycle operations
+-	 */
+-	.reset			= omap_ehci_init,
+-	.start			= ehci_run,
+-	.stop			= ehci_stop,
+-	.shutdown		= ehci_shutdown,
+-
+-	/*
+-	 * managing i/o requests and associated device resources
+-	 */
+-	.urb_enqueue		= ehci_urb_enqueue,
+-	.urb_dequeue		= ehci_urb_dequeue,
+-	.endpoint_disable	= ehci_endpoint_disable,
+-	.endpoint_reset		= ehci_endpoint_reset,
++static int __init ehci_omap_init(void)
++{
++	if (usb_disabled())
++		return -ENODEV;
+ 
+-	/*
+-	 * scheduling support
+-	 */
+-	.get_frame_number	= ehci_get_frame,
++	pr_info("%s: " DRIVER_DESC "\n", hcd_name);
+ 
+-	/*
+-	 * root hub support
+-	 */
+-	.hub_status_data	= ehci_hub_status_data,
+-	.hub_control		= ehci_hub_control,
+-	.bus_suspend		= ehci_bus_suspend,
+-	.bus_resume		= ehci_bus_resume,
++	ehci_init_driver(&ehci_omap_hc_driver, &ehci_omap_overrides);
++	return platform_driver_register(&ehci_hcd_omap_driver);
++}
++module_init(ehci_omap_init);
+ 
+-	.clear_tt_buffer_complete = ehci_clear_tt_buffer_complete,
+-};
++static void __exit ehci_omap_cleanup(void)
++{
++	platform_driver_unregister(&ehci_hcd_omap_driver);
++}
++module_exit(ehci_omap_cleanup);
+ 
+ MODULE_ALIAS("platform:ehci-omap");
+ MODULE_AUTHOR("Texas Instruments, Inc.");
+ MODULE_AUTHOR("Felipe Balbi <felipe.balbi at nokia.com>");
+ 
++MODULE_DESCRIPTION(DRIVER_DESC);
++MODULE_LICENSE("GPL");
+-- 
+1.7.10.4
+

Added: dists/sid/linux/debian/patches/features/arm/0010-USB-EHCI-make-ehci-orion-a-separate-driver.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/arm/0010-USB-EHCI-make-ehci-orion-a-separate-driver.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,255 @@
+From 4181beaae0fbcef78287f0f2a04d150ecc7201d9 Mon Sep 17 00:00:00 2001
+From: Manjunath Goudar <manjunath.goudar at linaro.org>
+Date: Tue, 2 Apr 2013 16:23:59 +0000
+Subject: [PATCH 10/10] USB: EHCI: make ehci-orion a separate driver
+
+Separate the Orion host controller driver from ehci-hcd host
+code into its own driver module because of following reason.
+
+With the multiplatform changes in arm-soc tree, it becomes
+possible to enable the mvebu platform (which uses
+ehci-orion) at the same time as other platforms that require
+a conflicting EHCI bus glue. At the moment, this results
+in a warning like
+
+drivers/usb/host/ehci-hcd.c:1297:0: warning: "PLATFORM_DRIVER" redefined [enabled by default]
+drivers/usb/host/ehci-hcd.c:1277:0: note: this is the location of the previous definition
+drivers/usb/host/ehci-orion.c:334:31: warning: 'ehci_orion_driver' defined but not used [-Wunused-variable]
+
+and an ehci driver that only works on one of them.
+
+With the infrastructure added by Alan Stern in patch 3e0232039
+"USB: EHCI: prepare to make ehci-hcd a library module", we can
+avoid this problem by turning a bus glue into a separate
+module, as we do here for the orion bus glue.
+
+An earlier version of this patch was included in 3.9 but caused
+a regression there, which has subsequently been fixed.
+
+While we are here, use the opportunity to disabiguate the two
+Marvell EHCI controller implementations in Kconfig.
+
+In V4 (arnd):
+- Improve Kconfig text
+
+In V3:
+- More detail provided in commit message regarding this patch.
+- Replaced hcd_name string "ehci-orion" into "orion-ehci".
+- MODULE_LICENSE is GPL v2.
+- In ehci_init_driver calling second argument passed  as NULL instead of
+  ehci_orion_overrides because ehci_orion_overrides is removed.
+
+In V2:
+- Tegra patch related changes removed from this patch.
+
+Signed-off-by: Manjunath Goudar <manjunath.goudar at linaro.org>
+Signed-off-by: Arnd Bergmann <arnd at arndb.de>
+Acked-by: Jason Cooper <jason at lakedaemon.net>
+Tested-by: Andrew Lunn <andrew at lunn.ch>
+Acked-by: Alan Stern <stern at rowland.harvard.edu>
+Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
+---
+ drivers/usb/host/Kconfig      |   17 ++++++++-
+ drivers/usb/host/Makefile     |    1 +
+ drivers/usb/host/ehci-hcd.c   |    6 +--
+ drivers/usb/host/ehci-orion.c |   82 ++++++++++++++++++-----------------------
+ 4 files changed, 53 insertions(+), 53 deletions(-)
+
+diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
+index 11e102e..539465b 100644
+--- a/drivers/usb/host/Kconfig
++++ b/drivers/usb/host/Kconfig
+@@ -162,6 +162,17 @@ config USB_EHCI_HCD_OMAP
+ 	  Enables support for the on-chip EHCI controller on
+ 	  OMAP3 and later chips.
+ 
++config USB_EHCI_HCD_ORION
++	tristate  "Support for Marvell EBU on-chip EHCI USB controller"
++	depends on USB_EHCI_HCD && PLAT_ORION
++	default y
++	---help---
++	  Enables support for the on-chip EHCI controller on Marvell's
++	  embedded ARM SoCs, including Orion, Kirkwood, Dove, Armada XP,
++	  Armada 370.  This is different from the EHCI implementation
++	  on Marvell's mobile PXA and MMP SoC, see "EHCI support for
++	  Marvell PXA/MMP USB controller" for those.
++
+ config USB_EHCI_MSM
+ 	bool "Support for MSM on-chip EHCI USB controller"
+ 	depends on USB_EHCI_HCD && ARCH_MSM
+@@ -205,13 +216,17 @@ config USB_EHCI_S5P
+ 	 Enable support for the S5P SOC's on-chip EHCI controller.
+ 
+ config USB_EHCI_MV
+-	bool "EHCI support for Marvell on-chip controller"
++	bool "EHCI support for Marvell PXA/MMP USB controller"
+ 	depends on USB_EHCI_HCD && (ARCH_PXA || ARCH_MMP)
+ 	select USB_EHCI_ROOT_HUB_TT
+ 	---help---
+ 	  Enables support for Marvell (including PXA and MMP series) on-chip
+ 	  USB SPH and OTG controller. SPH is a single port host, and it can
+ 	  only be EHCI host. OTG is controller that can switch to host mode.
++	  Note that this driver will not work on Marvell's other EHCI
++	  controller used by the EBU-type SoCs including Orion, Kirkwood,
++	  Dova, Armada 370 and Armada XP. See "Support for Marvell EBU
++	  on-chip EHCI USB controller" for those.
+ 
+ config USB_W90X900_EHCI
+ 	bool "W90X900(W90P910) EHCI support"
+diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile
+index 56de410..9492f50 100644
+--- a/drivers/usb/host/Makefile
++++ b/drivers/usb/host/Makefile
+@@ -28,6 +28,7 @@ obj-$(CONFIG_USB_EHCI_PCI)	+= ehci-pci.o
+ obj-$(CONFIG_USB_EHCI_HCD_PLATFORM)	+= ehci-platform.o
+ obj-$(CONFIG_USB_EHCI_MXC)	+= ehci-mxc.o
+ obj-$(CONFIG_USB_EHCI_HCD_OMAP)	+= ehci-omap.o
++obj-$(CONFIG_USB_EHCI_HCD_ORION)	+= ehci-orion.o
+ 
+ obj-$(CONFIG_USB_OXU210HP_HCD)	+= oxu210hp-hcd.o
+ obj-$(CONFIG_USB_ISP116X_HCD)	+= isp116x-hcd.o
+diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
+index 303b022..93fd382 100644
+--- a/drivers/usb/host/ehci-hcd.c
++++ b/drivers/usb/host/ehci-hcd.c
+@@ -1267,11 +1267,6 @@ MODULE_LICENSE ("GPL");
+ #define XILINX_OF_PLATFORM_DRIVER	ehci_hcd_xilinx_of_driver
+ #endif
+ 
+-#ifdef CONFIG_PLAT_ORION
+-#include "ehci-orion.c"
+-#define	PLATFORM_DRIVER		ehci_orion_driver
+-#endif
+-
+ #ifdef CONFIG_USB_W90X900_EHCI
+ #include "ehci-w90x900.c"
+ #define	PLATFORM_DRIVER		ehci_hcd_w90x900_driver
+@@ -1342,6 +1337,7 @@ MODULE_LICENSE ("GPL");
+ 	!IS_ENABLED(CONFIG_USB_CHIPIDEA_HOST) && \
+ 	!IS_ENABLED(CONFIG_USB_EHCI_MXC) && \
+ 	!IS_ENABLED(CONFIG_USB_EHCI_HCD_OMAP) && \
++	!IS_ENABLED(CONFIG_USB_EHCI_HCD_ORION) && \
+ 	!defined(PLATFORM_DRIVER) && \
+ 	!defined(PS3_SYSTEM_BUS_DRIVER) && \
+ 	!defined(OF_PLATFORM_DRIVER) && \
+diff --git a/drivers/usb/host/ehci-orion.c b/drivers/usb/host/ehci-orion.c
+index 914a3ec..e24e905 100644
+--- a/drivers/usb/host/ehci-orion.c
++++ b/drivers/usb/host/ehci-orion.c
+@@ -17,6 +17,12 @@
+ #include <linux/of.h>
+ #include <linux/of_device.h>
+ #include <linux/of_irq.h>
++#include <linux/usb.h>
++#include <linux/usb/hcd.h>
++#include <linux/io.h>
++#include <linux/dma-mapping.h>
++
++#include "ehci.h"
+ 
+ #define rdl(off)	__raw_readl(hcd->regs + (off))
+ #define wrl(off, val)	__raw_writel((val), hcd->regs + (off))
+@@ -34,6 +40,12 @@
+ #define USB_PHY_IVREF_CTRL	0x440
+ #define USB_PHY_TST_GRP_CTRL	0x450
+ 
++#define DRIVER_DESC "EHCI orion driver"
++
++static const char hcd_name[] = "ehci-orion";
++
++static struct hc_driver __read_mostly ehci_orion_hc_driver;
++
+ /*
+  * Implement Orion USB controller specification guidelines
+  */
+@@ -104,51 +116,6 @@ static void orion_usb_phy_v1_setup(struct usb_hcd *hcd)
+ 	wrl(USB_MODE, 0x13);
+ }
+ 
+-static const struct hc_driver ehci_orion_hc_driver = {
+-	.description = hcd_name,
+-	.product_desc = "Marvell Orion EHCI",
+-	.hcd_priv_size = sizeof(struct ehci_hcd),
+-
+-	/*
+-	 * generic hardware linkage
+-	 */
+-	.irq = ehci_irq,
+-	.flags = HCD_MEMORY | HCD_USB2,
+-
+-	/*
+-	 * basic lifecycle operations
+-	 */
+-	.reset = ehci_setup,
+-	.start = ehci_run,
+-	.stop = ehci_stop,
+-	.shutdown = ehci_shutdown,
+-
+-	/*
+-	 * managing i/o requests and associated device resources
+-	 */
+-	.urb_enqueue = ehci_urb_enqueue,
+-	.urb_dequeue = ehci_urb_dequeue,
+-	.endpoint_disable = ehci_endpoint_disable,
+-	.endpoint_reset = ehci_endpoint_reset,
+-
+-	/*
+-	 * scheduling support
+-	 */
+-	.get_frame_number = ehci_get_frame,
+-
+-	/*
+-	 * root hub support
+-	 */
+-	.hub_status_data = ehci_hub_status_data,
+-	.hub_control = ehci_hub_control,
+-	.bus_suspend = ehci_bus_suspend,
+-	.bus_resume = ehci_bus_resume,
+-	.relinquish_port = ehci_relinquish_port,
+-	.port_handed_over = ehci_port_handed_over,
+-
+-	.clear_tt_buffer_complete = ehci_clear_tt_buffer_complete,
+-};
+-
+ static void
+ ehci_orion_conf_mbus_windows(struct usb_hcd *hcd,
+ 			     const struct mbus_dram_target_info *dram)
+@@ -323,8 +290,6 @@ static int __exit ehci_orion_drv_remove(struct platform_device *pdev)
+ 	return 0;
+ }
+ 
+-MODULE_ALIAS("platform:orion-ehci");
+-
+ static const struct of_device_id ehci_orion_dt_ids[] = {
+ 	{ .compatible = "marvell,orion-ehci", },
+ 	{},
+@@ -341,3 +306,26 @@ static struct platform_driver ehci_orion_driver = {
+ 		.of_match_table = of_match_ptr(ehci_orion_dt_ids),
+ 	},
+ };
++
++static int __init ehci_orion_init(void)
++{
++	if (usb_disabled())
++		return -ENODEV;
++
++	pr_info("%s: " DRIVER_DESC "\n", hcd_name);
++
++	ehci_init_driver(&ehci_orion_hc_driver, NULL);
++	return platform_driver_register(&ehci_orion_driver);
++}
++module_init(ehci_orion_init);
++
++static void __exit ehci_orion_cleanup(void)
++{
++	platform_driver_unregister(&ehci_orion_driver);
++}
++module_exit(ehci_orion_cleanup);
++
++MODULE_DESCRIPTION(DRIVER_DESC);
++MODULE_ALIAS("platform:orion-ehci");
++MODULE_AUTHOR("Tzachi Perelstein");
++MODULE_LICENSE("GPL v2");
+-- 
+1.7.10.4
+

Added: dists/sid/linux/debian/patches/features/arm/ARM-dts-imx-add-imx5x-usb-clock-DT-lookups.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/arm/ARM-dts-imx-add-imx5x-usb-clock-DT-lookups.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,100 @@
+From 8ed5da7959d5e6d3fcbdfafbacb58614499fb314 Mon Sep 17 00:00:00 2001
+From: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Date: Thu, 11 Apr 2013 10:13:15 +0000
+Subject: 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>
+---
+(limited to 'arch/arm/boot/dts')
+
+diff --git a/arch/arm/boot/dts/imx51.dtsi b/arch/arm/boot/dts/imx51.dtsi
+index 761ae1c..b118e01 100644
+--- a/arch/arm/boot/dts/imx51.dtsi
++++ b/arch/arm/boot/dts/imx51.dtsi
+@@ -179,6 +179,7 @@
+ 				compatible = "fsl,imx51-usb", "fsl,imx27-usb";
+ 				reg = <0x73f80000 0x0200>;
+ 				interrupts = <18>;
++				clocks = <&clks 108>;
+ 				fsl,usbmisc = <&usbmisc 0>;
+ 				status = "disabled";
+ 			};
+@@ -187,6 +188,7 @@
+ 				compatible = "fsl,imx51-usb", "fsl,imx27-usb";
+ 				reg = <0x73f80200 0x0200>;
+ 				interrupts = <14>;
++				clocks = <&clks 108>;
+ 				fsl,usbmisc = <&usbmisc 1>;
+ 				status = "disabled";
+ 			};
+@@ -195,6 +197,7 @@
+ 				compatible = "fsl,imx51-usb", "fsl,imx27-usb";
+ 				reg = <0x73f80400 0x0200>;
+ 				interrupts = <16>;
++				clocks = <&clks 108>;
+ 				fsl,usbmisc = <&usbmisc 2>;
+ 				status = "disabled";
+ 			};
+@@ -203,6 +206,7 @@
+ 				compatible = "fsl,imx51-usb", "fsl,imx27-usb";
+ 				reg = <0x73f80600 0x0200>;
+ 				interrupts = <17>;
++				clocks = <&clks 108>;
+ 				fsl,usbmisc = <&usbmisc 3>;
+ 				status = "disabled";
+ 			};
+@@ -211,6 +215,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 6c8fa7d..faea9fa 100644
+--- a/arch/arm/boot/dts/imx53.dtsi
++++ b/arch/arm/boot/dts/imx53.dtsi
+@@ -167,6 +167,7 @@
+ 				compatible = "fsl,imx53-usb", "fsl,imx27-usb";
+ 				reg = <0x53f80000 0x0200>;
+ 				interrupts = <18>;
++				clocks = <&clks 108>;
+ 				fsl,usbmisc = <&usbmisc 0>;
+ 				status = "disabled";
+ 			};
+@@ -175,6 +176,7 @@
+ 				compatible = "fsl,imx53-usb", "fsl,imx27-usb";
+ 				reg = <0x53f80200 0x0200>;
+ 				interrupts = <14>;
++				clocks = <&clks 108>;
+ 				fsl,usbmisc = <&usbmisc 1>;
+ 				status = "disabled";
+ 			};
+@@ -183,6 +185,7 @@
+ 				compatible = "fsl,imx53-usb", "fsl,imx27-usb";
+ 				reg = <0x53f80400 0x0200>;
+ 				interrupts = <16>;
++				clocks = <&clks 108>;
+ 				fsl,usbmisc = <&usbmisc 2>;
+ 				status = "disabled";
+ 			};
+@@ -191,6 +194,7 @@
+ 				compatible = "fsl,imx53-usb", "fsl,imx27-usb";
+ 				reg = <0x53f80600 0x0200>;
+ 				interrupts = <17>;
++				clocks = <&clks 108>;
+ 				fsl,usbmisc = <&usbmisc 3>;
+ 				status = "disabled";
+ 			};
+@@ -199,6 +203,7 @@
+ 				#index-cells = <1>;
+ 				compatible = "fsl,imx53-usbmisc";
+ 				reg = <0x53f80800 0x200>;
++				clocks = <&clks 108>;
+ 			};
+ 
+ 			gpio1: gpio at 53f84000 {
+--
+cgit v0.9.1

Added: dists/sid/linux/debian/patches/features/arm/ARM-dts-imx-add-imx5x-usbmisc-entries.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/arm/ARM-dts-imx-add-imx5x-usbmisc-entries.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,102 @@
+From feb57438936827ce9faadd35f4835102b8fd0901 Mon Sep 17 00:00:00 2001
+From: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Date: Thu, 11 Apr 2013 10:13:14 +0000
+Subject: 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>
+---
+(limited to 'arch/arm/boot/dts')
+
+diff --git a/arch/arm/boot/dts/imx51.dtsi b/arch/arm/boot/dts/imx51.dtsi
+index 21bb786..761ae1c 100644
+--- a/arch/arm/boot/dts/imx51.dtsi
++++ b/arch/arm/boot/dts/imx51.dtsi
+@@ -179,6 +179,7 @@
+ 				compatible = "fsl,imx51-usb", "fsl,imx27-usb";
+ 				reg = <0x73f80000 0x0200>;
+ 				interrupts = <18>;
++				fsl,usbmisc = <&usbmisc 0>;
+ 				status = "disabled";
+ 			};
+ 
+@@ -186,6 +187,7 @@
+ 				compatible = "fsl,imx51-usb", "fsl,imx27-usb";
+ 				reg = <0x73f80200 0x0200>;
+ 				interrupts = <14>;
++				fsl,usbmisc = <&usbmisc 1>;
+ 				status = "disabled";
+ 			};
+ 
+@@ -193,6 +195,7 @@
+ 				compatible = "fsl,imx51-usb", "fsl,imx27-usb";
+ 				reg = <0x73f80400 0x0200>;
+ 				interrupts = <16>;
++				fsl,usbmisc = <&usbmisc 2>;
+ 				status = "disabled";
+ 			};
+ 
+@@ -200,9 +203,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 845982e..6c8fa7d 100644
+--- a/arch/arm/boot/dts/imx53.dtsi
++++ b/arch/arm/boot/dts/imx53.dtsi
+@@ -167,6 +167,7 @@
+ 				compatible = "fsl,imx53-usb", "fsl,imx27-usb";
+ 				reg = <0x53f80000 0x0200>;
+ 				interrupts = <18>;
++				fsl,usbmisc = <&usbmisc 0>;
+ 				status = "disabled";
+ 			};
+ 
+@@ -174,6 +175,7 @@
+ 				compatible = "fsl,imx53-usb", "fsl,imx27-usb";
+ 				reg = <0x53f80200 0x0200>;
+ 				interrupts = <14>;
++				fsl,usbmisc = <&usbmisc 1>;
+ 				status = "disabled";
+ 			};
+ 
+@@ -181,6 +183,7 @@
+ 				compatible = "fsl,imx53-usb", "fsl,imx27-usb";
+ 				reg = <0x53f80400 0x0200>;
+ 				interrupts = <16>;
++				fsl,usbmisc = <&usbmisc 2>;
+ 				status = "disabled";
+ 			};
+ 
+@@ -188,9 +191,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>;
+--
+cgit v0.9.1

Added: dists/sid/linux/debian/patches/features/arm/ARM-dts-imx-imx53-qsb.dts-enable-usbotg-and-usbh1.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/arm/ARM-dts-imx-imx53-qsb.dts-enable-usbotg-and-usbh1.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,28 @@
+From c9cb1ec6e2a15e744a6481cb14730a5812471e71 Mon Sep 17 00:00:00 2001
+From: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Date: Thu, 11 Apr 2013 10:13:17 +0000
+Subject: ARM: dts: imx: imx53-qsb.dts: enable usbotg and usbh1
+
+Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Signed-off-by: Shawn Guo <shawn.guo at linaro.org>
+---
+(limited to 'arch/arm/boot/dts')
+
+diff --git a/arch/arm/boot/dts/imx53-qsb.dts b/arch/arm/boot/dts/imx53-qsb.dts
+index 8f0e9ae..160d1bc 100644
+--- a/arch/arm/boot/dts/imx53-qsb.dts
++++ b/arch/arm/boot/dts/imx53-qsb.dts
+@@ -268,3 +268,11 @@
+ 	phy-reset-gpios = <&gpio7 6 0>;
+ 	status = "okay";
+ };
++
++&usbh1 {
++       status = "okay";
++};
++
++&usbotg {
++       status = "okay";
++};
+--
+cgit v0.9.1

Added: dists/sid/linux/debian/patches/features/arm/ARM-dts-imx-use-usb-nop-xceiv-usbphy-entries-for-imx5x.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/arm/ARM-dts-imx-use-usb-nop-xceiv-usbphy-entries-for-imx5x.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,77 @@
+From 972a8dd0c7ca37b70d4bf523018e32703937a829 Mon Sep 17 00:00:00 2001
+From: Michael Grzeschik <m.grzeschik at pengutronix.de>
+Date: Thu, 11 Apr 2013 10:13:16 +0000
+Subject: 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>
+---
+(limited to 'arch/arm/boot/dts')
+
+diff --git a/arch/arm/boot/dts/imx51.dtsi b/arch/arm/boot/dts/imx51.dtsi
+index b118e01..f23636f 100644
+--- a/arch/arm/boot/dts/imx51.dtsi
++++ b/arch/arm/boot/dts/imx51.dtsi
+@@ -175,12 +175,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 faea9fa..c4ddf51 100644
+--- a/arch/arm/boot/dts/imx53.dtsi
++++ b/arch/arm/boot/dts/imx53.dtsi
+@@ -163,12 +163,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";
+ 			};
+ 
+@@ -178,6 +193,7 @@
+ 				interrupts = <14>;
+ 				clocks = <&clks 108>;
+ 				fsl,usbmisc = <&usbmisc 1>;
++				fsl,usbphy = <&usbphy1>;
+ 				status = "disabled";
+ 			};
+ 
+--
+cgit v0.9.1

Added: dists/sid/linux/debian/patches/features/arm/imx53-qsb-usb-power.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/arm/imx53-qsb-usb-power.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,34 @@
+imx53-qsb: enable usb power
+
+Enable usb power pin by using a fixed regulator. With this and the usb clock
+patch is making usb working on my loco.
+
+Signed-off-by: Arnaud Patard <arnaud.patard at rtp-net.org>
+Index: linux/arch/arm/boot/dts/imx53-qsb.dts
+===================================================================
+--- linux.orig/arch/arm/boot/dts/imx53-qsb.dts	2013-05-20 00:46:34.000000000 +0200
++++ linux/arch/arm/boot/dts/imx53-qsb.dts	2013-05-20 01:06:31.000000000 +0200
+@@ -66,6 +66,15 @@
+ 			regulator-max-microvolt = <3200000>;
+ 			regulator-always-on;
+ 		};
++
++		reg_usbpwr: usbpwr {
++			compatible = "regulator-fixed";
++			regulator-name = "usbpwr";
++			regulator-min-microvolt = <5000000>;
++			regulator-max-microvolt = <5000000>;
++			gpio = <&gpio7 8 0>;
++			regulator-always-on;
++		};
+ 	};
+ 
+ 	sound {
+@@ -118,6 +127,7 @@
+ 				697  0x80000000	/* MX53_PAD_EIM_DA12__GPIO3_12 */
+ 				701  0x80000000	/* MX53_PAD_EIM_DA13__GPIO3_13 */
+ 				868  0x80000000	/* MX53_PAD_PATA_DA_0__GPIO7_6 */
++				878  0x80000000 /* MX53_PAD_PATA_DA_2__GPIO7_8 */
+ 				1149 0x80000000 /* MX53_PAD_GPIO_16__GPIO7_11 */
+ 			>;
+ 		};

Added: dists/sid/linux/debian/patches/features/arm/usbmisc-imx-add-module_device_table.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/arm/usbmisc-imx-add-module_device_table.patch	Fri May 31 22:09:44 2013	(r20160)
@@ -0,0 +1,20 @@
+usbmisc_imx: allow autoloading on according to dt ids
+
+[ not yet sent upstream ]
+
+Allow udev to autoload the module when booting with device-tree
+
+Signed-off-by: Arnaud Patard <arnaud.patard at rtp-net.org>
+
+Index: linux/drivers/usb/chipidea/usbmisc_imx.c
+===================================================================
+--- linux.orig/drivers/usb/chipidea/usbmisc_imx.c	2013-05-16 00:46:35.000000000 +0200
++++ linux/drivers/usb/chipidea/usbmisc_imx.c	2013-05-16 09:00:12.000000000 +0200
+@@ -175,6 +175,7 @@ static const struct of_device_id usbmisc
+ 	},
+ 	{ /* sentinel */ }
+ };
++MODULE_DEVICE_TABLE(of, usbmisc_imx_dt_ids);
+ 
+ static int usbmisc_imx_probe(struct platform_device *pdev)
+ {

Modified: dists/sid/linux/debian/patches/series
==============================================================================
--- dists/sid/linux/debian/patches/series	Fri May 31 22:02:49 2013	(r20159)
+++ dists/sid/linux/debian/patches/series	Fri May 31 22:09:44 2013	(r20160)
@@ -75,3 +75,31 @@
 debian/efivars-remove-check-for-50-full-on-write.patch
 debian/cdc_ncm-cdc_mbim-use-ncm-by-default.patch
 debian/powerpcspe-omit-uimage.patch
+
+features/arm/0009-USB-EHCI-split-ehci-omap-out-to-a-separate-driver.patch
+features/arm/0010-USB-EHCI-make-ehci-orion-a-separate-driver.patch
+bugfix/arm/mvneta-module-fix.patch
+bugfix/arm/i2c-imx-add-module_device_table.patch
+bugfix/arm/imx-sgtl5000-probe-defer.patch
+features/arm/0001-usb-chipidea-usbmisc-rename-file-struct-and-function.patch
+features/arm/0001-usb-chipidea-usbmisc-unset-global-varibale-usbmisc-o.patch
+features/arm/0001-usb-chipidea-usbmisc-fix-a-potential-race-condition.patch
+features/arm/0001-usb-chipidea-usbmisc-prepare-driver-to-handle-more-t.patch
+features/arm/0001-usb-chipidea-usbmisc-add-mx53-support.patch
+features/arm/0001-usb-chipidea-usbmisc-add-post-handling-and-errata-fi.patch
+features/arm/0001-usb-phy-nop-Add-some-parameters-to-platform-data.patch
+features/arm/0001-usb-phy-nop-use-devm_kzalloc.patch
+features/arm/0001-usb-phy-nop-Manage-PHY-clock.patch
+features/arm/0002-usb-phy-nop-Handle-power-supply-regulator-for-the-PH.patch
+features/arm/0003-usb-phy-nop-Handle-RESET-for-the-PHY.patch
+features/arm/0004-usb-phy-nop-use-new-PHY-API-to-register-PHY.patch
+features/arm/0005-usb-phy-nop-Add-device-tree-support-and-binding-info.patch
+features/arm/0006-USB-phy-nop-Defer-probe-if-device-needs-VCC-RESET.patch
+features/arm/ARM-dts-imx-add-imx5x-usbmisc-entries.patch
+features/arm/ARM-dts-imx-add-imx5x-usb-clock-DT-lookups.patch
+features/arm/ARM-dts-imx-use-usb-nop-xceiv-usbphy-entries-for-imx5x.patch
+features/arm/ARM-dts-imx-imx53-qsb.dts-enable-usbotg-and-usbh1.patch
+features/arm/usbmisc-imx-add-module_device_table.patch
+features/arm/imx53-qsb-usb-power.patch
+features/arm/0001-thermal-Add-driver-for-Armada-370-XP-SoC-thermal-man.patch
+features/arm/0001-ARM-mvebu-Add-thermal-support-to-Armada-XP-device-tr.patch 



More information about the Kernel-svn-changes mailing list