aboutsummaryrefslogtreecommitdiff
path: root/src/mainboard/google/octopus/variants
diff options
context:
space:
mode:
authorMarco Chen <marcochen@google.com>2020-12-21 22:10:21 +0800
committerFurquan Shaikh <furquan@google.com>2021-01-08 14:29:31 +0000
commit07c80b2164ef924bdd158144e21cf4c2b5f3d22d (patch)
tree5dd842b902872e54a4e2725db72c89662fcba2b6 /src/mainboard/google/octopus/variants
parent3f80a7aa6db62c16a724b86dfdcfe6202859e6e8 (diff)
mb/google/octopus: add audio codec into SSFC support for Bobba
BUG=b:174118027 BRANCH=octopus TEST=adjust SSFC value of CBI to select RT5682 or DA7219 then check whether device tree is updated correspondingly by disabling unselected one. Signed-off-by: Marco Chen <marcochen@google.com> Change-Id: Id37c4c5716ade0851cfcb24e12b390841e633ac9 Reviewed-on: https://review.coreboot.org/c/coreboot/+/48795 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Zhuohao Lee <zhuohao@chromium.org>
Diffstat (limited to 'src/mainboard/google/octopus/variants')
-rw-r--r--src/mainboard/google/octopus/variants/baseboard/Makefile.inc1
-rw-r--r--src/mainboard/google/octopus/variants/baseboard/cbi_ssfc.c70
-rw-r--r--src/mainboard/google/octopus/variants/baseboard/include/baseboard/cbi_ssfc.h38
-rw-r--r--src/mainboard/google/octopus/variants/baseboard/nhlt.c7
-rw-r--r--src/mainboard/google/octopus/variants/bobba/gpio.c8
-rw-r--r--src/mainboard/google/octopus/variants/bobba/overridetree.cb13
6 files changed, 135 insertions, 2 deletions
diff --git a/src/mainboard/google/octopus/variants/baseboard/Makefile.inc b/src/mainboard/google/octopus/variants/baseboard/Makefile.inc
index 63b03a6118..f28c3d6ce5 100644
--- a/src/mainboard/google/octopus/variants/baseboard/Makefile.inc
+++ b/src/mainboard/google/octopus/variants/baseboard/Makefile.inc
@@ -4,5 +4,6 @@ romstage-y += memory.c
ramstage-y += gpio.c
ramstage-y += nhlt.c
+ramstage-y += cbi_ssfc.c
smm-y += gpio.c
diff --git a/src/mainboard/google/octopus/variants/baseboard/cbi_ssfc.c b/src/mainboard/google/octopus/variants/baseboard/cbi_ssfc.c
new file mode 100644
index 0000000000..589f92e139
--- /dev/null
+++ b/src/mainboard/google/octopus/variants/baseboard/cbi_ssfc.c
@@ -0,0 +1,70 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#include <baseboard/cbi_ssfc.h>
+#include <console/console.h>
+#include <ec/google/chromeec/ec.h>
+
+static int get_ssfc(uint32_t *val)
+{
+ static uint32_t known_value;
+ static enum {
+ SSFC_NOT_READ,
+ SSFC_AVAILABLE,
+ } ssfc_state = SSFC_NOT_READ;
+
+ if (ssfc_state == SSFC_AVAILABLE) {
+ *val = known_value;
+ return 0;
+ }
+
+ /*
+ * If SSFC field is not in the CBI then the value of SSFC will be 0 for
+ * further processing later since 0 of each bits group means default
+ * component in a variant. For more detail, please refer to cbi_ssfc.h.
+ */
+ if (google_chromeec_cbi_get_ssfc(&known_value) != 0) {
+ printk(BIOS_DEBUG, "SSFC not set in CBI\n");
+ return -1;
+ }
+
+ ssfc_state = SSFC_AVAILABLE;
+ *val = known_value;
+ printk(BIOS_INFO, "SSFC 0x%x.\n", known_value);
+
+ return 0;
+}
+
+static unsigned int extract_field(uint32_t mask, int shift)
+{
+ uint32_t ssfc;
+
+ /* On errors nothing is assumed to be set. */
+ if (get_ssfc(&ssfc))
+ return 0;
+
+ return (ssfc >> shift) & mask;
+}
+
+static enum ssfc_audio_codec ssfc_get_default_audio_codec(void)
+{
+ /*
+ * Octopus has two reference boards; yorp is with DA7219 and bip is with
+ * RT5682. Currently only AMPTON derived from bip so only it uses
+ * RT5682 as the default source in the first MP devices.
+ */
+ if (CONFIG(BOARD_GOOGLE_AMPTON))
+ return SSFC_AUDIO_CODEC_RT5682;
+
+ return SSFC_AUDIO_CODEC_DA7219;
+}
+
+enum ssfc_audio_codec ssfc_get_audio_codec(void)
+{
+ uint32_t codec = extract_field(
+ SSFC_AUDIO_CODEC_MASK, SSFC_AUDIO_CODEC_OFFSET);
+
+ if (codec != SSFC_AUDIO_CODEC_DEFAULT)
+ return codec;
+
+ return ssfc_get_default_audio_codec();
+}
diff --git a/src/mainboard/google/octopus/variants/baseboard/include/baseboard/cbi_ssfc.h b/src/mainboard/google/octopus/variants/baseboard/include/baseboard/cbi_ssfc.h
new file mode 100644
index 0000000000..84020d7eb3
--- /dev/null
+++ b/src/mainboard/google/octopus/variants/baseboard/include/baseboard/cbi_ssfc.h
@@ -0,0 +1,38 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef _OCTOPUS_CBI_SSFC__H_
+#define _OCTOPUS_CBI_SSFC__H_
+
+#include <inttypes.h>
+
+/****************************************************************************
+ * Octopus CBI Second Source Factory Cache
+ *
+ * SSFC was introduced after variants were MPed already so we can expect there
+ * can be devices in the field without SSFC field in the CBI. For devices
+ * without SSFC field in the CBI, the value of SSFC will be 0 set by get_ssfc()
+ * in the cbi_ssfc.c.
+ *
+ * On the other hand, taking audio codec as the example there are two sources -
+ * DA7219 and RT5682 used in the MPed devices before introducing SSFC. As a
+ * result, the value 0 of each bits group for a specific component is defined as
+ * DEFAULT and different variants should transform this DEFAULT to one of
+ * sources they used as the first sources. In the example here, either DA7219 or
+ * RT5682 should be transformed.
+ */
+
+/*
+ * Audio Codec (Bits 9-11)
+ *
+ */
+enum ssfc_audio_codec {
+ SSFC_AUDIO_CODEC_DEFAULT,
+ SSFC_AUDIO_CODEC_DA7219,
+ SSFC_AUDIO_CODEC_RT5682,
+};
+#define SSFC_AUDIO_CODEC_OFFSET 9
+#define SSFC_AUDIO_CODEC_MASK 0x7
+
+enum ssfc_audio_codec ssfc_get_audio_codec(void);
+
+#endif /* _OCTOPUS_CBI_SSFC__H_ */
diff --git a/src/mainboard/google/octopus/variants/baseboard/nhlt.c b/src/mainboard/google/octopus/variants/baseboard/nhlt.c
index f1304f4720..9c9316c67a 100644
--- a/src/mainboard/google/octopus/variants/baseboard/nhlt.c
+++ b/src/mainboard/google/octopus/variants/baseboard/nhlt.c
@@ -1,5 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
+#include <baseboard/cbi_ssfc.h>
#include <baseboard/variants.h>
#include <console/console.h>
#include <nhlt.h>
@@ -7,6 +8,8 @@
void __weak variant_nhlt_init(struct nhlt *nhlt)
{
+ enum ssfc_audio_codec codec = ssfc_get_audio_codec();
+
/* 2 Channel DMIC array. */
if (!nhlt_soc_add_dmic_array(nhlt, 2))
printk(BIOS_ERR, "Added 2CH DMIC array.\n");
@@ -19,13 +22,13 @@ void __weak variant_nhlt_init(struct nhlt *nhlt)
* Headset codec is bi-directional but uses the same configuration
* settings for render and capture endpoints.
*/
- if (CONFIG(NHLT_DA7219)) {
+ if (CONFIG(NHLT_DA7219) && codec == SSFC_AUDIO_CODEC_DA7219) {
/* Dialog for Headset codec */
if (!nhlt_soc_add_da7219(nhlt, AUDIO_LINK_SSP2))
printk(BIOS_ERR, "Added Dialog_7219 codec.\n");
}
- if (CONFIG(NHLT_RT5682)) {
+ if (CONFIG(NHLT_RT5682) && codec == SSFC_AUDIO_CODEC_RT5682) {
/* Realtek for Headset codec */
if (!nhlt_soc_add_rt5682(nhlt, AUDIO_LINK_SSP2))
printk(BIOS_ERR, "Added ALC5682 codec.\n");
diff --git a/src/mainboard/google/octopus/variants/bobba/gpio.c b/src/mainboard/google/octopus/variants/bobba/gpio.c
index fd94377582..11fe9b5eec 100644
--- a/src/mainboard/google/octopus/variants/bobba/gpio.c
+++ b/src/mainboard/google/octopus/variants/bobba/gpio.c
@@ -17,6 +17,10 @@ enum {
static const struct pad_config default_override_table[] = {
PAD_NC(GPIO_104, UP_20K),
+ /* GPIO_137 -- HP_INT_ODL and would be amend by SSFC. */
+ PAD_CFG_GPI_APIC_IOS(GPIO_137, NONE, DEEP, LEVEL, INVERT, HIZCRx1,
+ DISPUPD),
+
/* EN_PP3300_TOUCHSCREEN */
PAD_CFG_GPO_IOSSTATE_IOSTERM(GPIO_146, 0, DEEP, NONE, Tx0RxDCRx0,
DISPUPD),
@@ -28,6 +32,10 @@ static const struct pad_config lte_override_table[] = {
/* Default override table. */
PAD_NC(GPIO_104, UP_20K),
+ /* GPIO_137 -- HP_INT_ODL and would be amend by SSFC. */
+ PAD_CFG_GPI_APIC_IOS(GPIO_137, NONE, DEEP, LEVEL, INVERT, HIZCRx1,
+ DISPUPD),
+
/* EN_PP3300_TOUCHSCREEN */
PAD_CFG_GPO_IOSSTATE_IOSTERM(GPIO_146, 0, DEEP, NONE, Tx0RxDCRx0,
DISPUPD),
diff --git a/src/mainboard/google/octopus/variants/bobba/overridetree.cb b/src/mainboard/google/octopus/variants/bobba/overridetree.cb
index 3c7187e048..73adfef9ab 100644
--- a/src/mainboard/google/octopus/variants/bobba/overridetree.cb
+++ b/src/mainboard/google/octopus/variants/bobba/overridetree.cb
@@ -165,6 +165,19 @@ chip soc/intel/apollolake
register "mic_amp_in_sel" = ""diff""
device i2c 1a on end
end
+ chip drivers/i2c/generic
+ register "hid" = ""10EC5682""
+ register "name" = ""RT58""
+ register "desc" = ""Realtek RT5682""
+ register "irq" = "ACPI_IRQ_LEVEL_LOW(GPIO_137_IRQ)"
+ register "probed" = "1"
+ register "property_count" = "1"
+ # Set the jd_src to RT5668_JD1 for jack detection
+ register "property_list[0].type" = "ACPI_DP_TYPE_INTEGER"
+ register "property_list[0].name" = ""realtek,jd-src""
+ register "property_list[0].integer" = "1"
+ device i2c 1a on end
+ end
end # - I2C 5
device pci 17.2 on
chip drivers/i2c/generic