Skip to contentSkip to conversation

USB: let the USB device know device node

RFC PATCH New Peter Chen 5 participants 12 messages Jan 8, 2016 – Jan 9, 2016

Subsystems (3)
lore
Share & tools
lore

Peter Chen

author
#0 lore raw

cover USB: let the USB device know device node

Hi all,

For some hard wired USB devices[1], we may need to use device tree to describe them, the first patch is teach USB device to know device node, the second patch is an example to show how to get properties through device node at USB device (class) driver.

[1] http://marc.info/?l=linux-usb&m=142772952730243&w=2

Peter Chen (2):
USB: core: let USB device know device node
usb: Example for how to use device node at usb device driver

 .../devicetree/bindings/usb/usb-device.txt         |  8 ++++
 arch/arm/boot/dts/imx6sx-sdb.dtsi                  |  9 ++++
 drivers/usb/core/Makefile                          |  2 +-
 drivers/usb/core/hub.c                             |  8 ++++
 drivers/usb/core/of.c                              | 48 ++++++++++++++++++++++
 drivers/usb/core/usb.c                             |  8 +++-
 include/linux/usb.h                                |  2 +
 include/linux/usb/of.h                             |  6 +++
 8 files changed, 88 insertions(+), 3 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/usb/usb-device.txt
 create mode 100644 drivers/usb/core/of.c
Signature · 1 line
1.9.1
author
#1 lore raw

RFC PATCH 1/2 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 descirbe these at device tree.

In this commit, it uses "reg" in dts as port number to match the 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.

---
 .../devicetree/bindings/usb/usb-device.txt         |  8 ++++
 drivers/usb/core/Makefile                          |  2 +-
 drivers/usb/core/of.c                              | 48 ++++++++++++++++++++++
 drivers/usb/core/usb.c                             |  8 +++-
 include/linux/usb.h                                |  2 +
 include/linux/usb/of.h                             |  6 +++
 6 files changed, 71 insertions(+), 3 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/usb/usb-device.txt
 create mode 100644 drivers/usb/core/of.c
Documentation/devicetree/bindings/usb/usb-device.txt new file +8 -0
new file mode 100644
index 0000000..d35facd
@@ -0,0 +1,8 @@
+Generic USB Device Properties
+
+Usually, we only use device tree for hard wired USB device. 
+The reference binding doc is from:
+http://playground.sun.com/1275/bindings/usb/usb-1_0.ps.
+
+Required properties:
+- reg: the port number which this device is connecting to.
drivers/usb/core/Makefile +1 -1
index 2f6f932..9780877 100644
@@ -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
drivers/usb/core/of.c new file +48 -0

48 lines not on this page · raw message

drivers/usb/core/usb.c +6 -2
index 77e4c9b..211cb6e 100644
@@ -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>
@@ -502,11 +503,14 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent,
 	dev->connect_time = jiffies;
 	dev->active_duration = -jiffies;
 #endif
-	if (root_hub)	/* Root hub always ok [and always wired] */
+	if (root_hub) {	/* Root hub always ok [and always wired] */
 		dev->authorized = 1;
-	else {
+		dev->of_node = bus->controller->of_node;
+	} else {
 		dev->authorized = !!HCD_DEV_AUTHORIZED(usb_hcd);
 		dev->wusb = usb_bus_is_wusb(bus) ? 1 : 0;
+		dev->dev.of_node = usb_of_find_node
+			(parent->of_node, dev->portnum);
 	}
 	return dev;
 }
include/linux/usb.h +2 -0
index 89533ba..a3a0b07 100644
@@ -21,6 +21,7 @@
 #include <linux/sched.h>	/* for current && schedule_timeout */
 #include <linux/mutex.h>	/* for struct mutex */
 #include <linux/pm_runtime.h>	/* for runtime PM */
+#include <linux/of.h>		/* for device tree */
 
 struct usb_device;
 struct usb_driver;
