All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] ASoC: cs42xx8: Add SPI bus support for CS42448/CS42888 codec
@ 2026-06-01  8:02 chancel.liu
  2026-06-01  8:39 ` Charles Keepax
                   ` (2 more replies)
  0 siblings, 3 replies; 16+ messages in thread
From: chancel.liu @ 2026-06-01  8:02 UTC (permalink / raw)
  To: lgirdwood, broonie, perex, tiwai, david.rhodes, rf
  Cc: linux-kernel, linux-sound, patches

From: Chancel Liu <chancel.liu@nxp.com>

The existing cs42xx8 driver only supported I2C control interface.
Add SPI bus support for the Cirrus Logic CS42448/CS42888 Audio CODEC.

Signed-off-by: Chancel Liu <chancel.liu@nxp.com>
---
 sound/soc/codecs/Kconfig       |   7 +++
 sound/soc/codecs/Makefile      |   2 +
 sound/soc/codecs/cs42xx8-spi.c | 104 +++++++++++++++++++++++++++++++++
 3 files changed, 113 insertions(+)
 create mode 100644 sound/soc/codecs/cs42xx8-spi.c

diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
index a7c61f7c7f4c..ae36f663a5ef 100644
--- a/sound/soc/codecs/Kconfig
+++ b/sound/soc/codecs/Kconfig
@@ -93,6 +93,7 @@ config SND_SOC_ALL_CODECS
 	imply SND_SOC_CS4271_I2C
 	imply SND_SOC_CS4271_SPI
 	imply SND_SOC_CS42XX8_I2C
+	imply SND_SOC_CS42XX8_SPI
 	imply SND_SOC_CS43130
 	imply SND_SOC_CS4341
 	imply SND_SOC_CS4349
@@ -1077,6 +1078,12 @@ config SND_SOC_CS4271_SPI
 config SND_SOC_CS42XX8
 	tristate
 
+config SND_SOC_CS42XX8_SPI
+	tristate "Cirrus Logic CS42448/CS42888 CODEC (SPI)"
+	depends on SPI_MASTER
+	select SND_SOC_CS42XX8
+	select REGMAP_SPI
+
 config SND_SOC_CS42XX8_I2C
 	tristate "Cirrus Logic CS42448/CS42888 CODEC (I2C)"
 	depends on I2C
diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile
index 73315d017c57..aa0396e5b575 100644
--- a/sound/soc/codecs/Makefile
+++ b/sound/soc/codecs/Makefile
@@ -103,6 +103,7 @@ snd-soc-cs4271-i2c-y := cs4271-i2c.o
 snd-soc-cs4271-spi-y := cs4271-spi.o
 snd-soc-cs42xx8-y := cs42xx8.o
 snd-soc-cs42xx8-i2c-y := cs42xx8-i2c.o
+snd-soc-cs42xx8-spi-y := cs42xx8-spi.o
 snd-soc-cs43130-y := cs43130.o
 snd-soc-cs4341-y := cs4341.o
 snd-soc-cs4349-y := cs4349.o
@@ -543,6 +544,7 @@ obj-$(CONFIG_SND_SOC_CS4271_I2C)	+= snd-soc-cs4271-i2c.o
 obj-$(CONFIG_SND_SOC_CS4271_SPI)	+= snd-soc-cs4271-spi.o
 obj-$(CONFIG_SND_SOC_CS42XX8)	+= snd-soc-cs42xx8.o
 obj-$(CONFIG_SND_SOC_CS42XX8_I2C) += snd-soc-cs42xx8-i2c.o
+obj-$(CONFIG_SND_SOC_CS42XX8_SPI) += snd-soc-cs42xx8-spi.o
 obj-$(CONFIG_SND_SOC_CS43130)   += snd-soc-cs43130.o
 obj-$(CONFIG_SND_SOC_CS4341)	+= snd-soc-cs4341.o
 obj-$(CONFIG_SND_SOC_CS4349)	+= snd-soc-cs4349.o
