diff mbox

[1/1] USB: core: let USB device know device node

Message ID 1452501535-8580-1-git-send-email-peter.chen@freescale.com
State Superseded, archived
Headers show

Commit Message

Peter Chen Jan. 11, 2016, 8:38 a.m. UTC
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>
---
Changes from RFC:
- Fix the error address for binding doc, and add compatible for binding doc
- Change get child node API from "usb_of_find_node" to
  "usb_of_get_child_node"
- Delete unecessary header files
- One typo

 .../devicetree/bindings/usb/usb-device.txt         | 17 ++++++++
 drivers/usb/core/Makefile                          |  2 +-
 drivers/usb/core/of.c                              | 47 ++++++++++++++++++++++
 drivers/usb/core/usb.c                             |  8 +++-
 include/linux/usb.h                                |  2 +
 include/linux/usb/of.h                             |  7 ++++
 6 files changed, 80 insertions(+), 3 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/usb/usb-device.txt
 create mode 100644 drivers/usb/core/of.c

Comments

kernel test robot Jan. 11, 2016, 8:54 a.m. UTC | #1
Hi Peter,

[auto build test ERROR on usb/usb-testing]
[also build test ERROR on v4.4 next-20160108]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]

url:    https://github.com/0day-ci/linux/commits/Peter-Chen/USB-core-let-USB-device-know-device-node/20160111-164533
base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing
config: x86_64-randconfig-x002-201602 (attached as .config)
reproduce:
        # save the attached .config to linux build tree
        make ARCH=x86_64 

All error/warnings (new ones prefixed by >>):

   In file included from include/linux/compiler.h:56:0,
                    from include/uapi/linux/stddef.h:1,
                    from include/linux/stddef.h:4,
                    from include/uapi/linux/posix_types.h:4,
                    from include/uapi/linux/types.h:13,
                    from include/linux/types.h:5,
                    from include/linux/list.h:4,
                    from include/linux/module.h:9,
                    from drivers/usb/core/usb.c:24:
>> include/linux/compiler-gcc.h:73:17: error: expected '{' before 'inline'
    #define inline  inline  __attribute__((always_inline)) notrace
                    ^
