intel/kunimitsu: add nhlt support
Provide an option for including the NHLT blobs within the kunimitsu mainboard directory while also adding the ACPI NHLT table generation that the current hardware supports. Kunimitsu does support two audio codec, ADI and MAXIM, hence use AUDIO_DB_ID to read correct codec and craete NHLT table, this will also help to load only one amplifier ASL for machine driver consumption. BUG=chrome-os-partner:44481 BRANCH=None TEST=Built and booted kunimitsu board. Audio worked with both ADI and MAXIM audio card. CQ-DEPEND=CL:316352 Change-Id: Ic9b9af83a0229fdf5f1cb019245ae65ad9d2f06c Signed-off-by: Patrick Georgi <pgeorgi@chromium.org> Original-Commit-Id: 2db85062d65c5e831da297588aa4abb18d6ed1bb Original-Change-Id: I3b08f3f23b334799a81cde81a30d6f231cc8583f Original-Signed-off-by: Naresh G Solanki <Naresh.Solanki@intel.com> Original-Signed-off-by: Subrata Banik <subrata.banik@intel.com> Original-Reviewed-on: https://chromium-review.googlesource.com/315450 Original-Reviewed-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: https://review.coreboot.org/12959 Tested-by: build bot (Jenkins) Reviewed-by: Martin Roth <martinroth@google.com>
This commit is contained in:
parent
7846e34c02
commit
06b0098c5b
|
@ -51,4 +51,12 @@ config MAX_CPUS
|
||||||
int
|
int
|
||||||
default 8
|
default 8
|
||||||
|
|
||||||
|
config INCLUDE_NHLT_BLOBS
|
||||||
|
bool "Include blobs for audio."
|
||||||
|
select NHLT_DMIC_2CH
|
||||||
|
select NHLT_DMIC_4CH
|
||||||
|
select NHLT_MAX98357
|
||||||
|
select NHLT_NAU88L25
|
||||||
|
select NHLT_SSM4567
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -80,7 +80,12 @@ Scope (\_SB)
|
||||||
|
|
||||||
Method (_STA)
|
Method (_STA)
|
||||||
{
|
{
|
||||||
|
/* AUDIO_DB_ID = 0 If MAXIM Codec Present */
|
||||||
|
If (LEqual (\_SB.PCI0.GRXS (AUDIO_DB_ID), 0x0)) {
|
||||||
Return (0xF)
|
Return (0xF)
|
||||||
|
} Else {
|
||||||
|
Return (0x0)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -261,7 +266,12 @@ Scope (\_SB.PCI0.I2C4)
|
||||||
|
|
||||||
Method (_STA)
|
Method (_STA)
|
||||||
{
|
{
|
||||||
|
/* AUDIO_DB_ID = 1 If ADI Codec Present */
|
||||||
|
If (LEqual (GRXS (AUDIO_DB_ID), 0x1)) {
|
||||||
Return (0xF)
|
Return (0xF)
|
||||||
|
} Else {
|
||||||
|
Return (0x0)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -285,7 +295,12 @@ Scope (\_SB.PCI0.I2C4)
|
||||||
|
|
||||||
Method (_STA)
|
Method (_STA)
|
||||||
{
|
{
|
||||||
|
/* AUDIO_DB_ID = 1 If ADI Codec Present */
|
||||||
|
If (LEqual (GRXS (AUDIO_DB_ID), 0x1)) {
|
||||||
Return (0xF)
|
Return (0xF)
|
||||||
|
} Else {
|
||||||
|
Return (0x0)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,15 +15,72 @@
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <arch/acpi.h>
|
||||||
|
#include <console/console.h>
|
||||||
#include <device/device.h>
|
#include <device/device.h>
|
||||||
|
#include <gpio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <soc/nhlt.h>
|
||||||
#include "ec.h"
|
#include "ec.h"
|
||||||
|
#include "gpio.h"
|
||||||
|
|
||||||
static void mainboard_init(device_t dev)
|
static void mainboard_init(device_t dev)
|
||||||
{
|
{
|
||||||
mainboard_ec_init();
|
mainboard_ec_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint8_t select_audio_codec(void)
|
||||||
|
{
|
||||||
|
int audio_db_sel = gpio_get(AUDIO_DB_ID);
|
||||||
|
|
||||||
|
return audio_db_sel;
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned long mainboard_write_acpi_tables(
|
||||||
|
device_t device, unsigned long current, acpi_rsdp_t *rsdp)
|
||||||
|
{
|
||||||
|
uintptr_t start_addr;
|
||||||
|
uintptr_t end_addr;
|
||||||
|
struct nhlt *nhlt;
|
||||||
|
|
||||||
|
start_addr = current;
|
||||||
|
|
||||||
|
nhlt = nhlt_init();
|
||||||
|
|
||||||
|
if (nhlt == NULL)
|
||||||
|
return start_addr;
|
||||||
|
|
||||||
|
/* 2 Channel DMIC array. */
|
||||||
|
if (nhlt_soc_add_dmic_array(nhlt, 2))
|
||||||
|
printk(BIOS_ERR, "Couldn't add 2CH DMIC array.\n");
|
||||||
|
|
||||||
|
|
||||||
|
/* 4 Channel DMIC array. */
|
||||||
|
if (nhlt_soc_add_dmic_array(nhlt, 4))
|
||||||
|
printk(BIOS_ERR, "Couldn't add 4CH DMIC arrays.\n");
|
||||||
|
|
||||||
|
if (select_audio_codec()) {
|
||||||
|
/* ADI Smart Amps for left and right. */
|
||||||
|
if (nhlt_soc_add_ssm4567(nhlt, AUDIO_LINK_SSP0))
|
||||||
|
printk(BIOS_ERR, "Couldn't add ssm4567.\n");
|
||||||
|
} else {
|
||||||
|
/* MAXIM Smart Amps for left and right. */
|
||||||
|
if (nhlt_soc_add_max98357(nhlt, AUDIO_LINK_SSP0))
|
||||||
|
printk(BIOS_ERR, "Couldn't add max98357.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* NAU88l25 Headset codec. */
|
||||||
|
if (nhlt_soc_add_nau88l25(nhlt, AUDIO_LINK_SSP1))
|
||||||
|
printk(BIOS_ERR, "Couldn't add headset codec.\n");
|
||||||
|
|
||||||
|
end_addr = nhlt_soc_serialize(nhlt, start_addr);
|
||||||
|
|
||||||
|
if (end_addr != start_addr)
|
||||||
|
acpi_add_table(rsdp, (void *)start_addr);
|
||||||
|
|
||||||
|
return end_addr;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* mainboard_enable is executed as first thing after
|
* mainboard_enable is executed as first thing after
|
||||||
* enumerate_buses().
|
* enumerate_buses().
|
||||||
|
@ -31,6 +88,7 @@ static void mainboard_init(device_t dev)
|
||||||
static void mainboard_enable(device_t dev)
|
static void mainboard_enable(device_t dev)
|
||||||
{
|
{
|
||||||
dev->ops->init = mainboard_init;
|
dev->ops->init = mainboard_init;
|
||||||
|
dev->ops->write_acpi_tables = mainboard_write_acpi_tables;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct chip_operations mainboard_ops = {
|
struct chip_operations mainboard_ops = {
|
||||||
|
|
Loading…
Reference in New Issue