[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20250821-v6-16-topic-usb-onboard-dev-v3-1-6d2b38a5d818@pengutronix.de>
Date: Thu, 21 Aug 2025 18:31:55 +0200
From: Marco Felsch <m.felsch@...gutronix.de>
To: Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
Rob Herring <robh@...nel.org>, Krzysztof Kozlowski <krzk+dt@...nel.org>,
Conor Dooley <conor+dt@...nel.org>, Fabio Estevam <festevam@...il.com>,
Matthias Kaehlcke <mka@...omium.org>, Liam Girdwood <lgirdwood@...il.com>,
Mark Brown <broonie@...nel.org>
Cc: linux-usb@...r.kernel.org, linux-kernel@...r.kernel.org,
devicetree@...r.kernel.org, kernel@...gutronix.de,
Marco Felsch <m.felsch@...gutronix.de>
Subject: [PATCH v3 1/4] usb: port: track the disabled state
The disable state isn't tracked at the moment, instead the state is
directly passed to the hub driver. Change this behavior to only trigger
the hub if a state change happened. Exit early in case of no state
changes but don't return an error.
Signed-off-by: Marco Felsch <m.felsch@...gutronix.de>
---
drivers/usb/core/hub.h | 2 ++
drivers/usb/core/port.c | 6 ++++++
2 files changed, 8 insertions(+)
diff --git a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h
index 9ebc5ef54a325d63e01b0deb59a1853d2b13c8d5..297adf2c6078809ca582104f228e5222c464f999 100644
--- a/drivers/usb/core/hub.h
+++ b/drivers/usb/core/hub.h
@@ -97,6 +97,7 @@ struct usb_hub {
* @usb3_lpm_u2_permit: whether USB3 U2 LPM is permitted.
* @early_stop: whether port initialization will be stopped earlier.
* @ignore_event: whether events of the port are ignored.
+ * @disabled: whether the port is disabled
*/
struct usb_port {
struct usb_device *child;
@@ -118,6 +119,7 @@ struct usb_port {
unsigned int is_superspeed:1;
unsigned int usb3_lpm_u1_permit:1;
unsigned int usb3_lpm_u2_permit:1;
+ unsigned int disabled:1;
};
#define to_usb_port(_dev) \
diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c
index f54198171b6a3fb49c5f74f4a8a303b422d099eb..cae08a9a71e65c42fb9a8f5369060bd82b8daebb 100644
--- a/drivers/usb/core/port.c
+++ b/drivers/usb/core/port.c
@@ -117,6 +117,10 @@ static ssize_t disable_store(struct device *dev, struct device_attribute *attr,
if (rc)
return rc;
+ /* Early quit if no change was detected */
+ if (port_dev->disabled == disabled)
+ return count;
+
hub_get(hub);
rc = usb_autopm_get_interface(intf);
if (rc < 0)
@@ -148,6 +152,8 @@ static ssize_t disable_store(struct device *dev, struct device_attribute *attr,
usb_clear_port_feature(hdev, port1, USB_PORT_FEAT_C_ENABLE);
}
+ port_dev->disabled = disabled;
+
if (!rc)
rc = count;
--
2.39.5
Powered by blists - more mailing lists