@@ -616,6 +617,7 @@ struct usb_device {
 	struct usb3_lpm_parameters u1_params;
 	struct usb3_lpm_parameters u2_params;
 	unsigned lpm_disable_count;
+	struct device_node	*of_node; /* associated device tree node */
 };
 #define	to_usb_device(d) container_of(d, struct usb_device, dev)
 
include/linux/usb/of.h +6 -0
index 974bce9..94340cb 100644
@@ -16,6 +16,7 @@ enum usb_dr_mode of_usb_get_dr_mode_by_phy(struct device_node *phy_np);
 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_find_node(struct device_node *parent, int portnum);
 #else
 static inline enum usb_dr_mode
 of_usb_get_dr_mode_by_phy(struct device_node *phy_np)
@@ -31,6 +32,11 @@ static inline int of_usb_update_otg_caps(struct device_node *np,
 {
 	return 0;
 }
+struct inline device_node *usb_of_find_node(struct device_node *parent,
+				int portnum)
+{
+	return NULL;
+}
 #endif
 
 #if IS_ENABLED(CONFIG_OF) && IS_ENABLED(CONFIG_USB_SUPPORT)
Signature · 1 line
1.9.1
#2 lore raw

RFC PATCH 1/2 USB: core: let USB device know device node

Quoted 5 lines · On Friday 08 January 2016 13:44:23 Peter Chen wrote:
drivers/usb/core/of.c new file +5 -0
+struct device_node *usb_of_find_node(struct device_node *parent, int portnum)
+{
+       struct device_node *node;
+       u32 port;
+

drivers/usb/core/of.c line 47

Quoted 10 lines
drivers/usb/core/of.c new file +10 -0
+       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_find_node);

The implementation looks good to me, but I find the function name slightly confusing. We use "*find_node" or similar names in other subsystems to scan the entire tree, when this one just looks at the immediate children of the device.

Maybe something like "usb_of_get_child_node()" instead?

Arnd

#3 lore raw

RFC PATCH 1/2 USB: core: let USB device know device node

Quoted 22 lines · Arnd Bergmann
Quoted 5 lines · On Friday 08 January 2016 13:44:23 Peter Chen wrote:
drivers/usb/core/of.c new file +5 -0
+struct device_node *usb_of_find_node(struct device_node *parent, int portnum)
+{
+       struct device_node *node;
+       u32 port;
+

drivers/usb/core/of.c line 47

Quoted 10 lines
drivers/usb/core/of.c new file +10 -0
+       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_find_node);

The implementation looks good to me, but I find the function name slightly confusing. We use "*find_node" or similar names in other subsystems to scan the entire tree, when this one just looks at the immediate children of the device.

Quoted 2 lines

Maybe something like "usb_of_get_child_node()" instead?

Ok, thanks.

Signature · 2 lines
Best Regards,
Peter Chen
#4 lore raw

RFC PATCH 1/2 USB: core: let USB device know device node

In reply to Peter Chen
Quoted 28 lines · Peter Chen

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 descirbe these at device tree.

In this commit, it uses "reg" in dts as port number to match the 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.

---
 .../devicetree/bindings/usb/usb-device.txt         |  8 ++++
 drivers/usb/core/Makefile                          |  2 +-
 drivers/usb/core/of.c                              | 48 ++++++++++++++++++++++
 drivers/usb/core/usb.c                             |  8 +++-
 include/linux/usb.h                                |  2 +
 include/linux/usb/of.h                             |  6 +++
 6 files changed, 71 insertions(+), 3 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/usb/usb-device.txt
 create mode 100644 drivers/usb/core/of.c
Documentation/devicetree/bindings/usb/usb-device.txt new file +0 -0
new file mode 100644
index 0000000..d35facd

Documentation/devicetree/bindings/usb/usb-device.txt line 5

Quoted 5 lines
Documentation/devicetree/bindings/usb/usb-device.txt new file +5 -0
@@ -0,0 +1,8 @@
+Generic USB Device Properties
+
+Usually, we only use device tree for hard wired USB device.
+The reference binding doc is from:
+http://playground.sun.com/1275/bindings/usb/usb-1_0.ps.

This path doesn't exist anymore. Use
http://www.firmware.org/1275/bindings/usb/usb-1_0.ps

Documentation/devicetree/bindings/usb/usb-device.txt line 8

Quoted 3 lines
Documentation/devicetree/bindings/usb/usb-device.txt new file +3 -0
+
+Required properties:
+- reg: the port number which this device is connecting to.

At least compatible should also be here.

Quoted 50 lines
drivers/usb/core/Makefile +1 -1
index 2f6f932..9780877 100644
@@ -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
drivers/usb/core/of.c new file +31 -0
new file mode 100644
index 0000000..008ae6a
@@ -0,0 +1,48 @@
+/*
+ * of.c                The helpers for hcd device tree support
+ *
+ * Copyright (C) 2016 Freescale Semiconductor, Inc.
+ * Author: Peter Chen <[email protected]>
+ *
+ * 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/module.h>
+#include <linux/moduleparam.h>
+#include <linux/of.h>
+
+/**
+ * usb_of_find_node - Find the device node match port number
+ * @dev: 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.

drivers/usb/core/of.c line 41

Quoted 10 lines
drivers/usb/core/of.c new file +10 -0
+ */
+struct device_node *usb_of_find_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;

This needs to match on the compatible string too. Otherwise, this could match in lots of cases.

Quoted 7 lines
drivers/usb/core/of.c new file +7 -0
+               }
+       }
+
+       return NULL;
+}
+EXPORT_SYMBOL_GPL(usb_of_find_node);
+
#5 lore raw

