diff --git a/src/mainboard/google/rauru/chromeos.c b/src/mainboard/google/rauru/chromeos.c index 7f2fd0587f..f530396eb3 100644 --- a/src/mainboard/google/rauru/chromeos.c +++ b/src/mainboard/google/rauru/chromeos.c @@ -2,6 +2,7 @@ #include #include +#include #include #include "gpio.h" @@ -24,9 +25,7 @@ void fill_lb_gpios(struct lb_gpios *gpios) { struct lb_gpio chromeos_gpios[] = { { GPIO_XHCI_INIT_DONE.id, ACTIVE_HIGH, -1, "XHCI init done" }, - { GPIO_EN_SPKR.id, ACTIVE_HIGH, -1, "speaker enable" }, { GPIO_EC_AP_INT_ODL.id, ACTIVE_LOW, -1, "EC interrupt" }, - { GPIO_BEEP_ON_OD.id, ACTIVE_HIGH, -1, "beep enable" }, { GPIO_GSC_AP_INT_ODL.id, ACTIVE_HIGH, -1, "TPM interrupt" }, }; lb_add_gpios(gpios, chromeos_gpios, ARRAY_SIZE(chromeos_gpios)); @@ -37,6 +36,20 @@ void fill_lb_gpios(struct lb_gpios *gpios) }; lb_add_gpios(gpios, sd_card_gpios, ARRAY_SIZE(sd_card_gpios)); } + + struct lb_gpio nau8318_gpios[] = { + {GPIO_EN_SPKR.id, ACTIVE_HIGH, -1, "speaker enable"}, + {GPIO_BEEP_ON_OD.id, ACTIVE_HIGH, -1, "beep enable"}, + }; + + struct lb_gpio smartamp_gpios[] = { + {GPIO_EN_SPKR.id, ACTIVE_LOW, -1, "speaker reset"}, + }; + + if (fw_config_probe(FW_CONFIG(AUDIO_AMP, AMP_TAS2563))) + lb_add_gpios(gpios, smartamp_gpios, ARRAY_SIZE(smartamp_gpios)); + else + lb_add_gpios(gpios, nau8318_gpios, ARRAY_SIZE(nau8318_gpios)); } int cr50_plat_irq_status(void) diff --git a/src/mainboard/google/rauru/devicetree.cb b/src/mainboard/google/rauru/devicetree.cb index df65b3f24b..7f6dc590de 100644 --- a/src/mainboard/google/rauru/devicetree.cb +++ b/src/mainboard/google/rauru/devicetree.cb @@ -1,5 +1,12 @@ ## SPDX-License-Identifier: GPL-2.0-only +fw_config + field AUDIO_AMP 28 29 + option AMP_NAU8318 0 + option AMP_TAS2563 1 + end +end + chip soc/mediatek/mt8196 device cpu_cluster 0 on end diff --git a/src/mainboard/google/rauru/gpio.h b/src/mainboard/google/rauru/gpio.h index d513dceab8..6191e056d6 100644 --- a/src/mainboard/google/rauru/gpio.h +++ b/src/mainboard/google/rauru/gpio.h @@ -16,6 +16,10 @@ #define GPIO_AP_FP_FW_UP_STRAP GPIO(EINT27) #define GPIO_EN_PWR_FP GPIO(PERIPHERAL_EN3) +#define GPIO_I2SI4_BCK GPIO(I2SIN1_BCK) +#define GPIO_I2SI4_LRCK GPIO(I2SIN1_LRCK) +#define GPIO_I2SO4_D0 GPIO(I2SOUT1_DO) + void setup_chromeos_gpios(void); #endif diff --git a/src/mainboard/google/rauru/mainboard.c b/src/mainboard/google/rauru/mainboard.c index 94a257fe3c..9c238c789b 100644 --- a/src/mainboard/google/rauru/mainboard.c +++ b/src/mainboard/google/rauru/mainboard.c @@ -2,14 +2,41 @@ #include #include +#include #include +#include #include #include +#include +#include #include #include #include "gpio.h" +#define AFE_SE_SECURE_CON1 (AUDIO_BASE + 0x5634) + +static void configure_i2s(void) +{ + /* Switch to normal mode */ + write32p(AFE_SE_SECURE_CON1, 0x0); + + /* SoC I2S */ + gpio_set_mode(GPIO_I2SI4_BCK, GPIO_FUNC(I2SIN1_BCK, I2SIN4_BCK)); + gpio_set_mode(GPIO_I2SI4_LRCK, GPIO_FUNC(I2SIN1_LRCK, I2SIN4_LRCK)); + gpio_set_mode(GPIO_I2SO4_D0, GPIO_FUNC(I2SOUT1_DO, I2SOUT4_DATA0)); +} + +static void configure_audio(void) +{ + if (fw_config_probe(FW_CONFIG(AUDIO_AMP, AMP_TAS2563))) { + mtk_i2c_bus_init(I2C3, I2C_SPEED_FAST); + configure_i2s(); + } + + printk(BIOS_INFO, "%s: done\n", __func__); +} + static void power_on_fpmcu(void) { /* Power on the fingerprint MCU */ @@ -26,6 +53,7 @@ static void mainboard_init(struct device *dev) { setup_usb_host(); power_on_fpmcu(); + configure_audio(); if (dpm_init()) printk(BIOS_ERR, "dpm init failed, DVFS may not work\n");