]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
firmware: cs_dsp: Remove async regmap writes
authorRichard Fitzgerald <rf@opensource.cirrus.com>
Tue, 25 Feb 2025 13:18:42 +0000 (13:18 +0000)
committerMark Brown <broonie@kernel.org>
Tue, 25 Feb 2025 15:06:57 +0000 (15:06 +0000)
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>
Link: https://patch.msgid.link/20250225131843.113752-2-rf@opensource.cirrus.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/firmware/cirrus/cs_dsp.c

index 5365e9a4300070c42e1bc998b848e62a4e4c9d53..42433c19eb30889a3810a84da4ad833f5d2b6f9f 100644 (file)
@@ -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;