From 07c80b2164ef924bdd158144e21cf4c2b5f3d22d Mon Sep 17 00:00:00 2001 From: Marco Chen Date: Mon, 21 Dec 2020 22:10:21 +0800 Subject: 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 Change-Id: Id37c4c5716ade0851cfcb24e12b390841e633ac9 Reviewed-on: https://review.coreboot.org/c/coreboot/+/48795 Tested-by: build bot (Jenkins) Reviewed-by: Zhuohao Lee --- src/mainboard/google/octopus/mainboard.c | 79 ++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) (limited to 'src/mainboard/google/octopus/mainboard.c') diff --git a/src/mainboard/google/octopus/mainboard.c b/src/mainboard/google/octopus/mainboard.c index e6dbd0330b..91d29cf61c 100644 --- a/src/mainboard/google/octopus/mainboard.c +++ b/src/mainboard/google/octopus/mainboard.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-only */ #include +#include #include #include #include @@ -8,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -22,6 +24,9 @@ #include #include +extern struct chip_operations drivers_i2c_generic_ops; +extern struct chip_operations drivers_i2c_da7219_ops; + static bool is_cnvi_held_in_reset(void) { struct device *dev = pcidev_path_on_root(PCH_DEVFN_CNVI); @@ -46,6 +51,41 @@ static void disable_wifi_wake(void) gpio_configure_pads(wifi_wake_gpio, ARRAY_SIZE(wifi_wake_gpio)); } +/* + * GPIO_137 for two audio codecs right now has the different configuration so + * if SSFC indicates that codec is different than default one then GPIO_137 + * needs to be overridden for the corresponding second source. + */ +static void gpio_modification_by_ssfc(struct pad_config *table, size_t num) +{ + /* For RT5682, GPIO 137 should be set as EDGE_BOTH. */ + const struct pad_config rt5682_gpio_137 = PAD_CFG_GPI_APIC_IOS(GPIO_137, + NONE, DEEP, EDGE_BOTH, INVERT, HIZCRx1, DISPUPD); + + if (table == NULL || num == 0) + return; + + /* + * Currently we only have the case of RT5682 as the second source. And + * in case of Ampton which used RT5682 as the default source, it didn't + * provide override_table right now so it will be returned ealier since + * table above is NULL. + */ + if (ssfc_get_audio_codec() != SSFC_AUDIO_CODEC_RT5682) + return; + + while (num--) { + if (table->pad == GPIO_137) { + *table = rt5682_gpio_137; + printk(BIOS_INFO, + "Configure GPIO 137 based on SSFC.\n"); + return; + } + + table++; + } +} + static void mainboard_init(void *chip_info) { int boardid; @@ -58,6 +98,8 @@ static void mainboard_init(void *chip_info) base_pads = variant_base_gpio_table(&base_num); override_pads = variant_override_gpio_table(&override_num); + gpio_modification_by_ssfc((struct pad_config *)override_pads, + override_num); gpio_configure_pads_with_override(base_pads, base_num, override_pads, override_num); @@ -128,10 +170,47 @@ static void wifi_device_update(void) dev->enabled = 0; } +/* + * Base on SSFC value in the CBI from EC to enable one of audio codec sources in + * the device tree. + */ +static void audio_codec_device_update(void) +{ + struct device *audio_dev = NULL; + struct bus *audio_i2c_bus = + pcidev_path_on_root(PCH_DEVFN_I2C5)->link_list; + enum ssfc_audio_codec codec = ssfc_get_audio_codec(); + + while ((audio_dev = dev_bus_each_child(audio_i2c_bus, audio_dev))) { + if (audio_dev->chip_info == NULL) + continue; + + if ((audio_dev->chip_ops == &drivers_i2c_da7219_ops) && + (codec == SSFC_AUDIO_CODEC_DA7219)) { + printk(BIOS_INFO, "enable DA7219.\n"); + continue; + } + + if ((audio_dev->chip_ops == &drivers_i2c_generic_ops) && + (codec == SSFC_AUDIO_CODEC_RT5682)) { + struct drivers_i2c_generic_config *cfg = + audio_dev->chip_info; + + if (cfg != NULL && !strcmp(cfg->hid, "10EC5682")) { + printk(BIOS_INFO, "enable RT5682.\n"); + continue; + } + } + + audio_dev->enabled = 0; + } +} + void mainboard_devtree_update(struct device *dev) { /* Apply common devtree updates. */ wifi_device_update(); + audio_codec_device_update(); /* Defer to variant for board-specific updates. */ variant_update_devtree(dev); -- cgit v1.2.3