diff --git a/sound/soc/codecs/cs42xx8-spi.c b/sound/soc/codecs/cs42xx8-spi.c
new file mode 100644
index 000000000000..d092cad02b61
--- /dev/null
+++ b/sound/soc/codecs/cs42xx8-spi.c
@@ -0,0 +1,104 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Cirrus Logic CS42448/CS42888 Audio CODEC DAI SPI driver
+ *
+ * Copyright 2026 NXP
+ *
+ */
+
+#include <linux/mod_devicetable.h>
+#include <linux/module.h>
+#include <linux/pm_runtime.h>
+#include <linux/regmap.h>
+#include <linux/spi/spi.h>
+#include <sound/soc.h>
+
+#include "cs42xx8.h"
+
+/*
+ * CS42448/CS42888 SPI register access (from datasheet Figure 23):
+ *
+ * The SPI frame is 3 bytes:
+ *   Byte 0: chip address [7:1] = 1001111, bit[0] = R/W (0=write, 1=read)
+ *           Write: 0x9E,  Read: 0x9F
+ *   Byte 1: MAP - Memory Address Pointer
+ *           bit[7] = INCR (auto-increment for burst), bits[6:0] = address
+ *   Byte 2: data byte
+ *
+ * We configure reg_bits=16 so that regmap treats the address field as 2 bytes
+ * (big-endian). The chip address byte (0x9E/0x9F) is placed in the high byte
+ * via write_flag_mask / read_flag_mask, and the MAP register address occupies
+ * the low byte. This produces the correct 3-byte on-wire frame without any
+ * custom bus implementation:
+ *
+ *   write: [0x9E, MAP_addr, data]
+ *   read:  [0x9F, MAP_addr] -> [data]
+ */
+
+static int cs42xx8_spi_probe(struct spi_device *spi)
+{
+	struct cs42xx8_driver_data *drvdata;
+	struct regmap_config config;
+	int ret;
+
+	drvdata = (struct cs42xx8_driver_data *)spi_get_device_match_data(spi);
+	if (!drvdata)
+		return dev_err_probe(&spi->dev, -EINVAL,
+				     "failed to find driver data\n");
+
+	config = cs42xx8_regmap_config;
+	/*
+	 * reg_bits=16 makes regmap send a 2-byte address field (big-endian).
+	 * write_flag_mask/read_flag_mask are OR'd into that address field:
+	 */
+	config.reg_bits           = 16;
+	config.write_flag_mask    = 0x9E;
+	config.read_flag_mask     = 0x9F;
+	config.reg_format_endian  = REGMAP_ENDIAN_BIG;
+
+	ret = cs42xx8_probe(&spi->dev,
+			    devm_regmap_init_spi(spi, &config), drvdata);
+	if (ret)
+		return ret;
+
+	pm_runtime_enable(&spi->dev);
+	pm_request_idle(&spi->dev);
+
+	return 0;
+}
+
+static void cs42xx8_spi_remove(struct spi_device *spi)
+{
+	pm_runtime_disable(&spi->dev);
+}
+
+static const struct of_device_id cs42xx8_of_match[] = {
+	{ .compatible = "cirrus,cs42448", .data = &cs42448_data, },
+	{ .compatible = "cirrus,cs42888", .data = &cs42888_data, },
+	{ /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, cs42xx8_of_match);
+
+static const struct spi_device_id cs42xx8_spi_id[] = {
+	{ .name = "cs42448", .driver_data = (kernel_ulong_t)&cs42448_data },
+	{ .name = "cs42888", .driver_data = (kernel_ulong_t)&cs42888_data },
+	{ }
+};
+MODULE_DEVICE_TABLE(spi, cs42xx8_spi_id);
+
+static struct spi_driver cs42xx8_spi_driver = {
+	.driver = {
+		.name = "cs42xx8",
+		.pm = pm_ptr(&cs42xx8_pm),
+		.of_match_table = cs42xx8_of_match,
+	},
+	.probe = cs42xx8_spi_probe,
+	.remove = cs42xx8_spi_remove,
+	.id_table = cs42xx8_spi_id,
+};
+
+module_spi_driver(cs42xx8_spi_driver);
+
+MODULE_DESCRIPTION("Cirrus Logic CS42448/CS42888 ALSA SoC Codec SPI Driver");
+MODULE_AUTHOR("Chancel Liu <chancel.liu@nxp.com>");
+MODULE_LICENSE("GPL");
-- 
2.50.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2026-06-03 13:46 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-01  8:02 [PATCH] ASoC: cs42xx8: Add SPI bus support for CS42448/CS42888 codec chancel.liu
2026-06-01  8:39 ` Charles Keepax
2026-06-02  5:31   ` Chancel Liu (OSS)
2026-06-01 16:53 ` Mark Brown
2026-06-02  6:25   ` Chancel Liu (OSS)
2026-06-02  8:44     ` Charles Keepax
2026-06-02  9:56       ` Chancel Liu (OSS)
2026-06-03  9:50 ` [PATCH v2 0/2] " chancel.liu
2026-06-03  9:50   ` [PATCH v2 1/2] ASoC: dt-bindings: cirrus,cs42xx8: Add SPI bus support chancel.liu
2026-06-03 10:00     ` sashiko-bot
2026-06-03  9:50   ` [PATCH v2 2/2] ASoC: cs42xx8: Add SPI bus support for CS42448/CS42888 codec chancel.liu
2026-06-03 10:15     ` sashiko-bot
2026-06-03 11:46   ` [PATCH v2 0/2] " Charles Keepax
2026-06-03 11:57   ` Mark Brown
2026-06-03 12:14     ` Chancel Liu (OSS)
2026-06-03 11:57   ` Mark Brown

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.