All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC PATCH 0/2] USB: let the USB device know device node
@ 2016-01-08  5:44 ` Peter Chen
  0 siblings, 0 replies; 24+ messages in thread
From: Peter Chen @ 2016-01-08  5:44 UTC (permalink / raw)
  To: gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r,
	stern-nwvwT67g6+6dFdvTe/nMLpVzexx5G7lz
  Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, pawel.moll-5wv7dgnIgG8,
	mark.rutland-5wv7dgnIgG8, linux-usb-u79uwXL29TY76Z2rM5mHXA,
	balbi-l0cyMroinI0, arnd-r2nGTMty4D4,
	valentin.longchamp-SkAbAL50j+5BDgjK7y7TUQ, Peter Chen

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

-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [RFC PATCH 0/2] USB: let the USB device know device node
@ 2016-01-08  5:44 ` Peter Chen
  0 siblings, 0 replies; 24+ messages in thread
From: Peter Chen @ 2016-01-08  5:44 UTC (permalink / raw)
  To: linux-arm-kernel

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

-- 
1.9.1

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [RFC PATCH 1/2] USB: core: let USB device know device node
  2016-01-08  5:44 ` Peter Chen
@ 2016-01-08  5:44     ` Peter Chen
  -1 siblings, 0 replies; 24+ messages in thread
From: Peter Chen @ 2016-01-08  5:44 UTC (permalink / raw)
  To: gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r,
	stern-nwvwT67g6+6dFdvTe/nMLpVzexx5G7lz
  Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, pawel.moll-5wv7dgnIgG8,
	mark.rutland-5wv7dgnIgG8, linux-usb-u79uwXL29TY76Z2rM5mHXA,
	balbi-l0cyMroinI0, arnd-r2nGTMty4D4,
	valentin.longchamp-SkAbAL50j+5BDgjK7y7TUQ, 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.

Signed-off-by: Peter Chen <peter.chen-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
---
 .../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

diff --git a/Documentation/devicetree/bindings/usb/usb-device.txt b/Documentation/devicetree/bindings/usb/usb-device.txt
new file mode 100644
index 0000000..d35facd
--- /dev/null
+++ b/Documentation/devicetree/bindings/usb/usb-device.txt
@@ -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.
diff --git a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile
index 2f6f932..9780877 100644
--- 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
diff --git a/drivers/usb/core/of.c b/drivers/usb/core/of.c
new file mode 100644
index 0000000..008ae6a
--- /dev/null
+++ b/drivers/usb/core/of.c
@@ -0,0 +1,48 @@
+/*
+ * of.c		The helpers for hcd device tree support
+ *
+ * Copyright (C) 2016 Freescale Semiconductor, Inc.
+ * Author: Peter Chen <peter.chen-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
+ *
+ * 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.
+ */
+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);
+
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
index 77e4c9b..211cb6e 100644
--- 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>
@@ -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;
 }
diff --git a/include/linux/usb.h b/include/linux/usb.h
index 89533ba..a3a0b07 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -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)
 
diff --git a/include/linux/usb/of.h b/include/linux/usb/of.h
index 974bce9..94340cb 100644
--- a/include/linux/usb/of.h
+++ b/include/linux/usb/of.h
@@ -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)
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [RFC PATCH 1/2] USB: core: let USB device know device node
@ 2016-01-08  5:44     ` Peter Chen
  0 siblings, 0 replies; 24+ messages in thread
From: Peter Chen @ 2016-01-08  5:44 UTC (permalink / raw)
  To: linux-arm-kernel

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.

Signed-off-by: Peter Chen <peter.chen@freescale.com>
---
 .../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

diff --git a/Documentation/devicetree/bindings/usb/usb-device.txt b/Documentation/devicetree/bindings/usb/usb-device.txt
new file mode 100644
index 0000000..d35facd
--- /dev/null
+++ b/Documentation/devicetree/bindings/usb/usb-device.txt
@@ -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.
diff --git a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile
index 2f6f932..9780877 100644
--- 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
diff --git a/drivers/usb/core/of.c b/drivers/usb/core/of.c
new file mode 100644
index 0000000..008ae6a
--- /dev/null
+++ b/drivers/usb/core/of.c
@@ -0,0 +1,48 @@
+/*
+ * 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/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.
+ */
+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);
+
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
index 77e4c9b..211cb6e 100644
--- 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>
@@ -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;
 }
diff --git a/include/linux/usb.h b/include/linux/usb.h
index 89533ba..a3a0b07 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -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)
 
diff --git a/include/linux/usb/of.h b/include/linux/usb/of.h
index 974bce9..94340cb 100644
--- a/include/linux/usb/of.h
+++ b/include/linux/usb/of.h
@@ -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)
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [RFC PATCH 2/2] usb: Example for how to use device node at usb device driver
  2016-01-08  5:44 ` Peter Chen
