summaryrefslogtreecommitdiff
path: root/src/ec
diff options
context:
space:
mode:
Diffstat (limited to 'src/ec')
-rw-r--r--src/ec/google/chromeec/ec_acpi.c30
1 files changed, 27 insertions, 3 deletions
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);