>> include/linux/usb/of.h:36:8: note: in expansion of macro 'inline'
    struct inline device_node * usb_of_get_child_node(struct device_node *parent,
           ^
   drivers/usb/core/usb.c: In function 'usb_alloc_dev':
>> drivers/usb/core/usb.c:512:22: error: implicit declaration of function 'usb_of_get_child_node' [-Werror=implicit-function-declaration]
      dev->dev.of_node = usb_of_get_child_node
                         ^
>> drivers/usb/core/usb.c:512:20: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
      dev->dev.of_node = usb_of_get_child_node
                       ^
   cc1: some warnings being treated as errors

vim +/usb_of_get_child_node +512 drivers/usb/core/usb.c

   506		if (root_hub) {	/* Root hub always ok [and always wired] */
   507			dev->authorized = 1;
   508			dev->of_node = bus->controller->of_node;
   509		} else {
   510			dev->authorized = !!HCD_DEV_AUTHORIZED(usb_hcd);
   511			dev->wusb = usb_bus_is_wusb(bus) ? 1 : 0;
 > 512			dev->dev.of_node = usb_of_get_child_node
   513				(parent->of_node, dev->portnum);
   514		}
   515		return dev;

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
Peter Chen Jan. 11, 2016, 9:57 a.m. UTC | #2
On Mon, Jan 11, 2016 at 04:54:21PM +0800, kbuild test robot wrote:
> Hi Peter,
> 
> [auto build test ERROR on usb/usb-testing]
> [also build test ERROR on v4.4 next-20160108]
> [if your patch is applied to the wrong git tree, please drop us a note to help improving the system]
> 
> url:    https://github.com/0day-ci/linux/commits/Peter-Chen/USB-core-let-USB-device-know-device-node/20160111-164533
> base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing
> config: x86_64-randconfig-x002-201602 (attached as .config)
> reproduce:
>         # save the attached .config to linux build tree
>         make ARCH=x86_64 
> 
> All error/warnings (new ones prefixed by >>):
> 
>    In file included from include/linux/compiler.h:56:0,
>                     from include/uapi/linux/stddef.h:1,
>                     from include/linux/stddef.h:4,
>                     from include/uapi/linux/posix_types.h:4,
>                     from include/uapi/linux/types.h:13,
>                     from include/linux/types.h:5,
>                     from include/linux/list.h:4,
>                     from include/linux/module.h:9,
>                     from drivers/usb/core/usb.c:24:
> >> include/linux/compiler-gcc.h:73:17: error: expected '{' before 'inline'
>     #define inline  inline  __attribute__((always_inline)) notrace
>                     ^
> >> include/linux/usb/of.h:36:8: note: in expansion of macro 'inline'
>     struct inline device_node * usb_of_get_child_node(struct device_node *parent,
>            ^

Would anybody explain what does above mean, thanks.
I just can't reproduce it at my env.

>    drivers/usb/core/usb.c: In function 'usb_alloc_dev':
> >> drivers/usb/core/usb.c:512:22: error: implicit declaration of function 'usb_of_get_child_node' [-Werror=implicit-function-declaration]
>       dev->dev.of_node = usb_of_get_child_node
>                          ^
> >> drivers/usb/core/usb.c:512:20: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
>       dev->dev.of_node = usb_of_get_child_node
>                        ^
>    cc1: some warnings being treated as errors
> 
> vim +/usb_of_get_child_node +512 drivers/usb/core/usb.c
> 
>    506		if (root_hub) {	/* Root hub always ok [and always wired] */
>    507			dev->authorized = 1;
>    508			dev->of_node = bus->controller->of_node;
>    509		} else {
>    510			dev->authorized = !!HCD_DEV_AUTHORIZED(usb_hcd);
>    511			dev->wusb = usb_bus_is_wusb(bus) ? 1 : 0;
>  > 512			dev->dev.of_node = usb_of_get_child_node
>    513				(parent->of_node, dev->portnum);
>    514		}
>    515		return dev;
> 
> ---
> 0-DAY kernel test infrastructure                Open Source Technology Center
> https://lists.01.org/pipermail/kbuild-all                   Intel Corporation


> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
kernel test robot Jan. 11, 2016, 10:04 a.m. UTC | #3
Hi Peter,

[auto build test WARNING on usb/usb-testing]
[also build test WARNING on v4.4 next-20160108]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]

url:    https://github.com/0day-ci/linux/commits/Peter-Chen/USB-core-let-USB-device-know-device-node/20160111-164533
base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing
reproduce: make htmldocs

All warnings (new ones prefixed by >>):

>> include/linux/usb.h:621: warning: No description found for parameter 'of_node'

vim +/of_node +621 include/linux/usb.h

151230068 Sarah Sharp          2007-12-21  605  
645daaab0 Alan Stern           2006-08-30  606  #ifdef CONFIG_PM
f476fbaba Randy Dunlap         2008-02-13  607  	unsigned long connect_time;
f476fbaba Randy Dunlap         2008-02-13  608  
f476fbaba Randy Dunlap         2008-02-13  609  	unsigned do_remote_wakeup:1;
f476fbaba Randy Dunlap         2008-02-13  610  	unsigned reset_resume:1;
bfd1e9101 Alan Stern           2012-10-19  611  	unsigned port_is_suspended:1;
645daaab0 Alan Stern           2006-08-30  612  #endif
b1d8dfb0e Inaky Perez-Gonzalez 2008-04-08  613  	struct wusb_dev *wusb_dev;
c6515272b Sarah Sharp          2009-04-27  614  	int slot_id;
0846e7e98 Matthew Garrett      2012-02-03  615  	enum usb_device_removable removable;
17f34867e Mathias Nyman        2013-05-23  616  	struct usb2_lpm_parameters l1_params;
51e0a0120 Sarah Sharp          2012-02-20  617  	struct usb3_lpm_parameters u1_params;
51e0a0120 Sarah Sharp          2012-02-20  618  	struct usb3_lpm_parameters u2_params;
1ea7e0e8e Sarah Sharp          2012-04-24  619  	unsigned lpm_disable_count;
9d9d6644d Peter Chen           2016-01-11  620  	struct device_node	*of_node; /* associated device tree node */
^1da177e4 Linus Torvalds       2005-04-16 @621  };
^1da177e4 Linus Torvalds       2005-04-16  622  #define	to_usb_device(d) container_of(d, struct usb_device, dev)
^1da177e4 Linus Torvalds       2005-04-16  623  
1e429018b Matthew Wilcox       2010-04-30  624  static inline struct usb_device *interface_to_usbdev(struct usb_interface *intf)
1e429018b Matthew Wilcox       2010-04-30  625  {
1e429018b Matthew Wilcox       2010-04-30  626  	return to_usb_device(intf->dev.parent);
1e429018b Matthew Wilcox       2010-04-30  627  }
1e429018b Matthew Wilcox       2010-04-30  628  
^1da177e4 Linus Torvalds       2005-04-16  629  extern struct usb_device *usb_get_dev(struct usb_device *dev);

:::::: The code at line 621 was first introduced by commit
:::::: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 Linux-2.6.12-rc2

