Skip to content

Commit

Permalink
ASoC: adau1701: add support for pin muxing
Browse files Browse the repository at this point in the history
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 <[email protected]>
Acked-by: Lars-Peter Clausen <[email protected]>
Signed-off-by: Mark Brown <[email protected]>
  • Loading branch information
zonque authored and broonie committed Jun 25, 2013
1 parent 45405d5 commit 97d0a86
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 2 deletions.
6 changes: 6 additions & 0 deletions Documentation/devicetree/bindings/sound/adi,adau1701.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,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:

Expand All @@ -25,5 +29,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>;
};
};
32 changes: 30 additions & 2 deletions sound/soc/codecs/adau1701.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@
#define ADAU1701_SEROCTL 0x081e
#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
Expand Down Expand Up @@ -99,6 +102,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[] = {
Expand Down Expand Up @@ -134,6 +138,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:
Expand Down Expand Up @@ -164,7 +171,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);
Expand Down Expand Up @@ -584,7 +591,8 @@ MODULE_DEVICE_TABLE(of, adau1701_dt_ids);

static int adau1701_probe(struct snd_soc_codec *codec)
{
int ret;
int i, ret;
unsigned int val;
struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(codec);

codec->control_data = to_i2c_client(codec->dev);
Expand All @@ -602,6 +610,19 @@ static int adau1701_probe(struct snd_soc_codec *codec)
if (ret < 0)
return ret;

/* 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;
}

Expand Down Expand Up @@ -662,6 +683,13 @@ static int adau1701_i2c_probe(struct i2c_client *client,
"adi,pll-mode-gpios", 1);
if (gpio_pll_mode[1] < 0 && gpio_pll_mode[1] != -ENOENT)
return gpio_pll_mode[1];

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)) {
Expand Down

0 comments on commit 97d0a86

Please sign in to comment.