@ 2016-01-08  5:44     ` Peter Chen
  -1 siblings, 0 replies; 24+ messages in thread
From: Peter Chen @ 2016-01-08  5:44 UTC (permalink / raw)
  To: gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r,
	stern-nwvwT67g6+6dFdvTe/nMLpVzexx5G7lz
  Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, pawel.moll-5wv7dgnIgG8,
	mark.rutland-5wv7dgnIgG8, linux-usb-u79uwXL29TY76Z2rM5mHXA,
	balbi-l0cyMroinI0, arnd-r2nGTMty4D4,
	valentin.longchamp-SkAbAL50j+5BDgjK7y7TUQ, 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.

Signed-off-by: Peter Chen <peter.chen-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
---
 arch/arm/boot/dts/imx6sx-sdb.dtsi | 9 +++++++++
 drivers/usb/core/hub.c            | 8 ++++++++
 2 files changed, 17 insertions(+)

diff --git a/arch/arm/boot/dts/imx6sx-sdb.dtsi b/arch/arm/boot/dts/imx6sx-sdb.dtsi
index 94ac400..fe0fd95 100644
--- a/arch/arm/boot/dts/imx6sx-sdb.dtsi
+++ b/arch/arm/boot/dts/imx6sx-sdb.dtsi
@@ -275,6 +275,15 @@
 	vbus-supply = <&reg_usb_otg2_vbus>;
 	dr_mode = "host";
 	status = "okay";
+
+	#address-cells = <1>;
+	#size-cells = <0>;
+	hub: genesys@01 {
+		compatible = "05e3,0608";
+		reg = <0x01>;
+		delay-duration-us = <50>;
+	};
+
 };
 
 &usdhc2 {
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 4c77001..1babfd4 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -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;
 
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [RFC PATCH 2/2] usb: Example for how to use device node at usb device driver
@ 2016-01-08  5:44     ` Peter Chen
  0 siblings, 0 replies; 24+ messages in thread
From: Peter Chen @ 2016-01-08  5:44 UTC (permalink / raw)
  To: linux-arm-kernel

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.

Signed-off-by: Peter Chen <peter.chen@freescale.com>
---
 arch/arm/boot/dts/imx6sx-sdb.dtsi | 9 +++++++++
 drivers/usb/core/hub.c            | 8 ++++++++
 2 files changed, 17 insertions(+)

diff --git a/arch/arm/boot/dts/imx6sx-sdb.dtsi b/arch/arm/boot/dts/imx6sx-sdb.dtsi
index 94ac400..fe0fd95 100644
--- a/arch/arm/boot/dts/imx6sx-sdb.dtsi
+++ b/arch/arm/boot/dts/imx6sx-sdb.dtsi
@@ -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 {
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 4c77001..1babfd4 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -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;
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* Re: [RFC PATCH 1/2] USB: core: let USB device know device node
  2016-01-08  5:44     ` Peter Chen
@ 2016-01-08  8:22         ` Arnd Bergmann
  -1 siblings, 0 replies; 24+ messages in thread
From: Arnd Bergmann @ 2016-01-08  8:22 UTC (permalink / raw)
  To: Peter Chen
  Cc: gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r,
	stern-nwvwT67g6+6dFdvTe/nMLpVzexx5G7lz,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, pawel.moll-5wv7dgnIgG8,
	mark.rutland-5wv7dgnIgG8, linux-usb-u79uwXL29TY76Z2rM5mHXA,
	balbi-l0cyMroinI0, valentin.longchamp-SkAbAL50j+5BDgjK7y7TUQ

On Friday 08 January 2016 13:44:23 Peter Chen wrote:
> +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);

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
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [RFC PATCH 1/2] USB: core: let USB device know device node
@ 2016-01-08  8:22         ` Arnd Bergmann
  0 siblings, 0 replies; 24+ messages in thread
From: Arnd Bergmann @ 2016-01-08  8:22 UTC (permalink / raw)
  To: linux-arm-kernel

On Friday 08 January 2016 13:44:23 Peter Chen wrote:
> +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);

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

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFC PATCH 2/2] usb: Example for how to use device node at usb device driver
  2016-01-08  5:44     ` Peter Chen
