1. 25 3月, 2018 3 次提交
  2. 23 3月, 2018 2 次提交
    • Z
      USB:fix USB3 devices behind USB3 hubs not resuming at hibernate thaw · 64627388
      Zhengjun Xing 提交于
      USB3 hubs don't support global suspend.
      
      USB3 specification 10.10, Enhanced SuperSpeed hubs only support selective
      suspend and resume, they do not support global suspend/resume where the
      hub downstream facing ports states are not affected.
      
      When system enters hibernation it first enters freeze process where only
      the root hub enters suspend, usb_port_suspend() is not called for other
      devices, and suspend status flags are not set for them. Other devices are
      expected to suspend globally. Some external USB3 hubs will suspend the
      downstream facing port at global suspend. These devices won't be resumed
      at thaw as the suspend status flag is not set.
      
      A USB3 removable hard disk connected through a USB3 hub that won't resume
      at thaw will fail to synchronize SCSI cache, return “cmd cmplt err -71”
      error, and needs a 60 seconds timeout which causing system hang for 60s
      before the USB host reset the port for the USB3 removable hard disk to
      recover.
      
      Fix this by always calling usb_port_suspend() during freeze for USB3
      devices.
      Signed-off-by: NZhengjun Xing <zhengjun.xing@linux.intel.com>
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      64627388
    • T
      usb: hub: Reduce warning to notice on power loss · 0442d7b0
      Tomeu Vizoso 提交于
      Currently we warn the user when the root hub lost power after resume,
      but the user cannot do anything about it so it should probably be a
      notice.
      
      This will reduce the noise in the console during suspend and resume,
      which is already quite significant in many systems.
      Signed-off-by: NTomeu Vizoso <tomeu.vizoso@collabora.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      0442d7b0
  3. 22 3月, 2018 2 次提交
  4. 20 3月, 2018 2 次提交
  5. 12 3月, 2018 1 次提交
    • G
      Revert "usb: core: Add "quirks" parameter for usbcore" · 95713fb8
      Greg Kroah-Hartman 提交于
      This reverts commit b27560e4 as it
      breaks the build for some arches :(
      Reported-by: Nkbuild test robot <fengguang.wu@intel.com>
      Cc: Kai-Heng Feng <kai.heng.feng@canonical.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      
      diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
      index 1d1d53f85ddd..70a7398c20e2 100644
      --- a/Documentation/admin-guide/kernel-parameters.txt
      +++ b/Documentation/admin-guide/kernel-parameters.txt
      @@ -4368,6 +4368,61 @@
      
       	usbcore.nousb	[USB] Disable the USB subsystem
      
      +	usbcore.quirks=
      +			[USB] A list of quirks entries to supplement or
      +			override the built-in usb core quirk list.  List
      +			entries are separated by commas.  Each entry has
      +			the form VID:PID:Flags where VID and PID are Vendor
      +			and Product ID values (4-digit hex numbers) and
      +			Flags is a set of characters, each corresponding
      +			to a common usb core quirk flag as follows:
      +				a = USB_QUIRK_STRING_FETCH_255 (string
      +					descriptors must not be fetched using
      +					a 255-byte read);
      +				b = USB_QUIRK_RESET_RESUME (device can't resume
      +					correctly so reset it instead);
      +				c = USB_QUIRK_NO_SET_INTF (device can't handle
      +					Set-Interface requests);
      +				d = USB_QUIRK_CONFIG_INTF_STRINGS (device can't
      +					handle its Configuration or Interface
      +					strings);
      +				e = USB_QUIRK_RESET (device can't be reset
      +					(e.g morph devices), don't use reset);
      +				f = USB_QUIRK_HONOR_BNUMINTERFACES (device has
      +					more interface descriptions than the
      +					bNumInterfaces count, and can't handle
      +					talking to these interfaces);
      +				g = USB_QUIRK_DELAY_INIT (device needs a pause
      +					during initialization, after we read
      +					the device descriptor);
      +				h = USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL (For
      +					high speed and super speed interrupt
      +					endpoints, the USB 2.0 and USB 3.0 spec
      +					require the interval in microframes (1
      +					microframe = 125 microseconds) to be
      +					calculated as interval = 2 ^
      +					(bInterval-1).
      +					Devices with this quirk report their
      +					bInterval as the result of this
      +					calculation instead of the exponent
      +					variable used in the calculation);
      +				i = USB_QUIRK_DEVICE_QUALIFIER (device can't
      +					handle device_qualifier descriptor
      +					requests);
      +				j = USB_QUIRK_IGNORE_REMOTE_WAKEUP (device
      +					generates spurious wakeup, ignore
      +					remote wakeup capability);
      +				k = USB_QUIRK_NO_LPM (device can't handle Link
      +					Power Management);
      +				l = USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL
      +					(Device reports its bInterval as linear
      +					frames instead of the USB 2.0
      +					calculation);
      +				m = USB_QUIRK_DISCONNECT_SUSPEND (Device needs
      +					to be disconnected before suspend to
      +					prevent spurious wakeup)
      +			Example: quirks=0781:5580:bk,0a5c:5834:gij
      +
       	usbhid.mousepoll=
       			[USBHID] The interval which mice are to be polled at.
      
      diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
      index f4a548471f0f..42faaeead81b 100644
      --- a/drivers/usb/core/quirks.c
      +++ b/drivers/usb/core/quirks.c
      @@ -11,6 +11,143 @@
       #include <linux/usb/hcd.h>
       #include "usb.h"
      
      +struct quirk_entry {
      +	u16 vid;
      +	u16 pid;
      +	u32 flags;
      +};
      +
      +static DEFINE_MUTEX(quirk_mutex);
      +
      +static struct quirk_entry *quirk_list;
      +static unsigned int quirk_count;
      +
      +static char quirks_param[128];
      +
      +static int quirks_param_set(const char *val, const struct kernel_param *kp)
      +{
      +	char *p, *field;
      +	u16 vid, pid;
      +	u32 flags;
      +	size_t i;
      +
      +	mutex_lock(&quirk_mutex);
      +
      +	if (!val || !*val) {
      +		quirk_count = 0;
      +		kfree(quirk_list);
      +		quirk_list = NULL;
      +		goto unlock;
      +	}
      +
      +	for (quirk_count = 1, i = 0; val[i]; i++)
      +		if (val[i] == ',')
      +			quirk_count++;
      +
      +	if (quirk_list) {
      +		kfree(quirk_list);
      +		quirk_list = NULL;
      +	}
      +
      +	quirk_list = kcalloc(quirk_count, sizeof(struct quirk_entry),
      +			     GFP_KERNEL);
      +	if (!quirk_list) {
      +		mutex_unlock(&quirk_mutex);
      +		return -ENOMEM;
      +	}
      +
      +	for (i = 0, p = (char *)val; p && *p;) {
      +		/* Each entry consists of VID:PID:flags */
      +		field = strsep(&p, ":");
      +		if (!field)
      +			break;
      +
      +		if (kstrtou16(field, 16, &vid))
      +			break;
      +
      +		field = strsep(&p, ":");
      +		if (!field)
      +			break;
      +
      +		if (kstrtou16(field, 16, &pid))
      +			break;
      +
      +		field = strsep(&p, ",");
      +		if (!field || !*field)
      +			break;
      +
      +		/* Collect the flags */
      +		for (flags = 0; *field; field++) {
      +			switch (*field) {
      +			case 'a':
      +				flags |= USB_QUIRK_STRING_FETCH_255;
      +				break;
      +			case 'b':
      +				flags |= USB_QUIRK_RESET_RESUME;
      +				break;
      +			case 'c':
      +				flags |= USB_QUIRK_NO_SET_INTF;
      +				break;
      +			case 'd':
      +				flags |= USB_QUIRK_CONFIG_INTF_STRINGS;
      +				break;
      +			case 'e':
      +				flags |= USB_QUIRK_RESET;
      +				break;
      +			case 'f':
      +				flags |= USB_QUIRK_HONOR_BNUMINTERFACES;
      +				break;
      +			case 'g':
      +				flags |= USB_QUIRK_DELAY_INIT;
      +				break;
      +			case 'h':
      +				flags |= USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL;
      +				break;
      +			case 'i':
      +				flags |= USB_QUIRK_DEVICE_QUALIFIER;
      +				break;
      +			case 'j':
      +				flags |= USB_QUIRK_IGNORE_REMOTE_WAKEUP;
      +				break;
      +			case 'k':
      +				flags |= USB_QUIRK_NO_LPM;
      +				break;
      +			case 'l':
      +				flags |= USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL;
      +				break;
      +			case 'm':
      +				flags |= USB_QUIRK_DISCONNECT_SUSPEND;
      +				break;
      +			/* Ignore unrecognized flag characters */
      +			}
      +		}
      +
      +		quirk_list[i++] = (struct quirk_entry)
      +			{ .vid = vid, .pid = pid, .flags = flags };
      +	}
      +
      +	if (i < quirk_count)
      +		quirk_count = i;
      +
      +unlock:
      +	mutex_unlock(&quirk_mutex);
      +
      +	return param_set_copystring(val, kp);
      +}
      +
      +static const struct kernel_param_ops quirks_param_ops = {
      +	.set = quirks_param_set,
      +	.get = param_get_string,
      +};
      +
      +static struct kparam_string quirks_param_string = {
      +	.maxlen = sizeof(quirks_param),
      +	.string = quirks_param,
      +};
      +
      +module_param_cb(quirks, &quirks_param_ops, &quirks_param_string, 0644);
      +MODULE_PARM_DESC(quirks, "Add/modify USB quirks by specifying quirks=vendorID:productID:quirks");
      +
       /* Lists of quirky USB devices, split in device quirks and interface quirks.
        * Device quirks are applied at the very beginning of the enumeration process,
        * right after reading the device descriptor. They can thus only match on device
      @@ -320,8 +457,8 @@ static int usb_amd_resume_quirk(struct usb_device *udev)
       	return 0;
       }
      
      -static u32 __usb_detect_quirks(struct usb_device *udev,
      -			       const struct usb_device_id *id)
      +static u32 usb_detect_static_quirks(struct usb_device *udev,
      +				    const struct usb_device_id *id)
       {
       	u32 quirks = 0;
      
      @@ -339,21 +476,43 @@ static u32 __usb_detect_quirks(struct usb_device *udev,
       	return quirks;
       }
      
      +static u32 usb_detect_dynamic_quirks(struct usb_device *udev)
      +{
      +	u16 vid = le16_to_cpu(udev->descriptor.idVendor);
      +	u16 pid = le16_to_cpu(udev->descriptor.idProduct);
      +	int i, flags = 0;
      +
      +	mutex_lock(&quirk_mutex);
      +
      +	for (i = 0; i < quirk_count; i++) {
      +		if (vid == quirk_list[i].vid && pid == quirk_list[i].pid) {
      +			flags = quirk_list[i].flags;
      +			break;
      +		}
      +	}
      +
      +	mutex_unlock(&quirk_mutex);
      +
      +	return flags;
      +}
      +
       /*
        * Detect any quirks the device has, and do any housekeeping for it if needed.
        */
       void usb_detect_quirks(struct usb_device *udev)
       {
      -	udev->quirks = __usb_detect_quirks(udev, usb_quirk_list);
      +	udev->quirks = usb_detect_static_quirks(udev, usb_quirk_list);
      
       	/*
       	 * Pixart-based mice would trigger remote wakeup issue on AMD
       	 * Yangtze chipset, so set them as RESET_RESUME flag.
       	 */
       	if (usb_amd_resume_quirk(udev))
      -		udev->quirks |= __usb_detect_quirks(udev,
      +		udev->quirks |= usb_detect_static_quirks(udev,
       				usb_amd_resume_quirk_list);
      
      +	udev->quirks ^= usb_detect_dynamic_quirks(udev);
      +
       	if (udev->quirks)
       		dev_dbg(&udev->dev, "USB quirks for this device: %x\n",
       			udev->quirks);
      @@ -372,7 +531,7 @@ void usb_detect_interface_quirks(struct usb_device *udev)
       {
       	u32 quirks;
      
      -	quirks = __usb_detect_quirks(udev, usb_interface_quirk_list);
      +	quirks = usb_detect_static_quirks(udev, usb_interface_quirk_list);
       	if (quirks == 0)
       		return;
      
      @@ -380,3 +539,11 @@ void usb_detect_interface_quirks(struct usb_device *udev)
       		quirks);
       	udev->quirks |= quirks;
       }
      +
      +void usb_release_quirk_list(void)
      +{
      +	mutex_lock(&quirk_mutex);
      +	kfree(quirk_list);
      +	quirk_list = NULL;
      +	mutex_unlock(&quirk_mutex);
      +}
      diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
      index 2f5fbc56a9dd..0adb6345ff2e 100644
      --- a/drivers/usb/core/usb.c
      +++ b/drivers/usb/core/usb.c
      @@ -1259,6 +1259,7 @@ static void __exit usb_exit(void)
       	if (usb_disabled())
       		return;
      
      +	usb_release_quirk_list();
       	usb_deregister_device_driver(&usb_generic_driver);
       	usb_major_cleanup();
       	usb_deregister(&usbfs_driver);
      diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h
      index 149cc7480971..546a2219454b 100644
      --- a/drivers/usb/core/usb.h
      +++ b/drivers/usb/core/usb.h
      @@ -36,6 +36,7 @@ extern void usb_deauthorize_interface(struct usb_interface *);
       extern void usb_authorize_interface(struct usb_interface *);
       extern void usb_detect_quirks(struct usb_device *udev);
       extern void usb_detect_interface_quirks(struct usb_device *udev);
      +extern void usb_release_quirk_list(void);
       extern int usb_remove_device(struct usb_device *udev);
      
       extern int usb_get_device_descriptor(struct usb_device *dev,
      95713fb8
  6. 10 3月, 2018 7 次提交
  7. 07 3月, 2018 2 次提交
    • S
      usb, signal, security: only pass the cred, not the secid, to... · 6b4f3d01
      Stephen Smalley 提交于
      usb, signal, security: only pass the cred, not the secid, to kill_pid_info_as_cred and security_task_kill
      
      commit d178bc3a ("user namespace: usb:
       make usb urbs user namespace aware (v2)") changed kill_pid_info_as_uid
      to kill_pid_info_as_cred, saving and passing a cred structure instead of
      uids.  Since the secid can be obtained from the cred, drop the secid fields
      from the usb_dev_state and async structures, and drop the secid argument to
      kill_pid_info_as_cred.  Replace the secid argument to security_task_kill
      with the cred.  Update SELinux, Smack, and AppArmor to use the cred, which
      avoids the need for Smack and AppArmor to use a secid at all in this hook.
      Further changes to Smack might still be required to take full advantage of
      this change, since it should now be possible to perform capability
      checking based on the supplied cred.  The changes to Smack and AppArmor
      have only been compile-tested.
      Signed-off-by: NStephen Smalley <sds@tycho.nsa.gov>
      Acked-by: NPaul Moore <paul@paul-moore.com>
      Acked-by: NCasey Schaufler <casey@schaufler-ca.com>
      Acked-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Acked-by: NJohn Johansen <john.johansen@canonical.com>
      Signed-off-by: NJames Morris <james.morris@microsoft.com>
      6b4f3d01
    • D
      usb: quirks: add control message delay for 1b1c:1b20 · cb88a058
      Danilo Krummrich 提交于
      Corsair Strafe RGB keyboard does not respond to usb control messages
      sometimes and hence generates timeouts.
      
      Commit de3af5bf ("usb: quirks: add delay init quirk for Corsair
      Strafe RGB keyboard") tried to fix those timeouts by adding
      USB_QUIRK_DELAY_INIT.
      
      Unfortunately, even with this quirk timeouts of usb_control_msg()
      can still be seen, but with a lower frequency (approx. 1 out of 15):
      
      [   29.103520] usb 1-8: string descriptor 0 read error: -110
      [   34.363097] usb 1-8: can't set config #1, error -110
      
      Adding further delays to different locations where usb control
      messages are issued just moves the timeouts to other locations,
      e.g.:
      
      [   35.400533] usbhid 1-8:1.0: can't add hid device: -110
      [   35.401014] usbhid: probe of 1-8:1.0 failed with error -110
      
      The only way to reliably avoid those issues is having a pause after
      each usb control message. In approx. 200 boot cycles no more timeouts
      were seen.
      
      Addionaly, keep USB_QUIRK_DELAY_INIT as it turned out to be necessary
      to have the delay in hub_port_connect() after hub_port_init().
      
      The overall boot time seems not to be influenced by these additional
      delays, even on fast machines and lightweight distributions.
      
      Fixes: de3af5bf ("usb: quirks: add delay init quirk for Corsair Strafe RGB keyboard")
      Cc: stable@vger.kernel.org
      Signed-off-by: NDanilo Krummrich <danilokrummrich@dk-develop.de>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      cb88a058
  8. 16 2月, 2018 1 次提交
  9. 12 2月, 2018 1 次提交
    • L
      vfs: do bulk POLL* -> EPOLL* replacement · a9a08845
      Linus Torvalds 提交于
      This is the mindless scripted replacement of kernel use of POLL*
      variables as described by Al, done by this script:
      
          for V in IN OUT PRI ERR RDNORM RDBAND WRNORM WRBAND HUP RDHUP NVAL MSG; do
              L=`git grep -l -w POLL$V | grep -v '^t' | grep -v /um/ | grep -v '^sa' | grep -v '/poll.h$'|grep -v '^D'`
              for f in $L; do sed -i "-es/^\([^\"]*\)\(\<POLL$V\>\)/\\1E\\2/" $f; done
          done
      
      with de-mangling cleanups yet to come.
      
      NOTE! On almost all architectures, the EPOLL* constants have the same
      values as the POLL* constants do.  But they keyword here is "almost".
      For various bad reasons they aren't the same, and epoll() doesn't
      actually work quite correctly in some cases due to this on Sparc et al.
      
      The next patch from Al will sort out the final differences, and we
      should be all done.
      Scripted-by: NAl Viro <viro@zeniv.linux.org.uk>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      a9a08845
  10. 23 1月, 2018 1 次提交
  11. 19 12月, 2017 3 次提交
  12. 16 12月, 2017 1 次提交
  13. 13 12月, 2017 2 次提交
  14. 12 12月, 2017 2 次提交
  15. 07 12月, 2017 1 次提交
  16. 06 12月, 2017 1 次提交
  17. 29 11月, 2017 1 次提交
  18. 28 11月, 2017 7 次提交
    • K
      usb: quirks: Add no-lpm quirk for KY-688 USB 3.1 Type-C Hub · e43a12f1
      Kai-Heng Feng 提交于
      KY-688 USB 3.1 Type-C Hub internally uses a Genesys Logic hub to connect
      to Realtek r8153.
      
      Similar to commit ("7496cfe5 usb: quirks: Add no-lpm quirk for Moshi
      USB to Ethernet Adapter"), no-lpm can make r8153 ethernet work.
      Signed-off-by: NKai-Heng Feng <kai.heng.feng@canonical.com>
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      e43a12f1
    • M
      usb: hub: Cycle HUB power when initialization fails · 973593a9
      Mike Looijmans 提交于
      Sometimes the USB device gets confused about the state of the initialization and
      the connection fails. In particular, the device thinks that it's already set up
      and running while the host thinks the device still needs to be configured. To
      work around this issue, power-cycle the hub's output to issue a sort of "reset"
      to the device. This makes the device restart its state machine and then the
      initialization succeeds.
      
      This fixes problems where the kernel reports a list of errors like this:
      
      usb 1-1.3: device not accepting address 19, error -71
      
      The end result is a non-functioning device. After this patch, the sequence
      becomes like this:
      
      usb 1-1.3: new high-speed USB device number 18 using ci_hdrc
      usb 1-1.3: device not accepting address 18, error -71
      usb 1-1.3: new high-speed USB device number 19 using ci_hdrc
      usb 1-1.3: device not accepting address 19, error -71
      usb 1-1-port3: attempt power cycle
      usb 1-1.3: new high-speed USB device number 21 using ci_hdrc
      usb-storage 1-1.3:1.2: USB Mass Storage device detected
      Signed-off-by: NMike Looijmans <mike.looijmans@topic.nl>
      Acked-by: NAlan Stern <stern@rowland.harvard.edu>
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      973593a9
    • M
      USB: core: Add type-specific length check of BOS descriptors · 81cf4a45
      Masakazu Mokuno 提交于
      As most of BOS descriptors are longer in length than their header
      'struct usb_dev_cap_header', comparing solely with it is not sufficient
      to avoid out-of-bounds access to BOS descriptors.
      
      This patch adds descriptor type specific length check in
      usb_get_bos_descriptor() to fix the issue.
      Signed-off-by: NMasakazu Mokuno <masakazu.mokuno@gmail.com>
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      81cf4a45
    • O
      USB: usbfs: Filter flags passed in from user space · 446f666d
      Oliver Neukum 提交于
      USBDEVFS_URB_ISO_ASAP must be accepted only for ISO endpoints.
      Improve sanity checking.
      Reported-by: NAndrey Konovalov <andreyknvl@google.com>
      Signed-off-by: NOliver Neukum <oneukum@suse.com>
      Cc: stable <stable@vger.kernel.org>
      Acked-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      446f666d
    • J
      USB: of: clean up device-node helper · 7739376e
      Johan Hovold 提交于
      Clean up the USB device-node helper that is used to look up a device
      node given a parent hub device and a port number. Also pass in a struct
      usb_device as first argument to provide some type checking.
      
      Give the helper the more descriptive name usb_of_get_device_node(),
      which matches the new usb_of_get_interface_node() helper that is used to
      look up a second type of of child node from a USB device.
      
      Note that the terms "device node" and "interface node" are defined and
      used by the OF Recommended Practice for USB.
      Signed-off-by: NJohan Hovold <johan@kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      7739376e
    • J
      USB: ledtrig-usbport: fix of-node leak · 03310a15
      Johan Hovold 提交于
      This code looks up a USB device node from a given parent USB device but
      never dropped its reference to the returned node.
      
      As only the address of the node is used for a later matching, the
      reference can be dropped immediately.
      
      Note that this trigger implementation confuses the description of the
      USB device connected to a port with the port itself (which does not have
      a device-tree representation).
      
      Fixes: 4f04c210 ("usb: core: read USB ports from DT in the usbport LED trigger driver")
      Cc: Rafał Miłecki <rafal@milecki.pl>
      Signed-off-by: NJohan Hovold <johan@kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      03310a15
    • J
      USB: add device-tree support for interfaces · 1a7e3948
      Johan Hovold 提交于
      Add OF device-tree support for USB interfaces.
      
      USB "interface nodes" are children of USB "device nodes" and are
      identified by an interface number and a configuration value:
      
      	&usb1 { /* host controller */
      		dev1: device@1 { /* device at port 1 */
      			compatible = "usb1234,5678";
      			reg = <1>;
      
      			#address-cells = <2>;
      			#size-cells = <0>;
      
      			interface@0,2 { /* interface 0 of configuration 2 */
      				compatible = "usbif1234,5678.config2.0";
      				reg = <0 2>;
      			};
      		};
      	};
      
      The configuration component is not included in the textual
      representation of an interface-node unit address for configuration 1:
      
      	&dev1 {
      		interface@0 {	/* interface 0 of configuration 1 */
      			compatible = "usbif1234,5678.config1.0";
      			reg = <0 1>;
      		};
      	};
      
      When a USB device of class 0 or 9 (hub) has only a single configuration
      with a single interface, a special case "combined node" is used instead
      of a device node with an interface node:
      
      	&usb1 {
      		device@2 {
      			compatible = "usb1234,abcd";
      			reg = <2>;
      		};
      	};
      
      Combined nodes are shared by the two device structures representing the
      USB device and its interface in the kernel's device model.
      
      Note that, as for device nodes, the compatible strings for interface
      nodes are currently not used.
      
      For more details see "Open Firmware Recommended Practice: Universal
      Serial Bus Version 1" and the binding documentation.
      Signed-off-by: NJohan Hovold <johan@kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      1a7e3948