Commit c6dafab9 authored by Martin Blumenstingl's avatar Martin Blumenstingl
Browse files

ASoC: cs4334: Add a driver for the Cirrus CS4334 Stereo I2S DAC

The Cirrus CS4334 is a simple Stereo I2S D/A converter. It does not have
any management interface (like I2C, SPI, GPIOs, ...).
It suports for 16 to 24 bit little endian input formats and sample rates
between 8kHz to 96kHz.

The MXT8234 is a functionally compatible replacement for the CS4334 from
Beijing Times Minxin Technology Co., Ltd.

Datasheets for both implementations are available on the web:
- https://statics.cirrus.com/pubs/proDatasheet/CS4334-5-8-9_F7.pdf
- http://www.mxtronics.com/n107/n124/n181/n184/c697/attr/2625.pdf


  (Chinese only)

Signed-off-by: default avatarMartin Blumenstingl <martin.blumenstingl@googlemail.com>
parent d730e205
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -73,6 +73,7 @@ config SND_SOC_ALL_CODECS
	imply SND_SOC_CS4271_SPI
	imply SND_SOC_CS42XX8_I2C
	imply SND_SOC_CS43130
	imply SND_SOC_CS4334
	imply SND_SOC_CS4341
	imply SND_SOC_CS4349
	imply SND_SOC_CS47L15
@@ -666,6 +667,9 @@ config SND_SOC_CS43130
	tristate "Cirrus Logic CS43130 CODEC"
	depends on I2C

config SND_SOC_CS4334
	tristate "Cirrus Logic CS4334 CODEC"

config SND_SOC_CS4341
	tristate "Cirrus Logic CS4341 CODEC"
	depends on SND_SOC_I2C_AND_SPI
+2 −0
Original line number Diff line number Diff line
@@ -69,6 +69,7 @@ snd-soc-cs4271-spi-objs := cs4271-spi.o
snd-soc-cs42xx8-objs := cs42xx8.o
snd-soc-cs42xx8-i2c-objs := cs42xx8-i2c.o
snd-soc-cs43130-objs := cs43130.o
snd-soc-cs4334-objs := cs4334.o
snd-soc-cs4341-objs := cs4341.o
snd-soc-cs4349-objs := cs4349.o
snd-soc-cs47l15-objs := cs47l15.o
@@ -386,6 +387,7 @@ 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_CS43130)   += snd-soc-cs43130.o
obj-$(CONFIG_SND_SOC_CS4334)	+= snd-soc-cs4334.o
obj-$(CONFIG_SND_SOC_CS4341)	+= snd-soc-cs4341.o
obj-$(CONFIG_SND_SOC_CS4349)	+= snd-soc-cs4349.o
obj-$(CONFIG_SND_SOC_CS47L24)	+= snd-soc-cs47l24.o
+67 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Driver for the Cirrus CS4334 - or functionally compatible - I2S Stereo DACs.
 *
 * Copyright (C) 2019 Martin Blumenstingl <martin.blumenstingl@googlemail.com>
 *
 * Based on pcm5102a:
 *   Copyright (C) 2013 Florian Meier <florian.meier@koalo.de>
 */

#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>

#include <sound/soc.h>

static struct snd_soc_dai_driver cs4334_dai = {
	.name = "cs4334",
	.playback = {
		.channels_min = 2,
		.channels_max = 2,
		.rates = SNDRV_PCM_RATE_8000_96000,
		.formats = SNDRV_PCM_FMTBIT_S16_LE |
			   SNDRV_PCM_FMTBIT_S24_LE
	},
};

static const struct snd_soc_dapm_widget cs4334_dapm_widgets[] = {
	SND_SOC_DAPM_REGULATOR_SUPPLY("VDD", 0, 0),
};

static struct snd_soc_component_driver soc_component_dev_cs4334 = {
	.dapm_widgets		= cs4334_dapm_widgets,
	.num_dapm_widgets	= ARRAY_SIZE(cs4334_dapm_widgets),
	.idle_bias_on		= 1,
	.use_pmdown_time	= 1,
	.endianness		= 1,
	.non_legacy_dai_naming	= 1,
};

static int cs4334_probe(struct platform_device *pdev)
{
	return devm_snd_soc_register_component(&pdev->dev,
					       &soc_component_dev_cs4334,
					       &cs4334_dai, 1);
}

static const struct of_device_id cs4334_of_match[] = {
	{ .compatible = "cirrus,cs4334" },
	{ .compatible = "mxtronics,mxt8234" },
	{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, cs4334_of_match);

static struct platform_driver cs4334_codec_driver = {
	.probe		= cs4334_probe,
	.driver		= {
		.name	= "cs4334-codec",
		.of_match_table = cs4334_of_match,
	},
};

module_platform_driver(cs4334_codec_driver);

MODULE_DESCRIPTION("ASoC Cirrus CS4334 codec driver");
MODULE_AUTHOR("Martin Blumenstingl <martin.blumenstingl@googlemail.com>");
MODULE_LICENSE("GPL v2");