* [PATCH 0/2] ALSA: cs35l56: Fix for races when soft-resetting on SPI
@ 2025-02-25 13:18 Richard Fitzgerald
2025-02-25 13:18 ` [PATCH 1/2] firmware: cs_dsp: Remove async regmap writes Richard Fitzgerald
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Richard Fitzgerald @ 2025-02-25 13:18 UTC (permalink / raw)
To: broonie, tiwai; +Cc: linux-sound, linux-kernel, patches
These two patches fix a race condition between driver and amp when issuing
a soft-reset over SPI. The main problem with the race is that the driver
could read the amp status as fully booted, when in fact the amp is about
to reset or is in the process of resetting.
This is mainly contained within the ASoC driver code but a small change is
needed to the HDA driver.
The first patch, to cs_dsp, is to remove async regmap writes so that the
cs35l56 driver can call spi_bus_lock() without breaking firmware download to
other amps on the same SPI bus.
Richard Fitzgerald (2):
firmware: cs_dsp: Remove async regmap writes
ASoC: cs35l56: Prevent races when soft-resetting using SPI control
drivers/firmware/cirrus/cs_dsp.c | 24 +++-------
include/sound/cs35l56.h | 31 ++++++++++++
sound/pci/hda/cs35l56_hda_spi.c | 3 ++
sound/soc/codecs/cs35l56-shared.c | 80 +++++++++++++++++++++++++++++++
sound/soc/codecs/cs35l56-spi.c | 3 ++
5 files changed, 123 insertions(+), 18 deletions(-)
--
2.39.5
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/2] firmware: cs_dsp: Remove async regmap writes
2025-02-25 13:18 [PATCH 0/2] ALSA: cs35l56: Fix for races when soft-resetting on SPI Richard Fitzgerald
@ 2025-02-25 13:18 ` Richard Fitzgerald
2025-02-25 15:15 ` Mark Brown
2025-02-25 13:18 ` [PATCH 2/2] ASoC: cs35l56: Prevent races when soft-resetting using SPI control Richard Fitzgerald
2025-02-25 17:04 ` [PATCH 0/2] ALSA: cs35l56: Fix for races when soft-resetting on SPI Mark Brown
2 siblings, 1 reply; 7+ messages in thread
From: Richard Fitzgerald @ 2025-02-25 13:18 UTC (permalink / raw)
To: broonie, tiwai; +Cc: linux-sound, linux-kernel, patches
Change calls to async regmap write functions to use the normal
blocking writes so that the cs35l56 driver can use spi_bus_lock() to
gain exclusive access to the SPI bus.
As this is part of a fix, it makes only the minimal change to swap the
functions to the blocking equivalents. There's no need to risk
reworking the buffer allocation logic that is now partially redundant.
The async writes are a 12-year-old workaround for inefficiency of
synchronous writes in the SPI subsystem. The SPI subsystem has since
been changed to avoid the overheads, so this workaround should not be
necessary.
The cs35l56 driver needs to use spi_bus_lock() prevent bus activity
while it is soft-resetting the cs35l56. But spi_bus_lock() is
incompatible with spi_async() calls, which will fail with -EBUSY.
Fixes: 8a731fd37f8b ("ASoC: cs35l56: Move utility functions to shared file")
Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
---
drivers/firmware/cirrus/cs_dsp.c | 24 ++++++------------------
1 file changed, 6 insertions(+), 18 deletions(-)
diff --git a/drivers/firmware/cirrus/cs_dsp.c b/drivers/firmware/cirrus/cs_dsp.c
index 5365e9a43000..42433c19eb30 100644
--- a/drivers/firmware/cirrus/cs_dsp.c
+++ b/drivers/firmware/cirrus/cs_dsp.c
@@ -1609,8 +1609,8 @@ static int cs_dsp_load(struct cs_dsp *dsp, const struct firmware *firmware,
goto out_fw;
}
- ret = regmap_raw_write_async(regmap, reg, buf->buf,
- le32_to_cpu(region->len));
+ ret = regmap_raw_write(regmap, reg, buf->buf,
+ le32_to_cpu(region->len));
if (ret != 0) {
cs_dsp_err(dsp,
"%s.%d: Failed to write %d bytes at %d in %s: %d\n",
@@ -1625,12 +1625,6 @@ static int cs_dsp_load(struct cs_dsp *dsp, const struct firmware *firmware,
regions++;
}
- ret = regmap_async_complete(regmap);
- if (ret != 0) {
- cs_dsp_err(dsp, "Failed to complete async write: %d\n", ret);
- goto out_fw;
- }
-
if (pos > firmware->size)
cs_dsp_warn(dsp, "%s.%d: %zu bytes at end of file\n",
file, regions, pos - firmware->size);
@@ -1638,7 +1632,6 @@ static int cs_dsp_load(struct cs_dsp *dsp, const struct firmware *firmware,
cs_dsp_debugfs_save_wmfwname(dsp, file);
out_fw:
- regmap_async_complete(regmap);
cs_dsp_buf_free(&buf_list);
if (ret == -EOVERFLOW)
@@ -2326,8 +2319,8 @@ static int cs_dsp_load_coeff(struct cs_dsp *dsp, const struct firmware *firmware
cs_dsp_dbg(dsp, "%s.%d: Writing %d bytes at %x\n",
file, blocks, le32_to_cpu(blk->len),
reg);
- ret = regmap_raw_write_async(regmap, reg, buf->buf,
- le32_to_cpu(blk->len));
+ ret = regmap_raw_write(regmap, reg, buf->buf,
+ le32_to_cpu(blk->len));
if (ret != 0) {
cs_dsp_err(dsp,
"%s.%d: Failed to write to %x in %s: %d\n",
@@ -2339,10 +2332,6 @@ static int cs_dsp_load_coeff(struct cs_dsp *dsp, const struct firmware *firmware
blocks++;
}
- ret = regmap_async_complete(regmap);
- if (ret != 0)
- cs_dsp_err(dsp, "Failed to complete async write: %d\n", ret);
-
if (pos > firmware->size)
cs_dsp_warn(dsp, "%s.%d: %zu bytes at end of file\n",
file, blocks, pos - firmware->size);
@@ -2350,7 +2339,6 @@ static int cs_dsp_load_coeff(struct cs_dsp *dsp, const struct firmware *firmware
cs_dsp_debugfs_save_binname(dsp, file);
out_fw:
- regmap_async_complete(regmap);
cs_dsp_buf_free(&buf_list);
if (ret == -EOVERFLOW)
@@ -2561,8 +2549,8 @@ static int cs_dsp_adsp2_enable_core(struct cs_dsp *dsp)
{
int ret;
- ret = regmap_update_bits_async(dsp->regmap, dsp->base + ADSP2_CONTROL,
- ADSP2_SYS_ENA, ADSP2_SYS_ENA);
+ ret = regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL,
+ ADSP2_SYS_ENA, ADSP2_SYS_ENA);
if (ret != 0)
return ret;
--
2.39.5
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/2] ASoC: cs35l56: Prevent races when soft-resetting using SPI control
2025-02-25 13:18 [PATCH 0/2] ALSA: cs35l56: Fix for races when soft-resetting on SPI Richard Fitzgerald
2025-02-25 13:18 ` [PATCH 1/2] firmware: cs_dsp: Remove async regmap writes Richard Fitzgerald
@ 2025-02-25 13:18 ` Richard Fitzgerald
2025-02-25 17:04 ` [PATCH 0/2] ALSA: cs35l56: Fix for races when soft-resetting on SPI Mark Brown
2 siblings, 0 replies; 7+ messages in thread
From: Richard Fitzgerald @ 2025-02-25 13:18 UTC (permalink / raw)
To: broonie, tiwai; +Cc: linux-sound, linux-kernel, patches
When SPI is used for control, the driver must hold the SPI bus lock
while issuing the sequence of writes to perform a soft reset.
From the time the driver writes the SYSTEM_RESET command until the
driver does a write to terminate the reset, there must not be any
activity on the SPI bus lines. If there is any SPI activity during the
soft-reset, another soft-reset will be triggered. The state of the SPI
chip select is irrelevant.
A repeated soft-reset does not in itself cause any problems, and it is
not an infinite loop. The problem is a race between these resets and
the driver polling for boot completion. There is a time window between
soft resets where the driver could read HALO_STATE as 2 (fully booted)
while the chip is actually soft-resetting. Although this window is
small, it is long enough that it is possible to hit it in normal
operation.
To prevent this race and ensure the chip really is fully booted, the
driver calls spi_bus_lock() to prevent other activity while resetting.
It then issues the SYSTEM_RESET mailbox command. After allowing
sufficient time for reset to take effect, the driver issues a PING
mailbox command, which will force completion of the full soft-reset
sequence. The SPI bus lock can then be released. The mailbox is
checked for any boot or wakeup response from the firmware, before the
value in HALO_STATE will be trusted.
This does not affect SoundWire or I2C control.
Fixes: 8a731fd37f8b ("ASoC: cs35l56: Move utility functions to shared file")
Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
---
include/sound/cs35l56.h | 31 ++++++++++++
sound/pci/hda/cs35l56_hda_spi.c | 3 ++
sound/soc/codecs/cs35l56-shared.c | 80 +++++++++++++++++++++++++++++++
sound/soc/codecs/cs35l56-spi.c | 3 ++
4 files changed, 117 insertions(+)
diff --git a/include/sound/cs35l56.h b/include/sound/cs35l56.h
index 3dc7a1551ac3..5d653a3491d0 100644
--- a/include/sound/cs35l56.h
+++ b/include/sound/cs35l56.h
@@ -12,6 +12,7 @@
#include <linux/firmware/cirrus/cs_dsp.h>
#include <linux/regulator/consumer.h>
#include <linux/regmap.h>
+#include <linux/spi/spi.h>
#include <sound/cs-amp-lib.h>
#define CS35L56_DEVID 0x0000000
@@ -61,6 +62,7 @@
#define CS35L56_IRQ1_MASK_8 0x000E0AC
#define CS35L56_IRQ1_MASK_18 0x000E0D4
#define CS35L56_IRQ1_MASK_20 0x000E0DC
+#define CS35L56_DSP_MBOX_1_RAW 0x0011000
#define CS35L56_DSP_VIRTUAL1_MBOX_1 0x0011020
#define CS35L56_DSP_VIRTUAL1_MBOX_2 0x0011024
#define CS35L56_DSP_VIRTUAL1_MBOX_3 0x0011028
@@ -224,6 +226,7 @@
#define CS35L56_HALO_STATE_SHUTDOWN 1
#define CS35L56_HALO_STATE_BOOT_DONE 2
+#define CS35L56_MBOX_CMD_PING 0x0A000000
#define CS35L56_MBOX_CMD_AUDIO_PLAY 0x0B000001
#define CS35L56_MBOX_CMD_AUDIO_PAUSE 0x0B000002
#define CS35L56_MBOX_CMD_AUDIO_REINIT 0x0B000003
@@ -254,6 +257,16 @@
#define CS35L56_NUM_BULK_SUPPLIES 3
#define CS35L56_NUM_DSP_REGIONS 5
+/* Additional margin for SYSTEM_RESET to control port ready on SPI */
+#define CS35L56_SPI_RESET_TO_PORT_READY_US (CS35L56_CONTROL_PORT_READY_US + 2500)
+
+struct cs35l56_spi_payload {
+ __be32 addr;
+ __be16 pad;
+ __be32 value;
+} __packed;
+static_assert(sizeof(struct cs35l56_spi_payload) == 10);
+
struct cs35l56_base {
struct device *dev;
struct regmap *regmap;
@@ -269,6 +282,7 @@ struct cs35l56_base {
s8 cal_index;
struct cirrus_amp_cal_data cal_data;
struct gpio_desc *reset_gpio;
+ struct cs35l56_spi_payload *spi_payload_buf;
};
static inline bool cs35l56_is_otp_register(unsigned int reg)
@@ -276,6 +290,23 @@ static inline bool cs35l56_is_otp_register(unsigned int reg)
return (reg >> 16) == 3;
}
+static inline int cs35l56_init_config_for_spi(struct cs35l56_base *cs35l56,
+ struct spi_device *spi)
+{
+ cs35l56->spi_payload_buf = devm_kzalloc(&spi->dev,
+ sizeof(*cs35l56->spi_payload_buf),
+ GFP_KERNEL | GFP_DMA);
+ if (!cs35l56->spi_payload_buf)
+ return -ENOMEM;
+
+ return 0;
+}
+
+static inline bool cs35l56_is_spi(struct cs35l56_base *cs35l56)
+{
+ return IS_ENABLED(CONFIG_SPI_MASTER) && !!cs35l56->spi_payload_buf;
+}
+
extern const struct regmap_config cs35l56_regmap_i2c;
extern const struct regmap_config cs35l56_regmap_spi;
extern const struct regmap_config cs35l56_regmap_sdw;
diff --git a/sound/pci/hda/cs35l56_hda_spi.c b/sound/pci/hda/cs35l56_hda_spi.c
index d4ee5bb7c486..903578466905 100644
--- a/sound/pci/hda/cs35l56_hda_spi.c
+++ b/sound/pci/hda/cs35l56_hda_spi.c
@@ -22,6 +22,9 @@ static int cs35l56_hda_spi_probe(struct spi_device *spi)
return -ENOMEM;
cs35l56->base.dev = &spi->dev;
+ ret = cs35l56_init_config_for_spi(&cs35l56->base, spi);
+ if (ret)
+ return ret;
#ifdef CS35L56_WAKE_HOLD_TIME_US
cs35l56->base.can_hibernate = true;
diff --git a/sound/soc/codecs/cs35l56-shared.c b/sound/soc/codecs/cs35l56-shared.c
index e0ed4fc11155..e28bfefa72f3 100644
--- a/sound/soc/codecs/cs35l56-shared.c
+++ b/sound/soc/codecs/cs35l56-shared.c
@@ -10,6 +10,7 @@
#include <linux/gpio/consumer.h>
#include <linux/regmap.h>
#include <linux/regulator/consumer.h>
+#include <linux/spi/spi.h>
#include <linux/types.h>
#include <sound/cs-amp-lib.h>
@@ -303,6 +304,79 @@ void cs35l56_wait_min_reset_pulse(void)
}
EXPORT_SYMBOL_NS_GPL(cs35l56_wait_min_reset_pulse, "SND_SOC_CS35L56_SHARED");
+static const struct {
+ u32 addr;
+ u32 value;
+} cs35l56_spi_system_reset_stages[] = {
+ { .addr = CS35L56_DSP_VIRTUAL1_MBOX_1, .value = CS35L56_MBOX_CMD_SYSTEM_RESET },
+ /* The next write is necessary to delimit the soft reset */
+ { .addr = CS35L56_DSP_MBOX_1_RAW, .value = CS35L56_MBOX_CMD_PING },
+};
+
+static void cs35l56_spi_issue_bus_locked_reset(struct cs35l56_base *cs35l56_base,
+ struct spi_device *spi)
+{
+ struct cs35l56_spi_payload *buf = cs35l56_base->spi_payload_buf;
+ struct spi_transfer t = {
+ .tx_buf = buf,
+ .len = sizeof(*buf),
+ };
+ struct spi_message m;
+ int i, ret;
+
+ for (i = 0; i < ARRAY_SIZE(cs35l56_spi_system_reset_stages); i++) {
+ buf->addr = cpu_to_be32(cs35l56_spi_system_reset_stages[i].addr);
+ buf->value = cpu_to_be32(cs35l56_spi_system_reset_stages[i].value);
+ spi_message_init_with_transfers(&m, &t, 1);
+ ret = spi_sync_locked(spi, &m);
+ if (ret)
+ dev_warn(cs35l56_base->dev, "spi_sync failed: %d\n", ret);
+
+ usleep_range(CS35L56_SPI_RESET_TO_PORT_READY_US,
+ 2 * CS35L56_SPI_RESET_TO_PORT_READY_US);
+ }
+}
+
+static void cs35l56_spi_system_reset(struct cs35l56_base *cs35l56_base)
+{
+ struct spi_device *spi = to_spi_device(cs35l56_base->dev);
+ unsigned int val;
+ int read_ret, ret;
+
+ /*
+ * There must not be any other SPI bus activity while the amp is
+ * soft-resetting.
+ */
+ ret = spi_bus_lock(spi->controller);
+ if (ret) {
+ dev_warn(cs35l56_base->dev, "spi_bus_lock failed: %d\n", ret);
+ return;
+ }
+
+ cs35l56_spi_issue_bus_locked_reset(cs35l56_base, spi);
+ spi_bus_unlock(spi->controller);
+
+ /*
+ * Check firmware boot by testing for a response in MBOX_2.
+ * HALO_STATE cannot be trusted yet because the reset sequence
+ * can leave it with stale state. But MBOX is reset.
+ * The regmap must remain in cache-only until the chip has
+ * booted, so use a bypassed read.
+ */
+ ret = read_poll_timeout(regmap_read_bypassed, read_ret,
+ (val > 0) && (val < 0xffffffff),
+ CS35L56_HALO_STATE_POLL_US,
+ CS35L56_HALO_STATE_TIMEOUT_US,
+ false,
+ cs35l56_base->regmap,
+ CS35L56_DSP_VIRTUAL1_MBOX_2,
+ &val);
+ if (ret) {
+ dev_err(cs35l56_base->dev, "SPI reboot timed out(%d): MBOX2=%#x\n",
+ read_ret, val);
+ }
+}
+
static const struct reg_sequence cs35l56_system_reset_seq[] = {
REG_SEQ0(CS35L56_DSP1_HALO_STATE, 0),
REG_SEQ0(CS35L56_DSP_VIRTUAL1_MBOX_1, CS35L56_MBOX_CMD_SYSTEM_RESET),
@@ -315,6 +389,12 @@ void cs35l56_system_reset(struct cs35l56_base *cs35l56_base, bool is_soundwire)
* accesses other than the controlled system reset sequence below.
*/
regcache_cache_only(cs35l56_base->regmap, true);
+
+ if (cs35l56_is_spi(cs35l56_base)) {
+ cs35l56_spi_system_reset(cs35l56_base);
+ return;
+ }
+
regmap_multi_reg_write_bypassed(cs35l56_base->regmap,
cs35l56_system_reset_seq,
ARRAY_SIZE(cs35l56_system_reset_seq));
diff --git a/sound/soc/codecs/cs35l56-spi.c b/sound/soc/codecs/cs35l56-spi.c
index c101134e8532..ca6c03a8766d 100644
--- a/sound/soc/codecs/cs35l56-spi.c
+++ b/sound/soc/codecs/cs35l56-spi.c
@@ -33,6 +33,9 @@ static int cs35l56_spi_probe(struct spi_device *spi)
cs35l56->base.dev = &spi->dev;
cs35l56->base.can_hibernate = true;
+ ret = cs35l56_init_config_for_spi(&cs35l56->base, spi);
+ if (ret)
+ return ret;
ret = cs35l56_common_probe(cs35l56);
if (ret != 0)
--
2.39.5
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] firmware: cs_dsp: Remove async regmap writes
2025-02-25 13:18 ` [PATCH 1/2] firmware: cs_dsp: Remove async regmap writes Richard Fitzgerald
@ 2025-02-25 15:15 ` Mark Brown
2025-02-25 16:22 ` Richard Fitzgerald
0 siblings, 1 reply; 7+ messages in thread
From: Mark Brown @ 2025-02-25 15:15 UTC (permalink / raw)
To: Richard Fitzgerald; +Cc: tiwai, linux-sound, linux-kernel, patches
[-- Attachment #1: Type: text/plain, Size: 756 bytes --]
On Tue, Feb 25, 2025 at 01:18:42PM +0000, Richard Fitzgerald wrote:
> The async writes are a 12-year-old workaround for inefficiency of
> synchronous writes in the SPI subsystem. The SPI subsystem has since
> been changed to avoid the overheads, so this workaround should not be
> necessary.
That wasn't really the issue, it was that on systems with low numbers of
slower cores (especially single core but there were some dual core
systems too) there was a surprisingly low threashold where it was useful
to overlap the marshalling of data to send to the device with
transmitting already marshalled data. SMP adds locking requirements
which loose a lot of the gains, and it's controller dependent where the
cuttoff points for interrupts and/or DMA are.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] firmware: cs_dsp: Remove async regmap writes
2025-02-25 15:15 ` Mark Brown
@ 2025-02-25 16:22 ` Richard Fitzgerald
2025-02-25 16:37 ` Mark Brown
0 siblings, 1 reply; 7+ messages in thread
From: Richard Fitzgerald @ 2025-02-25 16:22 UTC (permalink / raw)
To: Mark Brown; +Cc: tiwai, linux-sound, linux-kernel, patches
On 25/02/2025 3:15 pm, Mark Brown wrote:
> On Tue, Feb 25, 2025 at 01:18:42PM +0000, Richard Fitzgerald wrote:
>
>> The async writes are a 12-year-old workaround for inefficiency of
>> synchronous writes in the SPI subsystem. The SPI subsystem has since
>> been changed to avoid the overheads, so this workaround should not be
>> necessary.
>
> That wasn't really the issue, it was that on systems with low numbers of
> slower cores (especially single core but there were some dual core
> systems too) there was a surprisingly low threashold where it was useful
> to overlap the marshalling of data to send to the device with
> transmitting already marshalled data. SMP adds locking requirements
> which loose a lot of the gains, and it's controller dependent where the
> cuttoff points for interrupts and/or DMA are.
Ok. It was a very long time ago.
Do you want a V2 with a commit message that doesn't libel the SPI
framework?
FWIW switching to sync write reduced the download of small amp firmware
by 200ms on a 1.67MHz SPI bus.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] firmware: cs_dsp: Remove async regmap writes
2025-02-25 16:22 ` Richard Fitzgerald
@ 2025-02-25 16:37 ` Mark Brown
0 siblings, 0 replies; 7+ messages in thread
From: Mark Brown @ 2025-02-25 16:37 UTC (permalink / raw)
To: Richard Fitzgerald; +Cc: tiwai, linux-sound, linux-kernel, patches
[-- Attachment #1: Type: text/plain, Size: 628 bytes --]
On Tue, Feb 25, 2025 at 04:22:49PM +0000, Richard Fitzgerald wrote:
> Ok. It was a very long time ago.
> Do you want a V2 with a commit message that doesn't libel the SPI
> framework?
No, it's fine - it's in CI already.
> FWIW switching to sync write reduced the download of small amp firmware
> by 200ms on a 1.67MHz SPI bus.
Yeah, with modern multi-core systems that's unsurprising especially
with a controller that does small writes synchronously - the cost of
locking on modern CPUs tends to blow out the overlapping of the
formatting with the I/O. It's part of why maple tree caches don't do
async writes during sync.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 0/2] ALSA: cs35l56: Fix for races when soft-resetting on SPI
2025-02-25 13:18 [PATCH 0/2] ALSA: cs35l56: Fix for races when soft-resetting on SPI Richard Fitzgerald
2025-02-25 13:18 ` [PATCH 1/2] firmware: cs_dsp: Remove async regmap writes Richard Fitzgerald
2025-02-25 13:18 ` [PATCH 2/2] ASoC: cs35l56: Prevent races when soft-resetting using SPI control Richard Fitzgerald
@ 2025-02-25 17:04 ` Mark Brown
2 siblings, 0 replies; 7+ messages in thread
From: Mark Brown @ 2025-02-25 17:04 UTC (permalink / raw)
To: tiwai, Richard Fitzgerald; +Cc: linux-sound, linux-kernel, patches
On Tue, 25 Feb 2025 13:18:41 +0000, Richard Fitzgerald wrote:
> These two patches fix a race condition between driver and amp when issuing
> a soft-reset over SPI. The main problem with the race is that the driver
> could read the amp status as fully booted, when in fact the amp is about
> to reset or is in the process of resetting.
>
> This is mainly contained within the ASoC driver code but a small change is
> needed to the HDA driver.
>
> [...]
Applied to
https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next
Thanks!
[1/2] firmware: cs_dsp: Remove async regmap writes
commit: fe08b7d5085a9774abc30c26d5aebc5b9cdd6091
[2/2] ASoC: cs35l56: Prevent races when soft-resetting using SPI control
commit: 769c1b79295c38d60fde4c0a8f5f31e01360c54f
All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying
to this mail.
Thanks,
Mark
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-02-25 17:04 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-25 13:18 [PATCH 0/2] ALSA: cs35l56: Fix for races when soft-resetting on SPI Richard Fitzgerald
2025-02-25 13:18 ` [PATCH 1/2] firmware: cs_dsp: Remove async regmap writes Richard Fitzgerald
2025-02-25 15:15 ` Mark Brown
2025-02-25 16:22 ` Richard Fitzgerald
2025-02-25 16:37 ` Mark Brown
2025-02-25 13:18 ` [PATCH 2/2] ASoC: cs35l56: Prevent races when soft-resetting using SPI control Richard Fitzgerald
2025-02-25 17:04 ` [PATCH 0/2] ALSA: cs35l56: Fix for races when soft-resetting on SPI Mark Brown
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox