summaryrefslogtreecommitdiff
path: root/src/soc/intel/common/block/tcss/tcss.c
diff options
context:
space:
mode:
authorCoolStar <coolstarorganization@gmail.com>2023-02-07 14:44:54 -0800
committerMartin L Roth <gaumless@gmail.com>2023-08-06 19:25:34 +0000
commit9c7433ec557f9f06d7fb4fdc262fe09500d00903 (patch)
treec510e5fa4192bf0ca7ef3dc06ffc680cc9809cf2 /src/soc/intel/common/block/tcss/tcss.c
parentb33778e71fe183b1f51904119d35f721a411c8ae (diff)
soc/intel/common/tcss: Configure USB-C ports with attached devices
Inspect all type-C USB ports, check if there is a USB device attached, and if so, send the connection request to the PMC. This allows for any attached USB2/USB3 devices to be used for booting by the payload. Since this functionality is only needed by ChromeOS devices with TCSS running upstream coreboot, introduce a new Kconfig to guard its use. Boards needing it will select it in subsequent commits. TEST=tested with rest of patch train Change-Id: I69522dbcc8cae6bbf41659ae653107d0e031c812 Signed-off-by: Matt DeVillier <matt.devillier@gmail.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/72909 Reviewed-by: Angel Pons <th3fanbus@gmail.com> Reviewed-by: Martin L Roth <gaumless@gmail.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/soc/intel/common/block/tcss/tcss.c')
-rw-r--r--src/soc/intel/common/block/tcss/tcss.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/soc/intel/common/block/tcss/tcss.c b/src/soc/intel/common/block/tcss/tcss.c
index 23427b444e..7c58e3ae58 100644
--- a/src/soc/intel/common/block/tcss/tcss.c
+++ b/src/soc/intel/common/block/tcss/tcss.c
@@ -340,6 +340,32 @@ static void tcss_configure_dp_mode(const struct tcss_port_map *port_map, size_t
}
}
+static void tcss_configure_usb_mode(const struct tcss_port_map *port_map, size_t num_ports)
+{
+ int ret;
+ size_t i;
+ const struct usbc_ops *ops;
+ struct usbc_mux_info mux_info;
+ const struct tcss_port_map *port_info;
+
+ ops = usbc_get_ops();
+ if (ops == NULL)
+ return;
+
+ for (i = 0; i < num_ports; i++) {
+ ret = ops->mux_ops.get_mux_info(i, &mux_info);
+ if ((ret < 0) || !mux_info.usb || (mux_info.dp && mux_info.hpd_lvl))
+ continue;
+
+ port_info = &port_map[i];
+ ret = send_pmc_connect_request(i, &mux_info, port_info);
+ if (ret) {
+ printk(BIOS_ERR, "Port %zu connect request failed\n", i);
+ continue;
+ }
+ }
+}
+
static uint32_t calc_bias_ctrl_reg_value(gpio_t pad)
{
unsigned int vw_index, vw_bit;
@@ -429,6 +455,9 @@ void tcss_configure(const struct typec_aux_bias_pads aux_bias_pads[MAX_TYPE_C_PO
if (CONFIG(ENABLE_TCSS_DISPLAY_DETECTION))
tcss_configure_dp_mode(port_map, num_ports);
+
+ if (CONFIG(ENABLE_TCSS_USB_DETECTION))
+ tcss_configure_usb_mode(port_map, num_ports);
}
}