@ 2016-01-08  8:26         ` Arnd Bergmann
  -1 siblings, 0 replies; 24+ messages in thread
From: Arnd Bergmann @ 2016-01-08  8:26 UTC (permalink / raw)
  To: Peter Chen
  Cc: gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r,
	stern-nwvwT67g6+6dFdvTe/nMLpVzexx5G7lz,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, pawel.moll-5wv7dgnIgG8,
	mark.rutland-5wv7dgnIgG8, linux-usb-u79uwXL29TY76Z2rM5mHXA,
	balbi-l0cyMroinI0, valentin.longchamp-SkAbAL50j+5BDgjK7y7TUQ

On Friday 08 January 2016 13:44:24 Peter Chen wrote:
> +	  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
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [RFC PATCH 2/2] usb: Example for how to use device node at usb device driver
@ 2016-01-08  8:26         ` Arnd Bergmann
  0 siblings, 0 replies; 24+ messages in thread
From: Arnd Bergmann @ 2016-01-08  8:26 UTC (permalink / raw)
  To: linux-arm-kernel

On Friday 08 January 2016 13:44:24 Peter Chen wrote:
> +	  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

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFC PATCH 1/2] USB: core: let USB device know device node
  2016-01-08  5:44     ` Peter Chen
@ 2016-01-08 14:32         ` Rob Herring
  -1 siblings, 0 replies; 24+ messages in thread
From: Rob Herring @ 2016-01-08 14:32 UTC (permalink / raw)
  To: Peter Chen
  Cc: Greg Kroah-Hartman, Alan Stern,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	devicetree-u79uwXL29TY76Z2rM5mHXA, Pawel Moll, Mark Rutland,
	Linux USB List, Felipe Balbi, Arnd Bergmann, Valentin Longchamp

On Thu, Jan 7, 2016 at 11:44 PM, Peter Chen <peter.chen-KZfg59tc24xl57MIdRCFDg@public.gmane.org> wrote:
> 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.
>
> Signed-off-by: Peter Chen <peter.chen-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
> ---
>  .../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
>
> diff --git a/Documentation/devicetree/bindings/usb/usb-device.txt b/Documentation/devicetree/bindings/usb/usb-device.txt
> new file mode 100644
> index 0000000..d35facd
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/usb/usb-device.txt
> @@ -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

> +
> +Required properties:
> +- reg: the port number which this device is connecting to.

At least compatible should also be here.

> diff --git a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile
> index 2f6f932..9780877 100644
> --- 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
> diff --git a/drivers/usb/core/of.c b/drivers/usb/core/of.c
> new file mode 100644
> index 0000000..008ae6a
> --- /dev/null
> +++ b/drivers/usb/core/of.c
> @@ -0,0 +1,48 @@
> +/*
> + * of.c                The helpers for hcd device tree support
> + *
> + * Copyright (C) 2016 Freescale Semiconductor, Inc.
> + * Author: Peter Chen <peter.chen-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
> + *
> + * 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.
> + */
> +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.