RFC PATCH 1/2 USB: core: let USB device know device node

Quoted 23 lines · Rob Herring
Quoted 22 lines · Peter Chen

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 descirbe these at device tree.

In this commit, it uses "reg" in dts as port number to match the 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.

---
 .../devicetree/bindings/usb/usb-device.txt         |  8 ++++
 drivers/usb/core/Makefile                          |  2 +-
 drivers/usb/core/of.c                              | 48 ++++++++++++++++++++++
 drivers/usb/core/usb.c                             |  8 +++-
 include/linux/usb.h                                |  2 +
 include/linux/usb/of.h                             |  6 +++
 6 files changed, 71 insertions(+), 3 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/usb/usb-device.txt
 create mode 100644 drivers/usb/core/of.c
Quoted 15 lines

Documentation/devicetree/bindings/usb/usb-device.txt line 5

Quoted 11 lines
Documentation/devicetree/bindings/usb/usb-device.txt new file +5 -0
new file mode 100644
index 0000000..d35facd
@@ -0,0 +1,8 @@
+Generic USB Device Properties
+
+Usually, we only use device tree for hard wired USB device.
+The reference binding doc is from:
+http://playground.sun.com/1275/bindings/usb/usb-1_0.ps.

This path doesn't exist anymore. Use
http://www.firmware.org/1275/bindings/usb/usb-1_0.ps

Ok.

Quoted 6 lines

Documentation/devicetree/bindings/usb/usb-device.txt line 8

Quoted 3 lines
Documentation/devicetree/bindings/usb/usb-device.txt new file +3 -0
+
+Required properties:
+- reg: the port number which this device is connecting to.

At least compatible should also be here.

What format for USB device compatible string has still not been decided. Would you suggest something? At my example, I use "vid,pid".

Quoted 5 lines
Quoted 5 lines

+ */

