- 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 svn path=/dists/sid/linux/; revision=20160
This commit is contained in:
parent
6bd3cb8758
commit
6a4c912d6f
|
@ -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@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)
|
||||
{
|
|
@ -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@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);
|
|
@ -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@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;
|
35
debian/patches/features/arm/0001-ARM-mvebu-Add-thermal-support-to-Armada-XP-device-tr.patch
vendored
Normal file
35
debian/patches/features/arm/0001-ARM-mvebu-Add-thermal-support-to-Armada-XP-device-tr.patch
vendored
Normal file
|
@ -0,0 +1,35 @@
|
|||
From 693a56eaf487140adbe114248e3cd22002fc867d Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@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@free-electrons.com>
|
||||
Acked-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Signed-off-by: Jason Cooper <jason@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@d00182b0 {
|
||||
+ compatible = "marvell,armadaxp-thermal";
|
||||
+ reg = <0xd00182b0 0x4
|
||||
+ 0xd00184d0 0x4>;
|
||||
+ status = "okay";
|
||||
+ };
|
||||
};
|
||||
};
|
||||
--
|
||||
1.7.9.5
|
||||
|
330
debian/patches/features/arm/0001-thermal-Add-driver-for-Armada-370-XP-SoC-thermal-man.patch
vendored
Normal file
330
debian/patches/features/arm/0001-thermal-Add-driver-for-Armada-370-XP-SoC-thermal-man.patch
vendored
Normal file
|
@ -0,0 +1,330 @@
|
|||
From fa0d654c84c7705d90a2492b4611e1da7ccdf69c Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@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@free-electrons.com>
|
||||
Signed-off-by: Zhang Rui <rui.zhang@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@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@free-electrons.com>");
|
||||
+MODULE_DESCRIPTION("Armada 370/XP thermal driver");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
--
|
||||
1.7.9.5
|
||||
|
105
debian/patches/features/arm/0001-usb-chipidea-usbmisc-add-mx53-support.patch
vendored
Normal file
105
debian/patches/features/arm/0001-usb-chipidea-usbmisc-add-mx53-support.patch
vendored
Normal file
|
@ -0,0 +1,105 @@
|
|||
From f0c910b63cc273c239964776fae1aaa58ed4ad2b Mon Sep 17 00:00:00 2001
|
||||
From: Michael Grzeschik <m.grzeschik@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@pengutronix.de>
|
||||
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
|
||||
[Alex: fixed another set of line-too-long and void pointer cast]
|
||||
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@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
|
||||
|
168
debian/patches/features/arm/0001-usb-chipidea-usbmisc-add-post-handling-and-errata-fi.patch
vendored
Normal file
168
debian/patches/features/arm/0001-usb-chipidea-usbmisc-add-post-handling-and-errata-fi.patch
vendored
Normal file
|
@ -0,0 +1,168 @@
|
|||
From a068533079a0a1be53c78c89e65adfbd3c687591 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Grzeschik <m.grzeschik@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@pengutronix.de>
|
||||
Signed-off-by: Marc Kleine-Budde <mkl@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@linux.intel.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@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@02184000 { /* USB OTG */
|
||||
@@ -20,4 +21,5 @@ usb@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
|
||||
|
42
debian/patches/features/arm/0001-usb-chipidea-usbmisc-fix-a-potential-race-condition.patch
vendored
Normal file
42
debian/patches/features/arm/0001-usb-chipidea-usbmisc-fix-a-potential-race-condition.patch
vendored
Normal file
|
@ -0,0 +1,42 @@
|
|||
From 00b9a1f97dbdfbdc1d268bf8d878937b150ce2d4 Mon Sep 17 00:00:00 2001
|
||||
From: Marc Kleine-Budde <mkl@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@pengutronix.de>
|
||||
Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
|
||||
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@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
|
||||
|
92
debian/patches/features/arm/0001-usb-chipidea-usbmisc-prepare-driver-to-handle-more-t.patch
vendored
Normal file
92
debian/patches/features/arm/0001-usb-chipidea-usbmisc-prepare-driver-to-handle-more-t.patch
vendored
Normal file
|
@ -0,0 +1,92 @@
|
|||
From e609108a5ba70ecf3b1b6a7e09e5a56244e92926 Mon Sep 17 00:00:00 2001
|
||||
From: Marc Kleine-Budde <mkl@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@pengutronix.de>
|
||||
Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
|
||||
[Alex: fixed one case of line-too-long and one bogus cast to void ptr]
|
||||
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@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
|
||||
|
368
debian/patches/features/arm/0001-usb-chipidea-usbmisc-rename-file-struct-and-function.patch
vendored
Normal file
368
debian/patches/features/arm/0001-usb-chipidea-usbmisc-rename-file-struct-and-function.patch
vendored
Normal file
|
@ -0,0 +1,368 @@
|
|||
From a7bc2fdf003c55f8e00e1e7e6fff51a4876779ef Mon Sep 17 00:00:00 2001
|
||||
From: Michael Grzeschik <m.grzeschik@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@gmail.com>
|
||||
Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
|
||||
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
|
||||
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@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@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@freescale.com>");
|
32
debian/patches/features/arm/0001-usb-chipidea-usbmisc-unset-global-varibale-usbmisc-o.patch
vendored
Normal file
32
debian/patches/features/arm/0001-usb-chipidea-usbmisc-unset-global-varibale-usbmisc-o.patch
vendored
Normal file
|
@ -0,0 +1,32 @@
|
|||
From d48a24dbc0d3f21cbd594bcc2553d40cc5ed4fd9 Mon Sep 17 00:00:00 2001
|
||||
From: Marc Kleine-Budde <mkl@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@pengutronix.de>
|
||||
Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
|
||||
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@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
|
||||
|
38
debian/patches/features/arm/0001-usb-phy-nop-Add-some-parameters-to-platform-data.patch
vendored
Normal file
38
debian/patches/features/arm/0001-usb-phy-nop-Add-some-parameters-to-platform-data.patch
vendored
Normal file
|
@ -0,0 +1,38 @@
|
|||
From 1f0972f5b05a674d73e4eb314fa1b6c78e37aef1 Mon Sep 17 00:00:00 2001
|
||||
From: Roger Quadros <rogerq@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@ti.com>
|
||||
Acked-by: Felipe Balbi <balbi@ti.com>
|
||||
Signed-off-by: Felipe Balbi <balbi@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
|
||||
|
|
@ -0,0 +1,127 @@
|
|||
From 2319fb88e16e56c64d4f3ab50af69ed6dadbc7b5 Mon Sep 17 00:00:00 2001
|
||||
From: Roger Quadros <rogerq@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@ti.com>
|
||||
Signed-off-by: Felipe Balbi <balbi@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
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
From e4d7dc6674efd798792adbd689986cde5422aa62 Mon Sep 17 00:00:00 2001
|
||||
From: Roger Quadros <rogerq@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@ti.com>
|
||||
Signed-off-by: Felipe Balbi <balbi@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
|
||||
|
73
debian/patches/features/arm/0002-usb-phy-nop-Handle-power-supply-regulator-for-the-PH.patch
vendored
Normal file
73
debian/patches/features/arm/0002-usb-phy-nop-Handle-power-supply-regulator-for-the-PH.patch
vendored
Normal file
|
@ -0,0 +1,73 @@
|
|||
From 58f735fe4778d34d9d1e37bcdd59325d66a8793e Mon Sep 17 00:00:00 2001
|
||||
From: Roger Quadros <rogerq@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@ti.com>
|
||||
Signed-off-by: Felipe Balbi <balbi@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
|
||||
|
|
@ -0,0 +1,73 @@
|
|||
From ad63ebfc3565bbdec87ee4e30e4d40d164c1d3b8 Mon Sep 17 00:00:00 2001
|
||||
From: Roger Quadros <rogerq@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@ti.com>
|
||||
Signed-off-by: Felipe Balbi <balbi@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
|
||||
|
36
debian/patches/features/arm/0004-usb-phy-nop-use-new-PHY-API-to-register-PHY.patch
vendored
Normal file
36
debian/patches/features/arm/0004-usb-phy-nop-use-new-PHY-API-to-register-PHY.patch
vendored
Normal file
|
@ -0,0 +1,36 @@
|
|||
From 90f4232f31f087f86667da03b1a4f3c90a32cb4a Mon Sep 17 00:00:00 2001
|
||||
From: Roger Quadros <rogerq@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@ti.com>
|
||||
Signed-off-by: Felipe Balbi <balbi@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
|
||||
|
147
debian/patches/features/arm/0005-usb-phy-nop-Add-device-tree-support-and-binding-info.patch
vendored
Normal file
147
debian/patches/features/arm/0005-usb-phy-nop-Add-device-tree-support-and-binding-info.patch
vendored
Normal file
|
@ -0,0 +1,147 @@
|
|||
From 0eba387973f521e57f00584e5e840e5328a61dda Mon Sep 17 00:00:00 2001
|
||||
From: Roger Quadros <rogerq@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@ti.com>
|
||||
Signed-off-by: Felipe Balbi <balbi@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
|
||||
|
71
debian/patches/features/arm/0006-USB-phy-nop-Defer-probe-if-device-needs-VCC-RESET.patch
vendored
Normal file
71
debian/patches/features/arm/0006-USB-phy-nop-Defer-probe-if-device-needs-VCC-RESET.patch
vendored
Normal file
|
@ -0,0 +1,71 @@
|
|||
From b54b5f56531d9fcbb30908373ba842af4de6a26b Mon Sep 17 00:00:00 2001
|
||||
From: Roger Quadros <rogerq@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@ti.com>
|
||||
Signed-off-by: Felipe Balbi <balbi@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
|
||||
|
197
debian/patches/features/arm/0009-USB-EHCI-split-ehci-omap-out-to-a-separate-driver.patch
vendored
Normal file
197
debian/patches/features/arm/0009-USB-EHCI-split-ehci-omap-out-to-a-separate-driver.patch
vendored
Normal file
|
@ -0,0 +1,197 @@
|
|||
From a07cc53bf037c028e5f01419ab335de9a12f6bc4 Mon Sep 17 00:00:00 2001
|
||||
From: Alan Stern <stern@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@rowland.harvard.edu>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@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@nokia.com>");
|
||||
|
||||
+MODULE_DESCRIPTION(DRIVER_DESC);
|
||||
+MODULE_LICENSE("GPL");
|
||||
--
|
||||
1.7.10.4
|
||||
|
255
debian/patches/features/arm/0010-USB-EHCI-make-ehci-orion-a-separate-driver.patch
vendored
Normal file
255
debian/patches/features/arm/0010-USB-EHCI-make-ehci-orion-a-separate-driver.patch
vendored
Normal file
|
@ -0,0 +1,255 @@
|
|||
From 4181beaae0fbcef78287f0f2a04d150ecc7201d9 Mon Sep 17 00:00:00 2001
|
||||
From: Manjunath Goudar <manjunath.goudar@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@linaro.org>
|
||||
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
|
||||
Acked-by: Jason Cooper <jason@lakedaemon.net>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Acked-by: Alan Stern <stern@rowland.harvard.edu>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@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
|
||||
|
100
debian/patches/features/arm/ARM-dts-imx-add-imx5x-usb-clock-DT-lookups.patch
vendored
Normal file
100
debian/patches/features/arm/ARM-dts-imx-add-imx5x-usb-clock-DT-lookups.patch
vendored
Normal file
|
@ -0,0 +1,100 @@
|
|||
From 8ed5da7959d5e6d3fcbdfafbacb58614499fb314 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Grzeschik <m.grzeschik@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@pengutronix.de>
|
||||
Signed-off-by: Shawn Guo <shawn.guo@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@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@53f84000 {
|
||||
--
|
||||
cgit v0.9.1
|
|
@ -0,0 +1,102 @@
|
|||
From feb57438936827ce9faadd35f4835102b8fd0901 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Grzeschik <m.grzeschik@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@pengutronix.de>
|
||||
Signed-off-by: Shawn Guo <shawn.guo@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@73f80800 {
|
||||
+ #index-cells = <1>;
|
||||
+ compatible = "fsl,imx51-usbmisc";
|
||||
+ reg = <0x73f80800 0x200>;
|
||||
+ };
|
||||
+
|
||||
gpio1: gpio@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@53f80800 {
|
||||
+ #index-cells = <1>;
|
||||
+ compatible = "fsl,imx53-usbmisc";
|
||||
+ reg = <0x53f80800 0x200>;
|
||||
+ };
|
||||
+
|
||||
gpio1: gpio@53f84000 {
|
||||
compatible = "fsl,imx53-gpio", "fsl,imx35-gpio";
|
||||
reg = <0x53f84000 0x4000>;
|
||||
--
|
||||
cgit v0.9.1
|
28
debian/patches/features/arm/ARM-dts-imx-imx53-qsb.dts-enable-usbotg-and-usbh1.patch
vendored
Normal file
28
debian/patches/features/arm/ARM-dts-imx-imx53-qsb.dts-enable-usbotg-and-usbh1.patch
vendored
Normal file
|
@ -0,0 +1,28 @@
|
|||
From c9cb1ec6e2a15e744a6481cb14730a5812471e71 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Grzeschik <m.grzeschik@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@pengutronix.de>
|
||||
Signed-off-by: Shawn Guo <shawn.guo@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
|
77
debian/patches/features/arm/ARM-dts-imx-use-usb-nop-xceiv-usbphy-entries-for-imx5x.patch
vendored
Normal file
77
debian/patches/features/arm/ARM-dts-imx-use-usb-nop-xceiv-usbphy-entries-for-imx5x.patch
vendored
Normal file
|
@ -0,0 +1,77 @@
|
|||
From 972a8dd0c7ca37b70d4bf523018e32703937a829 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Grzeschik <m.grzeschik@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@pengutronix.de>
|
||||
Signed-off-by: Shawn Guo <shawn.guo@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@0 {
|
||||
+ compatible = "usb-nop-xceiv";
|
||||
+ clocks = <&clks 124>;
|
||||
+ clock-names = "main_clk";
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+
|
||||
usbotg: usb@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@0 {
|
||||
+ compatible = "usb-nop-xceiv";
|
||||
+ clocks = <&clks 124>;
|
||||
+ clock-names = "main_clk";
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+
|
||||
+ usbphy1: usbphy@1 {
|
||||
+ compatible = "usb-nop-xceiv";
|
||||
+ clocks = <&clks 125>;
|
||||
+ clock-names = "main_clk";
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+
|
||||
usbotg: usb@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
|
|
@ -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@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 */
|
||||
>;
|
||||
};
|
|
@ -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@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)
|
||||
{
|
|
@ -75,3 +75,31 @@ debian/efi-autoload-efivars.patch
|
|||
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
|
||||
|
|
Loading…
Reference in New Issue