> +               }
> +       }
> +
> +       return NULL;
> +}
> +EXPORT_SYMBOL_GPL(usb_of_find_node);
> +
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [RFC PATCH 1/2] USB: core: let USB device know device node
@ 2016-01-08 14:32         ` Rob Herring
  0 siblings, 0 replies; 24+ messages in thread
From: Rob Herring @ 2016-01-08 14:32 UTC (permalink / raw)
  To: linux-arm-kernel

On Thu, Jan 7, 2016 at 11:44 PM, Peter Chen <peter.chen@freescale.com> wrote:
> 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.
>
> Signed-off-by: Peter Chen <peter.chen@freescale.com>
> ---
>  .../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
>
> diff --git a/Documentation/devicetree/bindings/usb/usb-device.txt b/Documentation/devicetree/bindings/usb/usb-device.txt
> new file mode 100644
> index 0000000..d35facd
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/usb/usb-device.txt
> @@ -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

> +
> +Required properties:
> +- reg: the port number which this device is connecting to.

At least compatible should also be here.

> diff --git a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile
> index 2f6f932..9780877 100644
> --- 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
> diff --git a/drivers/usb/core/of.c b/drivers/usb/core/of.c
> new file mode 100644
> index 0000000..008ae6a
> --- /dev/null
> +++ b/drivers/usb/core/of.c
> @@ -0,0 +1,48 @@
> +/*
> + * 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/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.
> + */
> +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.

> +               }
> +       }
> +
> +       return NULL;
> +}
> +EXPORT_SYMBOL_GPL(usb_of_find_node);
> +

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFC PATCH 1/2] USB: core: let USB device know device node
  2016-01-08  5:44     ` Peter Chen
@ 2016-01-08 22:50         ` Alan Stern
  -1 siblings, 0 replies; 24+ messages in thread
From: Alan Stern @ 2016-01-08 22:50 UTC (permalink / raw)
  To: Peter Chen
  Cc: gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, pawel.moll-5wv7dgnIgG8,
	mark.rutland-5wv7dgnIgG8, linux-usb-u79uwXL29TY76Z2rM5mHXA,
	balbi-l0cyMroinI0, arnd-r2nGTMty4D4,
	valentin.longchamp-SkAbAL50j+5BDgjK7y7TUQ

On Fri, 8 Jan 2016, Peter Chen wrote:

> 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.
> 
> Signed-off-by: Peter Chen <peter.chen-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
> ---

> +#include <linux/module.h>
> +#include <linux/moduleparam.h>

Do you need those two #include's?

> +#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".

> + * @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_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);
> +

> diff --git a/include/linux/usb.h b/include/linux/usb.h
> index 89533ba..a3a0b07 100644
> --- a/include/linux/usb.h
> +++ b/include/linux/usb.h
> @@ -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.

>  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

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [RFC PATCH 1/2] USB: core: let USB device know device node
@ 2016-01-08 22:50         ` Alan Stern
  0 siblings, 0 replies; 24+ messages in thread
From: Alan Stern @ 2016-01-08 22:50 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, 8 Jan 2016, Peter Chen wrote:

> 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.
> 
> Signed-off-by: Peter Chen <peter.chen@freescale.com>
> ---

> +#include <linux/module.h>
> +#include <linux/moduleparam.h>

Do you need those two #include's?

> +#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".

> + * @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_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);
> +

> diff --git a/include/linux/usb.h b/include/linux/usb.h
> index 89533ba..a3a0b07 100644
> --- a/include/linux/usb.h
> +++ b/include/linux/usb.h
> @@ -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.

>  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

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFC PATCH 1/2] USB: core: let USB device know device node
  2016-01-08  8:22         ` Arnd Bergmann
@ 2016-01-09  8:56           ` Peter Chen
  -1 siblings, 0 replies; 24+ messages in thread
From: Peter Chen @ 2016-01-09  8:56 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Peter Chen, gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r,
	stern-nwvwT67g6+6dFdvTe/nMLpVzexx5G7lz,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, pawel.moll-5wv7dgnIgG8,
	mark.rutland-5wv7dgnIgG8, linux-usb-u79uwXL29TY76Z2rM5mHXA,
	balbi-l0cyMroinI0, valentin.longchamp-SkAbAL50j+5BDgjK7y7TUQ

