mainboard/intel/cannonlake_rvp: Add support for MAX98373 speaker amp

Add NHLT and dt support for max98373 amp

BUG=None
TEST=check SSDT and verify entries for max98373
TEST=check NHLT ACPI tables included blobs for max98373

Change-Id: I0b402f89f1ece9e62a394f713c4b0feff29bd1e5
Signed-off-by: N, Harshapriya <harshapriya.n@intel.com>
Signed-off-by: Sathyanarayana Nujella <sathyanarayana.nujella@intel.com>
Reviewed-on: https://review.coreboot.org/22674
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
N, Harshapriya 2017-11-28 14:29:26 -08:00 committed by Martin Roth
parent c14a99feda
commit 4a1ee4b53e
7 changed files with 120 additions and 12 deletions

View File

@ -6,6 +6,7 @@ config BOARD_SPECIFIC_OPTIONS
select DRIVERS_I2C_GENERIC
select DRIVERS_GENERIC_MAX98357A
select DRIVERS_I2C_DA7219
select DRIVERS_I2C_MAX98373
select GENERIC_SPD_BIN
select HAVE_ACPI_RESUME
select HAVE_ACPI_TABLES
@ -56,6 +57,12 @@ config INCLUDE_SND_MAX98357_DA7219_NHLT
select NHLT_DA7219
select NHLT_MAX98357
config INCLUDE_SND_MAX98373_NHLT
bool "Include blobs for audio with MAX98373"
select NHLT_DMIC_4CH_16B
select NHLT_DMIC_2CH_16B
select NHLT_MAX98373
config ME_BIN_PATH
string
depends on HAVE_ME_BIN

View File

@ -33,16 +33,21 @@ void __attribute__((weak)) variant_nhlt_init(struct nhlt *nhlt)
!nhlt_soc_add_dmic_array(nhlt, 4))
printk(BIOS_ERR, "Added 4CH DMIC array.\n");
#if IS_ENABLED(CONFIG_INCLUDE_SND_MAX98357_DA7219_NHLT)
/* Dialog for Headset codec.
* Headset codec is bi-directional but uses the same configuration
* settings for render and capture endpoints.
*/
if (!nhlt_soc_add_da7219(nhlt, AUDIO_LINK_SSP2))
printk(BIOS_ERR, "Added Dialog_7219 codec.\n");
if (IS_ENABLED(CONFIG_INCLUDE_SND_MAX98357_DA7219_NHLT))
{
/* Dialog for Headset codec.
* Headset codec is bi-directional but uses the same configuration
* settings for render and capture endpoints.
*/
if (!nhlt_soc_add_da7219(nhlt, AUDIO_LINK_SSP2))
printk(BIOS_ERR, "Added Dialog_7219 codec.\n");
/* MAXIM Smart Amps for left and right speakers. */
if (!nhlt_soc_add_max98357(nhlt, AUDIO_LINK_SSP1))
printk(BIOS_ERR, "Added Maxim_98357 codec.\n");
#endif
/* MAXIM Smart Amps for left and right speakers. */
if (!nhlt_soc_add_max98357(nhlt, AUDIO_LINK_SSP1))
printk(BIOS_ERR, "Added Maxim_98357 codec.\n");
}
if (IS_ENABLED(CONFIG_INCLUDE_SND_MAX98373_NHLT) &&
!nhlt_soc_add_max98373(nhlt, AUDIO_LINK_SSP1))
printk(BIOS_ERR, "Added Maxim_98373 codec.\n");
}

View File

@ -70,6 +70,13 @@ chip soc/intel/cannonlake
# GPIO for SD card detect
register "sdcard_cd_gpio" = "GPP_G5"
# Audio
register "i2c[3]" = "{
.speed = I2C_SPEED_STANDARD,
.rise_time_ns = 104,
.fall_time_ns = 52,
}"
device domain 0 on
device pci 00.0 on end # Host Bridge
device pci 02.0 on end # Integrated Graphics Device
@ -84,7 +91,17 @@ chip soc/intel/cannonlake
device pci 15.0 on end # I2C #0
device pci 15.1 on end # I2C #1
device pci 15.2 off end # I2C #2
device pci 15.3 off end # I2C #3
device pci 15.3 on
chip drivers/i2c/max98373
register "interleave_mode" = "1"
register "vmon_slot_no" = "4"
register "imon_slot_no" = "5"
register "uid" = "0"
register "desc" = ""Right Speaker Amp""
register "name" = ""MAXR""
device i2c 32 on end
end
end # I2C #3
device pci 16.0 on end # Management Engine Interface 1
device pci 16.1 off end # Management Engine Interface 2
device pci 16.2 off end # Management Engine IDE-R

View File

@ -141,6 +141,13 @@ config NHLT_MAX98357
help
Include DSP firmware settings for headset codec.
config NHLT_MAX98373
bool
depends on ACPI_NHLT
default n
help
Include DSP firmware settings for headset codec.
config NHLT_DA7219
bool
depends on ACPI_NHLT

View File

