From 8c5f3ebbdf4d961dd5b72fa02f5a50bc58aedad6 Mon Sep 17 00:00:00 2001 From: Karthikeyan Ramasubramanian Date: Thu, 15 Apr 2021 14:43:16 -0600 Subject: drivers/amd/i2s_machine_dev: Make DMIC select gpio optional The selector component in Sound Open Firmware (SOF) can consume all the mics and use the configuration in the Use Case Manager (UCM) to select the right channel. Hence dmic select gpio configuration is optional. BUG=b:182960979 TEST=Build and boot to OS in Guybrush. Ensure that the machine driver ACPI object is populated without DMIC select GPIO. Change-Id: Iba00b07c3656c487e33bab184fefee7037745e2d Signed-off-by: Karthikeyan Ramasubramanian Reviewed-on: https://review.coreboot.org/c/coreboot/+/52393 Reviewed-by: Furquan Shaikh Tested-by: build bot (Jenkins) --- src/drivers/amd/i2s_machine_dev/chip.h | 5 +- src/drivers/amd/i2s_machine_dev/i2s_machine_dev.c | 57 ++++++++++++----------- 2 files changed, 34 insertions(+), 28 deletions(-) (limited to 'src/drivers/amd') diff --git a/src/drivers/amd/i2s_machine_dev/chip.h b/src/drivers/amd/i2s_machine_dev/chip.h index 5d3a423b43..0ca00a8424 100644 --- a/src/drivers/amd/i2s_machine_dev/chip.h +++ b/src/drivers/amd/i2s_machine_dev/chip.h @@ -12,7 +12,10 @@ struct drivers_amd_i2s_machine_dev_config { /* ACPI _UID */ unsigned int uid; - /* DMIC select GPIO (required) */ + /* + * DMIC select GPIO (optional). Needs to be configured if the audio framework cannot use + * all the mics and select the right channel based on the use-case. + */ struct acpi_gpio dmic_select_gpio; }; diff --git a/src/drivers/amd/i2s_machine_dev/i2s_machine_dev.c b/src/drivers/amd/i2s_machine_dev/i2s_machine_dev.c index b5be31d038..7bd256d97b 100644 --- a/src/drivers/amd/i2s_machine_dev/i2s_machine_dev.c +++ b/src/drivers/amd/i2s_machine_dev/i2s_machine_dev.c @@ -9,10 +9,37 @@ #define AMD_I2S_ACPI_DESC "I2S machine driver" +static void i2s_machine_dev_fill_crs_dsd(const char *path, + const struct acpi_gpio *dmic_select_gpio) +{ + struct acpi_dp *dsd; + + /* Resources */ + acpigen_write_name("_CRS"); + acpigen_write_resourcetemplate_header(); + acpi_device_write_gpio(dmic_select_gpio); + acpigen_write_resourcetemplate_footer(); + + dsd = acpi_dp_new_table("_DSD"); + /* + * This GPIO is used to select DMIC0 or DMIC1 by the kernel driver. It does not + * really have a polarity since low and high control the selection of DMIC and + * hence does not have an active polarity. + * Kernel driver does not use the polarity field and instead treats the GPIO + * selection as follows: + * Set low (0) = Select DMIC0 + * Set high (1) = Select DMIC1 + */ + acpi_dp_add_gpio(dsd, "dmic-gpios", path, + 0, /* Index = 0 (There is a single GPIO entry in _CRS). */ + 0, /* Pin = 0 (There is a single pin in the GPIO resource). */ + 0); /* Active low = 0 (Kernel driver does not use active polarity). */ + acpi_dp_write(dsd); +} + static void i2s_machine_dev_fill_ssdt(const struct device *dev) { const char *scope = acpi_device_scope(dev); - struct acpi_dp *dsd; const struct acpi_gpio *dmic_select_gpio; const struct drivers_amd_i2s_machine_dev_config *cfg; const char *path = acpi_device_path(dev); @@ -31,11 +58,6 @@ static void i2s_machine_dev_fill_ssdt(const struct device *dev) return; } - if (dmic_select_gpio->pin_count == 0) { - printk(BIOS_ERR, "%s: ERROR: DMIC select GPIO required\n", dev_path(dev)); - return; - } - acpigen_write_scope(scope); /* Scope */ acpigen_write_device(acpi_device_name(dev)); /* Device */ acpigen_write_name_string("_HID", cfg->hid); @@ -44,27 +66,8 @@ static void i2s_machine_dev_fill_ssdt(const struct device *dev) acpigen_write_STA(acpi_device_status(dev)); - /* Resources */ - acpigen_write_name("_CRS"); - acpigen_write_resourcetemplate_header(); - acpi_device_write_gpio(dmic_select_gpio); - acpigen_write_resourcetemplate_footer(); - - dsd = acpi_dp_new_table("_DSD"); - /* - * This GPIO is used to select DMIC0 or DMIC1 by the kernel driver. It does not - * really have a polarity since low and high control the selection of DMIC and - * hence does not have an active polarity. - * Kernel driver does not use the polarity field and instead treats the GPIO - * selection as follows: - * Set low (0) = Select DMIC0 - * Set high (1) = Select DMIC1 - */ - acpi_dp_add_gpio(dsd, "dmic-gpios", path, - 0, /* Index = 0 (There is a single GPIO entry in _CRS). */ - 0, /* Pin = 0 (There is a single pin in the GPIO resource). */ - 0); /* Active low = 0 (Kernel driver does not use active polarity). */ - acpi_dp_write(dsd); + if (dmic_select_gpio->pin_count) + i2s_machine_dev_fill_crs_dsd(path, dmic_select_gpio); acpigen_pop_len(); /* Device */ acpigen_pop_len(); /* Scope */ -- cgit v1.2.3