On Fri, Jan 08, 2016 at 09:22:22AM +0100, Arnd Bergmann wrote:
> On Friday 08 January 2016 13:44:23 Peter Chen wrote:
> > +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);
> 
> 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?
> 

Ok, thanks. 

-- 

Best Regards,
Peter Chen
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [RFC PATCH 1/2] USB: core: let USB device know device node
@ 2016-01-09  8:56           ` Peter Chen
  0 siblings, 0 replies; 24+ messages in thread
From: Peter Chen @ 2016-01-09  8:56 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Jan 08, 2016 at 09:22:22AM +0100, Arnd Bergmann wrote:
> On Friday 08 January 2016 13:44:23 Peter Chen wrote:
> > +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);
> 
> 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?
> 

Ok, thanks. 

-- 

Best Regards,
Peter Chen

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFC PATCH 2/2] usb: Example for how to use device node at usb device driver
  2016-01-08  8:26         ` Arnd Bergmann
@ 2016-01-09  8:57           ` Peter Chen
  -1 siblings, 0 replies; 24+ messages in thread
From: Peter Chen @ 2016-01-09  8:57 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Peter Chen, gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r,
	stern-nwvwT67g6+6dFdvTe/nMLpVzexx5G7lz,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, pawel.moll-5wv7dgnIgG8,
	mark.rutland-5wv7dgnIgG8, linux-usb-u79uwXL29TY76Z2rM5mHXA,
	balbi-l0cyMroinI0, valentin.longchamp-SkAbAL50j+5BDgjK7y7TUQ

On Fri, Jan 08, 2016 at 09:26:10AM +0100, Arnd Bergmann wrote:
> On Friday 08 January 2016 13:44:24 Peter Chen wrote:
> > +	  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.
> 

Thanks, will change.

-- 

Best Regards,
Peter Chen
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [RFC PATCH 2/2] usb: Example for how to use device node at usb device driver
@ 2016-01-09  8:57           ` Peter Chen
  0 siblings, 0 replies; 24+ messages in thread
From: Peter Chen @ 2016-01-09  8:57 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Jan 08, 2016 at 09:26:10AM +0100, Arnd Bergmann wrote:
> On Friday 08 January 2016 13:44:24 Peter Chen wrote:
> > +	  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.
> 

Thanks, will change.

-- 

Best Regards,
Peter Chen

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFC PATCH 1/2] USB: core: let USB device know device node
  2016-01-08 14:32         ` Rob Herring
@ 2016-01-09  9:05             ` Peter Chen
  -1 siblings, 0 replies; 24+ messages in thread
From: Peter Chen @ 2016-01-09  9:05 UTC (permalink / raw)
  To: Rob Herring
  Cc: Peter Chen, Greg Kroah-Hartman, Alan Stern,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	devicetree-u79uwXL29TY76Z2rM5mHXA, Pawel Moll, Mark Rutland,
	Linux USB List, Felipe Balbi, Arnd Bergmann, Valentin Longchamp

On Fri, Jan 08, 2016 at 08:32:45AM -0600, Rob Herring wrote:
> On Thu, Jan 7, 2016 at 11:44 PM, Peter Chen <peter.chen-KZfg59tc24xl57MIdRCFDg@public.gmane.org> wrote:
> > 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.
> >
> > Signed-off-by: Peter Chen <peter.chen-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
> > ---
> >  .../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
> >
> > diff --git a/Documentation/devicetree/bindings/usb/usb-device.txt b/Documentation/devicetree/bindings/usb/usb-device.txt
> > new file mode 100644
> > index 0000000..d35facd
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/usb/usb-device.txt
> > @@ -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.

> > +
> > +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".

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

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.

-- 