:::::: TO: Linus Torvalds <torvalds@ppc970.osdl.org>
:::::: CC: Linus Torvalds <torvalds@ppc970.osdl.org>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
Sascha Hauer Jan. 11, 2016, 10:24 a.m. UTC | #4
On Mon, Jan 11, 2016 at 05:57:47PM +0800, Peter Chen wrote:
> On Mon, Jan 11, 2016 at 04:54:21PM +0800, kbuild test robot wrote:
> > Hi Peter,
> > 
> > [auto build test ERROR on usb/usb-testing]
> > [also build test ERROR on v4.4 next-20160108]
> > [if your patch is applied to the wrong git tree, please drop us a note to help improving the system]
> > 
> > url:    https://github.com/0day-ci/linux/commits/Peter-Chen/USB-core-let-USB-device-know-device-node/20160111-164533
> > base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing
> > config: x86_64-randconfig-x002-201602 (attached as .config)
> > reproduce:
> >         # save the attached .config to linux build tree
> >         make ARCH=x86_64 
> > 
> > All error/warnings (new ones prefixed by >>):
> > 
> >    In file included from include/linux/compiler.h:56:0,
> >                     from include/uapi/linux/stddef.h:1,
> >                     from include/linux/stddef.h:4,
> >                     from include/uapi/linux/posix_types.h:4,
> >                     from include/uapi/linux/types.h:13,
> >                     from include/linux/types.h:5,
> >                     from include/linux/list.h:4,
> >                     from include/linux/module.h:9,
> >                     from drivers/usb/core/usb.c:24:
> > >> include/linux/compiler-gcc.h:73:17: error: expected '{' before 'inline'
> >     #define inline  inline  __attribute__((always_inline)) notrace
> >                     ^
> > >> include/linux/usb/of.h:36:8: note: in expansion of macro 'inline'
> >     struct inline device_node * usb_of_get_child_node(struct device_node *parent,
> >            ^
> 
> Would anybody explain what does above mean, thanks.
> I just can't reproduce it at my env.

The instructions to reproduce this is included in the kbuild test robot mail.

Here you have to compile with CONFIG_OF disabled.

struct inline device_node * usb_of_get_child_node(...)

should be:

static inline struct device_node *usb_of_get_child_node(...)

Sascha
Alan Stern Jan. 11, 2016, 4:11 p.m. UTC | #5
On Mon, 11 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>

> --- a/include/linux/usb.h
> +++ b/include/linux/usb.h
> @@ -25,6 +25,7 @@
>  struct usb_device;
>  struct usb_driver;
>  struct wusb_dev;
> +struct devcie_node;

You misspelled "device".

Alan Stern

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

Patch

diff --git a/Documentation/devicetree/bindings/usb/usb-device.txt b/Documentation/devicetree/bindings/usb/usb-device.txt
new file mode 100644
index 0000000..0468834
--- /dev/null
+++ b/Documentation/devicetree/bindings/usb/usb-device.txt
@@ -0,0 +1,17 @@ 
+Generic USB Device Properties
+
+Usually, we only use device tree for hard wired USB device.
+The reference binding doc is from:
+http://www.firmware.org/1275/bindings/usb/usb-1_0.ps
+
+Required properties:
+- compatible: usbVID,PID
+- reg: the port number which this device is connecting to.
+
+
+Example:
+
+hub: genesys@01 {
+	compatible = "usb05e3,0608";
+	reg = <0x01>;
+};
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..2289700
--- /dev/null
+++ b/drivers/usb/core/of.c
@@ -0,0 +1,47 @@ 
+/*
+ * of.c		The helpers for hcd device tree support
+ *
+ * Copyright (C) 2016 Freescale Semiconductor, Inc.
+ * Author: Peter Chen <peter.chen@freescale.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2  of
+ * the License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/of.h>
+
+/**
+ * usb_of_get_child_node - Find the device node match port number
+ * @parent: the parent device node
+ * @portnum: the port number which device is connecting
+ *
+ * Find the node from device tree according to its port number.
+ *
+ * Return: On success, a pointer to the device node, %NULL on failure.
+ */
+struct device_node *usb_of_get_child_node(struct device_node *parent,
+					int portnum)
+{
+	struct device_node *node;
+	u32 port;
+
+	for_each_child_of_node(parent, node) {
+		if (!of_property_read_u32(node, "reg", &port)) {
+			if (port == portnum)
+				return node;
+		}
+	}
+
+	return NULL;
+}
+EXPORT_SYMBOL_GPL(usb_of_get_child_node);
+
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
index 77e4c9b..64c094e 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_get_child_node
+			(parent->of_node, dev->portnum);
 	}
 	return dev;
 }
diff --git a/include/linux/usb.h b/include/linux/usb.h
index 89533ba..101b943 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -25,6 +25,7 @@ 
 struct usb_device;
 struct usb_driver;
 struct wusb_dev;
+struct devcie_node;
 
 /*-------------------------------------------------------------------------*/
 
@@ -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..99d0377 100644
--- a/include/linux/usb/of.h
+++ b/include/linux/usb/of.h
@@ -16,6 +16,8 @@  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_get_child_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 +33,11 @@  static inline int of_usb_update_otg_caps(struct device_node *np,
 {
 	return 0;
 }
+struct inline device_node * usb_of_get_child_node(struct device_node *parent,
+				int portnum)
+{
+	return NULL;
+}
 #endif
 
 #if IS_ENABLED(CONFIG_OF) && IS_ENABLED(CONFIG_USB_SUPPORT)