| /* SPDX-License-Identifier: GPL-2.0-only */ |
| |
| #include <acpi/acpi_device.h> |
| #include <acpi/acpigen.h> |
| #include <device/device.h> |
| #include <device/path.h> |
| #include <string.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 = { |
| CHIP_NAME("SOF") |
| .enable_dev = sof_enable |
| }; |