From 74d4fac21048dac022914f2744bc8b63624448c4 Mon Sep 17 00:00:00 2001 From: Jeremy Compostella Date: Thu, 26 Feb 2026 09:16:06 -0800 Subject: [PATCH] soc/intel/common/feature/soundwire: Add common SoundWire driver Add a common implementation of soc_fill_soundwire_controller() to reduce code duplication across multiple Intel SoC platforms. This implementation consolidates identical SoundWire link configuration code from Alder Lake, Meteor Lake, Panther Lake, and Tiger Lake platforms. The common driver uses platform-specific Kconfig options: - SOC_SOUNDWIRE_ACPI_ADDRESS: ACPI address for the controller (default 0x40000000) - SOC_SOUNDWIRE_MASTER_COUNT: Number of SoundWire master links (default 4) Platforms can override these defaults in their Kconfig if needed. This change enables consolidation of nearly identical soundwire.c files across four platforms, reducing duplication by approximately 210 lines. Change-Id: I5e188b0b60da91a33cf0325caefbbcabef0ebcba Signed-off-by: Jeremy Compostella Reviewed-on: https://review.coreboot.org/c/coreboot/+/91276 Reviewed-by: Huang, Cliff Tested-by: build bot (Jenkins) --- .../intel/common/feature/soundwire/Kconfig | 24 +++++++ .../common/feature/soundwire/Makefile.mk | 3 + .../common/feature/soundwire/soundwire.c | 71 +++++++++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 src/soc/intel/common/feature/soundwire/Kconfig create mode 100644 src/soc/intel/common/feature/soundwire/Makefile.mk create mode 100644 src/soc/intel/common/feature/soundwire/soundwire.c diff --git a/src/soc/intel/common/feature/soundwire/Kconfig b/src/soc/intel/common/feature/soundwire/Kconfig new file mode 100644 index 0000000000..c53b0e39b8 --- /dev/null +++ b/src/soc/intel/common/feature/soundwire/Kconfig @@ -0,0 +1,24 @@ +## SPDX-License-Identifier: GPL-2.0-only + +config SOC_INTEL_COMMON_FEATURE_SOUNDWIRE + bool + help + Intel Processor Common SoundWire support. This provides a common + implementation of soc_fill_soundwire_controller() for platforms + that use the same SoundWire link configuration. The platform must + define SOC_SOUNDWIRE_ACPI_ADDRESS and SOC_SOUNDWIRE_MASTER_COUNT + in their Kconfig. + +config SOC_SOUNDWIRE_ACPI_ADDRESS + hex + default 0x40000000 + depends on SOC_INTEL_COMMON_FEATURE_SOUNDWIRE + help + ACPI address for the SoundWire controller. + +config SOC_SOUNDWIRE_MASTER_COUNT + int + default 4 + depends on SOC_INTEL_COMMON_FEATURE_SOUNDWIRE + help + Number of SoundWire master interfaces supported by the platform. diff --git a/src/soc/intel/common/feature/soundwire/Makefile.mk b/src/soc/intel/common/feature/soundwire/Makefile.mk new file mode 100644 index 0000000000..a668fdbaa9 --- /dev/null +++ b/src/soc/intel/common/feature/soundwire/Makefile.mk @@ -0,0 +1,3 @@ +## SPDX-License-Identifier: GPL-2.0-only + +ramstage-$(CONFIG_SOC_INTEL_COMMON_FEATURE_SOUNDWIRE) += soundwire.c diff --git a/src/soc/intel/common/feature/soundwire/soundwire.c b/src/soc/intel/common/feature/soundwire/soundwire.c new file mode 100644 index 0000000000..d9528df1a7 --- /dev/null +++ b/src/soc/intel/common/feature/soundwire/soundwire.c @@ -0,0 +1,71 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include +#include +#include +#include +#include +#include +#include + +static const struct soundwire_link link_xtal_38_4 = { + .clock_stop_mode0_supported = 1, + .clock_stop_mode1_supported = 1, + .clock_frequencies_supported_count = 1, + .clock_frequencies_supported = { 4800 * KHz }, + .default_frame_rate = 48 * KHz, + .default_frame_row_size = 50, + .default_frame_col_size = 4, + .dynamic_frame_shape = 1, + .command_error_threshold = 16, +}; + +static const struct soundwire_link link_xtal_24 = { + .clock_stop_mode0_supported = 1, + .clock_stop_mode1_supported = 1, + .clock_frequencies_supported_count = 1, + .clock_frequencies_supported = { 6 * MHz }, + .default_frame_rate = 48 * KHz, + .default_frame_row_size = 125, + .default_frame_col_size = 2, + .dynamic_frame_shape = 1, + .command_error_threshold = 16, +}; + +static struct intel_soundwire_controller intel_controller = { + .acpi_address = CONFIG_SOC_SOUNDWIRE_ACPI_ADDRESS, + .sdw = { + .master_list_count = CONFIG_SOC_SOUNDWIRE_MASTER_COUNT + } +}; + +int soc_fill_soundwire_controller(struct intel_soundwire_controller **controller) +{ + const struct soundwire_link *link; + enum pch_pmc_xtal xtal = pmc_get_xtal_freq(); + size_t i; + + /* Select link config based on XTAL frequency and set IP clock. */ + switch (xtal) { + case XTAL_24_MHZ: + link = &link_xtal_24; + intel_controller.ip_clock = 24 * MHz; + break; + case XTAL_38_4_MHZ: + link = &link_xtal_38_4; + intel_controller.ip_clock = 38400 * KHz; + break; + case XTAL_19_2_MHZ: + default: + printk(BIOS_ERR, "%s: XTAL not supported: 0x%x\n", __func__, xtal); + return -1; + } + + /* Fill link config in controller map based on selected XTAL. */ + for (i = 0; i < intel_controller.sdw.master_list_count; i++) + memcpy(&intel_controller.sdw.master_list[i], link, sizeof(*link)); + + *controller = &intel_controller; + return 0; +}