* [PATCH 1/2] ASoC: cs4341: Add driver for CS4341 CODEC
@ 2016-09-08 16:29 Alexander Shiyan
2016-09-21 2:38 ` Handrigan, Paul
2016-09-24 19:07 ` Mark Brown
0 siblings, 2 replies; 6+ messages in thread
From: Alexander Shiyan @ 2016-09-08 16:29 UTC (permalink / raw)
To: alsa-devel
Cc: Brian Austin, Alexander Shiyan, Takashi Iwai, Paul Handrigan,
Liam Girdwood, Mark Brown
Initial commit of the Cirrus Logic CS4341.
This is a very simple, playback only, stereo DAC.
Signed-off-by: Alexander Shiyan <shc_work@mail.ru>
---
sound/soc/codecs/Kconfig | 7 ++
sound/soc/codecs/Makefile | 1 +
sound/soc/codecs/cs4341.c | 281 ++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 289 insertions(+)
create mode 100644 sound/soc/codecs/cs4341.c
diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
index 1cd6ab3..9853e79 100644
--- a/sound/soc/codecs/Kconfig
+++ b/sound/soc/codecs/Kconfig
@@ -458,6 +458,13 @@ config SND_SOC_CS42XX8_I2C
select SND_SOC_CS42XX8
select REGMAP_I2C
+config SND_SOC_CS4341
+ tristate "Cirrus Logic CS4341 CODEC"
+ depends on SPI_MASTER
+ select REGMAP_SPI
+ help
+ Enable support for Cirrus Logic (Crystal) CS4341 CODEC.
+
# Cirrus Logic CS4349 HiFi DAC
config SND_SOC_CS4349
tristate "Cirrus Logic CS4349 CODEC"
diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile
index 58036af..f699105 100644
--- a/sound/soc/codecs/Makefile
+++ b/sound/soc/codecs/Makefile
@@ -50,6 +50,7 @@ snd-soc-cs4271-i2c-objs := cs4271-i2c.o
snd-soc-cs4271-spi-objs := cs4271-spi.o
snd-soc-cs42xx8-objs := cs42xx8.o
snd-soc-cs42xx8-i2c-objs := cs42xx8-i2c.o
+snd-soc-cs4341-objs := cs4341.o
snd-soc-cs4349-objs := cs4349.o
snd-soc-cs47l24-objs := cs47l24.o
snd-soc-cs53l30-objs := cs53l30.o
diff --git a/sound/soc/codecs/cs4341.c b/sound/soc/codecs/cs4341.c
new file mode 100644
index 0000000..74907ad
--- /dev/null
+++ b/sound/soc/codecs/cs4341.c
@@ -0,0 +1,281 @@
+/*
+ * Cirrus Logic CS4341A ALSA SoC Codec Driver
+ *
+ * Author: Alexander Shiyan <shc_work@mail.ru>, 2016
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/regmap.h>
+#include <linux/spi/spi.h>
+
+#include <sound/pcm.h>
+#include <sound/pcm_params.h>
+#include <sound/soc.h>
+#include <sound/tlv.h>
+
+/*
+ * CS4341 registers:
+ * High byte - SPI chip address (0x20)
+ * Low byte - Memory Address Pointer
+ */
+#define CS4341_REG_MODE1 0x00
+#define CS4341_REG_MODE2 0x01
+#define CS4341_REG_MIX 0x02
+#define CS4341_REG_VOLA 0x03
+#define CS4341_REG_VOLB 0x04
+
+#define CS4341_MODE2_DIF (7 << 4)
+#define CS4341_MODE2_DIF_I2S_24 (0 << 4)
+#define CS4341_MODE2_DIF_I2S_16 (1 << 4)
+#define CS4341_MODE2_DIF_LJ_24 (2 << 4)
+#define CS4341_MODE2_DIF_RJ_24 (3 << 4)
+#define CS4341_MODE2_DIF_RJ_16 (5 << 4)
+
+#define CS4341_VOLX_MUTE (1 << 7)
+
+struct cs4341_priv {
+ unsigned int fmt;
+ struct regmap *regmap;
+ struct regmap_config regcfg;
+};
+
+static const struct reg_default cs4341_reg_defaults[] = {
+ { CS4341_REG_MODE1, 0x00 },
+ { CS4341_REG_MODE2, 0x82 },
+ { CS4341_REG_MIX, 0x49 },
+ { CS4341_REG_VOLA, 0x80 },
+ { CS4341_REG_VOLB, 0x80 },
+};
+
+static bool cs4341_reg_readable(struct device *dev, unsigned int reg)
+{
+ return false;
+}
+
+static int cs4341_set_fmt(struct snd_soc_dai *dai, unsigned int format)
+{
+ struct snd_soc_codec *codec = dai->codec;
+ struct cs4341_priv *cs4341 = snd_soc_codec_get_drvdata(codec);
+
+ switch (format & SND_SOC_DAIFMT_MASTER_MASK) {
+ case SND_SOC_DAIFMT_CBS_CFS:
+ break;
+ default:
+ goto fmt_err;
+ }
+
+ switch (format & SND_SOC_DAIFMT_INV_MASK) {
+ case SND_SOC_DAIFMT_NB_NF:
+ break;
+ default:
+ goto fmt_err;
+ }
+
+ switch (format & SND_SOC_DAIFMT_FORMAT_MASK) {
+ case SND_SOC_DAIFMT_I2S:
+ case SND_SOC_DAIFMT_LEFT_J:
+ case SND_SOC_DAIFMT_RIGHT_J:
+ cs4341->fmt = format & SND_SOC_DAIFMT_FORMAT_MASK;
+ return 0;
+ default:
+ break;
+ }
+
+fmt_err:
+ dev_err(codec->dev, "Invalid DAI format 0x%08x\n", format);
+
+ return -EINVAL;
+}
+
+static int cs4341_hw_params(struct snd_pcm_substream *substream,
+ struct snd_pcm_hw_params *params,
+ struct snd_soc_dai *dai)
+{
+ struct snd_soc_codec *codec = dai->codec;
+ struct cs4341_priv *cs4341 = snd_soc_codec_get_drvdata(codec);
+ int bits24 = 0;
+
+ switch (params_format(params)) {
+ case SNDRV_PCM_FORMAT_S24_LE:
+ bits24 = 1;
+ break;
+ case SNDRV_PCM_FORMAT_S16_LE:
+ break;
+ default:
+ dev_err(codec->dev, "Unsupported PCM format\n");
+ return -EINVAL;
+ }
+
+ switch (cs4341->fmt) {
+ case SND_SOC_DAIFMT_I2S:
+ snd_soc_update_bits(codec, CS4341_REG_MODE2, CS4341_MODE2_DIF,
+ bits24 ? CS4341_MODE2_DIF_I2S_24 :
+ CS4341_MODE2_DIF_I2S_16);
+ break;
+ case SND_SOC_DAIFMT_LEFT_J:
+ snd_soc_update_bits(codec, CS4341_REG_MODE2, CS4341_MODE2_DIF,
+ CS4341_MODE2_DIF_LJ_24);
+ break;
+ case SND_SOC_DAIFMT_RIGHT_J:
+ snd_soc_update_bits(codec, CS4341_REG_MODE2, CS4341_MODE2_DIF,
+ bits24 ? CS4341_MODE2_DIF_RJ_24 :
+ CS4341_MODE2_DIF_RJ_16);
+ break;
+ default:
+ dev_err(codec->dev, "Unsupported DAI format\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int cs4341_digital_mute(struct snd_soc_dai *dai, int mute)
+{
+ struct snd_soc_codec *codec = dai->codec;
+ int ret;
+
+ ret = snd_soc_update_bits(codec, CS4341_REG_VOLA, CS4341_VOLX_MUTE,
+ mute ? CS4341_VOLX_MUTE : 0);
+ if (ret < 0)
+ return ret;
+
+ return snd_soc_update_bits(codec, CS4341_REG_VOLB, CS4341_VOLX_MUTE,
+ mute ? CS4341_VOLX_MUTE : 0);
+}
+
+static DECLARE_TLV_DB_SCALE(out_tlv, -9000, 100, 0);
+
+static const char *deemph[] = {
+ "Disabled", "44.1 kHz", "48 kHz", "32 kHz",
+};
+
+static const struct soc_enum deemph_enum =
+ SOC_ENUM_SINGLE(CS4341_REG_MODE2, 2, 4, deemph);
+
+static const char *srzc[] = {
+ "Immediate", "Zero Cross", "Soft Ramp", "SR on ZC",
+};
+
+static const struct soc_enum srzc_enum =
+ SOC_ENUM_SINGLE(CS4341_REG_MIX, 5, 4, srzc);
+
+
+static const struct snd_soc_dapm_widget cs4341_dapm_widgets[] = {
+ SND_SOC_DAPM_DAC("HiFi DAC", NULL, SND_SOC_NOPM, 0, 0),
+ SND_SOC_DAPM_OUTPUT("OutA"),
+ SND_SOC_DAPM_OUTPUT("OutB"),
+};
+
+static const struct snd_soc_dapm_route cs4341_routes[] = {
+ {"OutA", NULL, "HiFi DAC"},
+ {"OutB", NULL, "HiFi DAC"},
+ {"DAC Playback", NULL, "OutA"},
+ {"DAC Playback", NULL, "OutB"},
+};
+
+static const struct snd_kcontrol_new cs4341_controls[] = {
+ SOC_DOUBLE_R_TLV("Master Playback Volume",
+ CS4341_REG_VOLA, CS4341_REG_VOLB, 0, 90, 1, out_tlv),
+ SOC_ENUM("De-Emphasis Control", deemph_enum),
+ SOC_ENUM("Soft Ramp Zero Cross Control", srzc_enum),
+ SOC_SINGLE("Auto-Mute Switch", CS4341_REG_MODE2, 7, 1, 0),
+ SOC_SINGLE("Popguard Transient Control", CS4341_REG_MODE2, 1, 1, 0),
+};
+
+static const struct snd_soc_dai_ops cs4341_dai_ops = {
+ .set_fmt = cs4341_set_fmt,
+ .hw_params = cs4341_hw_params,
+ .digital_mute = cs4341_digital_mute,
+};
+
+static struct snd_soc_dai_driver cs4341_dai = {
+ .name = "cs4341a-hifi",
+ .symmetric_rates = 1,
+ .playback = {
+ .stream_name = "DAC Playback",
+ .channels_min = 1,
+ .channels_max = 2,
+ .rates = SNDRV_PCM_RATE_8000_96000,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE,
+ },
+ .ops = &cs4341_dai_ops,
+};
+
+static struct snd_soc_codec_driver soc_codec_cs4341 = {
+ .dapm_widgets = cs4341_dapm_widgets,
+ .num_dapm_widgets = ARRAY_SIZE(cs4341_dapm_widgets),
+ .dapm_routes = cs4341_routes,
+ .num_dapm_routes = ARRAY_SIZE(cs4341_routes),
+ .controls = cs4341_controls,
+ .num_controls = ARRAY_SIZE(cs4341_controls),
+};
+
+static int cs4341_spi_probe(struct spi_device *spi)
+{
+ struct cs4341_priv *cs4341;
+ int i, ret;
+
+ cs4341 = devm_kzalloc(&spi->dev, sizeof(*cs4341), GFP_KERNEL);
+ if (!cs4341)
+ return -ENOMEM;
+
+ spi->bits_per_word = spi->bits_per_word ? : 8;
+ spi->max_speed_hz = spi->max_speed_hz ? : 6000000;
+ ret = spi_setup(spi);
+ if (ret)
+ return ret;
+
+ cs4341->regcfg.reg_bits = 16;
+ cs4341->regcfg.val_bits = 8;
+ cs4341->regcfg.write_flag_mask = 0x20;
+ cs4341->regcfg.max_register = CS4341_REG_VOLB;
+ cs4341->regcfg.cache_type = REGCACHE_FLAT;
+ cs4341->regcfg.readable_reg = cs4341_reg_readable;
+ cs4341->regcfg.reg_defaults = cs4341_reg_defaults;
+ cs4341->regcfg.num_reg_defaults = ARRAY_SIZE(cs4341_reg_defaults);
+ cs4341->regmap = devm_regmap_init_spi(spi, &cs4341->regcfg);
+ if (IS_ERR(cs4341->regmap))
+ return PTR_ERR(cs4341->regmap);
+
+ spi_set_drvdata(spi, cs4341);
+
+ for (i = 0; i < ARRAY_SIZE(cs4341_reg_defaults); i++)
+ regmap_write(cs4341->regmap, cs4341_reg_defaults[i].reg,
+ cs4341_reg_defaults[i].def);
+
+ return snd_soc_register_codec(&spi->dev, &soc_codec_cs4341, &cs4341_dai, 1);
+}
+
+static int cs4341_spi_remove(struct spi_device *spi)
+{
+ snd_soc_unregister_codec(&spi->dev);
+
+ return 0;
+}
+
+static const struct of_device_id __maybe_unused cs4341_dt_ids[] = {
+ { .compatible = "cirrus,cs4341a", },
+ { }
+};
+MODULE_DEVICE_TABLE(of, cs4341_dt_ids);
+
+static struct spi_driver cs4341_spi_driver = {
+ .driver = {
+ .name = "cs4341",
+ .of_match_table = of_match_ptr(cs4341_dt_ids),
+ },
+ .probe = cs4341_spi_probe,
+ .remove = cs4341_spi_remove,
+};
+module_spi_driver(cs4341_spi_driver);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Alexander Shiyan <shc_work@mail.ru>");
+MODULE_DESCRIPTION("Cirrus Logic CS4341 ALSA SoC Codec Driver");
--
2.7.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] ASoC: cs4341: Add driver for CS4341 CODEC
2016-09-08 16:29 [PATCH 1/2] ASoC: cs4341: Add driver for CS4341 CODEC Alexander Shiyan
@ 2016-09-21 2:38 ` Handrigan, Paul
2016-09-21 8:59 ` Alexander Shiyan
2016-09-24 19:07 ` Mark Brown
1 sibling, 1 reply; 6+ messages in thread
From: Handrigan, Paul @ 2016-09-21 2:38 UTC (permalink / raw)
To: Alexander Shiyan, alsa-devel
Cc: Austin, Brian, Mark Brown, Takashi Iwai, Liam Girdwood
On 9/8/16, 11:29 AM, "Alexander Shiyan" <shc_work@mail.ru> wrote:
>diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
>index 1cd6ab3..9853e79 100644
>--- a/sound/soc/codecs/Kconfig
>+++ b/sound/soc/codecs/Kconfig
>@@ -458,6 +458,13 @@ config SND_SOC_CS42XX8_I2C
> select SND_SOC_CS42XX8
> select REGMAP_I2C
>
>+config SND_SOC_CS4341
>+ tristate "Cirrus Logic CS4341 CODEC"
>+ depends on SPI_MASTER
>+ select REGMAP_SPI
>+ help
>+ Enable support for Cirrus Logic (Crystal) CS4341 CODEC.
>+
This devices primary interface is I2C. That should be added as well since
i2c is read/write and spi is write only.
> # Cirrus Logic CS4349 HiFi DAC
> config SND_SOC_CS4349
> tristate "Cirrus Logic CS4349 CODEC"
>
>+#define CS4341_REG_MODE1 0x00
>+#define CS4341_REG_MODE2 0x01
>+#define CS4341_REG_MIX 0x02
>+#define CS4341_REG_VOLA 0x03
>+#define CS4341_REG_VOLB 0x04
>+
>+#define CS4341_MODE2_DIF (7 << 4)
>+#define CS4341_MODE2_DIF_I2S_24 (0 << 4)
>+#define CS4341_MODE2_DIF_I2S_16 (1 << 4)
>+#define CS4341_MODE2_DIF_LJ_24 (2 << 4)
>+#define CS4341_MODE2_DIF_RJ_24 (3 << 4)
>+#define CS4341_MODE2_DIF_RJ_16 (5 << 4)
>+
>+#define CS4341_VOLX_MUTE (1 << 7)
It would be a good idea to clean up the indentation here.
>+ switch (cs4341->fmt) {
>+ case SND_SOC_DAIFMT_I2S:
>+ snd_soc_update_bits(codec, CS4341_REG_MODE2, CS4341_MODE2_DIF,
>+ bits24 ? CS4341_MODE2_DIF_I2S_24 :
>+ CS4341_MODE2_DIF_I2S_16);
>+ break;
>+ case SND_SOC_DAIFMT_LEFT_J:
>+ snd_soc_update_bits(codec, CS4341_REG_MODE2, CS4341_MODE2_DIF,
>+ CS4341_MODE2_DIF_LJ_24);
>+ break;
>+ case SND_SOC_DAIFMT_RIGHT_J:
>+ snd_soc_update_bits(codec, CS4341_REG_MODE2, CS4341_MODE2_DIF,
>+ bits24 ? CS4341_MODE2_DIF_RJ_24 :
>+ CS4341_MODE2_DIF_RJ_16);
>+ break;
>+ default:
>+ dev_err(codec->dev, "Unsupported DAI format\n");
>+ return -EINVAL;
>+ }
Can we use regmap_update_bits where we can?
>+
>+ return 0;
>+}
>+
>+static int cs4341_digital_mute(struct snd_soc_dai *dai, int mute)
>+{
>+ struct snd_soc_codec *codec = dai->codec;
>+ int ret;
>+
>+ ret = snd_soc_update_bits(codec, CS4341_REG_VOLA, CS4341_VOLX_MUTE,
>+ mute ? CS4341_VOLX_MUTE : 0);
>+ if (ret < 0)
>+ return ret;
>+
>+ return snd_soc_update_bits(codec, CS4341_REG_VOLB, CS4341_VOLX_MUTE,
>+ mute ? CS4341_VOLX_MUTE : 0);
regmap_update_bits
>+}
>+
>
>
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] ASoC: cs4341: Add driver for CS4341 CODEC
2016-09-21 2:38 ` Handrigan, Paul
@ 2016-09-21 8:59 ` Alexander Shiyan
2016-09-24 19:07 ` Mark Brown
2016-09-28 21:20 ` Handrigan, Paul
0 siblings, 2 replies; 6+ messages in thread
From: Alexander Shiyan @ 2016-09-21 8:59 UTC (permalink / raw)
To: "Handrigan, Paul"
Cc: "Austin, Brian",
Mark Brown, Takashi Iwai, alsa-devel, Liam Girdwood
>On 9/8/16, 11:29 AM, "Alexander Shiyan" < shc_work@mail.ru > wrote:
>
...
>>+config SND_SOC_CS4341
>>+tristate "Cirrus Logic CS4341 CODEC"
>>+depends on SPI_MASTER
>>+select REGMAP_SPI
>>+help
>>+ Enable support for Cirrus Logic (Crystal) CS4341 CODEC.
>>+
>This devices primary interface is I2C. That should be added as well since
>i2c is read/write and spi is write only.
I can add I2C support, but can not test this.
...
>>+snd_soc_update_bits(codec, CS4341_REG_MODE2, CS4341_MODE2_DIF,
>>+ bits24 ? CS4341_MODE2_DIF_RJ_24 :
>>+ CS4341_MODE2_DIF_RJ_16);
>>+break;
>>+default:
>>+dev_err(codec->dev, "Unsupported DAI format\n");
>>+return -EINVAL;
>>+}
>
>Can we use regmap_update_bits where we can?
So you say that regmap_update_bits() is prefferred than snd_soc_update_bits() ?
---
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] ASoC: cs4341: Add driver for CS4341 CODEC
2016-09-08 16:29 [PATCH 1/2] ASoC: cs4341: Add driver for CS4341 CODEC Alexander Shiyan
2016-09-21 2:38 ` Handrigan, Paul
@ 2016-09-24 19:07 ` Mark Brown
1 sibling, 0 replies; 6+ messages in thread
From: Mark Brown @ 2016-09-24 19:07 UTC (permalink / raw)
To: Alexander Shiyan
Cc: Brian Austin, Liam Girdwood, alsa-devel, Paul Handrigan, Takashi Iwai
[-- Attachment #1.1: Type: text/plain, Size: 864 bytes --]
On Thu, Sep 08, 2016 at 07:29:29PM +0300, Alexander Shiyan wrote:
> + switch (format & SND_SOC_DAIFMT_INV_MASK) {
> + case SND_SOC_DAIFMT_NB_NF:
> + break;
> + default:
> + goto fmt_err;
> + }
Why the goto? Just put the error handling code in here directly.
> + switch (format & SND_SOC_DAIFMT_FORMAT_MASK) {
> + case SND_SOC_DAIFMT_I2S:
> + case SND_SOC_DAIFMT_LEFT_J:
> + case SND_SOC_DAIFMT_RIGHT_J:
> + cs4341->fmt = format & SND_SOC_DAIFMT_FORMAT_MASK;
> + return 0;
> + default:
> + break;
We silently ignore invalid formats here...
> + SOC_SINGLE("Popguard Transient Control", CS4341_REG_MODE2, 1, 1, 0),
Popguard Transient Switch so that userspace tools know how to handle
this.
> + spi->bits_per_word = spi->bits_per_word ? : 8;
> + spi->max_speed_hz = spi->max_speed_hz ? : 6000000;
Please write normal if statements, it's easier to read..
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 455 bytes --]
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] ASoC: cs4341: Add driver for CS4341 CODEC
2016-09-21 8:59 ` Alexander Shiyan
@ 2016-09-24 19:07 ` Mark Brown
2016-09-28 21:20 ` Handrigan, Paul
1 sibling, 0 replies; 6+ messages in thread
From: Mark Brown @ 2016-09-24 19:07 UTC (permalink / raw)
To: Alexander Shiyan
Cc: "Austin, Brian",
alsa-devel, Takashi Iwai, "Handrigan, Paul",
Liam Girdwood
[-- Attachment #1.1: Type: text/plain, Size: 293 bytes --]
On Wed, Sep 21, 2016 at 11:59:53AM +0300, Alexander Shiyan wrote:
> >On 9/8/16, 11:29 AM, "Alexander Shiyan" < shc_work@mail.ru > wrote:
> >Can we use regmap_update_bits where we can?
> So you say that regmap_update_bits() is prefferred than snd_soc_update_bits() ?
It's a bit better, yes.
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 455 bytes --]
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] ASoC: cs4341: Add driver for CS4341 CODEC
2016-09-21 8:59 ` Alexander Shiyan
2016-09-24 19:07 ` Mark Brown
@ 2016-09-28 21:20 ` Handrigan, Paul
1 sibling, 0 replies; 6+ messages in thread
From: Handrigan, Paul @ 2016-09-28 21:20 UTC (permalink / raw)
To: Alexander Shiyan
Cc: Austin, Brian, Mark Brown, Takashi Iwai, alsa-devel, Liam Girdwood
On 9/21/16, 3:59 AM, "Alexander Shiyan" <shc_work@mail.ru> wrote:
>>On 9/8/16, 11:29 AM, "Alexander Shiyan" < shc_work@mail.ru > wrote:
>>
>...
>>>+config SND_SOC_CS4341
>>>+tristate "Cirrus Logic CS4341 CODEC"
>>>+depends on SPI_MASTER
>>>+select REGMAP_SPI
>>>+help
>>>+ Enable support for Cirrus Logic (Crystal) CS4341 CODEC.
>>>+
>>This devices primary interface is I2C. That should be added as well
>>since
>>i2c is read/write and spi is write only.
>
>I can add I2C support, but can not test this.
OK, that is fine. We can add a patch to support I2C after that.
>
>...
>>>+snd_soc_update_bits(codec, CS4341_REG_MODE2, CS4341_MODE2_DIF,
>>>+ bits24 ? CS4341_MODE2_DIF_RJ_24 :
>>>+ CS4341_MODE2_DIF_RJ_16);
>>>+break;
>>>+default:
>>>+dev_err(codec->dev, "Unsupported DAI format\n");
>>>+return -EINVAL;
>>>+}
>>
>>Can we use regmap_update_bits where we can?
>
>So you say that regmap_update_bits() is prefferred than
>snd_soc_update_bits() ?
Yes.
>
>---
>
>_______________________________________________
>Alsa-devel mailing list
>Alsa-devel@alsa-project.org
>https://urldefense.proofpoint.com/v2/url?u=http-3A__mailman.alsa-2Dproject
>.org_mailman_listinfo_alsa-2Ddevel&d=DQICAg&c=O3LcjD-V2Iepl5V0N1424A&r=NJt
>NI3T_InLOY17xIGk4jdUC7XljFdoy6miaxhGHOOI&m=D9AVC8o2an1rQHYC1xfoGKGHyAfKmCk
>0R0ahr8l8n3Q&s=EaM-NwVFymokJtsVOM7graacnT_2n68TY32zeMkDSbw&e=
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2016-09-28 21:20 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-09-08 16:29 [PATCH 1/2] ASoC: cs4341: Add driver for CS4341 CODEC Alexander Shiyan
2016-09-21 2:38 ` Handrigan, Paul
2016-09-21 8:59 ` Alexander Shiyan
2016-09-24 19:07 ` Mark Brown
2016-09-28 21:20 ` Handrigan, Paul
2016-09-24 19:07 ` 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.