You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'usb-3.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
Pull USB updates from Greg KH: "Here is the big USB driver update for 3.17-rc1. Loads of gadget driver changes in here, including some big file movements to make things easier to manage over time. There's also the usual xhci and uas driver updates, and a handful of other changes in here. The changelog has the full details. All of these have been in linux-next for a while" * tag 'usb-3.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (211 commits) USB: devio: fix issue with log flooding uas: Log a warning when we cannot use uas because the hcd lacks streams uas: Only complain about missing sg if all other checks succeed xhci: Add missing checks for xhci_alloc_command failure xhci: Rename Asrock P67 pci product-id to EJ168 xhci: Blacklist using streams on the Etron EJ168 controller uas: Limit qdepth to 32 when connected over usb-2 uwb/whci: use correct structure type name in sizeof usb-core bInterval quirk USB: serial: ftdi_sio: Add support for new Xsens devices USB: serial: ftdi_sio: Annotate the current Xsens PID assignments usb: chipidea: debug: fix sparse non static symbol warnings usb: ci_hdrc_imx doc: fsl,usbphy is required usb: ci_hdrc_imx: Return -EINVAL for missing USB PHY usb: core: allow zero packet flag for interrupt urbs usb: lvstest: Fix sparse warnings generated by kbuild test bot USB: core: hcd-pci: free IRQ before disabling PCI device when shutting down phy: miphy365x: Represent each PHY channel as a DT subnode phy: miphy365x: Provide support for the MiPHY356x Generic PHY phy: miphy365x: Add Device Tree bindings for the MiPHY365x ...
This commit is contained in:
@@ -3,13 +3,13 @@ Date: May 2007
|
||||
KernelVersion: 2.6.23
|
||||
Contact: Alan Stern <stern@rowland.harvard.edu>
|
||||
Description:
|
||||
If CONFIG_USB_PERSIST is set, then each USB device directory
|
||||
will contain a file named power/persist. The file holds a
|
||||
boolean value (0 or 1) indicating whether or not the
|
||||
"USB-Persist" facility is enabled for the device. Since the
|
||||
facility is inherently dangerous, it is disabled by default
|
||||
for all devices except hubs. For more information, see
|
||||
Documentation/usb/persist.txt.
|
||||
USB device directories can contain a file named power/persist.
|
||||
The file holds a boolean value (0 or 1) indicating whether or
|
||||
not the "USB-Persist" facility is enabled for the device. For
|
||||
hubs this facility is always enabled and their device
|
||||
directories will not contain this file.
|
||||
|
||||
For more information, see Documentation/usb/persist.txt.
|
||||
|
||||
What: /sys/bus/usb/devices/.../power/autosuspend
|
||||
Date: March 2007
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
Link Layer Validation Device is a standard device for testing of Super
|
||||
Speed Link Layer tests. These nodes are available in sysfs only when lvs
|
||||
driver is bound with root hub device.
|
||||
|
||||
What: /sys/bus/usb/devices/.../get_dev_desc
|
||||
Date: March 2014
|
||||
Contact: Pratyush Anand <pratyush.anand@st.com>
|
||||
Description:
|
||||
Write to this node to issue "Get Device Descriptor"
|
||||
for Link Layer Validation device. It is needed for TD.7.06.
|
||||
|
||||
What: /sys/bus/usb/devices/.../u1_timeout
|
||||
Date: March 2014
|
||||
Contact: Pratyush Anand <pratyush.anand@st.com>
|
||||
Description:
|
||||
Set "U1 timeout" for the downstream port where Link Layer
|
||||
Validation device is connected. Timeout value must be between 0
|
||||
and 127. It is needed for TD.7.18, TD.7.19, TD.7.20 and TD.7.21.
|
||||
|
||||
What: /sys/bus/usb/devices/.../u2_timeout
|
||||
Date: March 2014
|
||||
Contact: Pratyush Anand <pratyush.anand@st.com>
|
||||
Description:
|
||||
Set "U2 timeout" for the downstream port where Link Layer
|
||||
Validation device is connected. Timeout value must be between 0
|
||||
and 127. It is needed for TD.7.18, TD.7.19, TD.7.20 and TD.7.21.
|
||||
|
||||
What: /sys/bus/usb/devices/.../hot_reset
|
||||
Date: March 2014
|
||||
Contact: Pratyush Anand <pratyush.anand@st.com>
|
||||
Description:
|
||||
Write to this node to issue "Reset" for Link Layer Validation
|
||||
device. It is needed for TD.7.29, TD.7.31, TD.7.34 and TD.7.35.
|
||||
|
||||
What: /sys/bus/usb/devices/.../u3_entry
|
||||
Date: March 2014
|
||||
Contact: Pratyush Anand <pratyush.anand@st.com>
|
||||
Description:
|
||||
Write to this node to issue "U3 entry" for Link Layer
|
||||
Validation device. It is needed for TD.7.35 and TD.7.36.
|
||||
|
||||
What: /sys/bus/usb/devices/.../u3_exit
|
||||
Date: March 2014
|
||||
Contact: Pratyush Anand <pratyush.anand@st.com>
|
||||
Description:
|
||||
Write to this node to issue "U3 exit" for Link Layer
|
||||
Validation device. It is needed for TD.7.36.
|
||||
@@ -556,11 +556,11 @@ been converted to this framework.
|
||||
Near-term plans include converting all of them, except for "gadgetfs".
|
||||
</para>
|
||||
|
||||
!Edrivers/usb/gadget/f_acm.c
|
||||
!Edrivers/usb/gadget/f_ecm.c
|
||||
!Edrivers/usb/gadget/f_subset.c
|
||||
!Edrivers/usb/gadget/f_obex.c
|
||||
!Edrivers/usb/gadget/f_serial.c
|
||||
!Edrivers/usb/gadget/function/f_acm.c
|
||||
!Edrivers/usb/gadget/function/f_ecm.c
|
||||
!Edrivers/usb/gadget/function/f_subset.c
|
||||
!Edrivers/usb/gadget/function/f_obex.c
|
||||
!Edrivers/usb/gadget/function/f_serial.c
|
||||
|
||||
</sect1>
|
||||
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
Berlin SATA PHY
|
||||
---------------
|
||||
|
||||
Required properties:
|
||||
- compatible: should be "marvell,berlin2q-sata-phy"
|
||||
- address-cells: should be 1
|
||||
- size-cells: should be 0
|
||||
- phy-cells: from the generic PHY bindings, must be 1
|
||||
- reg: address and length of the register
|
||||
- clocks: reference to the clock entry
|
||||
|
||||
Sub-nodes:
|
||||
Each PHY should be represented as a sub-node.
|
||||
|
||||
Sub-nodes required properties:
|
||||
- reg: the PHY number
|
||||
|
||||
Example:
|
||||
sata_phy: phy@f7e900a0 {
|
||||
compatible = "marvell,berlin2q-sata-phy";
|
||||
reg = <0xf7e900a0 0x200>;
|
||||
clocks = <&chip CLKID_SATA>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
#phy-cells = <1>;
|
||||
|
||||
sata-phy@0 {
|
||||
reg = <0>;
|
||||
};
|
||||
|
||||
sata-phy@1 {
|
||||
reg = <1>;
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,22 @@
|
||||
Hisilicon hix5hd2 SATA PHY
|
||||
-----------------------
|
||||
|
||||
Required properties:
|
||||
- compatible: should be "hisilicon,hix5hd2-sata-phy"
|
||||
- reg: offset and length of the PHY registers
|
||||
- #phy-cells: must be 0
|
||||
Refer to phy/phy-bindings.txt for the generic PHY binding properties
|
||||
|
||||
Optional Properties:
|
||||
- hisilicon,peripheral-syscon: phandle of syscon used to control peripheral.
|
||||
- hisilicon,power-reg: offset and bit number within peripheral-syscon,
|
||||
register of controlling sata power supply.
|
||||
|
||||
Example:
|
||||
sata_phy: phy@f9900000 {
|
||||
compatible = "hisilicon,hix5hd2-sata-phy";
|
||||
reg = <0xf9900000 0x10000>;
|
||||
#phy-cells = <0>;
|
||||
hisilicon,peripheral-syscon = <&peripheral_ctrl>;
|
||||
hisilicon,power-reg = <0x8 10>;
|
||||
};
|
||||
@@ -10,6 +10,10 @@ Required Properties:
|
||||
provider can use the values in cells to find the appropriate
|
||||
PHY.
|
||||
|
||||
Optional Properties:
|
||||
phy-supply: Phandle to a regulator that provides power to the PHY. This
|
||||
regulator will be managed during the PHY power on/off sequence.
|
||||
|
||||
For example:
|
||||
|
||||
phys: phy {
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
STMicroelectronics STi MIPHY365x PHY binding
|
||||
============================================
|
||||
|
||||
This binding describes a miphy device that is used to control PHY hardware
|
||||
for SATA and PCIe.
|
||||
|
||||
Required properties (controller (parent) node):
|
||||
- compatible : Should be "st,miphy365x-phy"
|
||||
- st,syscfg : Should be a phandle of the system configuration register group
|
||||
which contain the SATA, PCIe mode setting bits
|
||||
|
||||
Required nodes : A sub-node is required for each channel the controller
|
||||
provides. Address range information including the usual
|
||||
'reg' and 'reg-names' properties are used inside these
|
||||
nodes to describe the controller's topology. These nodes
|
||||
are translated by the driver's .xlate() function.
|
||||
|
||||
Required properties (port (child) node):
|
||||
- #phy-cells : Should be 1 (See second example)
|
||||
Cell after port phandle is device type from:
|
||||
- MIPHY_TYPE_SATA
|
||||
- MIPHY_TYPE_PCI
|
||||
- reg : Address and length of register sets for each device in
|
||||
"reg-names"
|
||||
- reg-names : The names of the register addresses corresponding to the
|
||||
registers filled in "reg":
|
||||
- sata: For SATA devices
|
||||
- pcie: For PCIe devices
|
||||
- syscfg: To specify the syscfg based config register
|
||||
|
||||
Optional properties (port (child) node):
|
||||
- st,sata-gen : Generation of locally attached SATA IP. Expected values
|
||||
are {1,2,3). If not supplied generation 1 hardware will
|
||||
be expected
|
||||
- st,pcie-tx-pol-inv : Bool property to invert the polarity PCIe Tx (Txn/Txp)
|
||||
- st,sata-tx-pol-inv : Bool property to invert the polarity SATA Tx (Txn/Txp)
|
||||
|
||||
Example:
|
||||
|
||||
miphy365x_phy: miphy365x@fe382000 {
|
||||
compatible = "st,miphy365x-phy";
|
||||
st,syscfg = <&syscfg_rear>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
|
||||
phy_port0: port@fe382000 {
|
||||
reg = <0xfe382000 0x100>, <0xfe394000 0x100>, <0x824 0x4>;
|
||||
reg-names = "sata", "pcie", "syscfg";
|
||||
#phy-cells = <1>;
|
||||
st,sata-gen = <3>;
|
||||
};
|
||||
|
||||
phy_port1: port@fe38a000 {
|
||||
reg = <0xfe38a000 0x100>, <0xfe804000 0x100>, <0x828 0x4>;;
|
||||
reg-names = "sata", "pcie", "syscfg";
|
||||
#phy-cells = <1>;
|
||||
st,pcie-tx-pol-inv;
|
||||
};
|
||||
};
|
||||
|
||||
Specifying phy control of devices
|
||||
=================================
|
||||
|
||||
Device nodes should specify the configuration required in their "phys"
|
||||
property, containing a phandle to the phy port node and a device type.
|
||||
|
||||
Example:
|
||||
|
||||
#include <dt-bindings/phy/phy-miphy365x.h>
|
||||
|
||||
sata0: sata@fe380000 {
|
||||
...
|
||||
phys = <&phy_port0 MIPHY_TYPE_SATA>;
|
||||
...
|
||||
};
|
||||
@@ -0,0 +1,24 @@
|
||||
Qualcomm APQ8064 SATA PHY Controller
|
||||
------------------------------------
|
||||
|
||||
SATA PHY nodes are defined to describe on-chip SATA Physical layer controllers.
|
||||
Each SATA PHY controller should have its own node.
|
||||
|
||||
Required properties:
|
||||
- compatible: compatible list, contains "qcom,apq8064-sata-phy".
|
||||
- reg: offset and length of the SATA PHY register set;
|
||||
- #phy-cells: must be zero
|
||||
- clocks: a list of phandles and clock-specifier pairs, one for each entry in
|
||||
clock-names.
|
||||
- clock-names: must be "cfg" for phy config clock.
|
||||
|
||||
Example:
|
||||
sata_phy: sata-phy@1b400000 {
|
||||
compatible = "qcom,apq8064-sata-phy";
|
||||
reg = <0x1b400000 0x200>;
|
||||
|
||||
clocks = <&gcc SATA_PHY_CFG_CLK>;
|
||||
clock-names = "cfg";
|
||||
|
||||
#phy-cells = <0>;
|
||||
};
|
||||
@@ -0,0 +1,23 @@
|
||||
Qualcomm IPQ806x SATA PHY Controller
|
||||
------------------------------------
|
||||
|
||||
SATA PHY nodes are defined to describe on-chip SATA Physical layer controllers.
|
||||
Each SATA PHY controller should have its own node.
|
||||
|
||||
Required properties:
|
||||
- compatible: compatible list, contains "qcom,ipq806x-sata-phy"
|
||||
- reg: offset and length of the SATA PHY register set;
|
||||
- #phy-cells: must be zero
|
||||
- clocks: must be exactly one entry
|
||||
- clock-names: must be "cfg"
|
||||
|
||||
Example:
|
||||
sata_phy: sata-phy@1b400000 {
|
||||
compatible = "qcom,ipq806x-sata-phy";
|
||||
reg = <0x1b400000 0x200>;
|
||||
|
||||
clocks = <&gcc SATA_PHY_CFG_CLK>;
|
||||
clock-names = "cfg";
|
||||
|
||||
#phy-cells = <0>;
|
||||
};
|
||||
@@ -26,6 +26,7 @@ Samsung S5P/EXYNOS SoC series USB PHY
|
||||
|
||||
Required properties:
|
||||
- compatible : should be one of the listed compatibles:
|
||||
- "samsung,exynos3250-usb2-phy"
|
||||
- "samsung,exynos4210-usb2-phy"
|
||||
- "samsung,exynos4x12-usb2-phy"
|
||||
- "samsung,exynos5250-usb2-phy"
|
||||
@@ -46,6 +47,7 @@ and Exynos 4212) it is as follows:
|
||||
1 - USB host ("host"),
|
||||
2 - HSIC0 ("hsic0"),
|
||||
3 - HSIC1 ("hsic1"),
|
||||
Exynos3250 has only USB device phy available as phy 0.
|
||||
|
||||
Exynos 4210 and Exynos 4212 use mode switching and require that mode switch
|
||||
register is supplied.
|
||||
|
||||
@@ -9,15 +9,17 @@ Required properties:
|
||||
e.g. USB2_PHY on OMAP5.
|
||||
"ti,control-phy-pipe3" - if it has DPLL and individual Rx & Tx power control
|
||||
e.g. USB3 PHY and SATA PHY on OMAP5.
|
||||
"ti,control-phy-pcie" - for pcie to support external clock for pcie and to
|
||||
set PCS delay value.
|
||||
e.g. PCIE PHY in DRA7x
|
||||
"ti,control-phy-usb2-dra7" - if it has power down register like USB2 PHY on
|
||||
DRA7 platform.
|
||||
"ti,control-phy-usb2-am437" - if it has power down register like USB2 PHY on
|
||||
AM437 platform.
|
||||
- reg : Address and length of the register set for the device. It contains
|
||||
the address of "otghs_control" for control-phy-otghs or "power" register
|
||||
for other types.
|
||||
- reg-names: should be "otghs_control" control-phy-otghs and "power" for
|
||||
other types.
|
||||
- reg : register ranges as listed in the reg-names property
|
||||
- reg-names: "otghs_control" for control-phy-otghs
|
||||
"power", "pcie_pcs" and "control_sma" for control-phy-pcie
|
||||
"power" for all other types
|
||||
|
||||
omap_control_usb: omap-control-usb@4a002300 {
|
||||
compatible = "ti,control-phy-otghs";
|
||||
@@ -56,8 +58,8 @@ usb2phy@4a0ad080 {
|
||||
TI PIPE3 PHY
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "ti,phy-usb3" or "ti,phy-pipe3-sata".
|
||||
"ti,omap-usb3" is deprecated.
|
||||
- compatible: Should be "ti,phy-usb3", "ti,phy-pipe3-sata" or
|
||||
"ti,phy-pipe3-pcie. "ti,omap-usb3" is deprecated.
|
||||
- reg : Address and length of the register set for the device.
|
||||
- reg-names: The names of the register addresses corresponding to the registers
|
||||
filled in "reg".
|
||||
@@ -69,10 +71,17 @@ Required properties:
|
||||
* "wkupclk" - wakeup clock.
|
||||
* "sysclk" - system clock.
|
||||
* "refclk" - reference clock.
|
||||
* "dpll_ref" - external dpll ref clk
|
||||
* "dpll_ref_m2" - external dpll ref clk
|
||||
* "phy-div" - divider for apll
|
||||
* "div-clk" - apll clock
|
||||
|
||||
Optional properties:
|
||||
- ctrl-module : phandle of the control module used by PHY driver to power on
|
||||
the PHY.
|
||||
- id: If there are multiple instance of the same type, in order to
|
||||
differentiate between each instance "id" can be used (e.g., multi-lane PCIe
|
||||
PHY). If "id" is not provided, it is set to default value of '1'.
|
||||
|
||||
This is usually a subnode of ocp2scp to which it is connected.
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ Required properties:
|
||||
- compatible: Should be "fsl,imx27-usb"
|
||||
- reg: Should contain registers location and length
|
||||
- interrupts: Should contain controller interrupt
|
||||
- fsl,usbphy: phandle of usb phy that connects to the port
|
||||
|
||||
Recommended properies:
|
||||
- phy_type: the type of the phy connected to the core. Should be one
|
||||
@@ -12,7 +13,6 @@ Recommended properies:
|
||||
- dr_mode: One of "host", "peripheral" or "otg". Defaults to "otg"
|
||||
|
||||
Optional properties:
|
||||
- fsl,usbphy: phandler of usb phy that connects to the only one port
|
||||
- fsl,usbmisc: phandler of non-core register device, with one argument
|
||||
that indicate usb controller index
|
||||
- vbus-supply: regulator for vbus
|
||||
|
||||
@@ -20,6 +20,12 @@ Required properties :
|
||||
Present if phy_type == utmi.
|
||||
- ulpi-link: The clock Tegra provides to the ULPI PHY (cdev2).
|
||||
Present if phy_type == ulpi, and ULPI link mode is in use.
|
||||
- resets : Must contain an entry for each entry in reset-names.
|
||||
See ../reset/reset.txt for details.
|
||||
- reset-names : Must include the following entries:
|
||||
- usb: The PHY's own reset signal.
|
||||
- utmi-pads: The reset of the PHY containing the chip-wide UTMI pad control
|
||||
registers. Required even if phy_type == ulpi.
|
||||
|
||||
Required properties for phy_type == ulpi:
|
||||
- nvidia,phy-reset-gpio : The GPIO used to reset the PHY.
|
||||
@@ -56,6 +62,8 @@ Optional properties:
|
||||
host means this is a host controller
|
||||
peripheral means it is device controller
|
||||
otg means it can operate as either ("on the go")
|
||||
- nvidia,has-utmi-pad-registers : boolean indicates whether this controller
|
||||
contains the UTMI pad control registers common to all USB controllers.
|
||||
|
||||
VBUS control (required for dr_mode == otg, optional for dr_mode == host):
|
||||
- vbus-supply: regulator for VBUS
|
||||
|
||||
@@ -9,8 +9,9 @@ Required properties:
|
||||
register set for the device.
|
||||
- interrupts: one XHCI interrupt should be described here.
|
||||
|
||||
Optional property:
|
||||
Optional properties:
|
||||
- clocks: reference to a clock
|
||||
- usb3-lpm-capable: determines if platform is USB3 LPM capable
|
||||
|
||||
Example:
|
||||
usb@f0931000 {
|
||||
|
||||
@@ -53,10 +53,12 @@ unregister the PHY.
|
||||
The PHY driver should create the PHY in order for other peripheral controllers
|
||||
to make use of it. The PHY framework provides 2 APIs to create the PHY.
|
||||
|
||||
struct phy *phy_create(struct device *dev, const struct phy_ops *ops,
|
||||
struct phy_init_data *init_data);
|
||||
struct phy *devm_phy_create(struct device *dev, const struct phy_ops *ops,
|
||||
struct phy_init_data *init_data);
|
||||
struct phy *phy_create(struct device *dev, struct device_node *node,
|
||||
const struct phy_ops *ops,
|
||||
struct phy_init_data *init_data);
|
||||
struct phy *devm_phy_create(struct device *dev, struct device_node *node,
|
||||
const struct phy_ops *ops,
|
||||
struct phy_init_data *init_data);
|
||||
|
||||
The PHY drivers can use one of the above 2 APIs to create the PHY by passing
|
||||
the device pointer, phy ops and init_data.
|
||||
|
||||
@@ -105,13 +105,13 @@ macros such as these, and use driver_info to store more information.
|
||||
A short example, for a driver that supports several specific USB devices
|
||||
and their quirks, might have a MODULE_DEVICE_TABLE like this:
|
||||
|
||||
static const struct usb_device_id mydriver_id_table = {
|
||||
static const struct usb_device_id mydriver_id_table[] = {
|
||||
{ USB_DEVICE (0x9999, 0xaaaa), driver_info: QUIRK_X },
|
||||
{ USB_DEVICE (0xbbbb, 0x8888), driver_info: QUIRK_Y|QUIRK_Z },
|
||||
...
|
||||
{ } /* end with an all-zeroes entry */
|
||||
}
|
||||
MODULE_DEVICE_TABLE (usb, mydriver_id_table);
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, mydriver_id_table);
|
||||
|
||||
Most USB device drivers should pass these tables to the USB subsystem as
|
||||
well as to the module management subsystem. Not all, though: some driver
|
||||
@@ -134,7 +134,7 @@ something like this:
|
||||
if exposing any operations through usbdevfs:
|
||||
.ioctl = my_ioctl,
|
||||
*/
|
||||
}
|
||||
};
|
||||
|
||||
When the USB subsystem knows about a driver's device ID table, it's used when
|
||||
choosing drivers to probe(). The thread doing new device processing checks
|
||||
|
||||
@@ -2,9 +2,28 @@
|
||||
|
||||
Alan Stern <stern@rowland.harvard.edu>
|
||||
|
||||
October 28, 2010
|
||||
Last-updated: February 2014
|
||||
|
||||
|
||||
Contents:
|
||||
---------
|
||||
* What is Power Management?
|
||||
* What is Remote Wakeup?
|
||||
* When is a USB device idle?
|
||||
* Forms of dynamic PM
|
||||
* The user interface for dynamic PM
|
||||
* Changing the default idle-delay time
|
||||
* Warnings
|
||||
* The driver interface for Power Management
|
||||
* The driver interface for autosuspend and autoresume
|
||||
* Other parts of the driver interface
|
||||
* Mutual exclusion
|
||||
* Interaction between dynamic PM and system PM
|
||||
* xHCI hardware link PM
|
||||
* USB Port Power Control
|
||||
* User Interface for Port Power Control
|
||||
* Suggested Userspace Port Power Policy
|
||||
|
||||
|
||||
What is Power Management?
|
||||
-------------------------
|
||||
@@ -516,3 +535,225 @@ relevant attribute files is usb2_hardware_lpm.
|
||||
driver will enable hardware LPM for the device. You
|
||||
can write y/Y/1 or n/N/0 to the file to enable/disable
|
||||
USB2 hardware LPM manually. This is for test purpose mainly.
|
||||
|
||||
|
||||
USB Port Power Control
|
||||
----------------------
|
||||
|
||||
In addition to suspending endpoint devices and enabling hardware
|
||||
controlled link power management, the USB subsystem also has the
|
||||
capability to disable power to ports under some conditions. Power is
|
||||
controlled through Set/ClearPortFeature(PORT_POWER) requests to a hub.
|
||||
In the case of a root or platform-internal hub the host controller
|
||||
driver translates PORT_POWER requests into platform firmware (ACPI)
|
||||
method calls to set the port power state. For more background see the
|
||||
Linux Plumbers Conference 2012 slides [1] and video [2]:
|
||||
|
||||
Upon receiving a ClearPortFeature(PORT_POWER) request a USB port is
|
||||
logically off, and may trigger the actual loss of VBUS to the port [3].
|
||||
VBUS may be maintained in the case where a hub gangs multiple ports into
|
||||
a shared power well causing power to remain until all ports in the gang
|
||||
are turned off. VBUS may also be maintained by hub ports configured for
|
||||
a charging application. In any event a logically off port will lose
|
||||
connection with its device, not respond to hotplug events, and not
|
||||
respond to remote wakeup events*.
|
||||
|
||||
WARNING: turning off a port may result in the inability to hot add a device.
|
||||
Please see "User Interface for Port Power Control" for details.
|
||||
|
||||
As far as the effect on the device itself it is similar to what a device
|
||||
goes through during system suspend, i.e. the power session is lost. Any
|
||||
USB device or driver that misbehaves with system suspend will be
|
||||
similarly affected by a port power cycle event. For this reason the
|
||||
implementation shares the same device recovery path (and honors the same
|
||||
quirks) as the system resume path for the hub.
|
||||
|
||||
[1]: http://dl.dropbox.com/u/96820575/sarah-sharp-lpt-port-power-off2-mini.pdf
|
||||
[2]: http://linuxplumbers.ubicast.tv/videos/usb-port-power-off-kerneluserspace-api/
|
||||
[3]: USB 3.1 Section 10.12
|
||||
* wakeup note: if a device is configured to send wakeup events the port
|
||||
power control implementation will block poweroff attempts on that
|
||||
port.
|
||||
|
||||
|
||||
User Interface for Port Power Control
|
||||
-------------------------------------
|
||||
|
||||
The port power control mechanism uses the PM runtime system. Poweroff is
|
||||
requested by clearing the power/pm_qos_no_power_off flag of the port device
|
||||
(defaults to 1). If the port is disconnected it will immediately receive a
|
||||
ClearPortFeature(PORT_POWER) request. Otherwise, it will honor the pm runtime
|
||||
rules and require the attached child device and all descendants to be suspended.
|
||||
This mechanism is dependent on the hub advertising port power switching in its
|
||||
hub descriptor (wHubCharacteristics logical power switching mode field).
|
||||
|
||||
Note, some interface devices/drivers do not support autosuspend. Userspace may
|
||||
need to unbind the interface drivers before the usb_device will suspend. An
|
||||
unbound interface device is suspended by default. When unbinding, be careful
|
||||
to unbind interface drivers, not the driver of the parent usb device. Also,
|
||||
leave hub interface drivers bound. If the driver for the usb device (not
|
||||
interface) is unbound the kernel is no longer able to resume the device. If a
|
||||
hub interface driver is unbound, control of its child ports is lost and all
|
||||
attached child-devices will disconnect. A good rule of thumb is that if the
|
||||
'driver/module' link for a device points to /sys/module/usbcore then unbinding
|
||||
it will interfere with port power control.
|
||||
|
||||
Example of the relevant files for port power control. Note, in this example
|
||||
these files are relative to a usb hub device (prefix).
|
||||
|
||||
prefix=/sys/devices/pci0000:00/0000:00:14.0/usb3/3-1
|
||||
|
||||
attached child device +
|
||||
hub port device + |
|
||||
hub interface device + | |
|
||||
v v v
|
||||
$prefix/3-1:1.0/3-1-port1/device
|
||||
|
||||
$prefix/3-1:1.0/3-1-port1/power/pm_qos_no_power_off
|
||||
$prefix/3-1:1.0/3-1-port1/device/power/control
|
||||
$prefix/3-1:1.0/3-1-port1/device/3-1.1:<intf0>/driver/unbind
|
||||
$prefix/3-1:1.0/3-1-port1/device/3-1.1:<intf1>/driver/unbind
|
||||
...
|
||||
$prefix/3-1:1.0/3-1-port1/device/3-1.1:<intfN>/driver/unbind
|
||||
|
||||
In addition to these files some ports may have a 'peer' link to a port on
|
||||
another hub. The expectation is that all superspeed ports have a
|
||||
hi-speed peer.
|
||||
|
||||
$prefix/3-1:1.0/3-1-port1/peer -> ../../../../usb2/2-1/2-1:1.0/2-1-port1
|
||||
../../../../usb2/2-1/2-1:1.0/2-1-port1/peer -> ../../../../usb3/3-1/3-1:1.0/3-1-port1
|
||||
|
||||
Distinct from 'companion ports', or 'ehci/xhci shared switchover ports'
|
||||
peer ports are simply the hi-speed and superspeed interface pins that
|
||||
are combined into a single usb3 connector. Peer ports share the same
|
||||
ancestor XHCI device.
|
||||
|
||||
While a superspeed port is powered off a device may downgrade its
|
||||
connection and attempt to connect to the hi-speed pins. The
|
||||
implementation takes steps to prevent this:
|
||||
|
||||
1/ Port suspend is sequenced to guarantee that hi-speed ports are powered-off
|
||||
before their superspeed peer is permitted to power-off. The implication is
|
||||
that the setting pm_qos_no_power_off to zero on a superspeed port may not cause
|
||||
the port to power-off until its highspeed peer has gone to its runtime suspend
|
||||
state. Userspace must take care to order the suspensions if it wants to
|
||||
guarantee that a superspeed port will power-off.
|
||||
|
||||
2/ Port resume is sequenced to force a superspeed port to power-on prior to its
|
||||
highspeed peer.
|
||||
|
||||
3/ Port resume always triggers an attached child device to resume. After a
|
||||
power session is lost the device may have been removed, or need reset.
|
||||
Resuming the child device when the parent port regains power resolves those
|
||||
states and clamps the maximum port power cycle frequency at the rate the child
|
||||
device can suspend (autosuspend-delay) and resume (reset-resume latency).
|
||||
|
||||
Sysfs files relevant for port power control:
|
||||
<hubdev-portX>/power/pm_qos_no_power_off:
|
||||
This writable flag controls the state of an idle port.
|
||||
Once all children and descendants have suspended the
|
||||
port may suspend/poweroff provided that
|
||||
pm_qos_no_power_off is '0'. If pm_qos_no_power_off is
|
||||
'1' the port will remain active/powered regardless of
|
||||
the stats of descendants. Defaults to 1.
|
||||
|
||||
<hubdev-portX>/power/runtime_status:
|
||||
This file reflects whether the port is 'active' (power is on)
|
||||
or 'suspended' (logically off). There is no indication to
|
||||
userspace whether VBUS is still supplied.
|
||||
|
||||
<hubdev-portX>/connect_type:
|
||||
An advisory read-only flag to userspace indicating the
|
||||
location and connection type of the port. It returns
|
||||
one of four values 'hotplug', 'hardwired', 'not used',
|
||||
and 'unknown'. All values, besides unknown, are set by
|
||||
platform firmware.
|
||||
|
||||
"hotplug" indicates an externally connectable/visible
|
||||
port on the platform. Typically userspace would choose
|
||||
to keep such a port powered to handle new device
|
||||
connection events.
|
||||
|
||||
"hardwired" refers to a port that is not visible but
|
||||
connectable. Examples are internal ports for USB
|
||||
bluetooth that can be disconnected via an external
|
||||
switch or a port with a hardwired USB camera. It is
|
||||
expected to be safe to allow these ports to suspend
|
||||
provided pm_qos_no_power_off is coordinated with any
|
||||
switch that gates connections. Userspace must arrange
|
||||
for the device to be connected prior to the port
|
||||
powering off, or to activate the port prior to enabling
|
||||
connection via a switch.
|
||||
|
||||
"not used" refers to an internal port that is expected
|
||||
to never have a device connected to it. These may be
|
||||
empty internal ports, or ports that are not physically
|
||||
exposed on a platform. Considered safe to be
|
||||
powered-off at all times.
|
||||
|
||||
"unknown" means platform firmware does not provide
|
||||
information for this port. Most commonly refers to
|
||||
external hub ports which should be considered 'hotplug'
|
||||
for policy decisions.
|
||||
|
||||
NOTE1: since we are relying on the BIOS to get this ACPI
|
||||
information correct, the USB port descriptions may be
|
||||
missing or wrong.
|
||||
|
||||
NOTE2: Take care in clearing pm_qos_no_power_off. Once
|
||||
power is off this port will
|
||||
not respond to new connect events.
|
||||
|
||||
Once a child device is attached additional constraints are
|
||||
applied before the port is allowed to poweroff.
|
||||
|
||||
<child>/power/control:
|
||||
Must be 'auto', and the port will not
|
||||
power down until <child>/power/runtime_status
|
||||
reflects the 'suspended' state. Default
|
||||
value is controlled by child device driver.
|
||||
|
||||
<child>/power/persist:
|
||||
This defaults to '1' for most devices and indicates if
|
||||
kernel can persist the device's configuration across a
|
||||
power session loss (suspend / port-power event). When
|
||||
this value is '0' (quirky devices), port poweroff is
|
||||
disabled.
|
||||
|
||||
<child>/driver/unbind:
|
||||
Wakeup capable devices will block port poweroff. At
|
||||
this time the only mechanism to clear the usb-internal
|
||||
wakeup-capability for an interface device is to unbind
|
||||
its driver.
|
||||
|
||||
Summary of poweroff pre-requisite settings relative to a port device:
|
||||
|
||||
echo 0 > power/pm_qos_no_power_off
|
||||
echo 0 > peer/power/pm_qos_no_power_off # if it exists
|
||||
echo auto > power/control # this is the default value
|
||||
echo auto > <child>/power/control
|
||||
echo 1 > <child>/power/persist # this is the default value
|
||||
|
||||
Suggested Userspace Port Power Policy
|
||||
-------------------------------------
|
||||
|
||||
As noted above userspace needs to be careful and deliberate about what
|
||||
ports are enabled for poweroff.
|
||||
|
||||
The default configuration is that all ports start with
|
||||
power/pm_qos_no_power_off set to '1' causing ports to always remain
|
||||
active.
|
||||
|
||||
Given confidence in the platform firmware's description of the ports
|
||||
(ACPI _PLD record for a port populates 'connect_type') userspace can
|
||||
clear pm_qos_no_power_off for all 'not used' ports. The same can be
|
||||
done for 'hardwired' ports provided poweroff is coordinated with any
|
||||
connection switch for the port.
|
||||
|
||||
A more aggressive userspace policy is to enable USB port power off for
|
||||
all ports (set <hubdev-portX>/power/pm_qos_no_power_off to '0') when
|
||||
some external factor indicates the user has stopped interacting with the
|
||||
system. For example, a distro may want to enable power off all USB
|
||||
ports when the screen blanks, and re-power them when the screen becomes
|
||||
active. Smart phones and tablets may want to power off USB ports when
|
||||
the user pushes the power button.
|
||||
|
||||
@@ -657,6 +657,8 @@
|
||||
<&tegra_car TEGRA114_CLK_PLL_U>,
|
||||
<&tegra_car TEGRA114_CLK_USBD>;
|
||||
clock-names = "reg", "pll_u", "utmi-pads";
|
||||
resets = <&tegra_car 22>, <&tegra_car 22>;
|
||||
reset-names = "usb", "utmi-pads";
|
||||
nvidia,hssync-start-delay = <0>;
|
||||
nvidia,idle-wait-delay = <17>;
|
||||
nvidia,elastic-limit = <16>;
|
||||
@@ -667,6 +669,7 @@
|
||||
nvidia,hssquelch-level = <2>;
|
||||
nvidia,hsdiscon-level = <5>;
|
||||
nvidia,xcvr-hsslew = <12>;
|
||||
nvidia,has-utmi-pad-registers;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@@ -690,6 +693,8 @@
|
||||
<&tegra_car TEGRA114_CLK_PLL_U>,
|
||||
<&tegra_car TEGRA114_CLK_USBD>;
|
||||
clock-names = "reg", "pll_u", "utmi-pads";
|
||||
resets = <&tegra_car 59>, <&tegra_car 22>;
|
||||
reset-names = "usb", "utmi-pads";
|
||||
nvidia,hssync-start-delay = <0>;
|
||||
nvidia,idle-wait-delay = <17>;
|
||||
nvidia,elastic-limit = <16>;
|
||||
|
||||
@@ -613,6 +613,8 @@
|
||||
<&tegra_car TEGRA124_CLK_PLL_U>,
|
||||
<&tegra_car TEGRA124_CLK_USBD>;
|
||||
clock-names = "reg", "pll_u", "utmi-pads";
|
||||
resets = <&tegra_car 59>, <&tegra_car 22>;
|
||||
reset-names = "usb", "utmi-pads";
|
||||
nvidia,hssync-start-delay = <0>;
|
||||
nvidia,idle-wait-delay = <17>;
|
||||
nvidia,elastic-limit = <16>;
|
||||
@@ -647,6 +649,8 @@
|
||||
<&tegra_car TEGRA124_CLK_PLL_U>,
|
||||
<&tegra_car TEGRA124_CLK_USBD>;
|
||||
clock-names = "reg", "pll_u", "utmi-pads";
|
||||
resets = <&tegra_car 22>, <&tegra_car 22>;
|
||||
reset-names = "usb", "utmi-pads";
|
||||
nvidia,hssync-start-delay = <0>;
|
||||
nvidia,idle-wait-delay = <17>;
|
||||
nvidia,elastic-limit = <16>;
|
||||
@@ -657,6 +661,7 @@
|
||||
nvidia,hssquelch-level = <2>;
|
||||
nvidia,hsdiscon-level = <5>;
|
||||
nvidia,xcvr-hsslew = <12>;
|
||||
nvidia,has-utmi-pad-registers;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@@ -681,6 +686,8 @@
|
||||
<&tegra_car TEGRA124_CLK_PLL_U>,
|
||||
<&tegra_car TEGRA124_CLK_USBD>;
|
||||
clock-names = "reg", "pll_u", "utmi-pads";
|
||||
resets = <&tegra_car 58>, <&tegra_car 22>;
|
||||
reset-names = "usb", "utmi-pads";
|
||||
nvidia,hssync-start-delay = <0>;
|
||||
nvidia,idle-wait-delay = <17>;
|
||||
nvidia,elastic-limit = <16>;
|
||||
|
||||
@@ -630,6 +630,8 @@
|
||||
<&tegra_car TEGRA20_CLK_CLK_M>,
|
||||
<&tegra_car TEGRA20_CLK_USBD>;
|
||||
clock-names = "reg", "pll_u", "timer", "utmi-pads";
|
||||
resets = <&tegra_car 22>, <&tegra_car 22>;
|
||||
reset-names = "usb", "utmi-pads";
|
||||
nvidia,has-legacy-mode;
|
||||
nvidia,hssync-start-delay = <9>;
|
||||
nvidia,idle-wait-delay = <17>;
|
||||
@@ -638,6 +640,7 @@
|
||||
nvidia,xcvr-setup = <9>;
|
||||
nvidia,xcvr-lsfslew = <1>;
|
||||
nvidia,xcvr-lsrslew = <1>;
|
||||
nvidia,has-utmi-pad-registers;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@@ -661,6 +664,8 @@
|
||||
<&tegra_car TEGRA20_CLK_PLL_U>,
|
||||
<&tegra_car TEGRA20_CLK_CDEV2>;
|
||||
clock-names = "reg", "pll_u", "ulpi-link";
|
||||
resets = <&tegra_car 58>, <&tegra_car 22>;
|
||||
reset-names = "usb", "utmi-pads";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@@ -685,6 +690,8 @@
|
||||
<&tegra_car TEGRA20_CLK_CLK_M>,
|
||||
<&tegra_car TEGRA20_CLK_USBD>;
|
||||
clock-names = "reg", "pll_u", "timer", "utmi-pads";
|
||||
resets = <&tegra_car 59>, <&tegra_car 22>;
|
||||
reset-names = "usb", "utmi-pads";
|
||||
nvidia,hssync-start-delay = <9>;
|
||||
nvidia,idle-wait-delay = <17>;
|
||||
nvidia,elastic-limit = <16>;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user