linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/7] ASoC: ad193X: Use table based DAPM and controls setup
@ 2011-11-28 16:28 Lars-Peter Clausen
  2011-11-28 16:28 ` [PATCH 2/7] ASoC: ad193X: Provide dB ranges for the volume controls Lars-Peter Clausen
                   ` (6 more replies)
  0 siblings, 7 replies; 14+ messages in thread
From: Lars-Peter Clausen @ 2011-11-28 16:28 UTC (permalink / raw)
  To: Mark Brown, Liam Girdwood
  Cc: linux-kernel, alsa-devel, drivers, device-drivers-devel,
	Lars-Peter Clausen

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
 sound/soc/codecs/ad193x.c |   13 ++++++-------
 1 files changed, 6 insertions(+), 7 deletions(-)

diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c
index 1901cd2..1dfda5c 100644
--- a/sound/soc/codecs/ad193x.c
+++ b/sound/soc/codecs/ad193x.c
@@ -345,7 +345,6 @@ static struct snd_soc_dai_driver ad193x_dai = {
 static int ad193x_probe(struct snd_soc_codec *codec)
 {
 	struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(codec);
-	struct snd_soc_dapm_context *dapm = &codec->dapm;
 	int ret;
 
 	codec->control_data = ad193x->regmap;
@@ -371,17 +370,17 @@ static int ad193x_probe(struct snd_soc_codec *codec)
 	snd_soc_write(codec, AD193X_PLL_CLK_CTRL0, 0x99); /* mclk=24.576Mhz: 0x9D; mclk=12.288Mhz: 0x99 */
 	snd_soc_write(codec, AD193X_PLL_CLK_CTRL1, 0x04);
 
-	snd_soc_add_controls(codec, ad193x_snd_controls,
-			     ARRAY_SIZE(ad193x_snd_controls));
-	snd_soc_dapm_new_controls(dapm, ad193x_dapm_widgets,
-				  ARRAY_SIZE(ad193x_dapm_widgets));
-	snd_soc_dapm_add_routes(dapm, audio_paths, ARRAY_SIZE(audio_paths));
-
 	return ret;
 }
 
 static struct snd_soc_codec_driver soc_codec_dev_ad193x = {
 	.probe = 	ad193x_probe,
+	.controls = ad193x_snd_controls,
+	.num_controls = ARRAY_SIZE(ad193x_snd_controls),
+	.dapm_widgets = ad193x_dapm_widgets,
+	.num_dapm_widgets = ARRAY_SIZE(ad193x_dapm_widgets),
+	.dapm_routes = audio_paths,
+	.num_dapm_routes = ARRAY_SIZE(audio_paths),
 };
 
 #if defined(CONFIG_SPI_MASTER)
-- 
1.7.7.3



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

* [PATCH 2/7] ASoC: ad193X: Provide dB ranges for the volume controls
  2011-11-28 16:28 [PATCH 1/7] ASoC: ad193X: Use table based DAPM and controls setup Lars-Peter Clausen
@ 2011-11-28 16:28 ` Lars-Peter Clausen
  2011-11-28 16:28 ` [PATCH 3/7] ASoC: AD193X: Make enum items const char * const Lars-Peter Clausen
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 14+ messages in thread
From: Lars-Peter Clausen @ 2011-11-28 16:28 UTC (permalink / raw)
  To: Mark Brown, Liam Girdwood
  Cc: linux-kernel, alsa-devel, drivers, device-drivers-devel,
	Lars-Peter Clausen

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
 sound/soc/codecs/ad193x.c |   18 ++++++++++--------
 1 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c
index 1dfda5c..7da7e29 100644
--- a/sound/soc/codecs/ad193x.c
+++ b/sound/soc/codecs/ad193x.c
@@ -35,16 +35,18 @@ static const char *ad193x_deemp[] = {"None", "48kHz", "44.1kHz", "32kHz"};
 static const struct soc_enum ad193x_deemp_enum =
 	SOC_ENUM_SINGLE(AD193X_DAC_CTRL2, 1, 4, ad193x_deemp);
 
+static const DECLARE_TLV_DB_MINMAX(adau193x_tlv, -9563, 0);
+
 static const struct snd_kcontrol_new ad193x_snd_controls[] = {
 	/* DAC volume control */
-	SOC_DOUBLE_R("DAC1 Volume", AD193X_DAC_L1_VOL,
-			AD193X_DAC_R1_VOL, 0, 0xFF, 1),
-	SOC_DOUBLE_R("DAC2 Volume", AD193X_DAC_L2_VOL,
-			AD193X_DAC_R2_VOL, 0, 0xFF, 1),
-	SOC_DOUBLE_R("DAC3 Volume", AD193X_DAC_L3_VOL,
-			AD193X_DAC_R3_VOL, 0, 0xFF, 1),
-	SOC_DOUBLE_R("DAC4 Volume", AD193X_DAC_L4_VOL,
-			AD193X_DAC_R4_VOL, 0, 0xFF, 1),
+	SOC_DOUBLE_R_TLV("DAC1 Volume", AD193X_DAC_L1_VOL,
+			AD193X_DAC_R1_VOL, 0, 0xFF, 1, adau193x_tlv),
+	SOC_DOUBLE_R_TLV("DAC2 Volume", AD193X_DAC_L2_VOL,
+			AD193X_DAC_R2_VOL, 0, 0xFF, 1, adau193x_tlv),
+	SOC_DOUBLE_R_TLV("DAC3 Volume", AD193X_DAC_L3_VOL,
+			AD193X_DAC_R3_VOL, 0, 0xFF, 1, adau193x_tlv),
+	SOC_DOUBLE_R_TLV("DAC4 Volume", AD193X_DAC_L4_VOL,
+			AD193X_DAC_R4_VOL, 0, 0xFF, 1, adau193x_tlv),
 
 	/* ADC switch control */
 	SOC_DOUBLE("ADC1 Switch", AD193X_ADC_CTRL0, AD193X_ADCL1_MUTE,
-- 
1.7.7.3



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

* [PATCH 3/7] ASoC: AD193X: Make enum items const char * const
  2011-11-28 16:28 [PATCH 1/7] ASoC: ad193X: Use table based DAPM and controls setup Lars-Peter Clausen
  2011-11-28 16:28 ` [PATCH 2/7] ASoC: ad193X: Provide dB ranges for the volume controls Lars-Peter Clausen
@ 2011-11-28 16:28 ` Lars-Peter Clausen
  2011-11-28 18:53   ` Mark Brown
  2011-11-28 16:28 ` [PATCH 4/7] ASoC: ad193X: Remove non-functional DAPM route controls Lars-Peter Clausen
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 14+ messages in thread
From: Lars-Peter Clausen @ 2011-11-28 16:28 UTC (permalink / raw)
  To: Mark Brown, Liam Girdwood
  Cc: linux-kernel, alsa-devel, drivers, device-drivers-devel,
	Lars-Peter Clausen

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
 sound/soc/codecs/ad193x.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c
index 7da7e29..665af5c 100644
--- a/sound/soc/codecs/ad193x.c
+++ b/sound/soc/codecs/ad193x.c
@@ -30,7 +30,7 @@ struct ad193x_priv {
 /*
  * AD193X volume/mute/de-emphasis etc. controls
  */
-static const char *ad193x_deemp[] = {"None", "48kHz", "44.1kHz", "32kHz"};
+static const char * const ad193x_deemp[] = {"None", "48kHz", "44.1kHz", "32kHz"};
 
 static const struct soc_enum ad193x_deemp_enum =
 	SOC_ENUM_SINGLE(AD193X_DAC_CTRL2, 1, 4, ad193x_deemp);
-- 
1.7.7.3



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

* [PATCH 4/7] ASoC: ad193X: Remove non-functional DAPM route controls
  2011-11-28 16:28 [PATCH 1/7] ASoC: ad193X: Use table based DAPM and controls setup Lars-Peter Clausen
  2011-11-28 16:28 ` [PATCH 2/7] ASoC: ad193X: Provide dB ranges for the volume controls Lars-Peter Clausen
  2011-11-28 16:28 ` [PATCH 3/7] ASoC: AD193X: Make enum items const char * const Lars-Peter Clausen
@ 2011-11-28 16:28 ` Lars-Peter Clausen
  2011-11-28 16:28 ` [PATCH 5/7] ASOC: AD193X: Add sysclk DAPM supply Lars-Peter Clausen
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 14+ messages in thread
From: Lars-Peter Clausen @ 2011-11-28 16:28 UTC (permalink / raw)
  To: Mark Brown, Liam Girdwood
  Cc: linux-kernel, alsa-devel, drivers, device-drivers-devel,
	Lars-Peter Clausen

DAPM route controls only take effect on paths where the sink is a mixer or a
mux, furthermore the control must be a control assigned to the mixer or mux.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
 sound/soc/codecs/ad193x.c |   12 ++++++------
 1 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c
index 665af5c..c52ebd3 100644
--- a/sound/soc/codecs/ad193x.c
+++ b/sound/soc/codecs/ad193x.c
@@ -90,12 +90,12 @@ static const struct snd_soc_dapm_route audio_paths[] = {
 	{ "ADC", NULL, "PLL_PWR" },
 	{ "DAC", NULL, "ADC_PWR" },
 	{ "ADC", NULL, "ADC_PWR" },
-	{ "DAC1OUT", "DAC1 Switch", "DAC" },
-	{ "DAC2OUT", "DAC2 Switch", "DAC" },
-	{ "DAC3OUT", "DAC3 Switch", "DAC" },
-	{ "DAC4OUT", "DAC4 Switch", "DAC" },
-	{ "ADC", "ADC1 Switch", "ADC1IN" },
-	{ "ADC", "ADC2 Switch", "ADC2IN" },
+	{ "DAC1OUT", NULL, "DAC" },
+	{ "DAC2OUT", NULL, "DAC" },
+	{ "DAC3OUT", NULL, "DAC" },
+	{ "DAC4OUT", NULL, "DAC" },
+	{ "ADC", NULL, "ADC1IN" },
+	{ "ADC", NULL, "ADC2IN" },
 };
 
 /*
-- 
1.7.7.3



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

* [PATCH 5/7] ASOC: AD193X: Add sysclk DAPM supply
  2011-11-28 16:28 [PATCH 1/7] ASoC: ad193X: Use table based DAPM and controls setup Lars-Peter Clausen
                   ` (2 preceding siblings ...)
  2011-11-28 16:28 ` [PATCH 4/7] ASoC: ad193X: Remove non-functional DAPM route controls Lars-Peter Clausen
@ 2011-11-28 16:28 ` Lars-Peter Clausen
  2011-11-29  5:24   ` Mike Frysinger
  2011-11-28 16:28 ` [PATCH 6/7] ASoC: AD193X: Use snd_soc_update_bits where appropriate Lars-Peter Clausen
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 14+ messages in thread
From: Lars-Peter Clausen @ 2011-11-28 16:28 UTC (permalink / raw)
  To: Mark Brown, Liam Girdwood
  Cc: linux-kernel, alsa-devel, drivers, device-drivers-devel,
	Lars-Peter Clausen

Add a DAPM supply widget for the internal sysclk, so it can be disabled
automatically when not needed.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
 sound/soc/codecs/ad193x.c |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c
index c52ebd3..c19e223 100644
--- a/sound/soc/codecs/ad193x.c
+++ b/sound/soc/codecs/ad193x.c
@@ -77,6 +77,7 @@ static const struct snd_soc_dapm_widget ad193x_dapm_widgets[] = {
 	SND_SOC_DAPM_ADC("ADC", "Capture", SND_SOC_NOPM, 0, 0),
 	SND_SOC_DAPM_SUPPLY("PLL_PWR", AD193X_PLL_CLK_CTRL0, 0, 1, NULL, 0),
 	SND_SOC_DAPM_SUPPLY("ADC_PWR", AD193X_ADC_CTRL0, 0, 1, NULL, 0),
+	SND_SOC_DAPM_SUPPLY("SYSCLK", AD193X_PLL_CLK_CTRL0, 7, 0, NULL, 0),
 	SND_SOC_DAPM_OUTPUT("DAC1OUT"),
 	SND_SOC_DAPM_OUTPUT("DAC2OUT"),
 	SND_SOC_DAPM_OUTPUT("DAC3OUT"),
@@ -86,8 +87,8 @@ static const struct snd_soc_dapm_widget ad193x_dapm_widgets[] = {
 };
 
 static const struct snd_soc_dapm_route audio_paths[] = {
-	{ "DAC", NULL, "PLL_PWR" },
-	{ "ADC", NULL, "PLL_PWR" },
+	{ "DAC", NULL, "SYSCLK" },
+	{ "ADC", NULL, "SYSCLK" },
 	{ "DAC", NULL, "ADC_PWR" },
 	{ "ADC", NULL, "ADC_PWR" },
 	{ "DAC1OUT", NULL, "DAC" },
@@ -96,6 +97,7 @@ static const struct snd_soc_dapm_route audio_paths[] = {
 	{ "DAC4OUT", NULL, "DAC" },
 	{ "ADC", NULL, "ADC1IN" },
 	{ "ADC", NULL, "ADC2IN" },
+	{ "SYSCLK", NULL, "PLL_PWR" },
 };
 
 /*
-- 
1.7.7.3



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

* [PATCH 6/7] ASoC: AD193X: Use snd_soc_update_bits where appropriate
  2011-11-28 16:28 [PATCH 1/7] ASoC: ad193X: Use table based DAPM and controls setup Lars-Peter Clausen
                   ` (3 preceding siblings ...)
  2011-11-28 16:28 ` [PATCH 5/7] ASOC: AD193X: Add sysclk DAPM supply Lars-Peter Clausen
@ 2011-11-28 16:28 ` Lars-Peter Clausen
  2011-11-28 16:28 ` [PATCH 7/7] ASoC: AD193X: Convert to direct regmap API usage Lars-Peter Clausen
  2011-11-28 18:57 ` [PATCH 1/7] ASoC: ad193X: Use table based DAPM and controls setup Mark Brown
  6 siblings, 0 replies; 14+ messages in thread
From: Lars-Peter Clausen @ 2011-11-28 16:28 UTC (permalink / raw)
  To: Mark Brown, Liam Girdwood
  Cc: linux-kernel, alsa-devel, drivers, device-drivers-devel,
	Lars-Peter Clausen

We can reduce the code size here a bit by using snd_soc_update_bits instead of
open-coding the read-modify-write cycle. The conversion done in this patch is
not completely straightforward and some minor code restructuring has been
incorporated to further reduce the code size.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
 sound/soc/codecs/ad193x.c |   96 +++++++++++++++++----------------------------
 sound/soc/codecs/ad193x.h |   17 ++++----
 2 files changed, 45 insertions(+), 68 deletions(-)

diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c
index c19e223..7d64f20 100644
--- a/sound/soc/codecs/ad193x.c
+++ b/sound/soc/codecs/ad193x.c
@@ -123,35 +123,29 @@ static int ad193x_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
 			       unsigned int rx_mask, int slots, int width)
 {
 	struct snd_soc_codec *codec = dai->codec;
-	int dac_reg = snd_soc_read(codec, AD193X_DAC_CTRL1);
-	int adc_reg = snd_soc_read(codec, AD193X_ADC_CTRL2);
-
-	dac_reg &= ~AD193X_DAC_CHAN_MASK;
-	adc_reg &= ~AD193X_ADC_CHAN_MASK;
+	unsigned int channels;
 
 	switch (slots) {
 	case 2:
-		dac_reg |= AD193X_DAC_2_CHANNELS << AD193X_DAC_CHAN_SHFT;
-		adc_reg |= AD193X_ADC_2_CHANNELS << AD193X_ADC_CHAN_SHFT;
+		channels = AD193X_2_CHANNELS;
 		break;
 	case 4:
-		dac_reg |= AD193X_DAC_4_CHANNELS << AD193X_DAC_CHAN_SHFT;
-		adc_reg |= AD193X_ADC_4_CHANNELS << AD193X_ADC_CHAN_SHFT;
+		channels = AD193X_4_CHANNELS;
 		break;
 	case 8:
-		dac_reg |= AD193X_DAC_8_CHANNELS << AD193X_DAC_CHAN_SHFT;
-		adc_reg |= AD193X_ADC_8_CHANNELS << AD193X_ADC_CHAN_SHFT;
+		channels = AD193X_8_CHANNELS;
 		break;
 	case 16:
-		dac_reg |= AD193X_DAC_16_CHANNELS << AD193X_DAC_CHAN_SHFT;
-		adc_reg |= AD193X_ADC_16_CHANNELS << AD193X_ADC_CHAN_SHFT;
+		channels = AD193X_16_CHANNELS;
 		break;
 	default:
 		return -EINVAL;
 	}
 
-	snd_soc_write(codec, AD193X_DAC_CTRL1, dac_reg);
-	snd_soc_write(codec, AD193X_ADC_CTRL2, adc_reg);
+	snd_soc_update_bits(codec, AD193X_DAC_CTRL1, AD193X_DAC_CHAN_MASK,
+		channels << AD193X_DAC_CHAN_SHFT);
+	snd_soc_update_bits(codec, AD193X_ADC_CTRL2, AD193X_ADC_CHAN_MASK,
+		channels << AD193X_ADC_CHAN_SHFT);
 
 	return 0;
 }
@@ -160,23 +154,19 @@ static int ad193x_set_dai_fmt(struct snd_soc_dai *codec_dai,
 		unsigned int fmt)
 {
 	struct snd_soc_codec *codec = codec_dai->codec;
-	int adc_reg1, adc_reg2, dac_reg;
-
-	adc_reg1 = snd_soc_read(codec, AD193X_ADC_CTRL1);
-	adc_reg2 = snd_soc_read(codec, AD193X_ADC_CTRL2);
-	dac_reg = snd_soc_read(codec, AD193X_DAC_CTRL1);
+	unsigned int adc_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)
 	 */
 	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
 	case SND_SOC_DAIFMT_I2S:
-		adc_reg1 &= ~AD193X_ADC_SERFMT_MASK;
-		adc_reg1 |= AD193X_ADC_SERFMT_TDM;
+		adc_serfmt |= AD193X_ADC_SERFMT_TDM;
 		break;
 	case SND_SOC_DAIFMT_DSP_A:
-		adc_reg1 &= ~AD193X_ADC_SERFMT_MASK;
-		adc_reg1 |= AD193X_ADC_SERFMT_AUX;
+		adc_serfmt |= AD193X_ADC_SERFMT_AUX;
 		break;
 	default:
 		return -EINVAL;
@@ -184,29 +174,20 @@ static int ad193x_set_dai_fmt(struct snd_soc_dai *codec_dai,
 
 	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
 	case SND_SOC_DAIFMT_NB_NF: /* normal bit clock + frame */
-		adc_reg2 &= ~AD193X_ADC_LEFT_HIGH;
-		adc_reg2 &= ~AD193X_ADC_BCLK_INV;
-		dac_reg &= ~AD193X_DAC_LEFT_HIGH;
-		dac_reg &= ~AD193X_DAC_BCLK_INV;
 		break;
 	case SND_SOC_DAIFMT_NB_IF: /* normal bclk + invert frm */
-		adc_reg2 |= AD193X_ADC_LEFT_HIGH;
-		adc_reg2 &= ~AD193X_ADC_BCLK_INV;
-		dac_reg |= AD193X_DAC_LEFT_HIGH;
-		dac_reg &= ~AD193X_DAC_BCLK_INV;
+		adc_fmt |= AD193X_ADC_LEFT_HIGH;
+		dac_fmt |= AD193X_DAC_LEFT_HIGH;
 		break;
 	case SND_SOC_DAIFMT_IB_NF: /* invert bclk + normal frm */
-		adc_reg2 &= ~AD193X_ADC_LEFT_HIGH;
-		adc_reg2 |= AD193X_ADC_BCLK_INV;
-		dac_reg &= ~AD193X_DAC_LEFT_HIGH;
-		dac_reg |= AD193X_DAC_BCLK_INV;
+		adc_fmt |= AD193X_ADC_BCLK_INV;
+		dac_fmt |= AD193X_DAC_BCLK_INV;
 		break;
-
 	case SND_SOC_DAIFMT_IB_IF: /* invert bclk + frm */
-		adc_reg2 |= AD193X_ADC_LEFT_HIGH;
-		adc_reg2 |= AD193X_ADC_BCLK_INV;
-		dac_reg |= AD193X_DAC_LEFT_HIGH;
-		dac_reg |= AD193X_DAC_BCLK_INV;
+		adc_fmt |= AD193X_ADC_LEFT_HIGH;
+		adc_fmt |= AD193X_ADC_BCLK_INV;
+		dac_fmt |= AD193X_DAC_LEFT_HIGH;
+		dac_fmt |= AD193X_DAC_BCLK_INV;
 		break;
 	default:
 		return -EINVAL;
@@ -214,36 +195,31 @@ static int ad193x_set_dai_fmt(struct snd_soc_dai *codec_dai,
 
 	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
 	case SND_SOC_DAIFMT_CBM_CFM: /* codec clk & frm master */
-		adc_reg2 |= AD193X_ADC_LCR_MASTER;
-		adc_reg2 |= AD193X_ADC_BCLK_MASTER;
-		dac_reg |= AD193X_DAC_LCR_MASTER;
-		dac_reg |= AD193X_DAC_BCLK_MASTER;
+		adc_fmt |= AD193X_ADC_LCR_MASTER;
+		adc_fmt |= AD193X_ADC_BCLK_MASTER;
+		dac_fmt |= AD193X_DAC_LCR_MASTER;
+		dac_fmt |= AD193X_DAC_BCLK_MASTER;
 		break;
 	case SND_SOC_DAIFMT_CBS_CFM: /* codec clk slave & frm master */
-		adc_reg2 |= AD193X_ADC_LCR_MASTER;
-		adc_reg2 &= ~AD193X_ADC_BCLK_MASTER;
-		dac_reg |= AD193X_DAC_LCR_MASTER;
-		dac_reg &= ~AD193X_DAC_BCLK_MASTER;
+		adc_fmt |= AD193X_ADC_LCR_MASTER;
+		dac_fmt |= AD193X_DAC_LCR_MASTER;
 		break;
 	case SND_SOC_DAIFMT_CBM_CFS: /* codec clk master & frame slave */
-		adc_reg2 &= ~AD193X_ADC_LCR_MASTER;
-		adc_reg2 |= AD193X_ADC_BCLK_MASTER;
-		dac_reg &= ~AD193X_DAC_LCR_MASTER;
-		dac_reg |= AD193X_DAC_BCLK_MASTER;
+		adc_fmt |= AD193X_ADC_BCLK_MASTER;
+		dac_fmt |= AD193X_DAC_BCLK_MASTER;
 		break;
 	case SND_SOC_DAIFMT_CBS_CFS: /* codec clk & frm slave */
-		adc_reg2 &= ~AD193X_ADC_LCR_MASTER;
-		adc_reg2 &= ~AD193X_ADC_BCLK_MASTER;
-		dac_reg &= ~AD193X_DAC_LCR_MASTER;
-		dac_reg &= ~AD193X_DAC_BCLK_MASTER;
 		break;
 	default:
 		return -EINVAL;
 	}
 
-	snd_soc_write(codec, AD193X_ADC_CTRL1, adc_reg1);
-	snd_soc_write(codec, AD193X_ADC_CTRL2, adc_reg2);
-	snd_soc_write(codec, AD193X_DAC_CTRL1, dac_reg);
+	snd_soc_update_bits(codec, AD193X_ADC_CTRL1, AD193X_ADC_SERFMT_MASK,
+	    adc_serfmt);
+	snd_soc_update_bits(codec, AD193X_ADC_CTRL2, AD193X_ADC_FMT_MASK,
+	    adc_fmt);
+	snd_soc_update_bits(codec, AD193X_DAC_CTRL1, AD193X_DAC_FMT_MASK,
+	    dac_fmt);
 
 	return 0;
 }
diff --git a/sound/soc/codecs/ad193x.h b/sound/soc/codecs/ad193x.h
index 1507eaa..4733880 100644
--- a/sound/soc/codecs/ad193x.h
+++ b/sound/soc/codecs/ad193x.h
@@ -23,16 +23,14 @@
 #define AD193X_DAC_SERFMT_STEREO	(0 << 6)
 #define AD193X_DAC_SERFMT_TDM		(1 << 6)
 #define AD193X_DAC_CTRL1        0x03
-#define AD193X_DAC_2_CHANNELS   0
-#define AD193X_DAC_4_CHANNELS   1
-#define AD193X_DAC_8_CHANNELS   2
-#define AD193X_DAC_16_CHANNELS  3
 #define AD193X_DAC_CHAN_SHFT    1
 #define AD193X_DAC_CHAN_MASK    (3 << AD193X_DAC_CHAN_SHFT)
 #define AD193X_DAC_LCR_MASTER   (1 << 4)
 #define AD193X_DAC_BCLK_MASTER  (1 << 5)
 #define AD193X_DAC_LEFT_HIGH    (1 << 3)
 #define AD193X_DAC_BCLK_INV     (1 << 7)
+#define AD193X_DAC_FMT_MASK	(AD193X_DAC_LCR_MASTER | \
+	AD193X_DAC_BCLK_MASTER | AD193X_DAC_LEFT_HIGH | AD193X_DAC_BCLK_INV)
 #define AD193X_DAC_CTRL2        0x04
 #define AD193X_DAC_WORD_LEN_SHFT        3
 #define AD193X_DAC_WORD_LEN_MASK        0x18
@@ -68,16 +66,19 @@
 #define AD193X_ADC_SERFMT_AUX		(2 << 5)
 #define AD193X_ADC_WORD_LEN_MASK	0x3
 #define AD193X_ADC_CTRL2        0x10
-#define AD193X_ADC_2_CHANNELS   0
-#define AD193X_ADC_4_CHANNELS   1
-#define AD193X_ADC_8_CHANNELS   2
-#define AD193X_ADC_16_CHANNELS  3
 #define AD193X_ADC_CHAN_SHFT    4
 #define AD193X_ADC_CHAN_MASK    (3 << AD193X_ADC_CHAN_SHFT)
 #define AD193X_ADC_LCR_MASTER   (1 << 3)
 #define AD193X_ADC_BCLK_MASTER  (1 << 6)
 #define AD193X_ADC_LEFT_HIGH    (1 << 2)
 #define AD193X_ADC_BCLK_INV     (1 << 1)
+#define AD193X_ADC_FMT_MASK	(AD193X_ADC_LCR_MASTER | \
+	AD193X_ADC_BCLK_MASTER | AD193X_ADC_LEFT_HIGH | AD193X_ADC_BCLK_INV)
+
+#define AD193X_2_CHANNELS   0
+#define AD193X_4_CHANNELS   1
+#define AD193X_8_CHANNELS   2
+#define AD193X_16_CHANNELS  3
 
 #define AD193X_NUM_REGS          17
 
-- 
1.7.7.3



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

* [PATCH 7/7] ASoC: AD193X: Convert to direct regmap API usage
  2011-11-28 16:28 [PATCH 1/7] ASoC: ad193X: Use table based DAPM and controls setup Lars-Peter Clausen
                   ` (4 preceding siblings ...)
  2011-11-28 16:28 ` [PATCH 6/7] ASoC: AD193X: Use snd_soc_update_bits where appropriate Lars-Peter Clausen
@ 2011-11-28 16:28 ` Lars-Peter Clausen
  2011-11-28 18:57 ` [PATCH 1/7] ASoC: ad193X: Use table based DAPM and controls setup Mark Brown
  6 siblings, 0 replies; 14+ messages in thread
From: Lars-Peter Clausen @ 2011-11-28 16:28 UTC (permalink / raw)
  To: Mark Brown, Liam Girdwood
  Cc: linux-kernel, alsa-devel, drivers, device-drivers-devel,
	Lars-Peter Clausen

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
 sound/soc/codecs/ad193x.c |   61 ++++++++++++++++++++++++++------------------
 1 files changed, 36 insertions(+), 25 deletions(-)

diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c
index 7d64f20..c1b7d92 100644
--- a/sound/soc/codecs/ad193x.c
+++ b/sound/soc/codecs/ad193x.c
@@ -106,14 +106,14 @@ static const struct snd_soc_dapm_route audio_paths[] = {
 
 static int ad193x_mute(struct snd_soc_dai *dai, int mute)
 {
-	struct snd_soc_codec *codec = dai->codec;
+	struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(dai->codec);
 
 	if (mute)
-		snd_soc_update_bits(codec, AD193X_DAC_CTRL2,
+		regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL2,
 				    AD193X_DAC_MASTER_MUTE,
 				    AD193X_DAC_MASTER_MUTE);
 	else
-		snd_soc_update_bits(codec, AD193X_DAC_CTRL2,
+		regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL2,
 				    AD193X_DAC_MASTER_MUTE, 0);
 
 	return 0;
@@ -122,7 +122,7 @@ static int ad193x_mute(struct snd_soc_dai *dai, int mute)
 static int ad193x_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
 			       unsigned int rx_mask, int slots, int width)
 {
-	struct snd_soc_codec *codec = dai->codec;
+	struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(dai->codec);
 	unsigned int channels;
 
 	switch (slots) {
@@ -142,10 +142,10 @@ static int ad193x_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
 		return -EINVAL;
 	}
 
-	snd_soc_update_bits(codec, AD193X_DAC_CTRL1, AD193X_DAC_CHAN_MASK,
-		channels << AD193X_DAC_CHAN_SHFT);
-	snd_soc_update_bits(codec, AD193X_ADC_CTRL2, AD193X_ADC_CHAN_MASK,
-		channels << AD193X_ADC_CHAN_SHFT);
+	regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL1,
+		AD193X_DAC_CHAN_MASK, channels << AD193X_DAC_CHAN_SHFT);
+	regmap_update_bits(ad193x->regmap, AD193X_ADC_CTRL2,
+		AD193X_ADC_CHAN_MASK, channels << AD193X_ADC_CHAN_SHFT);
 
 	return 0;
 }
@@ -153,7 +153,7 @@ static int ad193x_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
 static int ad193x_set_dai_fmt(struct snd_soc_dai *codec_dai,
 		unsigned int fmt)
 {
-	struct snd_soc_codec *codec = codec_dai->codec;
+	struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(codec_dai->codec);
 	unsigned int adc_serfmt = 0;
 	unsigned int adc_fmt = 0;
 	unsigned int dac_fmt = 0;
@@ -214,12 +214,12 @@ static int ad193x_set_dai_fmt(struct snd_soc_dai *codec_dai,
 		return -EINVAL;
 	}
 
-	snd_soc_update_bits(codec, AD193X_ADC_CTRL1, AD193X_ADC_SERFMT_MASK,
-	    adc_serfmt);
-	snd_soc_update_bits(codec, AD193X_ADC_CTRL2, AD193X_ADC_FMT_MASK,
-	    adc_fmt);
-	snd_soc_update_bits(codec, AD193X_DAC_CTRL1, AD193X_DAC_FMT_MASK,
-	    dac_fmt);
+	regmap_update_bits(ad193x->regmap, AD193X_ADC_CTRL1,
+		AD193X_ADC_SERFMT_MASK, adc_serfmt);
+	regmap_update_bits(ad193x->regmap, AD193X_ADC_CTRL2,
+		AD193X_ADC_FMT_MASK, adc_fmt);
+	regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL1,
+		AD193X_DAC_FMT_MASK, dac_fmt);
 
 	return 0;
 }
@@ -279,14 +279,14 @@ static int ad193x_hw_params(struct snd_pcm_substream *substream,
 		break;
 	}
 
-	snd_soc_update_bits(codec, AD193X_PLL_CLK_CTRL0,
+	regmap_update_bits(ad193x->regmap, AD193X_PLL_CLK_CTRL0,
 			    AD193X_PLL_INPUT_MASK, master_rate);
 
-	snd_soc_update_bits(codec, AD193X_DAC_CTRL2,
+	regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL2,
 			    AD193X_DAC_WORD_LEN_MASK,
 			    word_len << AD193X_DAC_WORD_LEN_SHFT);
 
-	snd_soc_update_bits(codec, AD193X_ADC_CTRL1,
+	regmap_update_bits(ad193x->regmap, AD193X_ADC_CTRL1,
 			    AD193X_ADC_WORD_LEN_MASK, word_len);
 
 	return 0;
@@ -337,18 +337,18 @@ static int ad193x_probe(struct snd_soc_codec *codec)
 	/* default setting for ad193x */
 
 	/* unmute dac channels */
-	snd_soc_write(codec, AD193X_DAC_CHNL_MUTE, 0x0);
+	regmap_write(ad193x->regmap, AD193X_DAC_CHNL_MUTE, 0x0);
 	/* de-emphasis: 48kHz, powedown dac */
-	snd_soc_write(codec, AD193X_DAC_CTRL2, 0x1A);
+	regmap_write(ad193x->regmap, AD193X_DAC_CTRL2, 0x1A);
 	/* powerdown dac, dac in tdm mode */
-	snd_soc_write(codec, AD193X_DAC_CTRL0, 0x41);
+	regmap_write(ad193x->regmap, AD193X_DAC_CTRL0, 0x41);
 	/* high-pass filter enable */
-	snd_soc_write(codec, AD193X_ADC_CTRL0, 0x3);
+	regmap_write(ad193x->regmap, AD193X_ADC_CTRL0, 0x3);
 	/* sata delay=1, adc aux mode */
-	snd_soc_write(codec, AD193X_ADC_CTRL1, 0x43);
+	regmap_write(ad193x->regmap, AD193X_ADC_CTRL1, 0x43);
 	/* pll input: mclki/xi */
-	snd_soc_write(codec, AD193X_PLL_CLK_CTRL0, 0x99); /* mclk=24.576Mhz: 0x9D; mclk=12.288Mhz: 0x99 */
-	snd_soc_write(codec, AD193X_PLL_CLK_CTRL1, 0x04);
+	regmap_write(ad193x->regmap, AD193X_PLL_CLK_CTRL0, 0x99); /* mclk=24.576Mhz: 0x9D; mclk=12.288Mhz: 0x99 */
+	regmap_write(ad193x->regmap, AD193X_PLL_CLK_CTRL1, 0x04);
 
 	return ret;
 }
@@ -363,6 +363,11 @@ static struct snd_soc_codec_driver soc_codec_dev_ad193x = {
 	.num_dapm_routes = ARRAY_SIZE(audio_paths),
 };
 
+static bool adau193x_reg_volatile(struct device *dev, unsigned int reg)
+{
+	return false;
+}
+
 #if defined(CONFIG_SPI_MASTER)
 
 static const struct regmap_config ad193x_spi_regmap_config = {
@@ -370,6 +375,9 @@ static const struct regmap_config ad193x_spi_regmap_config = {
 	.reg_bits = 16,
 	.read_flag_mask = 0x09,
 	.write_flag_mask = 0x08,
+
+	.max_register = AD193X_NUM_REGS - 1,
+	.volatile_reg = adau193x_reg_volatile,
 };
 
 static int __devinit ad193x_spi_probe(struct spi_device *spi)
@@ -429,6 +437,9 @@ static struct spi_driver ad193x_spi_driver = {
 static const struct regmap_config ad193x_i2c_regmap_config = {
 	.val_bits = 8,
 	.reg_bits = 8,
+
+	.max_register = AD193X_NUM_REGS - 1,
+	.volatile_reg = adau193x_reg_volatile,
 };
 
 static const struct i2c_device_id ad193x_id[] = {
-- 
1.7.7.3



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

* Re: [PATCH 3/7] ASoC: AD193X: Make enum items const char * const
  2011-11-28 16:28 ` [PATCH 3/7] ASoC: AD193X: Make enum items const char * const Lars-Peter Clausen
@ 2011-11-28 18:53   ` Mark Brown
  2011-11-28 19:01     ` Lars-Peter Clausen
  0 siblings, 1 reply; 14+ messages in thread
From: Mark Brown @ 2011-11-28 18:53 UTC (permalink / raw)
  To: Lars-Peter Clausen
  Cc: Liam Girdwood, linux-kernel, alsa-devel, drivers, device-drivers-devel

On Mon, Nov 28, 2011 at 05:28:08PM +0100, Lars-Peter Clausen wrote:

> -static const char *ad193x_deemp[] = {"None", "48kHz", "44.1kHz", "32kHz"};
> +static const char * const ad193x_deemp[] = {"None", "48kHz", "44.1kHz", "32kHz"};

Ideally this would be converted to a switch and the driver would
automatically select the rate based on the current sample rate.

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

* Re: [PATCH 1/7] ASoC: ad193X: Use table based DAPM and controls setup
  2011-11-28 16:28 [PATCH 1/7] ASoC: ad193X: Use table based DAPM and controls setup Lars-Peter Clausen
                   ` (5 preceding siblings ...)
  2011-11-28 16:28 ` [PATCH 7/7] ASoC: AD193X: Convert to direct regmap API usage Lars-Peter Clausen
@ 2011-11-28 18:57 ` Mark Brown
  6 siblings, 0 replies; 14+ messages in thread
From: Mark Brown @ 2011-11-28 18:57 UTC (permalink / raw)
  To: Lars-Peter Clausen
  Cc: Liam Girdwood, linux-kernel, alsa-devel, drivers, device-drivers-devel

On Mon, Nov 28, 2011 at 05:28:06PM +0100, Lars-Peter Clausen wrote:
> Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>

Applied all, thanks.

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

* Re: [PATCH 3/7] ASoC: AD193X: Make enum items const char * const
  2011-11-28 18:53   ` Mark Brown
@ 2011-11-28 19:01     ` Lars-Peter Clausen
  2011-11-28 19:03       ` Mark Brown
  0 siblings, 1 reply; 14+ messages in thread
From: Lars-Peter Clausen @ 2011-11-28 19:01 UTC (permalink / raw)
  To: Mark Brown
  Cc: Liam Girdwood, linux-kernel, alsa-devel, drivers, device-drivers-devel

On 11/28/2011 07:53 PM, Mark Brown wrote:
> On Mon, Nov 28, 2011 at 05:28:08PM +0100, Lars-Peter Clausen wrote:
> 
>> -static const char *ad193x_deemp[] = {"None", "48kHz", "44.1kHz", "32kHz"};
>> +static const char * const ad193x_deemp[] = {"None", "48kHz", "44.1kHz", "32kHz"};
> 
> Ideally this would be converted to a switch and the driver would
> automatically select the rate based on the current sample rate.

Ideally yes, but I'm not sure if this couldn't break some existing setup if it
expects to find that control.

- Lars

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

* Re: [PATCH 3/7] ASoC: AD193X: Make enum items const char * const
  2011-11-28 19:01     ` Lars-Peter Clausen
@ 2011-11-28 19:03       ` Mark Brown
  0 siblings, 0 replies; 14+ messages in thread
From: Mark Brown @ 2011-11-28 19:03 UTC (permalink / raw)
  To: Lars-Peter Clausen
  Cc: Liam Girdwood, linux-kernel, alsa-devel, drivers, device-drivers-devel

On Mon, Nov 28, 2011 at 08:01:38PM +0100, Lars-Peter Clausen wrote:
> On 11/28/2011 07:53 PM, Mark Brown wrote:
> > On Mon, Nov 28, 2011 at 05:28:08PM +0100, Lars-Peter Clausen wrote:

> >> -static const char *ad193x_deemp[] = {"None", "48kHz", "44.1kHz", "32kHz"};
> >> +static const char * const ad193x_deemp[] = {"None", "48kHz", "44.1kHz", "32kHz"};

> > Ideally this would be converted to a switch and the driver would
> > automatically select the rate based on the current sample rate.

> Ideally yes, but I'm not sure if this couldn't break some existing setup if it
> expects to find that control.

Well, it might but I'm not sure anyone actually uses deemphasis any more
anyway.

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

* Re: [PATCH 5/7] ASOC: AD193X: Add sysclk DAPM supply
  2011-11-28 16:28 ` [PATCH 5/7] ASOC: AD193X: Add sysclk DAPM supply Lars-Peter Clausen
@ 2011-11-29  5:24   ` Mike Frysinger
  2011-11-29 11:34     ` Mark Brown
  0 siblings, 1 reply; 14+ messages in thread
From: Mike Frysinger @ 2011-11-29  5:24 UTC (permalink / raw)
  To: Lars-Peter Clausen
  Cc: Mark Brown, Liam Girdwood, linux-kernel, alsa-devel, drivers,
	device-drivers-devel

nitpick: you've got a variety of subjects:
ASoC: AD193X: ...
ASOC: AD193X: ...
ASoC: ad193x: ...

be nice if it were consistent as it makes reading short logs easier ...
-mike

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

* Re: [PATCH 5/7] ASOC: AD193X: Add sysclk DAPM supply
  2011-11-29  5:24   ` Mike Frysinger
@ 2011-11-29 11:34     ` Mark Brown
  2011-11-30  5:42       ` Mike Frysinger
  0 siblings, 1 reply; 14+ messages in thread
From: Mark Brown @ 2011-11-29 11:34 UTC (permalink / raw)
  To: Mike Frysinger
  Cc: Lars-Peter Clausen, Liam Girdwood, linux-kernel, alsa-devel,
	drivers, device-drivers-devel

On Tue, Nov 29, 2011 at 12:24:27AM -0500, Mike Frysinger wrote:
> nitpick: you've got a variety of subjects:

Mike, *please* include some context in your replies.

> ASoC: AD193X: ...
> ASOC: AD193X: ...
> ASoC: ad193x: ...

> be nice if it were consistent as it makes reading short logs easier ...

I actually fixed this up when I was applying them but yes this is
better.

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

* Re: [PATCH 5/7] ASOC: AD193X: Add sysclk DAPM supply
  2011-11-29 11:34     ` Mark Brown
@ 2011-11-30  5:42       ` Mike Frysinger
  0 siblings, 0 replies; 14+ messages in thread
From: Mike Frysinger @ 2011-11-30  5:42 UTC (permalink / raw)
  To: Mark Brown
  Cc: Lars-Peter Clausen, Liam Girdwood, linux-kernel, alsa-devel,
	drivers, device-drivers-devel

On Tue, Nov 29, 2011 at 06:34, Mark Brown wrote:
> On Tue, Nov 29, 2011 at 12:24:27AM -0500, Mike Frysinger wrote:
>> nitpick: you've got a variety of subjects:
>
> Mike, *please* include some context in your replies.

the context was subject lines of diff patches, so i just picked a
random one to reply to ...
-mike

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

end of thread, other threads:[~2011-11-30  5:43 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-11-28 16:28 [PATCH 1/7] ASoC: ad193X: Use table based DAPM and controls setup Lars-Peter Clausen
2011-11-28 16:28 ` [PATCH 2/7] ASoC: ad193X: Provide dB ranges for the volume controls Lars-Peter Clausen
2011-11-28 16:28 ` [PATCH 3/7] ASoC: AD193X: Make enum items const char * const Lars-Peter Clausen
2011-11-28 18:53   ` Mark Brown
2011-11-28 19:01     ` Lars-Peter Clausen
2011-11-28 19:03       ` Mark Brown
2011-11-28 16:28 ` [PATCH 4/7] ASoC: ad193X: Remove non-functional DAPM route controls Lars-Peter Clausen
2011-11-28 16:28 ` [PATCH 5/7] ASOC: AD193X: Add sysclk DAPM supply Lars-Peter Clausen
2011-11-29  5:24   ` Mike Frysinger
2011-11-29 11:34     ` Mark Brown
2011-11-30  5:42       ` Mike Frysinger
2011-11-28 16:28 ` [PATCH 6/7] ASoC: AD193X: Use snd_soc_update_bits where appropriate Lars-Peter Clausen
2011-11-28 16:28 ` [PATCH 7/7] ASoC: AD193X: Convert to direct regmap API usage Lars-Peter Clausen
2011-11-28 18:57 ` [PATCH 1/7] ASoC: ad193X: Use table based DAPM and controls setup Mark Brown

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).