Commit 97d0a868 authored by Daniel Mack's avatar Daniel Mack Committed by Mark Brown

ASoC: adau1701: add support for pin muxing

The ADAU1701 has 12 pins that can be configured depending on the system
configuration. Allow settting the corresponding registers from DT.
Signed-off-by: default avatarDaniel Mack <zonque@gmail.com>
Acked-by: default avatarLars-Peter Clausen <lars@metafoo.de>
Signed-off-by: default avatarMark Brown <broonie@linaro.org>
parent 45405d58
...@@ -16,6 +16,10 @@ Optional properties: ...@@ -16,6 +16,10 @@ Optional properties:
The state of the pins are set according to the The state of the pins are set according to the
configured clock divider on ASoC side before the configured clock divider on ASoC side before the
firmware is loaded. 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: Examples:
...@@ -25,5 +29,7 @@ Examples: ...@@ -25,5 +29,7 @@ Examples:
reg = <0x34>; reg = <0x34>;
reset-gpio = <&gpio 23 0>; reset-gpio = <&gpio 23 0>;
adi,pll-mode-gpios = <&gpio 24 0 &gpio 25 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>;
}; };
}; };
...@@ -29,6 +29,9 @@ ...@@ -29,6 +29,9 @@
#define ADAU1701_SEROCTL 0x081e #define ADAU1701_SEROCTL 0x081e
#define ADAU1701_SERICTL 0x081f #define ADAU1701_SERICTL 0x081f
#define ADAU1701_AUXNPOW 0x0822
#define ADAU1701_PINCONF_0 0x0820
#define ADAU1701_PINCONF_1 0x0821
#define ADAU1701_AUXNPOW 0x0822 #define ADAU1701_AUXNPOW 0x0822
#define ADAU1701_OSCIPOW 0x0826 #define ADAU1701_OSCIPOW 0x0826
...@@ -99,6 +102,7 @@ struct adau1701 { ...@@ -99,6 +102,7 @@ struct adau1701 {
unsigned int pll_clkdiv; unsigned int pll_clkdiv;
unsigned int sysclk; unsigned int sysclk;
struct regmap *regmap; struct regmap *regmap;
u8 pin_config[12];
}; };
static const struct snd_kcontrol_new adau1701_controls[] = { static const struct snd_kcontrol_new adau1701_controls[] = {
...@@ -134,6 +138,9 @@ static unsigned int adau1701_register_size(struct device *dev, ...@@ -134,6 +138,9 @@ static unsigned int adau1701_register_size(struct device *dev,
unsigned int reg) unsigned int reg)
{ {
switch (reg) { switch (reg) {
case ADAU1701_PINCONF_0:
case ADAU1701_PINCONF_1:
return 3;
case ADAU1701_DSPCTRL: case ADAU1701_DSPCTRL:
case ADAU1701_SEROCTL: case ADAU1701_SEROCTL:
case ADAU1701_AUXNPOW: case ADAU1701_AUXNPOW:
...@@ -164,7 +171,7 @@ static int adau1701_reg_write(void *context, unsigned int reg, ...@@ -164,7 +171,7 @@ static int adau1701_reg_write(void *context, unsigned int reg,
struct i2c_client *client = context; struct i2c_client *client = context;
unsigned int i; unsigned int i;
unsigned int size; unsigned int size;
uint8_t buf[4]; uint8_t buf[5];
int ret; int ret;
size = adau1701_register_size(&client->dev, reg); size = adau1701_register_size(&client->dev, reg);
...@@ -584,7 +591,8 @@ MODULE_DEVICE_TABLE(of, adau1701_dt_ids); ...@@ -584,7 +591,8 @@ MODULE_DEVICE_TABLE(of, adau1701_dt_ids);
static int adau1701_probe(struct snd_soc_codec *codec) 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); struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(codec);
codec->control_data = to_i2c_client(codec->dev); codec->control_data = to_i2c_client(codec->dev);
...@@ -602,6 +610,19 @@ static int adau1701_probe(struct snd_soc_codec *codec) ...@@ -602,6 +610,19 @@ static int adau1701_probe(struct snd_soc_codec *codec)
if (ret < 0) if (ret < 0)
return ret; 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; return 0;
} }
...@@ -662,6 +683,13 @@ static int adau1701_i2c_probe(struct i2c_client *client, ...@@ -662,6 +683,13 @@ static int adau1701_i2c_probe(struct i2c_client *client,
"adi,pll-mode-gpios", 1); "adi,pll-mode-gpios", 1);
if (gpio_pll_mode[1] < 0 && gpio_pll_mode[1] != -ENOENT) if (gpio_pll_mode[1] < 0 && gpio_pll_mode[1] != -ENOENT)
return gpio_pll_mode[1]; 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)) { if (gpio_is_valid(gpio_nreset)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment