]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
usb: typec: Add mode_control field to port property
authorAndrei Kuchynski <akuchynski@chromium.org>
Mon, 19 Jan 2026 13:18:18 +0000 (13:18 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 23 Jan 2026 16:18:01 +0000 (17:18 +0100)
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@chromium.org>
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Reviewed-by: Benson Leung <bleung@chromium.org>
Link: https://patch.msgid.link/20260119131824.2529334-2-akuchynski@chromium.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/typec/class.c
drivers/usb/typec/class.h
include/linux/usb/typec.h

index c4ff4310ff58a16dc21136d57492f8f1a6fbea40..0f12d6120511b5d99763cb8a90948c3db329374e 100644 (file)
@@ -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;
 }
@@ -2708,6 +2710,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) {
index db2fe96c48ff0fb7ad70151e41353978b2383b7b..2e89a83c2eb70f0d1a640079f358fc96cbd01fb9 100644 (file)
@@ -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;
index c6fd46902fce734c4cdd69f1c9afa5e3ce62aff2..dbb259d88526646678da4aa254b5ae039b319533 100644 (file)
@@ -290,6 +290,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
@@ -307,6 +308,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;