All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Mack <zonque@gmail.com>
To: alsa-devel@alsa-project.org
Cc: broonie@kernel.org, lars@metafoo.de, Daniel Mack <zonque@gmail.com>
Subject: [PATCH 4/4] ASoC: codecs: adau1701: add support for pin muxing
Date: Fri,  7 Jun 2013 13:53:07 +0200	[thread overview]
Message-ID: <1370605987-19290-5-git-send-email-zonque@gmail.com> (raw)
In-Reply-To: <1370605987-19290-1-git-send-email-zonque@gmail.com>

The ADAU1701 has 12 pins that can be configured depending on the system
configuration. Allow settting the corresponding registers from DT.

Signed-off-by: Daniel Mack <zonque@gmail.com>
---
 .../devicetree/bindings/sound/adi,adau1701.txt     |  4 +++
 sound/soc/codecs/adau1701.c                        | 34 ++++++++++++++++++++--
 2 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/Documentation/devicetree/bindings/sound/adi,adau1701.txt b/Documentation/devicetree/bindings/sound/adi,adau1701.txt
index c9c6e98..e1b44a0 100644
--- a/Documentation/devicetree/bindings/sound/adi,adau1701.txt
+++ b/Documentation/devicetree/bindings/sound/adi,adau1701.txt
@@ -25,6 +25,10 @@ Optional properties:
 			according to the configured clock divider on ASoC side
 			before the firmware is loaded.
 
+ - adi,pin-config:	An array of 12 numerical values selecting one of the
+			pin configurations as described in the datasheet,
+			table 53.
+
 Examples:
 
 	i2c_bus {
diff --git a/sound/soc/codecs/adau1701.c b/sound/soc/codecs/adau1701.c
index 8d2804c..fca9cac 100644
--- a/sound/soc/codecs/adau1701.c
+++ b/sound/soc/codecs/adau1701.c
@@ -29,6 +29,8 @@
 #define ADAU1701_SEROCTL	0x1e
 #define ADAU1701_SERICTL	0x1f
 
+#define ADAU1701_PINCONF_0	0x20
+#define ADAU1701_PINCONF_1	0x21
 #define ADAU1701_AUXNPOW	0x22
 
 #define ADAU1701_OSCIPOW	0x26
@@ -97,6 +99,7 @@ struct adau1701 {
 	unsigned int dai_fmt;
 	unsigned int pll_clkdiv;
 	struct regmap *regmap;
+	unsigned char pin_config[12];
 };
 
 static const struct snd_kcontrol_new adau1701_controls[] = {
@@ -132,6 +135,9 @@ static unsigned int adau1701_register_size(struct device *dev,
 		unsigned int reg)
 {
 	switch (reg) {
+	case ADAU1701_PINCONF_0:
+	case ADAU1701_PINCONF_1:
+		return 3;
 	case ADAU1701_DSPCTRL:
 	case ADAU1701_SEROCTL:
 	case ADAU1701_AUXNPOW:
@@ -162,7 +168,7 @@ static int adau1701_reg_write(void *context, unsigned int reg,
 	struct i2c_client *client = context;
 	unsigned int i;
 	unsigned int size;
-	uint8_t buf[4];
+	uint8_t buf[5];
 	int ret;
 
 	size = adau1701_register_size(&client->dev, reg);
@@ -580,7 +586,8 @@ MODULE_DEVICE_TABLE(of, adau1701_dt_ids);
 
 static int adau1701_probe(struct snd_soc_codec *codec)
 {
-	int ret;
+	int ret, i;
+	unsigned int val;
 	struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(codec);
 
 	ret = adau1701_init(codec);
@@ -589,6 +596,19 @@ static int adau1701_probe(struct snd_soc_codec *codec)
 
 	regmap_write(adau1701->regmap, ADAU1701_DSPCTRL, ADAU1701_DSPCTRL_CR);
 
+	/* set up pin config */
+	val = 0;
+	for (i = 0; i < 6; i++)
+		val |= adau1701->pin_config[i] << (i * 4);
+
+	regmap_write(adau1701->regmap, ADAU1701_PINCONF_0, val);
+
+	val = 0;
+	for (i = 0; i < 6; i++)
+		val |= adau1701->pin_config[i + 6] << (i * 4);
+
+	regmap_write(adau1701->regmap, ADAU1701_PINCONF_1, val);
+
 	return 0;
 }
 
@@ -637,6 +657,9 @@ static int adau1701_i2c_probe(struct i2c_client *client,
 		return PTR_ERR(adau1701->regmap);
 
 	if (dev->of_node) {
+		const u32 *pin_config32;
+		u32 size, i;
+
 		gpio_nreset = of_get_named_gpio(dev->of_node, "reset-gpio", 0);
 		if (gpio_nreset < 0 && gpio_nreset != -ENOENT)
 			return gpio_nreset;
@@ -653,6 +676,13 @@ static int adau1701_i2c_probe(struct i2c_client *client,
 
 		of_property_read_u32(dev->of_node, "adi,pll-clkdiv",
 				     &adau1701->pll_clkdiv);
+		pin_config32 = of_get_property(dev->of_node,
+					       "adi,pin-config", &size);
+		size /= sizeof(u32);
+		size = min(ARRAY_SIZE(adau1701->pin_config), size);
+
+		for (i = 0; i < size; i++)
+			adau1701->pin_config[i] = be32_to_cpup(pin_config32 + i);
 	}
 
 	if (gpio_is_valid(gpio_nreset)) {
-- 
1.8.1.4

  parent reply	other threads:[~2013-06-07 11:52 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-07 11:53 [PATCH 0/4] ASoC: codecs: some more improvements for adau1701 Daniel Mack
2013-06-07 11:53 ` [PATCH 1/4] ASoC: codecs: adau1701: factor out firmware reset Daniel Mack
2013-06-10 13:08   ` Lars-Peter Clausen
2013-06-10 13:09   ` Mark Brown
2013-06-07 11:53 ` [PATCH 2/4] ASoC: codecs: adau1701: allow configuration of PLL mode pins Daniel Mack
2013-06-09 17:12   ` Lars-Peter Clausen
2013-06-07 11:53 ` [PATCH 3/4] ASoC: codecs: adau1701: switch to direct regmap API usage Daniel Mack
2013-06-09 17:39   ` Lars-Peter Clausen
2013-06-07 11:53 ` Daniel Mack [this message]
2013-06-09 17:43   ` [PATCH 4/4] ASoC: codecs: adau1701: add support for pin muxing Lars-Peter Clausen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1370605987-19290-5-git-send-email-zonque@gmail.com \
    --to=zonque@gmail.com \
    --cc=alsa-devel@alsa-project.org \
    --cc=broonie@kernel.org \
    --cc=lars@metafoo.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.