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.
78 lines
2.5 KiB
Diff
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
|
|
|