| /* SPDX-License-Identifier: GPL-2.0-only */ | |
| #include <acpi/acpi_device.h> | |
| #include <acpi/acpigen.h> | |
| #include <device/device.h> | |
| #include "chip.h" | |
| static const char *get_spkr_tplg_str(enum _spkr_tplg tplg) | |
| { | |
| switch (tplg) { | |
| case max98373: return "max98373"; | |
| case max98373_ssp2: return "max98373-ssp2"; | |
| case max98360a: return "max98360a"; | |
| case max98357a: return "max98357a"; | |
| case max98357a_tdm: return "max98357a-tdm"; | |
| case max98390: return "max98390"; | |
| case rt1011: return "rt1011"; | |
| case rt1015: return "rt1015"; | |
| case rt1019: return "rt1019"; | |
| case rt5650_sp: return "rt5650"; | |
| default: return "default"; | |
| } | |
| } | |
| static const char *get_jack_tplg_str(enum _jack_tplg tplg) | |
| { | |
| switch (tplg) { | |
| case cs42l42: return "cs42l42"; | |
| case da7219: return "da7219"; | |
| case nau8825: return "nau8825"; | |
| case rt5650_hp: return "rt5650"; | |
| case rt5682: return "rt5682"; | |
| default: return "default"; | |
| } | |
| } | |
| static const char *get_mic_tplg_str(enum _mic_tplg tplg) | |
| { | |
| switch (tplg) { | |
| case _1ch: return "1ch"; | |
| case _2ch_pdm0: return "2ch-pdm0"; | |
| case _2ch_pdm1: return "2ch-pdm1"; | |
| case _4ch: return "4ch"; | |
| default: return "default"; | |
| } | |
| } | |
| static void sof_fill_ssdt_generator(const struct device *dev) | |
| { | |
| struct drivers_sof_config *config = dev->chip_info; | |
| const char *scope = acpi_device_scope(dev); | |
| struct acpi_dp *dsd; | |
| if (!dev->enabled || !config || !scope) | |
| return; | |
| /* Device */ | |
| acpigen_write_scope(scope); | |
| /* DSD */ | |
| dsd = acpi_dp_new_table("_DSD"); | |
| acpi_dp_add_string(dsd, "speaker-tplg", | |
| get_spkr_tplg_str(config->spkr_tplg)); | |
| acpi_dp_add_string(dsd, "hp-tplg", | |
| get_jack_tplg_str(config->jack_tplg)); | |
| acpi_dp_add_string(dsd, "mic-tplg", | |
| get_mic_tplg_str(config->mic_tplg)); | |
| acpi_dp_write(dsd); | |
| acpigen_pop_len(); /* Scope */ | |
| } | |
| static struct device_operations sof_ops = { | |
| .read_resources = noop_read_resources, | |
| .set_resources = noop_set_resources, | |
| .acpi_fill_ssdt = sof_fill_ssdt_generator, | |
| }; | |
| static void sof_enable(struct device *dev) | |
| { | |
| dev->ops = &sof_ops; | |
| } | |
| struct chip_operations drivers_sof_ops = { | |
| .name = "SOF", | |
| .enable_dev = sof_enable | |
| }; |