drivers/sof: Add new driver to generate ACPI _DSD table
Add a new chip driver for boards which use SOF (Sound Open Firmware) OS drivers, which will be attached to the HDAS device and generate entries in an ACPI _DSD table for the OS driver to use. This will allow the OS drivers to easily determine the correct topology for the speaker and jack amplifiers and correct microphone configuration. TEST=tested with rest of patch train Change-Id: Ie0431b2002287f35245cbf959828e931d7f375b2 Signed-off-by: Matt DeVillier <matt.devillier@gmail.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/74813 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: CoolStar <coolstarorganization@gmail.com> Reviewed-by: Martin Roth <martin.roth@amd.corp-partner.google.com>
This commit is contained in:
committed by
Matt DeVillier
parent
ab05964b91
commit
3a4ac3a85e
85
src/drivers/sof/sof.c
Normal file
85
src/drivers/sof/sof.c
Normal file
@@ -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
|
||||
};
|
Reference in New Issue
Block a user