diff --git a/src/mainboard/google/skywalker/chromeos.c b/src/mainboard/google/skywalker/chromeos.c index 26f06442d9..9b5a9c0745 100644 --- a/src/mainboard/google/skywalker/chromeos.c +++ b/src/mainboard/google/skywalker/chromeos.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include "gpio.h" @@ -31,6 +32,7 @@ void setup_chromeos_gpios(void) gpio_output(GPIO_AP_FP_FW_UP_STRAP, 0); gpio_output(GPIO_EN_PWR_FP, 0); gpio_output(GPIO_FP_RST_1V8_S3_L, 0); + gpio_output(GPIO_EN_SPKR, 0); } void fill_lb_gpios(struct lb_gpios *gpios) @@ -48,6 +50,13 @@ void fill_lb_gpios(struct lb_gpios *gpios) }; lb_add_gpios(gpios, sd_card_gpios, ARRAY_SIZE(sd_card_gpios)); } + + if (fw_config_probe(FW_CONFIG(AUDIO_AMP, AMP_RT9123))) { + struct lb_gpio rt9123_gpios[] = { + {GPIO_EN_SPKR.id, ACTIVE_HIGH, -1, "rt9123_spk_en"}, + }; + lb_add_gpios(gpios, rt9123_gpios, ARRAY_SIZE(rt9123_gpios)); + } } int cr50_plat_irq_status(void) diff --git a/src/mainboard/google/skywalker/devicetree.cb b/src/mainboard/google/skywalker/devicetree.cb index c76b4e6141..6ec4e25c37 100644 --- a/src/mainboard/google/skywalker/devicetree.cb +++ b/src/mainboard/google/skywalker/devicetree.cb @@ -3,3 +3,9 @@ chip soc/mediatek/mt8189 device cpu_cluster 0 on end end + +fw_config + field AUDIO_AMP 25 27 + option AMP_RT9123 0 + end +end diff --git a/src/mainboard/google/skywalker/gpio.h b/src/mainboard/google/skywalker/gpio.h index 8a1925a635..208a3d9ef0 100644 --- a/src/mainboard/google/skywalker/gpio.h +++ b/src/mainboard/google/skywalker/gpio.h @@ -27,6 +27,10 @@ #define GPIO_SD_CD_ODL GPIO(GBE_INTR) #define GPIO_HDMI_HPD_1V8_ODL GPIO(CONN_TOP_CLK) #define GPIO_AP_HDMI_RST_ODL GPIO(GBE_TXC) +#define GPIO_EN_SPKR GPIO(GPIO05) +#define GPIO_I2SOUT1_BCK GPIO(DMIC0_DAT0) +#define GPIO_I2SOUT1_LRCK GPIO(DMIC1_CLK) +#define GPIO_I2SOUT1_DOUT GPIO(DMIC1_DAT0) void setup_chromeos_gpios(void); diff --git a/src/mainboard/google/skywalker/mainboard.c b/src/mainboard/google/skywalker/mainboard.c index 74c3ea715f..f6dc5cafa2 100644 --- a/src/mainboard/google/skywalker/mainboard.c +++ b/src/mainboard/google/skywalker/mainboard.c @@ -1,16 +1,45 @@ /* SPDX-License-Identifier: GPL-2.0-only OR MIT */ #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_rt9123(void) +{ + /* SoC I2S */ + gpio_set_mode(GPIO_I2SOUT1_BCK, GPIO_FUNC(DMIC0_DAT0, I2SOUT1_BCK)); + gpio_set_mode(GPIO_I2SOUT1_LRCK, GPIO_FUNC(DMIC1_CLK, I2SOUT1_LRCK)); + gpio_set_mode(GPIO_I2SOUT1_DOUT, GPIO_FUNC(DMIC1_DAT0, I2SOUT1_DO)); + + printk(BIOS_INFO, "%s: AMP configuration done\n", __func__); +} + +static void configure_audio(void) +{ + mtcmos_audio_power_on(); + mtcmos_protect_audio_bus(); + + /* Switch to normal mode */ + write32p(AFE_SE_SECURE_CON1, 0x0); + + if (fw_config_probe(FW_CONFIG(AUDIO_AMP, AMP_RT9123))) + configure_rt9123(); + else + printk(BIOS_WARNING, "Unknown amp\n"); +} + static void power_on_fpmcu(void) { /* Power on the fingerprint MCU */ @@ -24,6 +53,7 @@ static void mainboard_init(struct device *dev) setup_usb_host(); spm_init(); power_on_fpmcu(); + configure_audio(); if (CONFIG(SKYWALKER_SDCARD_INIT)) mtk_msdc_configure_sdcard();