Best Regards,
Peter Chen
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [RFC PATCH 1/2] USB: core: let USB device know device node
@ 2016-01-09  9:05             ` Peter Chen
  0 siblings, 0 replies; 24+ messages in thread
From: Peter Chen @ 2016-01-09  9:05 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Jan 08, 2016 at 08:32:45AM -0600, Rob Herring wrote:
> On Thu, Jan 7, 2016 at 11:44 PM, Peter Chen <peter.chen@freescale.com> wrote:
> > 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.
> >
> > Signed-off-by: Peter Chen <peter.chen@freescale.com>
> > ---
> >  .../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
> >
> > diff --git a/Documentation/devicetree/bindings/usb/usb-device.txt b/Documentation/devicetree/bindings/usb/usb-device.txt
> > new file mode 100644
> > index 0000000..d35facd
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/usb/usb-device.txt
> > @@ -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.

> > +
> > +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".

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

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.

-- 

Best Regards,
Peter Chen

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFC PATCH 1/2] USB: core: let USB device know device node
  2016-01-08 22:50         ` Alan Stern
@ 2016-01-09  9:32             ` Peter Chen
  -1 siblings, 0 replies; 24+ messages in thread
From: Peter Chen @ 2016-01-09  9:32 UTC (permalink / raw)
  To: Alan Stern
  Cc: Peter Chen, gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, pawel.moll-5wv7dgnIgG8,
	mark.rutland-5wv7dgnIgG8, linux-usb-u79uwXL29TY76Z2rM5mHXA,
	balbi-l0cyMroinI0, arnd-r2nGTMty4D4,
	valentin.longchamp-SkAbAL50j+5BDgjK7y7TUQ

On Fri, Jan 08, 2016 at 05:50:13PM -0500, Alan Stern wrote:
> On Fri, 8 Jan 2016, Peter Chen wrote:
> 
> > 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.
> > 
> > Signed-off-by: Peter Chen <peter.chen-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
> > ---
> 
> > +#include <linux/module.h>
> > +#include <linux/moduleparam.h>
> 
> Do you need those two #include's?

Will remove

> 
> > +#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.

> > + * @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_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);
> > +
> 
> > diff --git a/include/linux/usb.h b/include/linux/usb.h
> > index 89533ba..a3a0b07 100644
> > --- a/include/linux/usb.h
> > +++ b/include/linux/usb.h
> > @@ -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.
> 
> >  struct usb_device;
> >  struct usb_driver;

Yes, you are right.

-- 

Best Regards,
Peter Chen
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [RFC PATCH 1/2] USB: core: let USB device know device node
@ 2016-01-09  9:32             ` Peter Chen
  0 siblings, 0 replies; 24+ messages in thread
From: Peter Chen @ 2016-01-09  9:32 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Jan 08, 2016 at 05:50:13PM -0500, Alan Stern wrote:
> On Fri, 8 Jan 2016, Peter Chen wrote:
> 
> > 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.
> > 
> > Signed-off-by: Peter Chen <peter.chen@freescale.com>
> > ---
> 
> > +#include <linux/module.h>
> > +#include <linux/moduleparam.h>
> 
> Do you need those two #include's?

Will remove

> 
> > +#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.

> > + * @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_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);
> > +
> 
> > diff --git a/include/linux/usb.h b/include/linux/usb.h
> > index 89533ba..a3a0b07 100644
> > --- a/include/linux/usb.h
> > +++ b/include/linux/usb.h
> > @@ -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.
> 
> >  struct usb_device;
> >  struct usb_driver;

Yes, you are right.

-- 

Best Regards,
Peter Chen

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFC PATCH 1/2] USB: core: let USB device know device node
  2016-01-09  9:05             ` Peter Chen
@ 2016-01-09 15:20               ` Rob Herring
  -1 siblings, 0 replies; 24+ messages in thread
From: Rob Herring @ 2016-01-09 15:20 UTC (permalink / raw)
  To: Peter Chen
  Cc: Peter Chen, Greg Kroah-Hartman, Alan Stern,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	devicetree-u79uwXL29TY76Z2rM5mHXA, Pawel Moll, Mark Rutland,
	Linux USB List, Felipe Balbi, Arnd Bergmann, Valentin Longchamp

