]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
usb: typec: ucsi: Expose number of alternate modes in partner
authorSaranya Gopal <saranya.gopal@intel.com>
Tue, 16 Nov 2021 10:36:13 +0000 (16:06 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 Nov 2021 13:59:11 +0000 (14:59 +0100)
Type-c class provides an option to expose the number of alternate
modes in the port partner as a sysfs interface. Use that to
expose the number of alternate modes in the port partner from
the ucsi driver.

Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Rajaram Regupathy <rajaram.regupathy@intel.com>
Signed-off-by: Saranya Gopal <saranya.gopal@intel.com>
Link: https://lore.kernel.org/r/20211116103613.31349-1-saranya.gopal@intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/typec/ucsi/ucsi.c

index 6aa28384f77f1c45cf99471c6781e008f7096504..9d6b7e02d6efbfd1648a051fd29870e1ce29bf3e 100644 (file)
@@ -303,6 +303,17 @@ static int ucsi_next_altmode(struct typec_altmode **alt)
        return -ENOENT;
 }
 
+static int ucsi_get_num_altmode(struct typec_altmode **alt)
+{
+       int i;
+
+       for (i = 0; i < UCSI_MAX_ALTMODES; i++)
+               if (!alt[i])
+                       break;
+
+       return i;
+}
+
 static int ucsi_register_altmode(struct ucsi_connector *con,
                                 struct typec_altmode_desc *desc,
                                 u8 recipient)
@@ -607,7 +618,7 @@ static int ucsi_get_src_pdos(struct ucsi_connector *con)
 
 static int ucsi_check_altmodes(struct ucsi_connector *con)
 {
-       int ret;
+       int ret, num_partner_am;
 
        ret = ucsi_register_altmodes(con, UCSI_RECIPIENT_SOP);
        if (ret && ret != -ETIMEDOUT)
@@ -617,6 +628,9 @@ static int ucsi_check_altmodes(struct ucsi_connector *con)
 
        /* Ignoring the errors in this case. */
        if (con->partner_altmode[0]) {
+               num_partner_am = ucsi_get_num_altmode(con->partner_altmode);
+               if (num_partner_am > 0)
+                       typec_partner_set_num_altmodes(con->partner, num_partner_am);
                ucsi_altmode_update_active(con);
                return 0;
        }