summaryrefslogtreecommitdiff
path: root/kernels/linux-libre-lts-xtreme
diff options
context:
space:
mode:
authorDavid P <megver83@parabola.nu>2018-04-05 17:48:29 -0300
committerDavid P <megver83@parabola.nu>2018-04-05 17:48:29 -0300
commitc64d4af9ce9322cd9da96e85bc2bcca1b6a3034c (patch)
treee897c6a8a00b12220c37778bb89c50b0298798f5 /kernels/linux-libre-lts-xtreme
parent027e78f5c797eba3df43e8b47c03f3ba7bc20e64 (diff)
downloadabslibre-c64d4af9ce9322cd9da96e85bc2bcca1b6a3034c.tar.gz
abslibre-c64d4af9ce9322cd9da96e85bc2bcca1b6a3034c.tar.bz2
abslibre-c64d4af9ce9322cd9da96e85bc2bcca1b6a3034c.zip
kernels/linux-libre-lts-xtreme: remove unused patches
Diffstat (limited to 'kernels/linux-libre-lts-xtreme')
-rw-r--r--kernels/linux-libre-lts-xtreme/0001-add-sysctl-to-disallow-unprivileged-CLONE_NEWUSER-by.patch103
-rw-r--r--kernels/linux-libre-lts-xtreme/0002-drm-i915-edp-Only-use-the-alternate-fixed-mode-if-it.patch42
-rw-r--r--kernels/linux-libre-lts-xtreme/0010-power-add-power-sequence-library.patch790
-rw-r--r--kernels/linux-libre-lts-xtreme/0011-usb-core-add-power-sequence-handling-for-USB-devices.patch164
-rw-r--r--kernels/linux-libre-lts-xtreme/0012-ARM-dts-imx6qdl-Enable-usb-node-children-with-reg.patch49
-rw-r--r--kernels/linux-libre-lts-xtreme/0013-ARM-dts-imx6qdl-udoo.dtsi-fix-onboard-USB-HUB-proper.patch80
-rw-r--r--kernels/linux-libre-lts-xtreme/0014-ARM-dts-imx6q-evi-Fix-onboard-hub-reset-line.patch74
7 files changed, 0 insertions, 1302 deletions
diff --git a/kernels/linux-libre-lts-xtreme/0001-add-sysctl-to-disallow-unprivileged-CLONE_NEWUSER-by.patch b/kernels/linux-libre-lts-xtreme/0001-add-sysctl-to-disallow-unprivileged-CLONE_NEWUSER-by.patch
deleted file mode 100644
index a989d666a..000000000
--- a/kernels/linux-libre-lts-xtreme/0001-add-sysctl-to-disallow-unprivileged-CLONE_NEWUSER-by.patch
+++ /dev/null
@@ -1,103 +0,0 @@
-From 4e54373158caa50df5402fdd3db1794c5394026b Mon Sep 17 00:00:00 2001
-Message-Id: <4e54373158caa50df5402fdd3db1794c5394026b.1516188238.git.jan.steffens@gmail.com>
-From: Serge Hallyn <serge.hallyn@canonical.com>
-Date: Fri, 31 May 2013 19:12:12 +0100
-Subject: [PATCH 1/4] add sysctl to disallow unprivileged CLONE_NEWUSER by
- default
-
-Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
-[bwh: Remove unneeded binary sysctl bits]
-Signed-off-by: Daniel Micay <danielmicay@gmail.com>
----
- kernel/fork.c | 15 +++++++++++++++
- kernel/sysctl.c | 12 ++++++++++++
- kernel/user_namespace.c | 3 +++
- 3 files changed, 30 insertions(+)
-
-diff --git a/kernel/fork.c b/kernel/fork.c
-index 500ce64517d9..35f5860958b4 100644
---- a/kernel/fork.c
-+++ b/kernel/fork.c
-@@ -102,6 +102,11 @@
-
- #define CREATE_TRACE_POINTS
- #include <trace/events/task.h>
-+#ifdef CONFIG_USER_NS
-+extern int unprivileged_userns_clone;
-+#else
-+#define unprivileged_userns_clone 0
-+#endif
-
- /*
- * Minimum number of threads to boot the kernel
-@@ -1554,6 +1559,10 @@ static __latent_entropy struct task_struct *copy_process(
- if ((clone_flags & (CLONE_NEWUSER|CLONE_FS)) == (CLONE_NEWUSER|CLONE_FS))
- return ERR_PTR(-EINVAL);
-
-+ if ((clone_flags & CLONE_NEWUSER) && !unprivileged_userns_clone)
-+ if (!capable(CAP_SYS_ADMIN))
-+ return ERR_PTR(-EPERM);
-+
- /*
- * Thread groups must share signals as well, and detached threads
- * can only be started up within the thread group.
-@@ -2347,6 +2356,12 @@ SYSCALL_DEFINE1(unshare, unsigned long, unshare_flags)
- if (unshare_flags & CLONE_NEWNS)
- unshare_flags |= CLONE_FS;
-
-+ if ((unshare_flags & CLONE_NEWUSER) && !unprivileged_userns_clone) {
-+ err = -EPERM;
-+ if (!capable(CAP_SYS_ADMIN))
-+ goto bad_unshare_out;
-+ }
-+
- err = check_unshare_flags(unshare_flags);
- if (err)
- goto bad_unshare_out;
-diff --git a/kernel/sysctl.c b/kernel/sysctl.c
-index 56aca862c4f5..e8402ba393c1 100644
---- a/kernel/sysctl.c
-+++ b/kernel/sysctl.c
-@@ -105,6 +105,9 @@ extern int core_uses_pid;
- extern char core_pattern[];
- extern unsigned int core_pipe_limit;
- #endif
-+#ifdef CONFIG_USER_NS
-+extern int unprivileged_userns_clone;
-+#endif
- extern int pid_max;
- extern int pid_max_min, pid_max_max;
- extern int percpu_pagelist_fraction;
-@@ -513,6 +516,15 @@ static struct ctl_table kern_table[] = {
- .proc_handler = proc_dointvec,
- },
- #endif
-+#ifdef CONFIG_USER_NS
-+ {
-+ .procname = "unprivileged_userns_clone",
-+ .data = &unprivileged_userns_clone,
-+ .maxlen = sizeof(int),
-+ .mode = 0644,
-+ .proc_handler = proc_dointvec,
-+ },
-+#endif
- #ifdef CONFIG_PROC_SYSCTL
- {
- .procname = "tainted",
-diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c
-index c490f1e4313b..dd03bd39d7bf 100644
---- a/kernel/user_namespace.c
-+++ b/kernel/user_namespace.c
-@@ -24,6 +24,9 @@
- #include <linux/projid.h>
- #include <linux/fs_struct.h>
-
-+/* sysctl */
-+int unprivileged_userns_clone;
-+
- static struct kmem_cache *user_ns_cachep __read_mostly;
- static DEFINE_MUTEX(userns_state_mutex);
-
---
-2.15.1
-
diff --git a/kernels/linux-libre-lts-xtreme/0002-drm-i915-edp-Only-use-the-alternate-fixed-mode-if-it.patch b/kernels/linux-libre-lts-xtreme/0002-drm-i915-edp-Only-use-the-alternate-fixed-mode-if-it.patch
deleted file mode 100644
index f77c9b5c1..000000000
--- a/kernels/linux-libre-lts-xtreme/0002-drm-i915-edp-Only-use-the-alternate-fixed-mode-if-it.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From e722c8d112f0aa9621d7d4da5223cfc7aeb45e88 Mon Sep 17 00:00:00 2001
-Message-Id: <e722c8d112f0aa9621d7d4da5223cfc7aeb45e88.1516188238.git.jan.steffens@gmail.com>
-In-Reply-To: <4e54373158caa50df5402fdd3db1794c5394026b.1516188238.git.jan.steffens@gmail.com>
-References: <4e54373158caa50df5402fdd3db1794c5394026b.1516188238.git.jan.steffens@gmail.com>
-From: Jim Bride <jim.bride@linux.intel.com>
-Date: Mon, 6 Nov 2017 13:38:57 -0800
-Subject: [PATCH 4/4] drm/i915/edp: Only use the alternate fixed mode if it's
- asked for
-
-In commit dc911f5bd8aa ("drm/i915/edp: Allow alternate fixed mode for
-eDP if available."), the patch allows for the use of an alternate fixed
-mode if it is available, but the patch was not ensuring that the only
-time the alternate mode is used is when it is specifically requested.
-This patch adds an additional comparison to intel_edp_compare_alt_mode
-to ensure that we only use the alternate mode if it is directly
-requested.
-
-Fixes: dc911f5bd8aac ("Allow alternate fixed mode for eDP if available.")
-Cc: David Weinehall <david.weinehall@linux.intel.com>
-Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
-Signed-off-by: Jim Bride <jim.bride@linux.intel.com>
----
- drivers/gpu/drm/i915/intel_dp.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
-index 09f274419eea..838cee312e8e 100644
---- a/drivers/gpu/drm/i915/intel_dp.c
-+++ b/drivers/gpu/drm/i915/intel_dp.c
-@@ -1632,7 +1632,8 @@ static bool intel_edp_compare_alt_mode(struct drm_display_mode *m1,
- m1->vdisplay == m2->vdisplay &&
- m1->vsync_start == m2->vsync_start &&
- m1->vsync_end == m2->vsync_end &&
-- m1->vtotal == m2->vtotal);
-+ m1->vtotal == m2->vtotal &&
-+ m1->vrefresh == m2->vrefresh);
- return bres;
- }
-
---
-2.15.1
-
diff --git a/kernels/linux-libre-lts-xtreme/0010-power-add-power-sequence-library.patch b/kernels/linux-libre-lts-xtreme/0010-power-add-power-sequence-library.patch
deleted file mode 100644
index 74d8a615d..000000000
--- a/kernels/linux-libre-lts-xtreme/0010-power-add-power-sequence-library.patch
+++ /dev/null
@@ -1,790 +0,0 @@
-From c63f0d2231c841534a30c60db102ad9afc835994 Mon Sep 17 00:00:00 2001
-From: Peter Chen <peter.chen@nxp.com>
-Date: Wed, 21 Jun 2017 14:42:03 +0800
-Subject: [PATCH 10/14] power: add power sequence library
-
-We have an well-known problem that the device needs to do some power
-sequence before it can be recognized by related host, the typical
-example like hard-wired mmc devices and usb devices.
-
-This power sequence is hard to be described at device tree and handled by
-related host driver, so we have created a common power sequence
-library to cover this requirement. The core code has supplied
-some common helpers for host driver, and individual power sequence
-libraries handle kinds of power sequence for devices. The pwrseq
-librares always need to allocate extra instance for compatible
-string match.
-
-pwrseq_generic is intended for general purpose of power sequence, which
-handles gpios and clocks currently, and can cover other controls in
-future. The host driver just needs to call of_pwrseq_on/of_pwrseq_off
-if only one power sequence is needed, else call of_pwrseq_on_list
-/of_pwrseq_off_list instead (eg, USB hub driver).
-
-For new power sequence library, it needs to add its compatible string
-and allocation function at pwrseq_match_table_list, then the pwrseq
-core will match it with DT's, and choose this library at runtime.
-
-Signed-off-by: Peter Chen <peter.chen@nxp.com>
-Tested-by: Maciej S. Szmigiero <mail@maciej.szmigiero.name>
-Tested-by Joshua Clayton <stillcompiling@gmail.com>
-Reviewed-by: Matthias Kaehlcke <mka@chromium.org>
-Tested-by: Matthias Kaehlcke <mka@chromium.org>
----
- Documentation/power/power-sequence/design.rst | 54 +++++
- MAINTAINERS | 9 +
- drivers/power/Kconfig | 1 +
- drivers/power/Makefile | 1 +
- drivers/power/pwrseq/Kconfig | 20 ++
- drivers/power/pwrseq/Makefile | 2 +
- drivers/power/pwrseq/core.c | 293 ++++++++++++++++++++++++++
- drivers/power/pwrseq/pwrseq_generic.c | 210 ++++++++++++++++++
- include/linux/power/pwrseq.h | 84 ++++++++
- 9 files changed, 674 insertions(+)
- create mode 100644 Documentation/power/power-sequence/design.rst
- create mode 100644 drivers/power/pwrseq/Kconfig
- create mode 100644 drivers/power/pwrseq/Makefile
- create mode 100644 drivers/power/pwrseq/core.c
- create mode 100644 drivers/power/pwrseq/pwrseq_generic.c
- create mode 100644 include/linux/power/pwrseq.h
-
-diff --git a/Documentation/power/power-sequence/design.rst b/Documentation/power/power-sequence/design.rst
-new file mode 100644
-index 000000000000..554608e5f3b6
---- /dev/null
-+++ b/Documentation/power/power-sequence/design.rst
-@@ -0,0 +1,54 @@
-+====================================
-+Power Sequence Library
-+====================================
-+
-+:Date: Feb, 2017
-+:Author: Peter Chen <peter.chen@nxp.com>
-+
-+
-+Introduction
-+============
-+
-+We have an well-known problem that the device needs to do a power
-+sequence before it can be recognized by related host, the typical
-+examples are hard-wired mmc devices and usb devices. The host controller
-+can't know what kinds of this device is in its bus if the power
-+sequence has not done, since the related devices driver's probe calling
-+is determined by runtime according to eunumeration results. Besides,
-+the devices may have custom power sequence, so the power sequence library
-+which is independent with the devices is needed.
-+
-+Design
-+============
-+
-+The power sequence library includes the core file and customer power
-+sequence library. The core file exports interfaces are called by
-+host controller driver for power sequence and customer power sequence
-+library files to register its power sequence instance to global
-+power sequence list. The custom power sequence library creates power
-+sequence instance and implement custom power sequence.
-+
-+Since the power sequence describes hardware design, the description is
-+located at board description file, eg, device tree dts file. And
-+a specific power sequence belongs to device, so its description
-+is under the device node, please refer to:
-+Documentation/devicetree/bindings/power/pwrseq/pwrseq-generic.txt
-+
-+Custom power sequence library allocates one power sequence instance at
-+bootup periods using postcore_initcall, this static allocated instance is
-+used to compare with device-tree (DT) node to see if this library can be
-+used for the node or not. When the result is matched, the core API will
-+try to get resourses (->get, implemented at each library) for power
-+sequence, if all resources are got, it will try to allocate another
-+instance for next possible request from host driver.
-+
-+Then, the host controller driver can carry out power sequence on for this
-+DT node, the library will do corresponding operations, like open clocks,
-+toggle gpio, etc. The power sequence off routine will close and free the
-+resources, and is called when the parent is removed. And the power
-+sequence suspend and resume routine can be called at host driver's
-+suspend and resume routine if needed.
-+
-+The exported interfaces
-+.. kernel-doc:: drivers/power/pwrseq/core.c
-+ :export:
-diff --git a/MAINTAINERS b/MAINTAINERS
-index 845fc25812f1..c0925efb554c 100644
---- a/MAINTAINERS
-+++ b/MAINTAINERS
-@@ -10898,6 +10898,15 @@ F: drivers/firmware/psci*.c
- F: include/linux/psci.h
- F: include/uapi/linux/psci.h
-
-+POWER SEQUENCE LIBRARY
-+M: Peter Chen <Peter.Chen@nxp.com>
-+T: git git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb.git
-+L: linux-pm@vger.kernel.org
-+S: Maintained
-+F: Documentation/devicetree/bindings/power/pwrseq/
-+F: drivers/power/pwrseq/
-+F: include/linux/power/pwrseq.h
-+
- POWER SUPPLY CLASS/SUBSYSTEM and DRIVERS
- M: Sebastian Reichel <sre@kernel.org>
- L: linux-pm@vger.kernel.org
-diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig
-index 63454b5cac27..c1bb0465f956 100644
---- a/drivers/power/Kconfig
-+++ b/drivers/power/Kconfig
-@@ -1,3 +1,4 @@
- source "drivers/power/avs/Kconfig"
- source "drivers/power/reset/Kconfig"
- source "drivers/power/supply/Kconfig"
-+source "drivers/power/pwrseq/Kconfig"
-diff --git a/drivers/power/Makefile b/drivers/power/Makefile
-index ff35c712d824..7db80354b691 100644
---- a/drivers/power/Makefile
-+++ b/drivers/power/Makefile
-@@ -1,3 +1,4 @@
- obj-$(CONFIG_POWER_AVS) += avs/
- obj-$(CONFIG_POWER_RESET) += reset/
- obj-$(CONFIG_POWER_SUPPLY) += supply/
-+obj-$(CONFIG_POWER_SEQUENCE) += pwrseq/
-diff --git a/drivers/power/pwrseq/Kconfig b/drivers/power/pwrseq/Kconfig
-new file mode 100644
-index 000000000000..c6b356926cca
---- /dev/null
-+++ b/drivers/power/pwrseq/Kconfig
-@@ -0,0 +1,20 @@
-+#
-+# Power Sequence library
-+#
-+
-+menuconfig POWER_SEQUENCE
-+ bool "Power sequence control"
-+ help
-+ It is used for drivers which needs to do power sequence
-+ (eg, turn on clock, toggle reset gpio) before the related
-+ devices can be found by hardware, eg, USB bus.
-+
-+if POWER_SEQUENCE
-+
-+config PWRSEQ_GENERIC
-+ bool "Generic power sequence control"
-+ depends on OF
-+ help
-+ This is the generic power sequence control library, and is
-+ supposed to support common power sequence usage.
-+endif
-diff --git a/drivers/power/pwrseq/Makefile b/drivers/power/pwrseq/Makefile
-new file mode 100644
-index 000000000000..ad82389028c2
---- /dev/null
-+++ b/drivers/power/pwrseq/Makefile
-@@ -0,0 +1,2 @@
-+obj-$(CONFIG_POWER_SEQUENCE) += core.o
-+obj-$(CONFIG_PWRSEQ_GENERIC) += pwrseq_generic.o
-diff --git a/drivers/power/pwrseq/core.c b/drivers/power/pwrseq/core.c
-new file mode 100644
-index 000000000000..6b78a6691683
---- /dev/null
-+++ b/drivers/power/pwrseq/core.c
-@@ -0,0 +1,293 @@
-+/*
-+ * core.c power sequence core file
-+ *
-+ * Copyright (C) 2016 Freescale Semiconductor, Inc.
-+ * Author: Peter Chen <peter.chen@nxp.com>
-+ *
-+ * This program is free software: you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 of
-+ * the License as published by the Free Software Foundation.
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program.
-+ */
-+
-+#include <linux/list.h>
-+#include <linux/mutex.h>
-+#include <linux/of.h>
-+#include <linux/slab.h>
-+#include <linux/power/pwrseq.h>
-+
-+/*
-+ * Static power sequence match table
-+ * - Add compatible (the same with dts node) and related allocation function.
-+ * - Update related binding doc.
-+ */
-+static const struct of_device_id pwrseq_match_table_list[] = {
-+ { .compatible = "usb424,2513", .data = &pwrseq_generic_alloc_instance},
-+ { .compatible = "usb424,2514", .data = &pwrseq_generic_alloc_instance},
-+ { /* sentinel */ }
-+};
-+
-+static int pwrseq_get(struct device_node *np, struct pwrseq *p)
-+{
-+ if (p && p->get)
-+ return p->get(np, p);
-+
-+ return -ENOTSUPP;
-+}
-+
-+static int pwrseq_on(struct pwrseq *p)
-+{
-+ if (p && p->on)
-+ return p->on(p);
-+
-+ return -ENOTSUPP;
-+}
-+
-+static void pwrseq_off(struct pwrseq *p)
-+{
-+ if (p && p->off)
-+ p->off(p);
-+}
-+
-+static void pwrseq_put(struct pwrseq *p)
-+{
-+ if (p && p->put)
-+ p->put(p);
-+}
-+
-+/**
-+ * of_pwrseq_on - Carry out power sequence on for device node
-+ *
-+ * @np: the device node would like to power on
-+ *
-+ * Carry out a single device power on. If multiple devices
-+ * need to be handled, use of_pwrseq_on_list() instead.
-+ *
-+ * Return a pointer to the power sequence instance on success, or NULL if
-+ * not exist, or an error code on failure.
-+ */
-+struct pwrseq *of_pwrseq_on(struct device_node *np)
-+{
-+ struct pwrseq *pwrseq;
-+ int ret;
-+ const struct of_device_id *of_id;
-+ struct pwrseq *(*alloc_instance)(void);
-+
-+ of_id = of_match_node(pwrseq_match_table_list, np);
-+ if (!of_id)
-+ return NULL;
-+
-+ alloc_instance = of_id->data;
-+ /* Allocate pwrseq instance */
-+ pwrseq = alloc_instance();
-+ if (IS_ERR(pwrseq))
-+ return pwrseq;
-+
-+ ret = pwrseq_get(np, pwrseq);
-+ if (ret)
-+ goto pwr_put;
-+
-+ ret = pwrseq_on(pwrseq);
-+ if (ret)
-+ goto pwr_put;
-+
-+ return pwrseq;
-+
-+pwr_put:
-+ pwrseq_put(pwrseq);
-+ return ERR_PTR(ret);
-+}
-+EXPORT_SYMBOL_GPL(of_pwrseq_on);
-+
-+/**
-+ * of_pwrseq_off - Carry out power sequence off for this pwrseq instance
-+ *
-+ * @pwrseq: the pwrseq instance which related device would like to be off
-+ *
-+ * This API is used to power off single device, it is the opposite
-+ * operation for of_pwrseq_on.
-+ */
-+void of_pwrseq_off(struct pwrseq *pwrseq)
-+{
-+ pwrseq_off(pwrseq);
-+ pwrseq_put(pwrseq);
-+}
-+EXPORT_SYMBOL_GPL(of_pwrseq_off);
-+
-+/**
-+ * of_pwrseq_on_list - Carry out power sequence on for list
-+ *
-+ * @np: the device node would like to power on
-+ * @head: the list head for pwrseq list on this bus
-+ *
-+ * This API is used to power on multiple devices at single bus.
-+ * If there are several devices on bus (eg, USB bus), uses this
-+ * this API. Otherwise, use of_pwrseq_on instead. After the device
-+ * is powered on successfully, it will be added to pwrseq list for
-+ * this bus. The caller needs to use mutex_lock for concurrent.
-+ *
-+ * Return 0 on success, or -ENOENT if not exist, or an error value on failure.
-+ */
-+int of_pwrseq_on_list(struct device_node *np, struct list_head *head)
-+{
-+ struct pwrseq *pwrseq;
-+ struct pwrseq_list_per_dev *pwrseq_list_node;
-+
-+ pwrseq_list_node = kzalloc(sizeof(*pwrseq_list_node), GFP_KERNEL);
-+ if (!pwrseq_list_node)
-+ return -ENOMEM;
-+
-+ pwrseq = of_pwrseq_on(np);
-+ if (!pwrseq)
-+ return -ENOENT;
-+
-+ if (IS_ERR(pwrseq)) {
-+ kfree(pwrseq_list_node);
-+ return PTR_ERR(pwrseq);
-+ }
-+
-+ pwrseq_list_node->pwrseq = pwrseq;
-+ list_add(&pwrseq_list_node->list, head);
-+
-+ return 0;
-+}
-+EXPORT_SYMBOL_GPL(of_pwrseq_on_list);
-+
-+/**
-+ * of_pwrseq_off_list - Carry out power sequence off for the list
-+ *
-+ * @head: the list head for pwrseq instance list on this bus
-+ *
-+ * This API is used to power off all devices on this bus, it is
-+ * the opposite operation for of_pwrseq_on_list.
-+ * The caller needs to use mutex_lock for concurrent.
-+ */
-+void of_pwrseq_off_list(struct list_head *head)
-+{
-+ struct pwrseq *pwrseq;
-+ struct pwrseq_list_per_dev *pwrseq_list_node, *tmp_node;
-+
-+ list_for_each_entry_safe(pwrseq_list_node, tmp_node, head, list) {
-+ pwrseq = pwrseq_list_node->pwrseq;
-+ of_pwrseq_off(pwrseq);
-+ list_del(&pwrseq_list_node->list);
-+ kfree(pwrseq_list_node);
-+ }
-+}
-+EXPORT_SYMBOL_GPL(of_pwrseq_off_list);
-+
-+/**
-+ * pwrseq_suspend - Carry out power sequence suspend for this pwrseq instance
-+ *
-+ * @pwrseq: the pwrseq instance
-+ *
-+ * This API is used to do suspend operation on pwrseq instance.
-+ *
-+ * Return 0 on success, or an error value otherwise.
-+ */
-+int pwrseq_suspend(struct pwrseq *p)
-+{
-+ int ret = 0;
-+
-+ if (p && p->suspend)
-+ ret = p->suspend(p);
-+ else
-+ return ret;
-+
-+ if (!ret)
-+ p->suspended = true;
-+ else
-+ pr_err("%s failed\n", __func__);
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(pwrseq_suspend);
-+
-+/**
-+ * pwrseq_resume - Carry out power sequence resume for this pwrseq instance
-+ *
-+ * @pwrseq: the pwrseq instance
-+ *
-+ * This API is used to do resume operation on pwrseq instance.
-+ *
-+ * Return 0 on success, or an error value otherwise.
-+ */
-+int pwrseq_resume(struct pwrseq *p)
-+{
-+ int ret = 0;
-+
-+ if (p && p->resume)
-+ ret = p->resume(p);
-+ else
-+ return ret;
-+
-+ if (!ret)
-+ p->suspended = false;
-+ else
-+ pr_err("%s failed\n", __func__);
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(pwrseq_resume);
-+
-+/**
-+ * pwrseq_suspend_list - Carry out power sequence suspend for list
-+ *
-+ * @head: the list head for pwrseq instance list on this bus
-+ *
-+ * This API is used to do suspend on all power sequence instances on this bus.
-+ * The caller needs to use mutex_lock for concurrent.
-+ */
-+int pwrseq_suspend_list(struct list_head *head)
-+{
-+ struct pwrseq *pwrseq;
-+ struct pwrseq_list_per_dev *pwrseq_list_node;
-+ int ret = 0;
-+
-+ list_for_each_entry(pwrseq_list_node, head, list) {
-+ ret = pwrseq_suspend(pwrseq_list_node->pwrseq);
-+ if (ret)
-+ break;
-+ }
-+
-+ if (ret) {
-+ list_for_each_entry(pwrseq_list_node, head, list) {
-+ pwrseq = pwrseq_list_node->pwrseq;
-+ if (pwrseq->suspended)
-+ pwrseq_resume(pwrseq);
-+ }
-+ }
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(pwrseq_suspend_list);
-+
-+/**
-+ * pwrseq_resume_list - Carry out power sequence resume for the list
-+ *
-+ * @head: the list head for pwrseq instance list on this bus
-+ *
-+ * This API is used to do resume on all power sequence instances on this bus.
-+ * The caller needs to use mutex_lock for concurrent.
-+ */
-+int pwrseq_resume_list(struct list_head *head)
-+{
-+ struct pwrseq_list_per_dev *pwrseq_list_node;
-+ int ret = 0;
-+
-+ list_for_each_entry(pwrseq_list_node, head, list) {
-+ ret = pwrseq_resume(pwrseq_list_node->pwrseq);
-+ if (ret)
-+ break;
-+ }
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(pwrseq_resume_list);
-diff --git a/drivers/power/pwrseq/pwrseq_generic.c b/drivers/power/pwrseq/pwrseq_generic.c
-new file mode 100644
-index 000000000000..b7bbd6c5b47d
---- /dev/null
-+++ b/drivers/power/pwrseq/pwrseq_generic.c
-@@ -0,0 +1,210 @@
-+/*
-+ * pwrseq_generic.c Generic power sequence handling
-+ *
-+ * Copyright (C) 2016 Freescale Semiconductor, Inc.
-+ * Author: Peter Chen <peter.chen@nxp.com>
-+ *
-+ * This program is free software: you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 of
-+ * the License as published by the Free Software Foundation.
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program.
-+ */
-+
-+#include <linux/clk.h>
-+#include <linux/delay.h>
-+#include <linux/gpio.h>
-+#include <linux/gpio/consumer.h>
-+#include <linux/of.h>
-+#include <linux/of_gpio.h>
-+#include <linux/slab.h>
-+
-+#include <linux/power/pwrseq.h>
-+
-+struct pwrseq_generic {
-+ struct pwrseq pwrseq;
-+ struct gpio_desc *gpiod_reset;
-+ struct clk *clks[PWRSEQ_MAX_CLKS];
-+ u32 duration_us;
-+ bool suspended;
-+};
-+
-+#define to_generic_pwrseq(p) container_of(p, struct pwrseq_generic, pwrseq)
-+
-+static int pwrseq_generic_suspend(struct pwrseq *pwrseq)
-+{
-+ struct pwrseq_generic *pwrseq_gen = to_generic_pwrseq(pwrseq);
-+ int clk;
-+
-+ for (clk = PWRSEQ_MAX_CLKS - 1; clk >= 0; clk--)
-+ clk_disable_unprepare(pwrseq_gen->clks[clk]);
-+
-+ pwrseq_gen->suspended = true;
-+ return 0;
-+}
-+
-+static int pwrseq_generic_resume(struct pwrseq *pwrseq)
-+{
-+ struct pwrseq_generic *pwrseq_gen = to_generic_pwrseq(pwrseq);
-+ int clk, ret = 0;
-+
-+ for (clk = 0; clk < PWRSEQ_MAX_CLKS && pwrseq_gen->clks[clk]; clk++) {
-+ ret = clk_prepare_enable(pwrseq_gen->clks[clk]);
-+ if (ret) {
-+ pr_err("Can't enable clock, ret=%d\n", ret);
-+ goto err_disable_clks;
-+ }
-+ }
-+
-+ pwrseq_gen->suspended = false;
-+ return ret;
-+
-+err_disable_clks:
-+ while (--clk >= 0)
-+ clk_disable_unprepare(pwrseq_gen->clks[clk]);
-+
-+ return ret;
-+}
-+
-+static void pwrseq_generic_put(struct pwrseq *pwrseq)
-+{
-+ struct pwrseq_generic *pwrseq_gen = to_generic_pwrseq(pwrseq);
-+ int clk;
-+
-+ if (pwrseq_gen->gpiod_reset)
-+ gpiod_put(pwrseq_gen->gpiod_reset);
-+
-+ for (clk = 0; clk < PWRSEQ_MAX_CLKS; clk++)
-+ clk_put(pwrseq_gen->clks[clk]);
-+
-+ kfree(pwrseq_gen);
-+}
-+
-+static void pwrseq_generic_off(struct pwrseq *pwrseq)
-+{
-+ struct pwrseq_generic *pwrseq_gen = to_generic_pwrseq(pwrseq);
-+ int clk;
-+
-+ if (pwrseq_gen->suspended)
-+ return;
-+
-+ for (clk = PWRSEQ_MAX_CLKS - 1; clk >= 0; clk--)
-+ clk_disable_unprepare(pwrseq_gen->clks[clk]);
-+}
-+
-+static int pwrseq_generic_on(struct pwrseq *pwrseq)
-+{
-+ struct pwrseq_generic *pwrseq_gen = to_generic_pwrseq(pwrseq);
-+ int clk, ret = 0;
-+ struct gpio_desc *gpiod_reset = pwrseq_gen->gpiod_reset;
-+
-+ for (clk = 0; clk < PWRSEQ_MAX_CLKS && pwrseq_gen->clks[clk]; clk++) {
-+ ret = clk_prepare_enable(pwrseq_gen->clks[clk]);
-+ if (ret) {
-+ pr_err("Can't enable clock, ret=%d\n", ret);
-+ goto err_disable_clks;
-+ }
-+ }
-+
-+ if (gpiod_reset) {
-+ u32 duration_us = pwrseq_gen->duration_us;
-+
-+ if (duration_us <= 10)
-+ udelay(10);
-+ else
-+ usleep_range(duration_us, duration_us + 100);
-+ gpiod_set_value(gpiod_reset, 0);
-+ }
-+
-+ return ret;
-+
-+err_disable_clks:
-+ while (--clk >= 0)
-+ clk_disable_unprepare(pwrseq_gen->clks[clk]);
-+
-+ return ret;
-+}
-+
-+static int pwrseq_generic_get(struct device_node *np, struct pwrseq *pwrseq)
-+{
-+ struct pwrseq_generic *pwrseq_gen = to_generic_pwrseq(pwrseq);
-+ enum of_gpio_flags flags;
-+ int reset_gpio, clk, ret = 0;
-+
-+ for (clk = 0; clk < PWRSEQ_MAX_CLKS; clk++) {
-+ pwrseq_gen->clks[clk] = of_clk_get(np, clk);
-+ if (IS_ERR(pwrseq_gen->clks[clk])) {
-+ ret = PTR_ERR(pwrseq_gen->clks[clk]);
-+ if (ret != -ENOENT)
-+ goto err_put_clks;
-+ pwrseq_gen->clks[clk] = NULL;
-+ break;
-+ }
-+ }
-+
-+ reset_gpio = of_get_named_gpio_flags(np, "reset-gpios", 0, &flags);
-+ if (gpio_is_valid(reset_gpio)) {
-+ unsigned long gpio_flags;
-+
-+ if (flags & OF_GPIO_ACTIVE_LOW)
-+ gpio_flags = GPIOF_ACTIVE_LOW | GPIOF_OUT_INIT_LOW;
-+ else
-+ gpio_flags = GPIOF_OUT_INIT_HIGH;
-+
-+ ret = gpio_request_one(reset_gpio, gpio_flags,
-+ "pwrseq-reset-gpios");
-+ if (ret)
-+ goto err_put_clks;
-+
-+ pwrseq_gen->gpiod_reset = gpio_to_desc(reset_gpio);
-+ of_property_read_u32(np, "reset-duration-us",
-+ &pwrseq_gen->duration_us);
-+ } else if (reset_gpio == -ENOENT) {
-+ ; /* no such gpio */
-+ } else {
-+ ret = reset_gpio;
-+ pr_err("Failed to get reset gpio on %s, err = %d\n",
-+ np->full_name, reset_gpio);
-+ goto err_put_clks;
-+ }
-+
-+ return 0;
-+
-+err_put_clks:
-+ while (--clk >= 0)
-+ clk_put(pwrseq_gen->clks[clk]);
-+ return ret;
-+}
-+
-+/**
-+ * pwrseq_generic_alloc_instance - power sequence instance allocation
-+ *
-+ * This function is used to allocate one generic power sequence instance,
-+ * it is called when the system boots up and after one power sequence
-+ * instance is got successfully.
-+ *
-+ * Return zero on success or an error code otherwise.
-+ */
-+struct pwrseq *pwrseq_generic_alloc_instance(void)
-+{
-+ struct pwrseq_generic *pwrseq_gen;
-+
-+ pwrseq_gen = kzalloc(sizeof(*pwrseq_gen), GFP_KERNEL);
-+ if (!pwrseq_gen)
-+ return ERR_PTR(-ENOMEM);
-+
-+ pwrseq_gen->pwrseq.get = pwrseq_generic_get;
-+ pwrseq_gen->pwrseq.on = pwrseq_generic_on;
-+ pwrseq_gen->pwrseq.off = pwrseq_generic_off;
-+ pwrseq_gen->pwrseq.put = pwrseq_generic_put;
-+ pwrseq_gen->pwrseq.suspend = pwrseq_generic_suspend;
-+ pwrseq_gen->pwrseq.resume = pwrseq_generic_resume;
-+
-+ return &pwrseq_gen->pwrseq;
-+}
-diff --git a/include/linux/power/pwrseq.h b/include/linux/power/pwrseq.h
-new file mode 100644
-index 000000000000..c5b278f5f2ae
---- /dev/null
-+++ b/include/linux/power/pwrseq.h
-@@ -0,0 +1,84 @@
-+#ifndef __LINUX_PWRSEQ_H
-+#define __LINUX_PWRSEQ_H
-+
-+#include <linux/of.h>
-+
-+#define PWRSEQ_MAX_CLKS 3
-+
-+/**
-+ * struct pwrseq - the power sequence structure
-+ * @pwrseq_of_match_table: the OF device id table this pwrseq library supports
-+ * @node: the list pointer to be added to pwrseq list
-+ * @get: the API is used to get pwrseq instance from the device node
-+ * @on: do power on for this pwrseq instance
-+ * @off: do power off for this pwrseq instance
-+ * @put: release the resources on this pwrseq instance
-+ * @suspend: do suspend operation on this pwrseq instance
-+ * @resume: do resume operation on this pwrseq instance
-+ */
-+struct pwrseq {
-+ const struct of_device_id *pwrseq_of_match_table;
-+ struct list_head node;
-+ int (*get)(struct device_node *np, struct pwrseq *p);
-+ int (*on)(struct pwrseq *p);
-+ void (*off)(struct pwrseq *p);
-+ void (*put)(struct pwrseq *p);
-+ int (*suspend)(struct pwrseq *p);
-+ int (*resume)(struct pwrseq *p);
-+ bool suspended;
-+};
-+
-+/* used for power sequence instance list in one driver */
-+struct pwrseq_list_per_dev {
-+ struct pwrseq *pwrseq;
-+ struct list_head list;
-+};
-+
-+#if IS_ENABLED(CONFIG_POWER_SEQUENCE)
-+struct pwrseq *of_pwrseq_on(struct device_node *np);
-+void of_pwrseq_off(struct pwrseq *pwrseq);
-+int of_pwrseq_on_list(struct device_node *np, struct list_head *head);
-+void of_pwrseq_off_list(struct list_head *head);
-+int pwrseq_suspend(struct pwrseq *p);
-+int pwrseq_resume(struct pwrseq *p);
-+int pwrseq_suspend_list(struct list_head *head);
-+int pwrseq_resume_list(struct list_head *head);
-+#else
-+static inline struct pwrseq *of_pwrseq_on(struct device_node *np)
-+{
-+ return NULL;
-+}
-+static void of_pwrseq_off(struct pwrseq *pwrseq) {}
-+static int of_pwrseq_on_list(struct device_node *np, struct list_head *head)
-+{
-+ return 0;
-+}
-+static void of_pwrseq_off_list(struct list_head *head) {}
-+static int pwrseq_suspend(struct pwrseq *p)
-+{
-+ return 0;
-+}
-+static int pwrseq_resume(struct pwrseq *p)
-+{
-+ return 0;
-+}
-+static int pwrseq_suspend_list(struct list_head *head)
-+{
-+ return 0;
-+}
-+static int pwrseq_resume_list(struct list_head *head)
-+{
-+ return 0;
-+}
-+#endif /* CONFIG_POWER_SEQUENCE */
-+
-+#if IS_ENABLED(CONFIG_PWRSEQ_GENERIC)
-+extern struct pwrseq *pwrseq_generic_alloc_instance(void);
-+#else
-+static inline struct pwrseq *pwrseq_generic_alloc_instance(void)
-+{
-+ return ERR_PTR(-ENOTSUPP);
-+}
-+#endif /* CONFIG_PWRSEQ_GENERIC */
-+
-+#endif /* __LINUX_PWRSEQ_H */
---
-2.16.1
-
diff --git a/kernels/linux-libre-lts-xtreme/0011-usb-core-add-power-sequence-handling-for-USB-devices.patch b/kernels/linux-libre-lts-xtreme/0011-usb-core-add-power-sequence-handling-for-USB-devices.patch
deleted file mode 100644
index ac86e626d..000000000
--- a/kernels/linux-libre-lts-xtreme/0011-usb-core-add-power-sequence-handling-for-USB-devices.patch
+++ /dev/null
@@ -1,164 +0,0 @@
-From 292560a839e5622bf2e071c1afe54bdb34209516 Mon Sep 17 00:00:00 2001
-From: Peter Chen <peter.chen@nxp.com>
-Date: Wed, 21 Jun 2017 14:42:05 +0800
-Subject: [PATCH 11/14] usb: core: add power sequence handling for USB devices
-
-Some hard-wired USB devices need to do power sequence to let the
-device work normally, the typical power sequence like: enable USB
-PHY clock, toggle reset pin, etc. But current Linux USB driver
-lacks of such code to do it, it may cause some hard-wired USB devices
-works abnormal or can't be recognized by controller at all.
-
-In this patch, it calls power sequence library APIs to finish
-the power sequence events. It will do power on sequence at hub's
-probe for all devices under this hub (includes root hub).
-At hub_disconnect, it will do power off sequence which is at powered
-on list.
-
-Signed-off-by: Peter Chen <peter.chen@nxp.com>
-Tested-by Joshua Clayton <stillcompiling@gmail.com>
-Tested-by: Maciej S. Szmigiero <mail@maciej.szmigiero.name>
-Reviewed-by: Vaibhav Hiremath <hvaibhav.linux@gmail.com>
-Acked-by: Alan Stern <stern@rowland.harvard.edu>
----
- drivers/usb/Kconfig | 1 +
- drivers/usb/core/hub.c | 49 +++++++++++++++++++++++++++++++++++++++++++++----
- drivers/usb/core/hub.h | 1 +
- 3 files changed, 47 insertions(+), 4 deletions(-)
-
-diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig
-index f699abab1787..67316ba6a84c 100644
---- a/drivers/usb/Kconfig
-+++ b/drivers/usb/Kconfig
-@@ -39,6 +39,7 @@ config USB
- tristate "Support for Host-side USB"
- depends on USB_ARCH_HAS_HCD
- select USB_COMMON
-+ select POWER_SEQUENCE
- select NLS # for UTF-8 strings
- ---help---
- Universal Serial Bus (USB) is a specification for a serial bus
-diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
-index cf7bbcb9a63c..34f249f73757 100644
---- a/drivers/usb/core/hub.c
-+++ b/drivers/usb/core/hub.c
-@@ -28,6 +28,7 @@
- #include <linux/mutex.h>
- #include <linux/random.h>
- #include <linux/pm_qos.h>
-+#include <linux/power/pwrseq.h>
-
- #include <linux/uaccess.h>
- #include <asm/byteorder.h>
-@@ -1634,6 +1635,7 @@ static void hub_disconnect(struct usb_interface *intf)
- hub->error = 0;
- hub_quiesce(hub, HUB_DISCONNECT);
-
-+ of_pwrseq_off_list(&hub->pwrseq_list);
- mutex_lock(&usb_port_peer_mutex);
-
- /* Avoid races with recursively_mark_NOTATTACHED() */
-@@ -1680,11 +1682,41 @@ static bool hub_descriptor_is_sane(struct usb_host_interface *desc)
- return true;
- }
-
-+#ifdef CONFIG_OF
-+static int hub_of_pwrseq_on(struct usb_hub *hub)
-+{
-+ struct device *parent;
-+ struct usb_device *hdev = hub->hdev;
-+ struct device_node *np;
-+ int ret;
-+
-+ if (hdev->parent)
-+ parent = &hdev->dev;
-+ else
-+ parent = bus_to_hcd(hdev->bus)->self.sysdev;
-+
-+ for_each_child_of_node(parent->of_node, np) {
-+ ret = of_pwrseq_on_list(np, &hub->pwrseq_list);
-+ /* Maybe no power sequence library is chosen */
-+ if (ret && ret != -ENOENT)
-+ return ret;
-+ }
-+
-+ return 0;
-+}
-+#else
-+static int hub_of_pwrseq_on(struct usb_hub *hub)
-+{
-+ return 0;
-+}
-+#endif
-+
- static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
- {
- struct usb_host_interface *desc;
- struct usb_device *hdev;
- struct usb_hub *hub;
-+ int ret = -ENODEV;
-
- desc = intf->cur_altsetting;
- hdev = interface_to_usbdev(intf);
-@@ -1775,6 +1807,7 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
- INIT_DELAYED_WORK(&hub->leds, led_work);
- INIT_DELAYED_WORK(&hub->init_work, NULL);
- INIT_WORK(&hub->events, hub_event);
-+ INIT_LIST_HEAD(&hub->pwrseq_list);
- usb_get_intf(intf);
- usb_get_dev(hdev);
-
-@@ -1788,11 +1821,14 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
- if (id->driver_info & HUB_QUIRK_CHECK_PORT_AUTOSUSPEND)
- hub->quirk_check_port_auto_suspend = 1;
-
-- if (hub_configure(hub, &desc->endpoint[0].desc) >= 0)
-- return 0;
-+ if (hub_configure(hub, &desc->endpoint[0].desc) >= 0) {
-+ ret = hub_of_pwrseq_on(hub);
-+ if (!ret)
-+ return 0;
-+ }
-
- hub_disconnect(intf);
-- return -ENODEV;
-+ return ret;
- }
-
- static int
-@@ -3606,14 +3642,19 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg)
-
- /* stop hub_wq and related activity */
- hub_quiesce(hub, HUB_SUSPEND);
-- return 0;
-+ return pwrseq_suspend_list(&hub->pwrseq_list);
- }
-
- static int hub_resume(struct usb_interface *intf)
- {
- struct usb_hub *hub = usb_get_intfdata(intf);
-+ int ret;
-
- dev_dbg(&intf->dev, "%s\n", __func__);
-+ ret = pwrseq_resume_list(&hub->pwrseq_list);
-+ if (ret)
-+ return ret;
-+
- hub_activate(hub, HUB_RESUME);
- return 0;
- }
-diff --git a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h
-index 2a700ccc868c..3a0e6e6b22b0 100644
---- a/drivers/usb/core/hub.h
-+++ b/drivers/usb/core/hub.h
-@@ -70,6 +70,7 @@ struct usb_hub {
- struct delayed_work init_work;
- struct work_struct events;
- struct usb_port **ports;
-+ struct list_head pwrseq_list; /* powered pwrseq node list */
- };
-
- /**
---
-2.16.1
-
diff --git a/kernels/linux-libre-lts-xtreme/0012-ARM-dts-imx6qdl-Enable-usb-node-children-with-reg.patch b/kernels/linux-libre-lts-xtreme/0012-ARM-dts-imx6qdl-Enable-usb-node-children-with-reg.patch
deleted file mode 100644
index 9631476bc..000000000
--- a/kernels/linux-libre-lts-xtreme/0012-ARM-dts-imx6qdl-Enable-usb-node-children-with-reg.patch
+++ /dev/null
@@ -1,49 +0,0 @@
-From 059a623ab52a9fdaccd7a5d1b189478d5e7a96be Mon Sep 17 00:00:00 2001
-From: Joshua Clayton <stillcompiling@gmail.com>
-Date: Wed, 21 Jun 2017 14:42:06 +0800
-Subject: [PATCH 12/14] ARM: dts: imx6qdl: Enable usb node children with <reg>
-
-Give usb nodes #address and #size attributes, so that a child node
-representing a permanently connected device such as an onboard hub may
-be addressed with a <reg> attribute
-
-Signed-off-by: Joshua Clayton <stillcompiling@gmail.com>
-Signed-off-by: Peter Chen <peter.chen@nxp.com>
----
- arch/arm/boot/dts/imx6qdl.dtsi | 6 ++++++
- 1 file changed, 6 insertions(+)
-
-diff --git a/arch/arm/boot/dts/imx6qdl.dtsi b/arch/arm/boot/dts/imx6qdl.dtsi
-index 1ce4eabf0590..3ff1ada590d1 100644
---- a/arch/arm/boot/dts/imx6qdl.dtsi
-+++ b/arch/arm/boot/dts/imx6qdl.dtsi
-@@ -969,6 +969,8 @@
-
- usbh1: usb@2184200 {
- compatible = "fsl,imx6q-usb", "fsl,imx27-usb";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
- reg = <0x02184200 0x200>;
- interrupts = <0 40 IRQ_TYPE_LEVEL_HIGH>;
- clocks = <&clks IMX6QDL_CLK_USBOH3>;
-@@ -983,6 +985,8 @@
-
- usbh2: usb@2184400 {
- compatible = "fsl,imx6q-usb", "fsl,imx27-usb";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
- reg = <0x02184400 0x200>;
- interrupts = <0 41 IRQ_TYPE_LEVEL_HIGH>;
- clocks = <&clks IMX6QDL_CLK_USBOH3>;
-@@ -996,6 +1000,8 @@
-
- usbh3: usb@2184600 {
- compatible = "fsl,imx6q-usb", "fsl,imx27-usb";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
- reg = <0x02184600 0x200>;
- interrupts = <0 42 IRQ_TYPE_LEVEL_HIGH>;
- clocks = <&clks IMX6QDL_CLK_USBOH3>;
---
-2.16.1
-
diff --git a/kernels/linux-libre-lts-xtreme/0013-ARM-dts-imx6qdl-udoo.dtsi-fix-onboard-USB-HUB-proper.patch b/kernels/linux-libre-lts-xtreme/0013-ARM-dts-imx6qdl-udoo.dtsi-fix-onboard-USB-HUB-proper.patch
deleted file mode 100644
index 8e8a085c9..000000000
--- a/kernels/linux-libre-lts-xtreme/0013-ARM-dts-imx6qdl-udoo.dtsi-fix-onboard-USB-HUB-proper.patch
+++ /dev/null
@@ -1,80 +0,0 @@
-From 74bb546b27536c3f9bdd16080a915d98e8c1667f Mon Sep 17 00:00:00 2001
-From: Peter Chen <peter.chen@nxp.com>
-Date: Wed, 21 Jun 2017 14:42:07 +0800
-Subject: [PATCH 13/14] ARM: dts: imx6qdl-udoo.dtsi: fix onboard USB HUB
- property
-
-The current dts describes USB HUB's property at USB controller's
-entry, it is improper. The USB HUB should be the child node
-under USB controller, and power sequence properties are under
-it. Besides, using gpio pinctrl setting for USB2415's reset pin.
-
-Signed-off-by: Peter Chen <peter.chen@nxp.com>
-Signed-off-by: Joshua Clayton <stillcompiling@gmail.com>
-Tested-by: Maciej S. Szmigiero <mail@maciej.szmigiero.name>
----
- arch/arm/boot/dts/imx6qdl-udoo.dtsi | 26 ++++++++++++--------------
- 1 file changed, 12 insertions(+), 14 deletions(-)
-
-diff --git a/arch/arm/boot/dts/imx6qdl-udoo.dtsi b/arch/arm/boot/dts/imx6qdl-udoo.dtsi
-index c96c91d83678..a173de20ee73 100644
---- a/arch/arm/boot/dts/imx6qdl-udoo.dtsi
-+++ b/arch/arm/boot/dts/imx6qdl-udoo.dtsi
-@@ -9,6 +9,8 @@
- *
- */
-
-+#include <dt-bindings/gpio/gpio.h>
-+
- / {
- aliases {
- backlight = &backlight;
-@@ -58,17 +60,6 @@
- #address-cells = <1>;
- #size-cells = <0>;
-
-- reg_usb_h1_vbus: regulator@0 {
-- compatible = "regulator-fixed";
-- reg = <0>;
-- regulator-name = "usb_h1_vbus";
-- regulator-min-microvolt = <5000000>;
-- regulator-max-microvolt = <5000000>;
-- enable-active-high;
-- startup-delay-us = <2>; /* USB2415 requires a POR of 1 us minimum */
-- gpio = <&gpio7 12 0>;
-- };
--
- reg_panel: regulator@1 {
- compatible = "regulator-fixed";
- reg = <1>;
-@@ -188,7 +179,7 @@
-
- pinctrl_usbh: usbhgrp {
- fsl,pins = <
-- MX6QDL_PAD_GPIO_17__GPIO7_IO12 0x80000000
-+ MX6QDL_PAD_GPIO_17__GPIO7_IO12 0x1b0b0
- MX6QDL_PAD_NANDF_CS2__CCM_CLKO2 0x130b0
- >;
- };
-@@ -259,9 +250,16 @@
- &usbh1 {
- pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_usbh>;
-- vbus-supply = <&reg_usb_h1_vbus>;
-- clocks = <&clks IMX6QDL_CLK_CKO>;
- status = "okay";
-+
-+ usb2415: hub@1 {
-+ compatible = "usb424,2514";
-+ reg = <1>;
-+
-+ clocks = <&clks IMX6QDL_CLK_CKO>;
-+ reset-gpios = <&gpio7 12 GPIO_ACTIVE_LOW>;
-+ reset-duration-us = <3000>;
-+ };
- };
-
- &usdhc3 {
---
-2.16.1
-
diff --git a/kernels/linux-libre-lts-xtreme/0014-ARM-dts-imx6q-evi-Fix-onboard-hub-reset-line.patch b/kernels/linux-libre-lts-xtreme/0014-ARM-dts-imx6q-evi-Fix-onboard-hub-reset-line.patch
deleted file mode 100644
index dbc7fce01..000000000
--- a/kernels/linux-libre-lts-xtreme/0014-ARM-dts-imx6q-evi-Fix-onboard-hub-reset-line.patch
+++ /dev/null
@@ -1,74 +0,0 @@
-From 47a3451ea61bc01753f71acfc011738f8681dc53 Mon Sep 17 00:00:00 2001
-From: Joshua Clayton <stillcompiling@gmail.com>
-Date: Wed, 21 Jun 2017 14:42:08 +0800
-Subject: [PATCH 14/14] ARM: dts: imx6q-evi: Fix onboard hub reset line
-
-Previously the onboard hub was made to work by treating its
-reset gpio as a regulator enable.
-Get rid of that kludge now that pwseq has added reset gpio support
-Move pin muxing the hub reset pin into the usbh1 group
-
-Signed-off-by: Joshua Clayton <stillcompiling@gmail.com>
-Signed-off-by: Peter Chen <peter.chen@nxp.com>
----
- arch/arm/boot/dts/imx6q-evi.dts | 25 +++++++------------------
- 1 file changed, 7 insertions(+), 18 deletions(-)
-
-diff --git a/arch/arm/boot/dts/imx6q-evi.dts b/arch/arm/boot/dts/imx6q-evi.dts
-index e0aea782c666..6f3afffc8faa 100644
---- a/arch/arm/boot/dts/imx6q-evi.dts
-+++ b/arch/arm/boot/dts/imx6q-evi.dts
-@@ -54,18 +54,6 @@
- reg = <0x10000000 0x40000000>;
- };
-
-- reg_usbh1_vbus: regulator-usbhubreset {
-- compatible = "regulator-fixed";
-- regulator-name = "usbh1_vbus";
-- regulator-min-microvolt = <5000000>;
-- regulator-max-microvolt = <5000000>;
-- enable-active-high;
-- startup-delay-us = <2>;
-- pinctrl-names = "default";
-- pinctrl-0 = <&pinctrl_usbh1_hubreset>;
-- gpio = <&gpio7 12 GPIO_ACTIVE_HIGH>;
-- };
--
- reg_usb_otg_vbus: regulator-usbotgvbus {
- compatible = "regulator-fixed";
- regulator-name = "usb_otg_vbus";
-@@ -213,12 +201,18 @@
- };
-
- &usbh1 {
-- vbus-supply = <&reg_usbh1_vbus>;
- pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_usbh1>;
- dr_mode = "host";
- disable-over-current;
- status = "okay";
-+
-+ usb2415host: hub@1 {
-+ compatible = "usb424,2513";
-+ reg = <1>;
-+ reset-gpios = <&gpio7 12 GPIO_ACTIVE_LOW>;
-+ reset-duration-us = <3000>;
-+ };
- };
-
- &usbotg {
-@@ -481,11 +475,6 @@
- MX6QDL_PAD_GPIO_3__USB_H1_OC 0x1b0b0
- /* usbh1_b OC */
- MX6QDL_PAD_GPIO_0__GPIO1_IO00 0x1b0b0
-- >;
-- };
--
-- pinctrl_usbh1_hubreset: usbh1hubresetgrp {
-- fsl,pins = <
- MX6QDL_PAD_GPIO_17__GPIO7_IO12 0x1b0b0
- >;
- };
---
-2.16.1
-