[PATCH RFC 05/12] usb: hub: Power on connected M.2 E-key connectors
Alan Stern
stern at rowland.harvard.edu
Fri May 15 07:39:04 PDT 2026
On Fri, May 15, 2026 at 05:01:41PM +0800, Chen-Yu Tsai wrote:
> diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
> index 90ea597d42ae..4165f71e212b 100644
> --- a/drivers/usb/core/hub.c
> +++ b/drivers/usb/core/hub.c
> @@ -31,7 +31,9 @@
> #include <linux/minmax.h>
> #include <linux/mutex.h>
> #include <linux/random.h>
> +#include <linux/of_graph.h>
> #include <linux/pm_qos.h>
> +#include <linux/pwrseq/consumer.h>
> #include <linux/kobject.h>
>
> #include <linux/bitfield.h>
> @@ -888,13 +890,25 @@ int usb_hub_set_port_power(struct usb_device *hdev, struct usb_hub *hub,
> {
> int ret;
>
> + if (set)
> + ret = pwrseq_power_on(hub->ports[port1 - 1]->pwrseq);
> + else
> + ret = pwrseq_power_off(hub->ports[port1 - 1]->pwrseq);
> + if (ret)
> + return ret;
> +
> if (set)
> ret = set_port_feature(hdev, port1, USB_PORT_FEAT_POWER);
> else
> ret = usb_clear_port_feature(hdev, port1, USB_PORT_FEAT_POWER);
>
> - if (ret)
> + if (ret) {
> + if (set)
> + pwrseq_power_off(hub->ports[port1 - 1]->pwrseq);
> + else
> + pwrseq_power_on(hub->ports[port1 - 1]->pwrseq);
> return ret;
> + }
>
> if (set)
> set_bit(port1, hub->power_bits);
> @@ -1867,6 +1881,7 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
> struct usb_host_interface *desc;
> struct usb_device *hdev;
> struct usb_hub *hub;
> + int ret;
>
> desc = intf->cur_altsetting;
> hdev = interface_to_usbdev(intf);
This change is totally useless. Didn't you get a warning from the
compiler when you built it?
> diff --git a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h
> index 9ebc5ef54a32..6039e5f5dcd7 100644
> --- a/drivers/usb/core/hub.h
> +++ b/drivers/usb/core/hub.h
> @@ -85,6 +85,7 @@ struct usb_hub {
> * @port_owner: port's owner
> * @peer: related usb2 and usb3 ports (share the same connector)
> * @connector: USB Type-C connector
> + * @pwrseq: power sequencing descriptor for the port
> * @req: default pm qos request for hubs without port power control
> * @connect_type: port's connect type
> * @state: device state of the usb device attached to the port
> @@ -104,6 +105,7 @@ struct usb_port {
> struct usb_dev_state *port_owner;
> struct usb_port *peer;
> struct typec_connector *connector;
> + struct pwrseq_desc *pwrseq;
> struct dev_pm_qos_request *req;
> enum usb_port_connect_type connect_type;
> enum usb_device_state state;
The fact that hub.h uses struct pwrseq_desc indicates that it ought to
#include <linux/pwrseq/consumer.h>, instead of making the .c files do
so themselves. Then you wouldn't have to add the #include lines to
hub.c and port.c.
> diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c
> index b1364f0c384c..2d09037fee93 100644
> --- a/drivers/usb/core/port.c
> +++ b/drivers/usb/core/port.c
> @@ -7,11 +7,14 @@
> * Author: Lan Tianyu <tianyu.lan at intel.com>
> */
>
> +#include <linux/cleanup.h>
Why is this needed?
> #include <linux/kstrtox.h>
> #include <linux/slab.h>
> #include <linux/string_choices.h>
> #include <linux/sysfs.h>
> +#include <linux/of_graph.h>
> #include <linux/pm_qos.h>
> +#include <linux/pwrseq/consumer.h>
> #include <linux/component.h>
> #include <linux/usb/of.h>
>
Alan Stern
More information about the Linux-mediatek
mailing list