On Sat, Jan 9, 2016 at 3:05 AM, Peter Chen <hzpeterchen-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
> On Fri, Jan 08, 2016 at 08:32:45AM -0600, Rob Herring wrote:
>> On Thu, Jan 7, 2016 at 11:44 PM, Peter Chen <peter.chen-KZfg59tc24xl57MIdRCFDg@public.gmane.org> wrote:
>> > 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.
>> >
>> > Signed-off-by: Peter Chen <peter.chen-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
>> > ---
>> >  .../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
>> >
>> > diff --git a/Documentation/devicetree/bindings/usb/usb-device.txt b/Documentation/devicetree/bindings/usb/usb-device.txt
>> > new file mode 100644
>> > index 0000000..d35facd
>> > --- /dev/null
>> > +++ b/Documentation/devicetree/bindings/usb/usb-device.txt
>> > @@ -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.
>
>> > +
>> > +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".

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

>> > +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.
>>
>
> 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
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [RFC PATCH 1/2] USB: core: let USB device know device node
@ 2016-01-09 15:20               ` Rob Herring
  0 siblings, 0 replies; 24+ messages in thread
From: Rob Herring @ 2016-01-09 15:20 UTC (permalink / raw)
  To: linux-arm-kernel

On Sat, Jan 9, 2016 at 3:05 AM, Peter Chen <hzpeterchen@gmail.com> wrote:
> On Fri, Jan 08, 2016 at 08:32:45AM -0600, Rob Herring wrote:
>> On Thu, Jan 7, 2016 at 11:44 PM, Peter Chen <peter.chen@freescale.com> wrote:
>> > 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.
>> >
>> > Signed-off-by: Peter Chen <peter.chen@freescale.com>
>> > ---
>> >  .../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
>> >
>> > diff --git a/Documentation/devicetree/bindings/usb/usb-device.txt b/Documentation/devicetree/bindings/usb/usb-device.txt
>> > new file mode 100644
>> > index 0000000..d35facd
>> > --- /dev/null
>> > +++ b/Documentation/devicetree/bindings/usb/usb-device.txt
>> > @@ -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.
>
>> > +
>> > +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".

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

>> > +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.
>>
>
> 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

^ permalink raw reply	[flat|nested] 24+ messages in thread

end of thread, other threads:[~2016-01-09 15:20 UTC | newest]

Thread overview: 24+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-01-08  5:44 [RFC PATCH 0/2] USB: let the USB device know device node Peter Chen
2016-01-08  5:44 ` Peter Chen
     [not found] ` <1452231864-11171-1-git-send-email-peter.chen-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
2016-01-08  5:44   ` [RFC PATCH 1/2] USB: core: let " Peter Chen
2016-01-08  5:44     ` Peter Chen
     [not found]     ` <1452231864-11171-2-git-send-email-peter.chen-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
2016-01-08  8:22       ` Arnd Bergmann
2016-01-08  8:22         ` Arnd Bergmann
2016-01-09  8:56         ` Peter Chen
2016-01-09  8:56           ` Peter Chen
2016-01-08 14:32       ` Rob Herring
2016-01-08 14:32         ` Rob Herring
     [not found]         ` <CAL_JsqKwATxGiqJ_MNV6_pur1dUEVOzH+iB8yY+kWA0y2gWbNg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-01-09  9:05           ` Peter Chen
2016-01-09  9:05             ` Peter Chen
2016-01-09 15:20             ` Rob Herring
2016-01-09 15:20               ` Rob Herring
2016-01-08 22:50       ` Alan Stern
2016-01-08 22:50         ` Alan Stern
     [not found]         ` <Pine.LNX.4.44L0.1601081746080.21467-100000-pYrvlCTfrz9XsRXLowluHWD2FQJk+8+b@public.gmane.org>
2016-01-09  9:32           ` Peter Chen
2016-01-09  9:32             ` Peter Chen
2016-01-08  5:44   ` [RFC PATCH 2/2] usb: Example for how to use device node at usb device driver Peter Chen
2016-01-08  5:44     ` Peter Chen
     [not found]     ` <1452231864-11171-3-git-send-email-peter.chen-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
2016-01-08  8:26       ` Arnd Bergmann
2016-01-08  8:26         ` Arnd Bergmann
2016-01-09  8:57         ` Peter Chen
2016-01-09  8:57           ` Peter Chen

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.