Hi Andrei, On Mon, Nov 24, 2025 at 12:46:36PM +0000, Andrei Kuchynski wrote: > 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 > Reviewed-by: Heikki Krogerus Reviewed-by: Benson Leung > --- > drivers/usb/typec/class.c | 9 ++++++--- > drivers/usb/typec/class.h | 1 + > include/linux/usb/typec.h | 2 ++ > 3 files changed, 9 insertions(+), 3 deletions(-) > > diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c > index 9b2647cb199b..a5327e444265 100644 > --- a/drivers/usb/typec/class.c > +++ b/drivers/usb/typec/class.c > @@ -457,11 +457,13 @@ static umode_t typec_altmode_attr_is_visible(struct kobject *kobj, > struct attribute *attr, int n) > { > struct typec_altmode *adev = to_typec_altmode(kobj_to_dev(kobj)); > + struct typec_port *port = typec_altmode2port(adev); > > 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)) { > + if (!port->mode_control || !adev->ops || !adev->ops->activate) > + return 0444; > + } > > return attr->mode; > } > @@ -2694,6 +2696,7 @@ struct typec_port *typec_register_port(struct device *parent, > } > > port->pd = cap->pd; > + port->mode_control = !cap->no_mode_control; > > ret = device_add(&port->dev); > if (ret) { > diff --git a/drivers/usb/typec/class.h b/drivers/usb/typec/class.h > index db2fe96c48ff..2e89a83c2eb7 100644 > --- a/drivers/usb/typec/class.h > +++ b/drivers/usb/typec/class.h > @@ -62,6 +62,7 @@ struct typec_port { > struct mutex partner_link_lock; > > enum typec_orientation orientation; > + bool mode_control; > struct typec_switch *sw; > struct typec_mux *mux; > struct typec_retimer *retimer; > diff --git a/include/linux/usb/typec.h b/include/linux/usb/typec.h > index 309251572e2e..59d5fd7e4ff4 100644 > --- a/include/linux/usb/typec.h > +++ b/include/linux/usb/typec.h > @@ -287,6 +287,7 @@ enum usb_pd_svdm_ver { > * @prefer_role: Initial role preference (DRP ports). > * @accessory: Supported Accessory Modes > * @usb_capability: Supported USB Modes > + * @no_mode_control: Ability to manage Alternate Modes > * @fwnode: Optional fwnode of the port > * @driver_data: Private pointer for driver specific info > * @pd: Optional USB Power Delivery Support > @@ -304,6 +305,7 @@ struct typec_capability { > enum typec_accessory accessory[TYPEC_MAX_ACCESSORY]; > unsigned int orientation_aware:1; > u8 usb_capability; > + bool no_mode_control; > > struct fwnode_handle *fwnode; > void *driver_data; > -- > 2.52.0.rc2.455.g230fcf2819-goog >