Documentation/devicetree/bindings/usb/usb-device.txt new file +4 -0
+struct device_node *usb_of_find_node(struct device_node *parent, int portnum)
+{
+       struct device_node *node;
+       u32 port;
Quoted 9 lines

Documentation/devicetree/bindings/usb/usb-device.txt

Quoted 5 lines
Documentation/devicetree/bindings/usb/usb-device.txt new file +5 -0
+
+       for_each_child_of_node(parent, node) {
+               if (!of_property_read_u32(node, "reg", &port)) {
+                       if (port == portnum)
+                               return node;

This needs to match on the compatible string too. Otherwise, this could match in lots of cases.

No, the port number is unique under the USB HUB (including host controller, which is roothub), and there are some many compatible string for USB devices.

Signature · 2 lines
Best Regards,
Peter Chen
#6 lore raw

RFC PATCH 1/2 USB: core: let USB device know device node

Quoted 49 lines · Peter Chen
Quoted 23 lines · Rob Herring
Quoted 22 lines · Peter Chen

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 descirbe these at device tree.

In this commit, it uses "reg" in dts as port number to match the 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.

---
 .../devicetree/bindings/usb/usb-device.txt         |  8 ++++
 drivers/usb/core/Makefile                          |  2 +-
 drivers/usb/core/of.c                              | 48 ++++++++++++++++++++++
 drivers/usb/core/usb.c                             |  8 +++-
 include/linux/usb.h                                |  2 +
 include/linux/usb/of.h                             |  6 +++
 6 files changed, 71 insertions(+), 3 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/usb/usb-device.txt
 create mode 100644 drivers/usb/core/of.c
Quoted 15 lines

Documentation/devicetree/bindings/usb/usb-device.txt line 5

Quoted 11 lines
Documentation/devicetree/bindings/usb/usb-device.txt new file +5 -0
new file mode 100644
index 0000000..d35facd
@@ -0,0 +1,8 @@
+Generic USB Device Properties
+
+Usually, we only use device tree for hard wired USB device.
+The reference binding doc is from:
+http://playground.sun.com/1275/bindings/usb/usb-1_0.ps.

This path doesn't exist anymore. Use
http://www.firmware.org/1275/bindings/usb/usb-1_0.ps

Ok.

Quoted 6 lines

Documentation/devicetree/bindings/usb/usb-device.txt line 8

Quoted 3 lines
Documentation/devicetree/bindings/usb/usb-device.txt new file +3 -0
+
+Required properties:
+- reg: the port number which this device is connecting to.

At least compatible should also be here.

Quoted 2 lines

What format for USB device compatible string has still not been decided. Would you suggest something? At my example, I use "vid,pid".

Yes, it is. They are defined in OpenFirmware USB binding doc above. However, the compatible strings and nodes are supposed to reflect the USB descriptors and interfaces. I don't think we need that much detail here, so I'd suggest we limit it to a subset such as:

usbVID.PID.REV
usbVID.PID
usbVID.classDC
usb.classDC
usbifVID.classIC
usbif.classIC

Quoted 14 lines
Quoted 4 lines
Quoted 4 lines
Documentation/devicetree/bindings/usb/usb-device.txt new file +4 -0
+struct device_node *usb_of_find_node(struct device_node *parent, int portnum)
+{
+       struct device_node *node;
+       u32 port;
Quoted 9 lines

Documentation/devicetree/bindings/usb/usb-device.txt

Quoted 5 lines
Documentation/devicetree/bindings/usb/usb-device.txt new file +5 -0
+
+       for_each_child_of_node(parent, node) {
+               if (!of_property_read_u32(node, "reg", &port)) {
+                       if (port == portnum)
+                               return node;

This needs to match on the compatible string too. Otherwise, this could match in lots of cases.

Quoted 3 lines

No, the port number is unique under the USB HUB (including host controller, which is roothub), and there are some many compatible string for USB devices.

Assuming the parent node pointer is correct. You could pass a SPI host node to this function and it will return a valid device node pointer.

Rob

#7 lore raw

RFC PATCH 1/2 USB: core: let USB device know device node

In reply to Peter Chen
Quoted 13 lines · Peter Chen

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 descirbe these at device tree.

In this commit, it uses "reg" in dts as port number to match the 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.

---

drivers/usb/core/of.c line 21

Quoted 2 lines
drivers/usb/core/of.c new file +2 -0
+#include <linux/module.h>
+#include <linux/moduleparam.h>

Do you need those two #include's?

drivers/usb/core/of.c line 26

Quoted 5 lines
drivers/usb/core/of.c new file +5 -0
+#include <linux/of.h>
+
+/**
+ * usb_of_find_node - Find the device node match port number
+ * @dev: the parent device node

The parameter is actually named "parent".

Quoted 28 lines

+ * @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.
+ */

drivers/usb/core/of.c new file +16 -0
+struct device_node *usb_of_find_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_find_node);
+
include/linux/usb.h +0 -0
index 89533ba..a3a0b07 100644

include/linux/usb.h line 24

Quoted 4 lines
include/linux/usb.h +1 -0
@@ -21,6 +21,7 @@
 #include <linux/sched.h>	/* for current && schedule_timeout */
 #include <linux/mutex.h>	/* for struct mutex */
 #include <linux/pm_runtime.h>	/* for runtime PM */
+#include <linux/of.h>		/* for device tree */

I think you don't need this line. You can simply write:

	struct device_node;

just like the two lines below.

include/linux/usb.h struct usb_device { · line 622

Quoted 9 lines
include/linux/usb.h +1 -0
 struct usb_device;
 struct usb_driver;
@@ -616,6 +617,7 @@ struct usb_device {
 	struct usb3_lpm_parameters u1_params;
 	struct usb3_lpm_parameters u2_params;
 	unsigned lpm_disable_count;
+	struct device_node	*of_node; /* associated device tree node */
 };
 #define	to_usb_device(d) container_of(d, struct usb_device, dev)

Alan Stern

#8 lore raw

RFC PATCH 1/2 USB: core: let USB device know device node

Quoted 12 lines · Alan Stern
Quoted 10 lines · Peter Chen

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 descirbe these at device tree.

In this commit, it uses "reg" in dts as port number to match the 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.

Quoted 7 lines

drivers/usb/core/of.c line 21

Quoted 5 lines

---

drivers/usb/core/of.c new file +2 -0
+#include <linux/module.h>
+#include <linux/moduleparam.h>

Do you need those two #include's?

Will remove

Quoted 9 lines

drivers/usb/core/of.c line 26

Quoted 6 lines
drivers/usb/core/of.c new file +5 -0
+#include <linux/of.h>
+
+/**
+ * usb_of_find_node - Find the device node match port number
+ * @dev: the parent device node

The parameter is actually named "parent".

Sorry, I copied some code, will change.

Quoted 35 lines
Quoted 28 lines

+ * @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.
+ */

drivers/usb/core/of.c new file +16 -0
+struct device_node *usb_of_find_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_find_node);
+
include/linux/usb.h +0 -0
index 89533ba..a3a0b07 100644

include/linux/usb.h line 24

Quoted 4 lines
include/linux/usb.h +1 -0
@@ -21,6 +21,7 @@
 #include <linux/sched.h>	/* for current && schedule_timeout */
 #include <linux/mutex.h>	/* for struct mutex */
 #include <linux/pm_runtime.h>	/* for runtime PM */
+#include <linux/of.h>		/* for device tree */

I think you don't need this line. You can simply write:

Quoted 6 lines
	struct device_node;

just like the two lines below.

Quoted 2 lines
include/linux/usb.h +0 -0
 struct usb_device;
 struct usb_driver;

Yes, you are right.

Signature · 2 lines
Best Regards,
Peter Chen
author
#9 lore raw

RFC PATCH 2/2 usb: Example for how to use device node at usb device driver

In reply to Peter Chen

In this example, we take HUB driver as an example to show how to get properties in USB device driver if this device has device node.

---
 arch/arm/boot/dts/imx6sx-sdb.dtsi | 9 +++++++++
 drivers/usb/core/hub.c            | 8 ++++++++
 2 files changed, 17 insertions(+)
arch/arm/boot/dts/imx6sx-sdb.dtsi +9 -0
index 94ac400..fe0fd95 100644
@@ -275,6 +275,15 @@
 	vbus-supply = <&reg_usb_otg2_vbus>;
 	dr_mode = "host";
 	status = "okay";
+
+	#address-cells = <1>;
+	#size-cells = <0>;
+	hub: genesys at 01 {
+		compatible = "05e3,0608";
+		reg = <0x01>;
+		delay-duration-us = <50>;
+	};
+
 };
 
 &usdhc2 {
drivers/usb/core/hub.c +8 -0
index 4c77001..1babfd4 100644
@@ -27,6 +27,7 @@
 #include <linux/random.h>
 #include <linux/pm_qos.h>
 #include <linux/of_platform.h>
+#include <linux/of.h>
 
 #include <asm/uaccess.h>
 #include <asm/byteorder.h>
@@ -1748,6 +1749,7 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
 	struct usb_device *hdev;
 	struct usb_hub *hub;
 	int ret;
+	u32 duration_us = 0;
 
 	desc = intf->cur_altsetting;
 	hdev = interface_to_usbdev(intf);
@@ -1873,6 +1875,12 @@ descriptor_error:
 		return ret;
 	}
 
+	of_property_read_u32(hdev->dev.of_node, "delay-duration-us", &duration_us);
+	if (duration_us > 0) {
+		usleep_range(duration_us, duration_us + 10);
+		dev_info(&hdev->dev, "The delay is %d us\n", duration_us);
+	}
+
 	if (hub_configure(hub, endpoint) >= 0)
 		return 0;
 
Signature · 1 line
1.9.1
#10 lore raw

RFC PATCH 2/2 usb: Example for how to use device node at usb device driver

drivers/usb/core/hub.c descriptor_error: · line 1883

Quoted 8 lines · On Friday 08 January 2016 13:44:24 Peter Chen wrote:
drivers/usb/core/hub.c +7 -0
+	  u32 duration_us = 0;
 
+       of_property_read_u32(hdev->dev.of_node, "delay-duration-us", &duration_us);
+       if (duration_us > 0) {
+               usleep_range(duration_us, duration_us + 10);
+               dev_info(&hdev->dev, "The delay is %d us\n", duration_us);
+       }
+

I think especially for an example, it would be better to use error checking and not initialize the variable:

	u32 duration_us;
	int ret;
...
	ret = of_property_read_u32(hdev->dev.of_node, "delay-duration-us", &duration_us);
	if (!ret && duration_us > 0) {
		...
	}

The effect is the same as the other one.

Arnd

#11 lore raw

RFC PATCH 2/2 usb: Example for how to use device node at usb device driver

Quoted 21 lines · Arnd Bergmann

drivers/usb/core/hub.c descriptor_error: · line 1883

Quoted 8 lines · On Friday 08 January 2016 13:44:24 Peter Chen wrote:
drivers/usb/core/hub.c +7 -0
+	  u32 duration_us = 0;
 
+       of_property_read_u32(hdev->dev.of_node, "delay-duration-us", &duration_us);
+       if (duration_us > 0) {
+               usleep_range(duration_us, duration_us + 10);
+               dev_info(&hdev->dev, "The delay is %d us\n", duration_us);
+       }
+

I think especially for an example, it would be better to use error checking and not initialize the variable:

	u32 duration_us;
	int ret;
...
	ret = of_property_read_u32(hdev->dev.of_node, "delay-duration-us", &duration_us);
	if (!ret && duration_us > 0) {
		...
	}
Quoted 2 lines

The effect is the same as the other one.

Thanks, will change.

Signature · 2 lines
Best Regards,
Peter Chen