summaryrefslogtreecommitdiffstats
path: root/target/linux/generic/patches-4.4/082-0001-USB-core-let-USB-device-know-device-node.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/generic/patches-4.4/082-0001-USB-core-let-USB-device-know-device-node.patch')
-rw-r--r--target/linux/generic/patches-4.4/082-0001-USB-core-let-USB-device-know-device-node.patch179
1 files changed, 179 insertions, 0 deletions
diff --git a/target/linux/generic/patches-4.4/082-0001-USB-core-let-USB-device-know-device-node.patch b/target/linux/generic/patches-4.4/082-0001-USB-core-let-USB-device-know-device-node.patch
new file mode 100644
index 0000000000..901cdf7e83
--- /dev/null
+++ b/target/linux/generic/patches-4.4/082-0001-USB-core-let-USB-device-know-device-node.patch
@@ -0,0 +1,179 @@
+From 69bec725985324e79b1c47ea287815ac4ddb0521 Mon Sep 17 00:00:00 2001
+From: Peter Chen <peter.chen@freescale.com>
+Date: Fri, 19 Feb 2016 17:26:15 +0800
+Subject: [PATCH] USB: core: let USB device know device node
+
+Although most of USB devices are hot-plug's, there are still some devices
+are hard wired on the board, eg, for HSIC and SSIC interface USB devices.
+If these kinds of USB devices are multiple functions, and they can supply
+other interfaces like i2c, gpios for other devices, we may need to
+describe these at device tree.
+
+In this commit, it uses "reg" in dts as physical port number to match
+the phyiscal port number decided by USB core, if they are the same,
+then the device node is for the device we are creating for USB core.
+
+Signed-off-by: Peter Chen <peter.chen@freescale.com>
+Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
+Acked-by: Alan Stern <stern@rowland.harvard.edu>
+Acked-by: Rob Herring <robh@kernel.org>
+Acked-by: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ .../devicetree/bindings/usb/usb-device.txt | 28 +++++++++++++
+ drivers/usb/core/Makefile | 2 +-
+ drivers/usb/core/of.c | 47 ++++++++++++++++++++++
+ drivers/usb/core/usb.c | 10 +++++
+ include/linux/usb/of.h | 7 ++++
+ 5 files changed, 93 insertions(+), 1 deletion(-)
+ create mode 100644 Documentation/devicetree/bindings/usb/usb-device.txt
+ create mode 100644 drivers/usb/core/of.c
+
+--- /dev/null
++++ b/Documentation/devicetree/bindings/usb/usb-device.txt
+@@ -0,0 +1,28 @@
++Generic USB Device Properties
++
++Usually, we only use device tree for hard wired USB device.
++The reference binding doc is from:
++http://www.firmware.org/1275/bindings/usb/usb-1_0.ps
++
++Required properties:
++- compatible: usbVID,PID. The textual representation of VID, PID shall
++ be in lower case hexadecimal with leading zeroes suppressed. The
++ other compatible strings from the above standard binding could also
++ be used, but a device adhering to this binding may leave out all except
++ for usbVID,PID.
++- reg: the port number which this device is connecting to, the range
++ is 1-31.
++
++Example:
++
++&usb1 {
++ status = "okay";
++
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ hub: genesys@1 {
++ compatible = "usb5e3,608";
++ reg = <1>;
++ };
++}
+--- a/drivers/usb/core/Makefile
++++ b/drivers/usb/core/Makefile
+@@ -5,7 +5,7 @@
+ usbcore-y := usb.o hub.o hcd.o urb.o message.o driver.o
+ usbcore-y += config.o file.o buffer.o sysfs.o endpoint.o
+ usbcore-y += devio.o notify.o generic.o quirks.o devices.o
+-usbcore-y += port.o
++usbcore-y += port.o of.o
+
+ usbcore-$(CONFIG_PCI) += hcd-pci.o
+ usbcore-$(CONFIG_ACPI) += usb-acpi.o
+--- /dev/null
++++ b/drivers/usb/core/of.c
+@@ -0,0 +1,47 @@
++/*
++ * of.c The helpers for hcd device tree support
++ *
++ * Copyright (C) 2016 Freescale Semiconductor, Inc.
++ * Author: Peter Chen <peter.chen@freescale.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. If not, see <http://www.gnu.org/licenses/>.
++ */
++
++#include <linux/of.h>
++
++/**
++ * usb_of_get_child_node - Find the device node match port number
++ * @parent: the parent device node
++ * @portnum: the port number which device is connecting
++ *
++ * Find the node from device tree according to its port number.
++ *
++ * Return: On success, a pointer to the device node, %NULL on failure.
++ */
++struct device_node *usb_of_get_child_node(struct device_node *parent,
++ int portnum)
++{
++ struct device_node *node;
++ u32 port;
++
++ for_each_child_of_node(parent, node) {
++ if (!of_property_read_u32(node, "reg", &port)) {
++ if (port == portnum)
++ return node;
++ }
++ }
++
++ return NULL;
++}
++EXPORT_SYMBOL_GPL(usb_of_get_child_node);
++
+--- a/drivers/usb/core/usb.c
++++ b/drivers/usb/core/usb.c
+@@ -36,6 +36,7 @@
+ #include <linux/mutex.h>
+ #include <linux/workqueue.h>
+ #include <linux/debugfs.h>
++#include <linux/usb/of.h>
+
+ #include <asm/io.h>
+ #include <linux/scatterlist.h>
+@@ -469,6 +470,7 @@ struct usb_device *usb_alloc_dev(struct
+ dev->route = 0;
+
+ dev->dev.parent = bus->controller;
++ dev->dev.of_node = bus->controller->of_node;
+ dev_set_name(&dev->dev, "usb%d", bus->busnum);
+ root_hub = 1;
+ } else {
+@@ -493,6 +495,14 @@ struct usb_device *usb_alloc_dev(struct
+ dev->dev.parent = &parent->dev;
+ dev_set_name(&dev->dev, "%d-%s", bus->busnum, dev->devpath);
+
++ if (!parent->parent) {
++ /* device under root hub's port */
++ port1 = usb_hcd_find_raw_port_number(usb_hcd,
++ port1);
++ }
++ dev->dev.of_node = usb_of_get_child_node(parent->dev.of_node,
++ port1);
++
+ /* hub driver sets up TT records */
+ }
+
+--- a/include/linux/usb/of.h
++++ b/include/linux/usb/of.h
+@@ -15,6 +15,8 @@
+ bool of_usb_host_tpl_support(struct device_node *np);
+ int of_usb_update_otg_caps(struct device_node *np,
+ struct usb_otg_caps *otg_caps);
++struct device_node *usb_of_get_child_node(struct device_node *parent,
++ int portnum);
+ #else
+ static inline bool of_usb_host_tpl_support(struct device_node *np)
+ {
+@@ -25,6 +27,11 @@ static inline int of_usb_update_otg_caps
+ {
+ return 0;
+ }
++static inline struct device_node *usb_of_get_child_node
++ (struct device_node *parent, int portnum)
++{
++ return NULL;
++}
+ #endif
+
+ #if IS_ENABLED(CONFIG_OF) && IS_ENABLED(CONFIG_USB_SUPPORT)