aboutsummaryrefslogtreecommitdiff
path: root/src/drivers/intel/pmc_mux/conn
diff options
context:
space:
mode:
authorTim Wawrzynczak <twawrzynczak@chromium.org>2020-07-03 09:36:11 -0600
committerTim Wawrzynczak <twawrzynczak@chromium.org>2020-07-04 21:59:00 +0000
commite414ce45325d05dbdcc6b9b89b3703371a7d3411 (patch)
treefd883b75a01cf0f254ef361aad077f791fdb409e /src/drivers/intel/pmc_mux/conn
parent54be395a9bfab6871ed997b331affdc2a3d5c646 (diff)
drivers/intel/pmc_mux: Rename con driver to conn
For historical reasons, Windows has issues with certain names being used for files and directories, 'con' or 'CON' being one of them. Therefore, rename the pmc_mux/con driver to pmc_mux/conn in order to work around this issue. TEST=built volteer (only user of this driver as of now) Signed-off-by: Tim Wawrzynczak <twawrzynczak@chromium.org> Change-Id: Ia78dc4efe647c96a7169a3b95fc3b8944d052c83 Reviewed-on: https://review.coreboot.org/c/coreboot/+/43090 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Angel Pons <th3fanbus@gmail.com> Reviewed-by: Caveh Jalali <caveh@chromium.org>
Diffstat (limited to 'src/drivers/intel/pmc_mux/conn')
-rw-r--r--src/drivers/intel/pmc_mux/conn/Makefile.inc1
-rw-r--r--src/drivers/intel/pmc_mux/conn/chip.h26
-rw-r--r--src/drivers/intel/pmc_mux/conn/conn.c90
3 files changed, 117 insertions, 0 deletions
diff --git a/src/drivers/intel/pmc_mux/conn/Makefile.inc b/src/drivers/intel/pmc_mux/conn/Makefile.inc
new file mode 100644
index 0000000000..babca2f9bb
--- /dev/null
+++ b/src/drivers/intel/pmc_mux/conn/Makefile.inc
@@ -0,0 +1 @@
+ramstage-$(CONFIG_DRIVERS_INTEL_PMC) += conn.c
diff --git a/src/drivers/intel/pmc_mux/conn/chip.h b/src/drivers/intel/pmc_mux/conn/chip.h
new file mode 100644
index 0000000000..8497350337
--- /dev/null
+++ b/src/drivers/intel/pmc_mux/conn/chip.h
@@ -0,0 +1,26 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#ifndef __DRIVERS_INTEL_PMC_MUX_CONN_H__
+#define __DRIVERS_INTEL_PMC_MUX_CONN_H__
+
+enum typec_orientation {
+ /* The orientation of the signal follows the orientation of the CC lines. */
+ TYPEC_ORIENTATION_FOLLOW_CC = 0,
+ /* The orientation of the signal is fixed to follow CC1 */
+ TYPEC_ORIENTATION_NORMAL,
+ /* The orientation of the signal is fixed to follow CC2 */
+ TYPEC_ORIENTATION_REVERSE,
+};
+
+struct drivers_intel_pmc_mux_conn_config {
+ /* 1-based port numbers (from SoC point of view) */
+ int usb2_port_number;
+ /* 1-based port numbers (from SoC point of view) */
+ int usb3_port_number;
+ /* Orientation of the sideband signals (SBU) */
+ enum typec_orientation sbu_orientation;
+ /* Orientation of the High Speed lines */
+ enum typec_orientation hsl_orientation;
+};
+
+#endif /* __DRIVERS_INTEL_PMC_MUX_CONN_H__ */
diff --git a/src/drivers/intel/pmc_mux/conn/conn.c b/src/drivers/intel/pmc_mux/conn/conn.c
new file mode 100644
index 0000000000..16d113bcb1
--- /dev/null
+++ b/src/drivers/intel/pmc_mux/conn/conn.c
@@ -0,0 +1,90 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#include <acpi/acpigen.h>
+#include <console/console.h>
+#include <intelblocks/acpi.h>
+#include "chip.h"
+
+static const char *conn_acpi_name(const struct device *dev)
+{
+ static char name[5];
+ snprintf(name, sizeof(name), "CON%1X", dev->path.generic.id);
+ return name;
+}
+
+static const char *orientation_to_str(enum typec_orientation ori)
+{
+ switch (ori) {
+ case TYPEC_ORIENTATION_NORMAL:
+ return "normal";
+ case TYPEC_ORIENTATION_REVERSE:
+ return "reverse";
+ case TYPEC_ORIENTATION_FOLLOW_CC: /* Intentional fallthrough */
+ default:
+ return "";
+ }
+}
+
+static void conn_fill_ssdt(const struct device *dev)
+{
+ struct drivers_intel_pmc_mux_conn_config *config = dev->chip_info;
+ struct acpi_dp *dsd;
+ const char *scope;
+ const char *name;
+
+ if (!dev->enabled)
+ return;
+
+ /* Reference the existing scope and write CONx device */
+ scope = acpi_device_scope(dev);
+ name = acpi_device_name(dev);
+ if (!scope || !name)
+ return;
+
+ acpigen_write_scope(scope);
+ acpigen_write_device(name);
+
+ acpigen_write_name_integer("_ADR", dev->path.generic.id);
+
+ /* _DSD, Device-Specific Data */
+ dsd = acpi_dp_new_table("_DSD");
+ acpi_dp_add_integer(dsd, "usb2-port-number", config->usb2_port_number);
+ acpi_dp_add_integer(dsd, "usb3-port-number", config->usb3_port_number);
+
+ /*
+ * The kernel assumes that these Type-C signals (SBUs and HSLs) follow the CC lines,
+ * unless they are explicitly called out otherwise.
+ */
+ if (config->sbu_orientation != TYPEC_ORIENTATION_FOLLOW_CC)
+ acpi_dp_add_string(dsd, "sbu-orientation",
+ orientation_to_str(config->sbu_orientation));
+
+ if (config->hsl_orientation != TYPEC_ORIENTATION_FOLLOW_CC)
+ acpi_dp_add_string(dsd, "hsl-orientation",
+ orientation_to_str(config->hsl_orientation));
+
+ acpi_dp_write(dsd);
+
+ acpigen_pop_len(); /* CONx Device */
+ acpigen_pop_len(); /* Scope */
+
+ printk(BIOS_INFO, "%s: %s at %s\n", acpi_device_path(dev), dev->chip_ops->name,
+ dev_path(dev));
+}
+
+static struct device_operations conn_dev_ops = {
+ .read_resources = noop_read_resources,
+ .set_resources = noop_set_resources,
+ .acpi_name = conn_acpi_name,
+ .acpi_fill_ssdt = conn_fill_ssdt,
+};
+
+static void conn_enable(struct device *dev)
+{
+ dev->ops = &conn_dev_ops;
+}
+
+struct chip_operations drivers_intel_pmc_mux_conn_ops = {
+ CHIP_NAME("Intel PMC MUX CONN Driver")
+ .enable_dev = conn_enable,
+};