[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250616133147.1835939-2-akuchynski@chromium.org>
Date: Mon, 16 Jun 2025 13:31:38 +0000
From: Andrei Kuchynski <akuchynski@...omium.org>
To: Heikki Krogerus <heikki.krogerus@...ux.intel.com>,
Dmitry Baryshkov <lumag@...nel.org>,
Abhishek Pandit-Subedi <abhishekpandit@...omium.org>,
Jameson Thies <jthies@...gle.com>,
Benson Leung <bleung@...omium.org>,
Tzung-Bi Shih <tzungbi@...nel.org>
Cc: Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
Guenter Roeck <groeck@...omium.org>,
Pooja Katiyar <pooja.katiyar@...el.com>,
Badhri Jagan Sridharan <badhri@...gle.com>,
RD Babiera <rdbabiera@...gle.com>,
linux-usb@...r.kernel.org,
linux-kernel@...r.kernel.org,
chrome-platform@...ts.linux.dev,
Andrei Kuchynski <akuchynski@...omium.org>
Subject: [PATCH 01/10] usb: typec: Add alt_mode_override field to port property
This new field in the port properties dictates whether the Platform Policy
Manager (PPM) allows the OS Policy Manager (OPM) to change the currently
active, negotiated alternate mode.
Signed-off-by: Andrei Kuchynski <akuchynski@...omium.org>
---
drivers/usb/typec/class.c | 14 +++++++++++---
drivers/usb/typec/class.h | 2 ++
include/linux/usb/typec.h | 1 +
3 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c
index 67a533e35150..a72325ff099a 100644
--- a/drivers/usb/typec/class.c
+++ b/drivers/usb/typec/class.c
@@ -459,9 +459,16 @@ static umode_t typec_altmode_attr_is_visible(struct kobject *kobj,
struct typec_altmode *adev = to_typec_altmode(kobj_to_dev(kobj));
if (attr == &dev_attr_active.attr)
- if (!is_typec_port(adev->dev.parent) &&
- (!adev->ops || !adev->ops->activate))
- return 0444;
+ if (!is_typec_port(adev->dev.parent)) {
+ struct typec_partner *partner =
+ to_typec_partner(adev->dev.parent);
+ struct typec_port *port =
+ to_typec_port(partner->dev.parent);
+
+ if (!port->alt_mode_override || !adev->ops ||
+ !adev->ops->activate)
+ return 0444;
+ }
return attr->mode;
}
@@ -2681,6 +2688,7 @@ struct typec_port *typec_register_port(struct device *parent,
}
port->pd = cap->pd;
+ port->alt_mode_override = cap->alt_mode_override;
ret = device_add(&port->dev);
if (ret) {
diff --git a/drivers/usb/typec/class.h b/drivers/usb/typec/class.h
index db2fe96c48ff..f05d9201c233 100644
--- a/drivers/usb/typec/class.h
+++ b/drivers/usb/typec/class.h
@@ -80,6 +80,8 @@ struct typec_port {
*/
struct device *usb2_dev;
struct device *usb3_dev;
+
+ bool alt_mode_override;
};
#define to_typec_port(_dev_) container_of(_dev_, struct typec_port, dev)
diff --git a/include/linux/usb/typec.h b/include/linux/usb/typec.h
index 252af3f77039..6e09e68788dd 100644
--- a/include/linux/usb/typec.h
+++ b/include/linux/usb/typec.h
@@ -304,6 +304,7 @@ struct typec_capability {
enum typec_accessory accessory[TYPEC_MAX_ACCESSORY];
unsigned int orientation_aware:1;
u8 usb_capability;
+ bool alt_mode_override;
struct fwnode_handle *fwnode;
void *driver_data;
--
2.50.0.rc1.591.g9c95f17f64-goog
Powered by blists - more mailing lists