diff --git a/src/ec/google/chromeec/ec_acpi.c b/src/ec/google/chromeec/ec_acpi.c index 0dbaa9c456..8c80382b18 100644 --- a/src/ec/google/chromeec/ec_acpi.c +++ b/src/ec/google/chromeec/ec_acpi.c @@ -124,6 +124,22 @@ static void add_port_location(struct acpi_dp *dsd, int port_number) port_location_to_str(port_caps.port_location)); } +static int con_id_to_match; + +/* A callback to match a port's connector for dev_find_matching_device_on_bus */ +static bool match_connector(DEVTREE_CONST struct device *dev) +{ + if (CONFIG(DRIVERS_INTEL_PMC)) { + extern struct chip_operations drivers_intel_pmc_mux_con_ops; + + return (dev->chip_ops == &drivers_intel_pmc_mux_con_ops && + dev->path.type == DEVICE_PATH_GENERIC && + dev->path.generic.id == con_id_to_match); + } + + return false; +} + static void fill_ssdt_typec_device(const struct device *dev) { int rv; @@ -132,6 +148,7 @@ static void fill_ssdt_typec_device(const struct device *dev) struct device *usb3_port; struct device *usb4_port; const struct device *mux; + const struct device *con; if (google_chromeec_get_num_pd_ports(&num_ports)) return; @@ -147,7 +164,14 @@ static void fill_ssdt_typec_device(const struct device *dev) if (rv) continue; + /* Get the MUX device, and find the matching connector on its bus */ + con = NULL; mux = soc_get_pmc_mux_device(i); + if (mux) { + con_id_to_match = i; + con = dev_find_matching_device_on_bus(mux->link_list, match_connector); + } + usb2_port = NULL; usb3_port = NULL; usb4_port = NULL; @@ -160,9 +184,9 @@ static void fill_ssdt_typec_device(const struct device *dev) .usb2_port = usb2_port, .usb3_port = usb3_port, .usb4_port = usb4_port, - .orientation_switch = mux, - .usb_role_switch = mux, - .mode_switch = mux, + .orientation_switch = con, + .usb_role_switch = con, + .mode_switch = con, }; acpigen_write_typec_connector(&config, i, add_port_location);