@ -81,6 +81,8 @@ DMIC_2CH_48KHZ_16B = dmic-2ch-48khz-16b.bin
DMIC_4CH_48KHZ_16B = dmic-4ch-48khz-16b.bin
MAX98357_RENDER = max98357-render-2ch-48khz-24b.bin
DA7219_RENDER_CAPTURE = dialog-2ch-48khz-24b.bin
MAX98373_RENDER_24B = max98373-render-2ch-48khz-24b.bin
MAX98373_RENDER_16B = max98373-render-2ch-48khz-16b.bin
cbfs-files-$(CONFIG_NHLT_DMIC_1CH_16B) += $(DMIC_1CH_48KHZ_16B)
$(DMIC_1CH_48KHZ_16B)-file := $(NHLT_BLOB_PATH)/$(DMIC_1CH_48KHZ_16B)
@ -98,6 +100,14 @@ cbfs-files-$(CONFIG_NHLT_MAX98357) += $(MAX98357_RENDER)
$(MAX98357_RENDER)-file := $(NHLT_BLOB_PATH)/$(MAX98357_RENDER)
$(MAX98357_RENDER)-type := raw
cbfs-files-$(CONFIG_NHLT_MAX98373) += $(MAX98373_RENDER_16B)
$(MAX98373_RENDER_16B)-file := $(NHLT_BLOB_PATH)/$(MAX98373_RENDER_16B)
$(MAX98373_RENDER_16B)-type := raw
cbfs-files-$(CONFIG_NHLT_MAX98373) += $(MAX98373_RENDER_24B)
$(MAX98373_RENDER_24B)-file := $(NHLT_BLOB_PATH)/$(MAX98373_RENDER_24B)
$(MAX98373_RENDER_24B)-type := raw
cbfs-files-$(CONFIG_NHLT_DA7219) += $(DA7219_RENDER_CAPTURE)
$(DA7219_RENDER_CAPTURE)-file := $(NHLT_BLOB_PATH)/$(DA7219_RENDER_CAPTURE)
$(DA7219_RENDER_CAPTURE)-type := raw

View File

@ -39,5 +39,6 @@ enum {
int nhlt_soc_add_dmic_array(struct nhlt *nhlt, int num_channels);
int nhlt_soc_add_max98357(struct nhlt *nhlt, int hwlink);
int nhlt_soc_add_da7219(struct nhlt *nhlt, int hwlink);
int nhlt_soc_add_max98373(struct nhlt *nhlt, int hwlink);
#endif

View File

@ -180,6 +180,60 @@ static const struct nhlt_endp_descriptor max98357_descriptors[] = {
},
};
static const struct nhlt_format_config max98373_render_formats[] = {
/* 48 KHz 24-bits per sample. */
{
.num_channels = 2,
.sample_freq_khz = 48,
.container_bits_per_sample = 32,
.valid_bits_per_sample = 24,
.speaker_mask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT,
.settings_file = "max98373-render-2ch-48khz-24b.bin",
},
/* 48 KHz 16-bits per sample. */
{
.num_channels = 2,
.sample_freq_khz = 48,
.container_bits_per_sample = 16,
.valid_bits_per_sample = 16,
.speaker_mask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT,
.settings_file = "max98373-render-2ch-48khz-16b.bin",
}
};
static const struct nhlt_format_config max98373_capture_formats[] = {
/* 48 KHz 16-bits per sample. */
{
.num_channels = 2,
.sample_freq_khz = 48,
.container_bits_per_sample = 16,
.valid_bits_per_sample = 16,
.speaker_mask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT,
.settings_file = "max98373-render-2ch-48khz-16b.bin",
},
};
static const struct nhlt_endp_descriptor max98373_descriptors[] = {
{
.link = NHLT_LINK_SSP,
.device = NHLT_SSP_DEV_I2S,
.direction = NHLT_DIR_RENDER,
.vid = NHLT_VID,
.did = NHLT_DID_SSP,
.formats = max98373_render_formats,
.num_formats = ARRAY_SIZE(max98373_render_formats),
},
{
.link = NHLT_LINK_SSP,
.device = NHLT_SSP_DEV_I2S,
.direction = NHLT_DIR_CAPTURE,
.vid = NHLT_VID,
.did = NHLT_DID_SSP,
.formats = max98373_capture_formats,
.num_formats = ARRAY_SIZE(max98373_capture_formats),
},
};
int nhlt_soc_add_dmic_array(struct nhlt *nhlt, int num_channels)
{
switch (num_channels) {
@ -210,3 +264,10 @@ int nhlt_soc_add_max98357(struct nhlt *nhlt, int hwlink)
return nhlt_add_ssp_endpoints(nhlt, hwlink, max98357_descriptors,
ARRAY_SIZE(max98357_descriptors));
}
int nhlt_soc_add_max98373(struct nhlt *nhlt, int hwlink)
{
/* Virtual bus id of SSP links are the hardware port ids proper. */
return nhlt_add_ssp_endpoints(nhlt, hwlink, max98373_descriptors,
ARRAY_SIZE(max98373_descriptors));
}