]> www.infradead.org Git - users/hch/misc.git/commitdiff
usb: typec: Make active on port altmode writable
authorAbhishek Pandit-Subedi <abhishekpandit@chromium.org>
Fri, 13 Dec 2024 23:35:44 +0000 (15:35 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 24 Dec 2024 07:56:05 +0000 (08:56 +0100)
The active property of port altmode should be writable (to prevent or
allow partner altmodes from entering) and needs to be part of
typec_altmode_desc so we can initialize the port to an inactive state if
desired.

Signed-off-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org>
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Reviewed-by: Benson Leung <bleung@chromium.org>
Link: https://lore.kernel.org/r/20241213153543.v5.3.I794566684ab2965e209f326b08232006eff333f8@changeid
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/typec/class.c
include/linux/usb/typec.h

index febe453b96be60b78a1ede7e982bedf1b5db09f8..b5e67a57762ce284232067837d975e3d61d09c81 100644 (file)
@@ -458,7 +458,8 @@ 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 (!adev->ops || !adev->ops->activate)
+               if (!is_typec_port(adev->dev.parent) &&
+                   (!adev->ops || !adev->ops->activate))
                        return 0444;
 
        return attr->mode;
@@ -563,7 +564,7 @@ typec_register_altmode(struct device *parent,
 
        if (is_port) {
                alt->attrs[3] = &dev_attr_supported_roles.attr;
-               alt->adev.active = true; /* Enabled by default */
+               alt->adev.active = !desc->inactive; /* Enabled by default */
        }
 
        sprintf(alt->group_name, "mode%d", desc->mode);
index d616b8807000612232019214cfd655e12c0cf5f2..252af3f7703968ea260b2ba38cdf95d15f2dbd9f 100644 (file)
@@ -140,6 +140,7 @@ int typec_cable_set_identity(struct typec_cable *cable);
  * @mode: Index of the Mode
  * @vdo: VDO returned by Discover Modes USB PD command
  * @roles: Only for ports. DRP if the mode is available in both roles
+ * @inactive: Only for ports. Make this port inactive (default is active).
  *
  * Description of an Alternate Mode which a connector, cable plug or partner
  * supports.
@@ -150,6 +151,7 @@ struct typec_altmode_desc {
        u32                     vdo;
        /* Only used with ports */
        enum typec_port_data    roles;
+       bool                    inactive;
 };
 
 void typec_partner_set_pd_revision(struct typec_partner *partner, u16 pd_revision);