summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mainboard/intel/cannonlake_rvp/Kconfig7
-rw-r--r--src/mainboard/intel/cannonlake_rvp/variants/baseboard/nhlt.c27
-rw-r--r--src/mainboard/intel/cannonlake_rvp/variants/cnl_u/devicetree.cb19
-rw-r--r--src/soc/intel/cannonlake/Kconfig7
-rw-r--r--src/soc/intel/cannonlake/Makefile.inc10
-rw-r--r--src/soc/intel/cannonlake/include/soc/nhlt.h1
-rw-r--r--src/soc/intel/cannonlake/nhlt.c61
7 files changed, 120 insertions, 12 deletions
diff --git a/src/mainboard/intel/cannonlake_rvp/Kconfig b/src/mainboard/intel/cannonlake_rvp/Kconfig
index e9dccd8090..f779ac2c4a 100644
--- a/src/mainboard/intel/cannonlake_rvp/Kconfig
+++ b/src/mainboard/intel/cannonlake_rvp/Kconfig
@@ -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
diff --git a/src/mainboard/intel/cannonlake_rvp/variants/baseboard/nhlt.c b/src/mainboard/intel/cannonlake_rvp/variants/baseboard/nhlt.c
index f8647d7011..9fb9be5184 100644
--- a/src/mainboard/intel/cannonlake_rvp/variants/baseboard/nhlt.c
+++ b/src/mainboard/intel/cannonlake_rvp/variants/baseboard/nhlt.c
@@ -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");
}
diff --git a/src/mainboard/intel/cannonlake_rvp/variants/cnl_u/devicetree.cb b/src/mainboard/intel/cannonlake_rvp/variants/cnl_u/devicetree.cb
index e5157efd07..3e60ed946b 100644
--- a/src/mainboard/intel/cannonlake_rvp/variants/cnl_u/devicetree.cb
+++ b/src/mainboard/intel/cannonlake_rvp/variants/cnl_u/devicetree.cb
@@ -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
diff --git a/src/soc/intel/cannonlake/Kconfig b/src/soc/intel/cannonlake/Kconfig
index ed4a068c1b..8eee6f4fdd 100644
--- a/src/soc/intel/cannonlake/Kconfig
+++ b/src/soc/intel/cannonlake/Kconfig
@@ -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
diff --git a/src/soc/intel/cannonlake/Makefile.inc b/src/soc/intel/cannonlake/Makefile.inc
index ca6a5e23f7..bfc52ce418 100644
--- a/src/soc/intel/cannonlake/Makefile.inc
+++ b/src/soc/intel/cannonlake/Makefile.inc
@@ -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
diff --git a/src/soc/intel/cannonlake/include/soc/nhlt.h b/src/soc/intel/cannonlake/include/soc/nhlt.h
index 10de336aca..bd0da3ae68 100644
--- a/src/soc/intel/cannonlake/include/soc/nhlt.h
+++ b/src/soc/intel/cannonlake/include/soc/nhlt.h
@@ -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
diff --git a/src/soc/intel/cannonlake/nhlt.c b/src/soc/intel/cannonlake/nhlt.c
index 9ca54eb09b..ff1b4464ba 100644
--- a/src/soc/intel/cannonlake/nhlt.c
+++ b/src/soc/intel/cannonlake/nhlt.c
@@ -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));
+}