diff options
-rw-r--r-- | src/drivers/amd/i2s_machine_dev/chip.h | 5 | ||||
-rw-r--r-- | src/drivers/amd/i2s_machine_dev/i2s_machine_dev.c | 57 |
2 files changed, 34 insertions, 28 deletions
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 */ |