Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

usb: typec: ucsi: Register SOP' alternate modes with cable plug

Register SOP' alternate modes with a Type-C Connector Class cable plug.
Alternate modes are queried from the PPM using the GET_ALTERNATE_MODES
command with recipient set to SOP'.

Reviewed-by: Benson Leung <bleung@chromium.org>
Reviewed-by: Prashant Malani <pmalani@chromium.org>
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Jameson Thies <jthies@google.com>
Link: https://lore.kernel.org/r/20240305025804.1290919-5-jthies@google.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Jameson Thies and committed by
Greg Kroah-Hartman
3dd85520 f896d5e8

+62
+60
drivers/usb/typec/ucsi/ucsi.c
··· 399 399 400 400 con->partner_altmode[i] = alt; 401 401 break; 402 + case UCSI_RECIPIENT_SOP_P: 403 + i = ucsi_next_altmode(con->plug_altmode); 404 + if (i < 0) { 405 + ret = i; 406 + goto err; 407 + } 408 + 409 + ret = ucsi_altmode_next_mode(con->plug_altmode, desc->svid); 410 + if (ret < 0) 411 + return ret; 412 + 413 + desc->mode = ret; 414 + 415 + alt = typec_plug_register_altmode(con->plug, desc); 416 + if (IS_ERR(alt)) { 417 + ret = PTR_ERR(alt); 418 + goto err; 419 + } 420 + 421 + con->plug_altmode[i] = alt; 422 + break; 402 423 default: 403 424 return -EINVAL; 404 425 } ··· 586 565 break; 587 566 case UCSI_RECIPIENT_SOP: 588 567 adev = con->partner_altmode; 568 + break; 569 + case UCSI_RECIPIENT_SOP_P: 570 + adev = con->plug_altmode; 589 571 break; 590 572 default: 591 573 return; ··· 860 836 con->partner_pd = NULL; 861 837 } 862 838 839 + static int ucsi_register_plug(struct ucsi_connector *con) 840 + { 841 + struct typec_plug *plug; 842 + struct typec_plug_desc desc = {.index = TYPEC_PLUG_SOP_P}; 843 + 844 + plug = typec_register_plug(con->cable, &desc); 845 + if (IS_ERR(plug)) { 846 + dev_err(con->ucsi->dev, 847 + "con%d: failed to register plug (%ld)\n", con->num, 848 + PTR_ERR(plug)); 849 + return PTR_ERR(plug); 850 + } 851 + 852 + con->plug = plug; 853 + return 0; 854 + } 855 + 856 + static void ucsi_unregister_plug(struct ucsi_connector *con) 857 + { 858 + if (!con->plug) 859 + return; 860 + 861 + ucsi_unregister_altmodes(con, UCSI_RECIPIENT_SOP_P); 862 + typec_unregister_plug(con->plug); 863 + con->plug = NULL; 864 + } 865 + 863 866 static int ucsi_register_cable(struct ucsi_connector *con) 864 867 { 865 868 struct typec_cable *cable; ··· 930 879 if (!con->cable) 931 880 return; 932 881 882 + ucsi_unregister_plug(con); 933 883 typec_unregister_cable(con->cable); 934 884 memset(&con->cable_identity, 0, sizeof(con->cable_identity)); 935 885 con->cable = NULL; ··· 1134 1082 return ret; 1135 1083 1136 1084 ret = ucsi_get_cable_identity(con); 1085 + if (ret < 0) 1086 + return ret; 1087 + 1088 + ret = ucsi_register_plug(con); 1089 + if (ret < 0) 1090 + return ret; 1091 + 1092 + ret = ucsi_register_altmodes(con, UCSI_RECIPIENT_SOP_P); 1137 1093 if (ret < 0) 1138 1094 return ret; 1139 1095
+2
drivers/usb/typec/ucsi/ucsi.h
··· 429 429 struct typec_port *port; 430 430 struct typec_partner *partner; 431 431 struct typec_cable *cable; 432 + struct typec_plug *plug; 432 433 433 434 struct typec_altmode *port_altmode[UCSI_MAX_ALTMODES]; 434 435 struct typec_altmode *partner_altmode[UCSI_MAX_ALTMODES]; 436 + struct typec_altmode *plug_altmode[UCSI_MAX_ALTMODES]; 435 437 436 438 struct typec_capability typec_cap; 437 439