mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-08-30 13:03:01 +00:00

The dt-core typically allows multiple compatibles[1] but usb-device currently forces a single compatible. This is an issue when multiple devices with slightly different productID all behave the same. This would require the driver to keep updating its compatible matching table to include this new productID instead of doing what is usually done: have two compatibles, the leftmost which matches exactly the HW device definition, and the rightmost one as a fallback which is assumed to be 100% compatible with the device at hand. If this assumption turns out to be wrong, it is easy to work around this without having to modify the device tree by handling the leftmost compatible in the driver. [1] https://github.com/devicetree-org/dt-schema/blob/main/dtschema/schemas/dt-core.yaml#L21-L25 Signed-off-by: Quentin Schulz <quentin.schulz@cherry.de> Reviewed-by: Rob Herring (Arm) <robh@kernel.org> Link: https://lore.kernel.org/r/20250418-dt-binding-usb-device-compatibles-v2-1-b3029f14e800@cherry.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
127 lines
3.9 KiB
YAML
127 lines
3.9 KiB
YAML
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
|
%YAML 1.2
|
|
---
|
|
$id: http://devicetree.org/schemas/usb/usb-device.yaml#
|
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
|
|
|
title: Generic USB Device
|
|
|
|
maintainers:
|
|
- Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
|
|
description: |
|
|
Usually, we only use device tree for hard wired USB device.
|
|
The reference binding doc is from:
|
|
http://www.devicetree.org/open-firmware/bindings/usb/usb-1_0.ps
|
|
|
|
Four types of device-tree nodes are defined: "host-controller nodes"
|
|
representing USB host controllers, "device nodes" representing USB devices,
|
|
"interface nodes" representing USB interfaces and "combined nodes"
|
|
representing simple USB devices.
|
|
|
|
A combined node shall be used instead of a device node and an interface node
|
|
for devices of class 0 or 9 (hub) with a single configuration and a single
|
|
interface.
|
|
|
|
A "hub node" is a combined node or an interface node that represents a USB
|
|
hub.
|
|
|
|
properties:
|
|
compatible:
|
|
contains:
|
|
pattern: "^usb[0-9a-f]{1,4},[0-9a-f]{1,4}$"
|
|
description: Device nodes or combined nodes.
|
|
"usbVID,PID", where VID is the vendor id and PID the product id.
|
|
The textual representation of VID and PID shall be in lower case
|
|
hexadecimal with leading zeroes suppressed. The other compatible
|
|
strings from the above standard binding could also be used,
|
|
but a device adhering to this binding may leave out all except
|
|
for "usbVID,PID".
|
|
|
|
reg:
|
|
description: the number of the USB hub port or the USB host-controller
|
|
port to which this device is attached.
|
|
items:
|
|
- minimum: 1
|
|
maximum: 255
|
|
|
|
"#address-cells":
|
|
description: should be 1 for hub nodes with device nodes,
|
|
should be 2 for device nodes with interface nodes.
|
|
enum: [1, 2]
|
|
|
|
"#size-cells":
|
|
const: 0
|
|
|
|
patternProperties:
|
|
"^interface@[0-9a-f]{1,2}(,[0-9a-f]{1,2})$":
|
|
type: object
|
|
description: USB interface nodes.
|
|
The configuration component is not included in the textual
|
|
representation of an interface-node unit address for configuration 1.
|
|
|
|
properties:
|
|
compatible:
|
|
pattern: "^usbif[0-9a-f]{1,4},[0-9a-f]{1,4}.config[0-9a-f]{1,2}.[0-9a-f]{1,2}$"
|
|
description: Interface nodes.
|
|
"usbifVID,PID.configCN.IN", where VID is the vendor id, PID is
|
|
the product id, CN is the configuration value and IN is the interface
|
|
number. The textual representation of VID, PID, CN and IN shall be
|
|
in lower case hexadecimal with leading zeroes suppressed.
|
|
The other compatible strings from the above standard binding could
|
|
also be used, but a device adhering to this binding may leave out
|
|
all except for "usbifVID,PID.configCN.IN".
|
|
|
|
reg:
|
|
description: should be 2 cells long, the first cell represents
|
|
the interface number and the second cell represents the
|
|
configuration value.
|
|
maxItems: 1
|
|
|
|
required:
|
|
- reg
|
|
|
|
additionalProperties: true
|
|
|
|
examples:
|
|
# hub connected to port 1
|
|
# device connected to port 2
|
|
# device connected to port 3
|
|
# interface 0 of configuration 1
|
|
# interface 0 of configuration 2
|
|
- |
|
|
usb@11270000 {
|
|
reg = <0x11270000 0x1000>;
|
|
interrupts = <0x0 0x4e 0x0>;
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
|
|
hub@1 {
|
|
compatible = "usb5e3,608";
|
|
reg = <1>;
|
|
};
|
|
|
|
device@2 {
|
|
compatible = "usb123,4567";
|
|
reg = <2>;
|
|
};
|
|
|
|
device@3 {
|
|
compatible = "usb123,abcd";
|
|
reg = <3>;
|
|
|
|
#address-cells = <2>;
|
|
#size-cells = <0>;
|
|
|
|
interface@0 {
|
|
compatible = "usbif123,abcd.config1.0";
|
|
reg = <0 1>;
|
|
};
|
|
|
|
interface@0,2 {
|
|
compatible = "usbif123,abcd.config2.0";
|
|
reg = <0 2>;
|
|
};
|
|
};
|
|
};
|