* [PATCH 0/5] ASoC: codecs: ad193x: Several fixes and imprevements
@ 2019-02-18 16:10 Codrin.Ciubotariu
2019-02-18 16:10 ` [PATCH 1/5] ASoC: codecs: ad193x: Remove capture support for codecs without ADC Codrin.Ciubotariu
` (5 more replies)
0 siblings, 6 replies; 12+ messages in thread
From: Codrin.Ciubotariu @ 2019-02-18 16:10 UTC (permalink / raw)
To: lars, lgirdwood, broonie; +Cc: alsa-devel, linux-kernel, Codrin.Ciubotariu
From: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
This patch set contains some changes I needed to make I2S and TDM
(DSP_A) formats work. I tested only with ad1936, but the patches
should work fine for all the codecs that use this driver. Although I
checked the DS for all of them (I hope) to assure that the patches
apply, I would really appreciate if someone else can test them on
another codec.
Codrin Ciubotariu (5):
ASoC: codecs: ad193x: Remove capture support for codecs without ADC
ASoC: codecs: ad193x: Set constraint to always have 32 sample bits
ASoC: codecs: ad193x: Fix frame polarity for DSP_A format
ASoC: codecs: ad193x: Add runtime support for DSP_A and I2S modes
ASoC: codecs: ad193x: Add support to disable on-chip PLL
sound/soc/codecs/ad193x.c | 76 ++++++++++++++++++++++++++++++++++++---
sound/soc/codecs/ad193x.h | 8 +++++
2 files changed, 80 insertions(+), 4 deletions(-)
--
2.17.1
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 1/5] ASoC: codecs: ad193x: Remove capture support for codecs without ADC
2019-02-18 16:10 [PATCH 0/5] ASoC: codecs: ad193x: Several fixes and imprevements Codrin.Ciubotariu
@ 2019-02-18 16:10 ` Codrin.Ciubotariu
2019-02-18 18:49 ` Applied "ASoC: codecs: ad193x: Remove capture support for codecs without ADC" to the asoc tree Mark Brown
2019-02-18 16:10 ` [PATCH 2/5] ASoC: codecs: ad193x: Set constraint to always have 32 sample bits Codrin.Ciubotariu
` (4 subsequent siblings)
5 siblings, 1 reply; 12+ messages in thread
From: Codrin.Ciubotariu @ 2019-02-18 16:10 UTC (permalink / raw)
To: lars, lgirdwood, broonie; +Cc: alsa-devel, linux-kernel, Codrin.Ciubotariu
From: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
Some ad193x codecs don't have ADCs, so they have no capture capabilities.
This way, we can use this driver in multicodec cards.
Signed-off-by: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
---
sound/soc/codecs/ad193x.c | 19 ++++++++++++++++++-
1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c
index 4b60ebee491d..21a38cc9e3da 100644
--- a/sound/soc/codecs/ad193x.c
+++ b/sound/soc/codecs/ad193x.c
@@ -351,6 +351,20 @@ static struct snd_soc_dai_driver ad193x_dai = {
.ops = &ad193x_dai_ops,
};
+/* codec DAI instance for DAC only */
+static struct snd_soc_dai_driver ad193x_no_adc_dai = {
+ .name = "ad193x-hifi",
+ .playback = {
+ .stream_name = "Playback",
+ .channels_min = 2,
+ .channels_max = 8,
+ .rates = SNDRV_PCM_RATE_48000,
+ .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE,
+ },
+ .ops = &ad193x_dai_ops,
+};
+
static int ad193x_component_probe(struct snd_soc_component *component)
{
struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(component);
@@ -444,8 +458,11 @@ int ad193x_probe(struct device *dev, struct regmap *regmap,
dev_set_drvdata(dev, ad193x);
+ if (ad193x_has_adc(ad193x))
+ return devm_snd_soc_register_component(dev, &soc_component_dev_ad193x,
+ &ad193x_dai, 1);
return devm_snd_soc_register_component(dev, &soc_component_dev_ad193x,
- &ad193x_dai, 1);
+ &ad193x_no_adc_dai, 1);
}
EXPORT_SYMBOL_GPL(ad193x_probe);
--
2.17.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 2/5] ASoC: codecs: ad193x: Set constraint to always have 32 sample bits
2019-02-18 16:10 [PATCH 0/5] ASoC: codecs: ad193x: Several fixes and imprevements Codrin.Ciubotariu
2019-02-18 16:10 ` [PATCH 1/5] ASoC: codecs: ad193x: Remove capture support for codecs without ADC Codrin.Ciubotariu
@ 2019-02-18 16:10 ` Codrin.Ciubotariu
2019-02-18 18:49 ` Applied "ASoC: codecs: ad193x: Set constraint to always have 32 sample bits" to the asoc tree Mark Brown
2019-02-18 16:10 ` [PATCH 3/5] ASoC: codecs: ad193x: Fix frame polarity for DSP_A format Codrin.Ciubotariu
` (3 subsequent siblings)
5 siblings, 1 reply; 12+ messages in thread
From: Codrin.Ciubotariu @ 2019-02-18 16:10 UTC (permalink / raw)
To: lars, lgirdwood, broonie; +Cc: alsa-devel, linux-kernel, Codrin.Ciubotariu
From: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
DACs and ADCs on ad193x codecs require a 32 bit slot size. We should
assure that no other size is used.
Signed-off-by: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
---
sound/soc/codecs/ad193x.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c
index 21a38cc9e3da..c16c9969d1a0 100644
--- a/sound/soc/codecs/ad193x.c
+++ b/sound/soc/codecs/ad193x.c
@@ -37,6 +37,13 @@ static SOC_ENUM_SINGLE_DECL(ad193x_deemp_enum, AD193X_DAC_CTRL2, 1,
static const DECLARE_TLV_DB_MINMAX(adau193x_tlv, -9563, 0);
+static const unsigned int ad193x_sb[] = {32};
+
+static struct snd_pcm_hw_constraint_list constr = {
+ .list = ad193x_sb,
+ .count = ARRAY_SIZE(ad193x_sb),
+};
+
static const struct snd_kcontrol_new ad193x_snd_controls[] = {
/* DAC volume control */
SOC_DOUBLE_R_TLV("DAC1 Volume", AD193X_DAC_L1_VOL,
@@ -321,7 +328,16 @@ static int ad193x_hw_params(struct snd_pcm_substream *substream,
return 0;
}
+static int ad193x_startup(struct snd_pcm_substream *substream,
+ struct snd_soc_dai *dai)
+{
+ return snd_pcm_hw_constraint_list(substream->runtime, 0,
+ SNDRV_PCM_HW_PARAM_SAMPLE_BITS,
+ &constr);
+}
+
static const struct snd_soc_dai_ops ad193x_dai_ops = {
+ .startup = ad193x_startup,
.hw_params = ad193x_hw_params,
.digital_mute = ad193x_mute,
.set_tdm_slot = ad193x_set_tdm_slot,
--
2.17.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 3/5] ASoC: codecs: ad193x: Fix frame polarity for DSP_A format
2019-02-18 16:10 [PATCH 0/5] ASoC: codecs: ad193x: Several fixes and imprevements Codrin.Ciubotariu
2019-02-18 16:10 ` [PATCH 1/5] ASoC: codecs: ad193x: Remove capture support for codecs without ADC Codrin.Ciubotariu
2019-02-18 16:10 ` [PATCH 2/5] ASoC: codecs: ad193x: Set constraint to always have 32 sample bits Codrin.Ciubotariu
@ 2019-02-18 16:10 ` Codrin.Ciubotariu
2019-02-18 18:49 ` Applied "ASoC: codecs: ad193x: Fix frame polarity for DSP_A format" to the asoc tree Mark Brown
2019-02-18 16:10 ` [PATCH 4/5] ASoC: codecs: ad193x: Add runtime support for DSP_A and I2S modes Codrin.Ciubotariu
` (2 subsequent siblings)
5 siblings, 1 reply; 12+ messages in thread
From: Codrin.Ciubotariu @ 2019-02-18 16:10 UTC (permalink / raw)
To: lars, lgirdwood, broonie; +Cc: alsa-devel, linux-kernel, Codrin.Ciubotariu
From: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
By default, the codec starts to interpret the left (first) channel on
the falling edge (low polarity) of LRCLK. However, for DSP_A, the left
channel needs to start on the rising edge of LRCLK. This patch fixes
this channel swap by toggling the bit which selects the LRCLK polarity.
Signed-off-by: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
---
sound/soc/codecs/ad193x.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c
index c16c9969d1a0..315ec9775118 100644
--- a/sound/soc/codecs/ad193x.c
+++ b/sound/soc/codecs/ad193x.c
@@ -228,6 +228,12 @@ static int ad193x_set_dai_fmt(struct snd_soc_dai *codec_dai,
return -EINVAL;
}
+ /* For DSP_*, LRCLK's polarity must be inverted */
+ if (fmt & SND_SOC_DAIFMT_DSP_A) {
+ change_bit(ffs(AD193X_DAC_LEFT_HIGH) - 1,
+ (unsigned long *)&dac_fmt);
+ }
+
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
case SND_SOC_DAIFMT_CBM_CFM: /* codec clk & frm master */
adc_fmt |= AD193X_ADC_LCR_MASTER;
--
2.17.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 4/5] ASoC: codecs: ad193x: Add runtime support for DSP_A and I2S modes
2019-02-18 16:10 [PATCH 0/5] ASoC: codecs: ad193x: Several fixes and imprevements Codrin.Ciubotariu
` (2 preceding siblings ...)
2019-02-18 16:10 ` [PATCH 3/5] ASoC: codecs: ad193x: Fix frame polarity for DSP_A format Codrin.Ciubotariu
@ 2019-02-18 16:10 ` Codrin.Ciubotariu
2019-02-18 18:49 ` Applied "ASoC: codecs: ad193x: Add runtime support for DSP_A and I2S modes" to the asoc tree Mark Brown
2019-02-18 16:10 ` [PATCH 5/5] ASoC: codecs: ad193x: Add support to disable on-chip PLL Codrin.Ciubotariu
2019-02-18 16:57 ` [PATCH 0/5] ASoC: codecs: ad193x: Several fixes and imprevements Codrin.Ciubotariu
5 siblings, 1 reply; 12+ messages in thread
From: Codrin.Ciubotariu @ 2019-02-18 16:10 UTC (permalink / raw)
To: lars, lgirdwood, broonie; +Cc: alsa-devel, linux-kernel, Codrin.Ciubotariu
From: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
The driver only supports DPS_A for DAC, which is configured at probe.
This patch adds support for DSP_A and I2S modes by using the set_fmt()
callback.
A trivial break is also removed from a case's default branch.
Signed-off-by: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
---
sound/soc/codecs/ad193x.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c
index 315ec9775118..f8cf182518a3 100644
--- a/sound/soc/codecs/ad193x.c
+++ b/sound/soc/codecs/ad193x.c
@@ -188,23 +188,26 @@ static int ad193x_set_dai_fmt(struct snd_soc_dai *codec_dai,
{
struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(codec_dai->component);
unsigned int adc_serfmt = 0;
+ unsigned int dac_serfmt = 0;
unsigned int adc_fmt = 0;
unsigned int dac_fmt = 0;
/* At present, the driver only support AUX ADC mode(SND_SOC_DAIFMT_I2S
- * with TDM) and ADC&DAC TDM mode(SND_SOC_DAIFMT_DSP_A)
+ * with TDM), ADC&DAC TDM mode(SND_SOC_DAIFMT_DSP_A) and DAC I2S mode
+ * (SND_SOC_DAIFMT_I2S)
*/
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
case SND_SOC_DAIFMT_I2S:
adc_serfmt |= AD193X_ADC_SERFMT_TDM;
+ dac_serfmt |= AD193X_DAC_SERFMT_STEREO;
break;
case SND_SOC_DAIFMT_DSP_A:
adc_serfmt |= AD193X_ADC_SERFMT_AUX;
+ dac_serfmt |= AD193X_DAC_SERFMT_TDM;
break;
default:
if (ad193x_has_adc(ad193x))
return -EINVAL;
- break;
}
switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
@@ -261,6 +264,8 @@ static int ad193x_set_dai_fmt(struct snd_soc_dai *codec_dai,
regmap_update_bits(ad193x->regmap, AD193X_ADC_CTRL2,
AD193X_ADC_FMT_MASK, adc_fmt);
}
+ regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL0,
+ AD193X_DAC_SERFMT_MASK, dac_serfmt);
regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL1,
AD193X_DAC_FMT_MASK, dac_fmt);
--
2.17.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 5/5] ASoC: codecs: ad193x: Add support to disable on-chip PLL
2019-02-18 16:10 [PATCH 0/5] ASoC: codecs: ad193x: Several fixes and imprevements Codrin.Ciubotariu
` (3 preceding siblings ...)
2019-02-18 16:10 ` [PATCH 4/5] ASoC: codecs: ad193x: Add runtime support for DSP_A and I2S modes Codrin.Ciubotariu
@ 2019-02-18 16:10 ` Codrin.Ciubotariu
2019-02-18 18:49 ` Applied "ASoC: codecs: ad193x: Add support to disable on-chip PLL" to the asoc tree Mark Brown
2019-02-18 16:57 ` [PATCH 0/5] ASoC: codecs: ad193x: Several fixes and imprevements Codrin.Ciubotariu
5 siblings, 1 reply; 12+ messages in thread
From: Codrin.Ciubotariu @ 2019-02-18 16:10 UTC (permalink / raw)
To: lars, lgirdwood, broonie; +Cc: alsa-devel, linux-kernel, Codrin.Ciubotariu
From: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
The on-chip PLL can be disabled if on the MCLKI pin we have an external
clock at 512 x fs. This clock can be used as direct internal clock for
ADCs or DACs.
To support this, we add an extra clock id that can be configured
using the set_sysclk() callback.
Signed-off-by: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
---
sound/soc/codecs/ad193x.c | 26 +++++++++++++++++++++++++-
sound/soc/codecs/ad193x.h | 8 ++++++++
2 files changed, 33 insertions(+), 1 deletion(-)
diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c
index f8cf182518a3..96d7cb2e4a56 100644
--- a/sound/soc/codecs/ad193x.c
+++ b/sound/soc/codecs/ad193x.c
@@ -100,6 +100,15 @@ static const struct snd_soc_dapm_widget ad193x_adc_widgets[] = {
SND_SOC_DAPM_INPUT("ADC2IN"),
};
+static int ad193x_check_pll(struct snd_soc_dapm_widget *source,
+ struct snd_soc_dapm_widget *sink)
+{
+ struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);
+ struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(component);
+
+ return !!ad193x->sysclk;
+}
+
static const struct snd_soc_dapm_route audio_paths[] = {
{ "DAC", NULL, "SYSCLK" },
{ "DAC Output", NULL, "DAC" },
@@ -108,7 +117,7 @@ static const struct snd_soc_dapm_route audio_paths[] = {
{ "DAC2OUT", NULL, "DAC Output" },
{ "DAC3OUT", NULL, "DAC Output" },
{ "DAC4OUT", NULL, "DAC Output" },
- { "SYSCLK", NULL, "PLL_PWR" },
+ { "SYSCLK", NULL, "PLL_PWR", &ad193x_check_pll },
};
static const struct snd_soc_dapm_route ad193x_adc_audio_paths[] = {
@@ -276,7 +285,22 @@ static int ad193x_set_dai_sysclk(struct snd_soc_dai *codec_dai,
int clk_id, unsigned int freq, int dir)
{
struct snd_soc_component *component = codec_dai->component;
+ struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(component);
+
+ if (clk_id == AD193X_SYSCLK_MCLK) {
+ /* MCLK must be 512 x fs */
+ if (dir == SND_SOC_CLOCK_OUT || freq != 24576000)
+ return -EINVAL;
+
+ regmap_update_bits(ad193x->regmap, AD193X_PLL_CLK_CTRL1,
+ AD193X_PLL_SRC_MASK,
+ AD193X_PLL_DAC_SRC_MCLK |
+ AD193X_PLL_CLK_SRC_MCLK);
+
+ snd_soc_dapm_sync(dapm);
+ return 0;
+ }
switch (freq) {
case 12288000:
case 18432000:
diff --git a/sound/soc/codecs/ad193x.h b/sound/soc/codecs/ad193x.h
index 8b1e65f928d2..27d6afbd7dfb 100644
--- a/sound/soc/codecs/ad193x.h
+++ b/sound/soc/codecs/ad193x.h
@@ -31,6 +31,11 @@ int ad193x_probe(struct device *dev, struct regmap *regmap,
#define AD193X_PLL_INPUT_512 (2 << 1)
#define AD193X_PLL_INPUT_768 (3 << 1)
#define AD193X_PLL_CLK_CTRL1 0x01
+#define AD193X_PLL_SRC_MASK 0x03
+#define AD193X_PLL_DAC_SRC_PLL 0
+#define AD193X_PLL_DAC_SRC_MCLK 1
+#define AD193X_PLL_CLK_SRC_PLL (0 << 1)
+#define AD193X_PLL_CLK_SRC_MCLK (1 << 1)
#define AD193X_DAC_CTRL0 0x02
#define AD193X_DAC_POWERDOWN 0x01
#define AD193X_DAC_SERFMT_MASK 0xC0
@@ -96,4 +101,7 @@ int ad193x_probe(struct device *dev, struct regmap *regmap,
#define AD193X_NUM_REGS 17
+#define AD193X_SYSCLK_PLL 0
+#define AD193X_SYSCLK_MCLK 1
+
#endif
--
2.17.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH 0/5] ASoC: codecs: ad193x: Several fixes and imprevements
2019-02-18 16:10 [PATCH 0/5] ASoC: codecs: ad193x: Several fixes and imprevements Codrin.Ciubotariu
` (4 preceding siblings ...)
2019-02-18 16:10 ` [PATCH 5/5] ASoC: codecs: ad193x: Add support to disable on-chip PLL Codrin.Ciubotariu
@ 2019-02-18 16:57 ` Codrin.Ciubotariu
5 siblings, 0 replies; 12+ messages in thread
From: Codrin.Ciubotariu @ 2019-02-18 16:57 UTC (permalink / raw)
To: lars, lgirdwood, broonie; +Cc: alsa-devel, linux-kernel
On 18.02.2019 18:10, Codrin Ciubotariu - M19940 wrote:
> From: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
>
> This patch set contains some changes I needed to make I2S and TDM
> (DSP_A) formats work. I tested only with ad1936, but the patches
actually, it's ad1934. Sorry about that.
Best regards,
Codrin
> should work fine for all the codecs that use this driver. Although I
> checked the DS for all of them (I hope) to assure that the patches
> apply, I would really appreciate if someone else can test them on
> another codec.
>
> Codrin Ciubotariu (5):
> ASoC: codecs: ad193x: Remove capture support for codecs without ADC
> ASoC: codecs: ad193x: Set constraint to always have 32 sample bits
> ASoC: codecs: ad193x: Fix frame polarity for DSP_A format
> ASoC: codecs: ad193x: Add runtime support for DSP_A and I2S modes
> ASoC: codecs: ad193x: Add support to disable on-chip PLL
>
> sound/soc/codecs/ad193x.c | 76 ++++++++++++++++++++++++++++++++++++---
> sound/soc/codecs/ad193x.h | 8 +++++
> 2 files changed, 80 insertions(+), 4 deletions(-)
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Applied "ASoC: codecs: ad193x: Add support to disable on-chip PLL" to the asoc tree
2019-02-18 16:10 ` [PATCH 5/5] ASoC: codecs: ad193x: Add support to disable on-chip PLL Codrin.Ciubotariu
@ 2019-02-18 18:49 ` Mark Brown
0 siblings, 0 replies; 12+ messages in thread
From: Mark Brown @ 2019-02-18 18:49 UTC (permalink / raw)
To: Codrin Ciubotariu
Cc: Mark Brown, lars, lgirdwood, broonie, alsa-devel,
Codrin.Ciubotariu, linux-kernel, alsa-devel
The patch
ASoC: codecs: ad193x: Add support to disable on-chip PLL
has been applied to the asoc tree at
https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
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
From 59529473751e987e28c926838f70aaef588b83b0 Mon Sep 17 00:00:00 2001
From: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
Date: Mon, 18 Feb 2019 16:10:36 +0000
Subject: [PATCH] ASoC: codecs: ad193x: Add support to disable on-chip PLL
The on-chip PLL can be disabled if on the MCLKI pin we have an external
clock at 512 x fs. This clock can be used as direct internal clock for
ADCs or DACs.
To support this, we add an extra clock id that can be configured
using the set_sysclk() callback.
Signed-off-by: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
sound/soc/codecs/ad193x.c | 26 +++++++++++++++++++++++++-
sound/soc/codecs/ad193x.h | 8 ++++++++
2 files changed, 33 insertions(+), 1 deletion(-)
diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c
index f8cf182518a3..96d7cb2e4a56 100644
--- a/sound/soc/codecs/ad193x.c
+++ b/sound/soc/codecs/ad193x.c
@@ -100,6 +100,15 @@ static const struct snd_soc_dapm_widget ad193x_adc_widgets[] = {
SND_SOC_DAPM_INPUT("ADC2IN"),
};
+static int ad193x_check_pll(struct snd_soc_dapm_widget *source,
+ struct snd_soc_dapm_widget *sink)
+{
+ struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);
+ struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(component);
+
+ return !!ad193x->sysclk;
+}
+
static const struct snd_soc_dapm_route audio_paths[] = {
{ "DAC", NULL, "SYSCLK" },
{ "DAC Output", NULL, "DAC" },
@@ -108,7 +117,7 @@ static const struct snd_soc_dapm_route audio_paths[] = {
{ "DAC2OUT", NULL, "DAC Output" },
{ "DAC3OUT", NULL, "DAC Output" },
{ "DAC4OUT", NULL, "DAC Output" },
- { "SYSCLK", NULL, "PLL_PWR" },
+ { "SYSCLK", NULL, "PLL_PWR", &ad193x_check_pll },
};
static const struct snd_soc_dapm_route ad193x_adc_audio_paths[] = {
@@ -276,7 +285,22 @@ static int ad193x_set_dai_sysclk(struct snd_soc_dai *codec_dai,
int clk_id, unsigned int freq, int dir)
{
struct snd_soc_component *component = codec_dai->component;
+ struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(component);
+
+ if (clk_id == AD193X_SYSCLK_MCLK) {
+ /* MCLK must be 512 x fs */
+ if (dir == SND_SOC_CLOCK_OUT || freq != 24576000)
+ return -EINVAL;
+
+ regmap_update_bits(ad193x->regmap, AD193X_PLL_CLK_CTRL1,
+ AD193X_PLL_SRC_MASK,
+ AD193X_PLL_DAC_SRC_MCLK |
+ AD193X_PLL_CLK_SRC_MCLK);
+
+ snd_soc_dapm_sync(dapm);
+ return 0;
+ }
switch (freq) {
case 12288000:
case 18432000:
diff --git a/sound/soc/codecs/ad193x.h b/sound/soc/codecs/ad193x.h
index 8b1e65f928d2..27d6afbd7dfb 100644
--- a/sound/soc/codecs/ad193x.h
+++ b/sound/soc/codecs/ad193x.h
@@ -31,6 +31,11 @@ int ad193x_probe(struct device *dev, struct regmap *regmap,
#define AD193X_PLL_INPUT_512 (2 << 1)
#define AD193X_PLL_INPUT_768 (3 << 1)
#define AD193X_PLL_CLK_CTRL1 0x01
+#define AD193X_PLL_SRC_MASK 0x03
+#define AD193X_PLL_DAC_SRC_PLL 0
+#define AD193X_PLL_DAC_SRC_MCLK 1
+#define AD193X_PLL_CLK_SRC_PLL (0 << 1)
+#define AD193X_PLL_CLK_SRC_MCLK (1 << 1)
#define AD193X_DAC_CTRL0 0x02
#define AD193X_DAC_POWERDOWN 0x01
#define AD193X_DAC_SERFMT_MASK 0xC0
@@ -96,4 +101,7 @@ int ad193x_probe(struct device *dev, struct regmap *regmap,
#define AD193X_NUM_REGS 17
+#define AD193X_SYSCLK_PLL 0
+#define AD193X_SYSCLK_MCLK 1
+
#endif
--
2.20.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Applied "ASoC: codecs: ad193x: Add runtime support for DSP_A and I2S modes" to the asoc tree
2019-02-18 16:10 ` [PATCH 4/5] ASoC: codecs: ad193x: Add runtime support for DSP_A and I2S modes Codrin.Ciubotariu
@ 2019-02-18 18:49 ` Mark Brown
0 siblings, 0 replies; 12+ messages in thread
From: Mark Brown @ 2019-02-18 18:49 UTC (permalink / raw)
To: Codrin Ciubotariu
Cc: Mark Brown, lars, lgirdwood, broonie, alsa-devel,
Codrin.Ciubotariu, linux-kernel, alsa-devel
The patch
ASoC: codecs: ad193x: Add runtime support for DSP_A and I2S modes
has been applied to the asoc tree at
https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
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
From bccf9c7e14830af0004399d42d861b33c92eacff Mon Sep 17 00:00:00 2001
From: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
Date: Mon, 18 Feb 2019 16:10:34 +0000
Subject: [PATCH] ASoC: codecs: ad193x: Add runtime support for DSP_A and I2S
modes
The driver only supports DPS_A for DAC, which is configured at probe.
This patch adds support for DSP_A and I2S modes by using the set_fmt()
callback.
A trivial break is also removed from a case's default branch.
Signed-off-by: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
sound/soc/codecs/ad193x.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c
index 315ec9775118..f8cf182518a3 100644
--- a/sound/soc/codecs/ad193x.c
+++ b/sound/soc/codecs/ad193x.c
@@ -188,23 +188,26 @@ static int ad193x_set_dai_fmt(struct snd_soc_dai *codec_dai,
{
struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(codec_dai->component);
unsigned int adc_serfmt = 0;
+ unsigned int dac_serfmt = 0;
unsigned int adc_fmt = 0;
unsigned int dac_fmt = 0;
/* At present, the driver only support AUX ADC mode(SND_SOC_DAIFMT_I2S
- * with TDM) and ADC&DAC TDM mode(SND_SOC_DAIFMT_DSP_A)
+ * with TDM), ADC&DAC TDM mode(SND_SOC_DAIFMT_DSP_A) and DAC I2S mode
+ * (SND_SOC_DAIFMT_I2S)
*/
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
case SND_SOC_DAIFMT_I2S:
adc_serfmt |= AD193X_ADC_SERFMT_TDM;
+ dac_serfmt |= AD193X_DAC_SERFMT_STEREO;
break;
case SND_SOC_DAIFMT_DSP_A:
adc_serfmt |= AD193X_ADC_SERFMT_AUX;
+ dac_serfmt |= AD193X_DAC_SERFMT_TDM;
break;
default:
if (ad193x_has_adc(ad193x))
return -EINVAL;
- break;
}
switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
@@ -261,6 +264,8 @@ static int ad193x_set_dai_fmt(struct snd_soc_dai *codec_dai,
regmap_update_bits(ad193x->regmap, AD193X_ADC_CTRL2,
AD193X_ADC_FMT_MASK, adc_fmt);
}
+ regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL0,
+ AD193X_DAC_SERFMT_MASK, dac_serfmt);
regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL1,
AD193X_DAC_FMT_MASK, dac_fmt);
--
2.20.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Applied "ASoC: codecs: ad193x: Fix frame polarity for DSP_A format" to the asoc tree
2019-02-18 16:10 ` [PATCH 3/5] ASoC: codecs: ad193x: Fix frame polarity for DSP_A format Codrin.Ciubotariu
@ 2019-02-18 18:49 ` Mark Brown
0 siblings, 0 replies; 12+ messages in thread
From: Mark Brown @ 2019-02-18 18:49 UTC (permalink / raw)
To: Codrin Ciubotariu
Cc: Mark Brown, lars, lgirdwood, broonie, alsa-devel,
Codrin.Ciubotariu, linux-kernel, alsa-devel
The patch
ASoC: codecs: ad193x: Fix frame polarity for DSP_A format
has been applied to the asoc tree at
https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
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
From 90f6e68031397fb6212bef5619193cd15707fa0f Mon Sep 17 00:00:00 2001
From: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
Date: Mon, 18 Feb 2019 16:10:32 +0000
Subject: [PATCH] ASoC: codecs: ad193x: Fix frame polarity for DSP_A format
By default, the codec starts to interpret the left (first) channel on
the falling edge (low polarity) of LRCLK. However, for DSP_A, the left
channel needs to start on the rising edge of LRCLK. This patch fixes
this channel swap by toggling the bit which selects the LRCLK polarity.
Signed-off-by: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
sound/soc/codecs/ad193x.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c
index c16c9969d1a0..315ec9775118 100644
--- a/sound/soc/codecs/ad193x.c
+++ b/sound/soc/codecs/ad193x.c
@@ -228,6 +228,12 @@ static int ad193x_set_dai_fmt(struct snd_soc_dai *codec_dai,
return -EINVAL;
}
+ /* For DSP_*, LRCLK's polarity must be inverted */
+ if (fmt & SND_SOC_DAIFMT_DSP_A) {
+ change_bit(ffs(AD193X_DAC_LEFT_HIGH) - 1,
+ (unsigned long *)&dac_fmt);
+ }
+
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
case SND_SOC_DAIFMT_CBM_CFM: /* codec clk & frm master */
adc_fmt |= AD193X_ADC_LCR_MASTER;
--
2.20.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Applied "ASoC: codecs: ad193x: Set constraint to always have 32 sample bits" to the asoc tree
2019-02-18 16:10 ` [PATCH 2/5] ASoC: codecs: ad193x: Set constraint to always have 32 sample bits Codrin.Ciubotariu
@ 2019-02-18 18:49 ` Mark Brown
0 siblings, 0 replies; 12+ messages in thread
From: Mark Brown @ 2019-02-18 18:49 UTC (permalink / raw)
To: Codrin Ciubotariu
Cc: Mark Brown, lars, lgirdwood, broonie, alsa-devel,
Codrin.Ciubotariu, linux-kernel, alsa-devel
The patch
ASoC: codecs: ad193x: Set constraint to always have 32 sample bits
has been applied to the asoc tree at
https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
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
From 75c2ecb4bda296f89d4ea6a42750f48bfcd8a1d9 Mon Sep 17 00:00:00 2001
From: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
Date: Mon, 18 Feb 2019 16:10:30 +0000
Subject: [PATCH] ASoC: codecs: ad193x: Set constraint to always have 32 sample
bits
DACs and ADCs on ad193x codecs require a 32 bit slot size. We should
assure that no other size is used.
Signed-off-by: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
sound/soc/codecs/ad193x.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c
index 21a38cc9e3da..c16c9969d1a0 100644
--- a/sound/soc/codecs/ad193x.c
+++ b/sound/soc/codecs/ad193x.c
@@ -37,6 +37,13 @@ static SOC_ENUM_SINGLE_DECL(ad193x_deemp_enum, AD193X_DAC_CTRL2, 1,
static const DECLARE_TLV_DB_MINMAX(adau193x_tlv, -9563, 0);
+static const unsigned int ad193x_sb[] = {32};
+
+static struct snd_pcm_hw_constraint_list constr = {
+ .list = ad193x_sb,
+ .count = ARRAY_SIZE(ad193x_sb),
+};
+
static const struct snd_kcontrol_new ad193x_snd_controls[] = {
/* DAC volume control */
SOC_DOUBLE_R_TLV("DAC1 Volume", AD193X_DAC_L1_VOL,
@@ -321,7 +328,16 @@ static int ad193x_hw_params(struct snd_pcm_substream *substream,
return 0;
}
+static int ad193x_startup(struct snd_pcm_substream *substream,
+ struct snd_soc_dai *dai)
+{
+ return snd_pcm_hw_constraint_list(substream->runtime, 0,
+ SNDRV_PCM_HW_PARAM_SAMPLE_BITS,
+ &constr);
+}
+
static const struct snd_soc_dai_ops ad193x_dai_ops = {
+ .startup = ad193x_startup,
.hw_params = ad193x_hw_params,
.digital_mute = ad193x_mute,
.set_tdm_slot = ad193x_set_tdm_slot,
--
2.20.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Applied "ASoC: codecs: ad193x: Remove capture support for codecs without ADC" to the asoc tree
2019-02-18 16:10 ` [PATCH 1/5] ASoC: codecs: ad193x: Remove capture support for codecs without ADC Codrin.Ciubotariu
@ 2019-02-18 18:49 ` Mark Brown
0 siblings, 0 replies; 12+ messages in thread
From: Mark Brown @ 2019-02-18 18:49 UTC (permalink / raw)
To: Codrin Ciubotariu
Cc: Mark Brown, lars, lgirdwood, broonie, alsa-devel,
Codrin.Ciubotariu, linux-kernel, alsa-devel
The patch
ASoC: codecs: ad193x: Remove capture support for codecs without ADC
has been applied to the asoc tree at
https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
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
From 7aac8d13fc60db3ec2422f26c4dc2425a7fef20c Mon Sep 17 00:00:00 2001
From: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
Date: Mon, 18 Feb 2019 16:10:28 +0000
Subject: [PATCH] ASoC: codecs: ad193x: Remove capture support for codecs
without ADC
Some ad193x codecs don't have ADCs, so they have no capture capabilities.
This way, we can use this driver in multicodec cards.
Signed-off-by: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
sound/soc/codecs/ad193x.c | 19 ++++++++++++++++++-
1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c
index 4b60ebee491d..21a38cc9e3da 100644
--- a/sound/soc/codecs/ad193x.c
+++ b/sound/soc/codecs/ad193x.c
@@ -351,6 +351,20 @@ static struct snd_soc_dai_driver ad193x_dai = {
.ops = &ad193x_dai_ops,
};
+/* codec DAI instance for DAC only */
+static struct snd_soc_dai_driver ad193x_no_adc_dai = {
+ .name = "ad193x-hifi",
+ .playback = {
+ .stream_name = "Playback",
+ .channels_min = 2,
+ .channels_max = 8,
+ .rates = SNDRV_PCM_RATE_48000,
+ .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE,
+ },
+ .ops = &ad193x_dai_ops,
+};
+
static int ad193x_component_probe(struct snd_soc_component *component)
{
struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(component);
@@ -444,8 +458,11 @@ int ad193x_probe(struct device *dev, struct regmap *regmap,
dev_set_drvdata(dev, ad193x);
+ if (ad193x_has_adc(ad193x))
+ return devm_snd_soc_register_component(dev, &soc_component_dev_ad193x,
+ &ad193x_dai, 1);
return devm_snd_soc_register_component(dev, &soc_component_dev_ad193x,
- &ad193x_dai, 1);
+ &ad193x_no_adc_dai, 1);
}
EXPORT_SYMBOL_GPL(ad193x_probe);
--
2.20.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
end of thread, other threads:[~2019-02-18 18:50 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-02-18 16:10 [PATCH 0/5] ASoC: codecs: ad193x: Several fixes and imprevements Codrin.Ciubotariu
2019-02-18 16:10 ` [PATCH 1/5] ASoC: codecs: ad193x: Remove capture support for codecs without ADC Codrin.Ciubotariu
2019-02-18 18:49 ` Applied "ASoC: codecs: ad193x: Remove capture support for codecs without ADC" to the asoc tree Mark Brown
2019-02-18 16:10 ` [PATCH 2/5] ASoC: codecs: ad193x: Set constraint to always have 32 sample bits Codrin.Ciubotariu
2019-02-18 18:49 ` Applied "ASoC: codecs: ad193x: Set constraint to always have 32 sample bits" to the asoc tree Mark Brown
2019-02-18 16:10 ` [PATCH 3/5] ASoC: codecs: ad193x: Fix frame polarity for DSP_A format Codrin.Ciubotariu
2019-02-18 18:49 ` Applied "ASoC: codecs: ad193x: Fix frame polarity for DSP_A format" to the asoc tree Mark Brown
2019-02-18 16:10 ` [PATCH 4/5] ASoC: codecs: ad193x: Add runtime support for DSP_A and I2S modes Codrin.Ciubotariu
2019-02-18 18:49 ` Applied "ASoC: codecs: ad193x: Add runtime support for DSP_A and I2S modes" to the asoc tree Mark Brown
2019-02-18 16:10 ` [PATCH 5/5] ASoC: codecs: ad193x: Add support to disable on-chip PLL Codrin.Ciubotariu
2019-02-18 18:49 ` Applied "ASoC: codecs: ad193x: Add support to disable on-chip PLL" to the asoc tree Mark Brown
2019-02-18 16:57 ` [PATCH 0/5] ASoC: codecs: ad193x: Several fixes and imprevements Codrin.Ciubotariu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).