[alsa-devel] [PATCH v3 3/3] ASoC: codecs: adau1701: add support for pin muxing

Lars-Peter Clausen lars at metafoo.de
Fri Jun 21 10:09:08 CEST 2013


On 06/21/2013 09:54 AM, Daniel Mack wrote:
> 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 at gmail.com>

Acked-by: Lars-Peter Clausen <lars at metafoo.de>

Thanks.

> ---
>  .../devicetree/bindings/sound/adi,adau1701.txt     |  6 +++++
>  sound/soc/codecs/adau1701.c                        | 29 ++++++++++++++++++++--
>  2 files changed, 33 insertions(+), 2 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/sound/adi,adau1701.txt b/Documentation/devicetree/bindings/sound/adi,adau1701.txt
> index 173ae06..8582a45 100644
> --- a/Documentation/devicetree/bindings/sound/adi,adau1701.txt
> +++ b/Documentation/devicetree/bindings/sound/adi,adau1701.txt
> @@ -25,6 +25,10 @@ Optional properties:
>  			The state of the pins are set 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. Note that the value of this property has
> +			to be prefixed with '/bits/ 8'.
>  
>  Examples:
>  
> @@ -34,5 +38,7 @@ Examples:
>  			reg = <0x34>;
>  			reset-gpio = <&gpio 23 0>;
>  			adi,pll-mode-gpios = <&gpio 24 0 &gpio 25 0>;
> +			adi,pin-config = /bits/ 8 <0x4 0x7 0x5 0x5 0x4 0x4
> +                                                   0x4 0x4 0x4 0x4 0x4 0x4>;
>  		};
>  	};
> diff --git a/sound/soc/codecs/adau1701.c b/sound/soc/codecs/adau1701.c
> index c48f4c5..95216c8 100644
> --- a/sound/soc/codecs/adau1701.c
> +++ b/sound/soc/codecs/adau1701.c
> @@ -30,6 +30,9 @@
>  #define ADAU1701_SERICTL	0x081f
>  
>  #define ADAU1701_AUXNPOW	0x0822
> +#define ADAU1701_PINCONF_0	0x0820
> +#define ADAU1701_PINCONF_1	0x0821
> +#define ADAU1701_AUXNPOW	0x0822
>  
>  #define ADAU1701_OSCIPOW	0x0826
>  #define ADAU1701_DACSET		0x0827
> @@ -97,6 +100,7 @@ struct adau1701 {
>  	unsigned int pll_clkdiv;
>  	unsigned int sysclk;
>  	struct regmap *regmap;
> +	u8 pin_config[12];
>  };
>  
>  static const struct snd_kcontrol_new adau1701_controls[] = {
> @@ -132,6 +136,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 +169,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);
> @@ -561,7 +568,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 i2c_client *client = to_i2c_client(codec->dev);
>  	struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(codec);
>  
> @@ -577,6 +585,19 @@ static int adau1701_probe(struct snd_soc_codec *codec)
>  	regmap_write(adau1701->regmap, ADAU1701_DACSET, ADAU1701_DACSET_DACINIT);
>  	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;
>  }
>  
> @@ -640,6 +661,10 @@ static int adau1701_i2c_probe(struct i2c_client *client,
>  
>  		of_property_read_u32(dev->of_node, "adi,pll-clkdiv",
>  				     &adau1701->pll_clkdiv);
> +
> +		of_property_read_u8_array(dev->of_node, "adi,pin-config",
> +					  adau1701->pin_config,
> +					  ARRAY_SIZE(adau1701->pin_config));
>  	}
>  
>  	if (gpio_is_valid(gpio_nreset)) {



More information about the Alsa-devel mailing list