summaryrefslogtreecommitdiff
path: root/src/drivers/sof/sof.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/sof/sof.c')
-rw-r--r--src/drivers/sof/sof.c85
1 files changed, 85 insertions, 0 deletions
diff --git a/src/drivers/sof/sof.c b/src/drivers/sof/sof.c
new file mode 100644
index 0000000000..d11f7300c0
--- /dev/null
+++ b/src/drivers/sof/sof.c
@@ -0,0 +1,85 @@
+/* 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(unsigned int index)
+{
+ switch (index) {
+ case 1: return "max98373";
+ case 2: return "max98360a";
+ case 3: return "max98357a";
+ case 4: return "max98390";
+ case 5: return "rt1011";
+ case 6: return "rt1015";
+ default: return "default";
+ }
+}
+
+static const char *get_jack_tplg_str(unsigned int index)
+{
+ switch (index) {
+ case 1: return "cs42l42";
+ case 2: return "da7219";
+ case 3: return "nau8825";
+ case 4: return "rt5682";
+ default: return "default";
+ }
+}
+
+static const char *get_mic_tplg_str(unsigned int index)
+{
+ switch (index) {
+ case 1: return "1ch";
+ case 2: return "2ch-pdm0";
+ case 3: return "2ch-pdm1";
+ case 4: 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
+};