Files
omarchy-pkgs/pkgbuilds/edge/linux-ptl-audio/0007-ASoC-SDCA-Add-lock-to-serialise-the-Function-initial.patch
T
Gaggery Tsai 35ed17f238 Add linux-ptl-audio kernel package for Panther Lake SDCA audio
Alternative kernel package based on Arch Linux 6.19.9 with 12 upstream
SDCA backport patches that enable audio on Intel Panther Lake systems
(Dell XPS 2026 and similar hardware with CS35L57 SoundWire amps).

The stock 6.19.9 kernel lacks the SDCA class/function topology driver
code needed for PTL audio. These patches backport the SDCA support from
mainline v7.0 to the stable 6.19.x series.

Tested on Dell XPS 16 (Panther Lake): all 4 CS35L57 amps probe with
calibration, SDCA jack detection works, sof-soundwire sound card
registers successfully.

CONFIG_RUST is disabled to avoid build failures with newer Rust
toolchain versions. Rust is not required for audio functionality.
2026-03-19 14:58:29 -07:00

78 lines
2.5 KiB
Diff

From 914bb3e2ba56354fd66cbb130eb536513ae3e1ca Mon Sep 17 00:00:00 2001
From: Charles Keepax <ckeepax@opensource.cirrus.com>
Date: Fri, 9 Jan 2026 14:52:06 +0000
Subject: [PATCH 07/17] ASoC: SDCA: Add lock to serialise the Function
initialisation
To avoid issues on some devices serialise the boot of each SDCA Function
from the others.
Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.dev>
Link: https://patch.msgid.link/20260109145206.3456151-5-ckeepax@opensource.cirrus.com
Signed-off-by: Mark Brown <broonie@kernel.org>
---
sound/soc/sdca/sdca_class.c | 1 +
sound/soc/sdca/sdca_class.h | 2 ++
sound/soc/sdca/sdca_class_function.c | 5 +++++
3 files changed, 8 insertions(+)
diff --git a/sound/soc/sdca/sdca_class.c b/sound/soc/sdca/sdca_class.c
index 6d19a183683e..918b638acb57 100644
--- a/sound/soc/sdca/sdca_class.c
+++ b/sound/soc/sdca/sdca_class.c
@@ -205,6 +205,7 @@ static int class_sdw_probe(struct sdw_slave *sdw, const struct sdw_device_id *id
drv->dev = dev;
drv->sdw = sdw;
mutex_init(&drv->regmap_lock);
+ mutex_init(&drv->init_lock);
dev_set_drvdata(drv->dev, drv);
diff --git a/sound/soc/sdca/sdca_class.h b/sound/soc/sdca/sdca_class.h
index bb4c9dd12429..6f24ea2bbd38 100644
--- a/sound/soc/sdca/sdca_class.h
+++ b/sound/soc/sdca/sdca_class.h
@@ -28,6 +28,8 @@ struct sdca_class_drv {
struct sdca_interrupt_info *irq_info;
struct mutex regmap_lock;
+ /* Serialise function initialisations */
+ struct mutex init_lock;
struct work_struct boot_work;
struct completion device_attach;
diff --git a/sound/soc/sdca/sdca_class_function.c b/sound/soc/sdca/sdca_class_function.c
index bbf486d9a3d0..0afa41c1ee93 100644
--- a/sound/soc/sdca/sdca_class_function.c
+++ b/sound/soc/sdca/sdca_class_function.c
@@ -8,6 +8,7 @@
*/
#include <linux/auxiliary_bus.h>
+#include <linux/cleanup.h>
#include <linux/minmax.h>
#include <linux/module.h>
#include <linux/pm.h>
@@ -244,6 +245,8 @@ static int class_function_boot(struct class_function_drv *drv)
unsigned int val;
int ret;
+ guard(mutex)(&drv->core->init_lock);
+
ret = regmap_read(drv->regmap, reg, &val);
if (ret < 0) {
dev_err(drv->dev, "failed to read function status: %d\n", ret);
@@ -418,6 +421,8 @@ static int class_function_runtime_resume(struct device *dev)
struct class_function_drv *drv = auxiliary_get_drvdata(auxdev);
int ret;
+ guard(mutex)(&drv->core->init_lock);
+
regcache_mark_dirty(drv->regmap);
regcache_cache_only(drv->regmap, false);
--
2.43.0