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>
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 0000000..babca2f
--- /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 0000000..8497350
--- /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 0000000..16d113b
--- /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,
+};