[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20250327172803.3404615-2-m.felsch@pengutronix.de>
Date: Thu, 27 Mar 2025 18:28:00 +0100
From: Marco Felsch <m.felsch@...gutronix.de>
To: gregkh@...uxfoundation.org,
robh@...nel.org,
krzk+dt@...nel.org,
conor+dt@...nel.org,
mka@...omium.org,
lgirdwood@...il.com,
broonie@...nel.org,
festevam@...x.de,
stern@...land.harvard.edu,
m.felsch@...gutronix.de,
kaihengf@...dia.com,
lijiayi@...inos.cn,
krzysztof.kozlowski@...aro.org
Cc: kernel@...gutronix.de,
linux-usb@...r.kernel.org,
devicetree@...r.kernel.org,
linux-kernel@...r.kernel.org
Subject: [PATCH v2 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 e6ae73f8a95d..9e91add60b1c 100644
--- a/drivers/usb/core/hub.h
+++ b/drivers/usb/core/hub.h
@@ -96,6 +96,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;
@@ -117,6 +118,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 f54198171b6a..cae08a9a71e6 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