Commit 3d632cc8 authored by Eric Nelson's avatar Eric Nelson Committed by Mark Brown

ASoC: sgtl5000: Initialize CHIP_ANA_POWER to power-on defaults

Initialize CHIP_ANA_POWER to match power on defaults, which disables
ADC, DAC, and charge pumps.

In the process, remove references to the following register/bitfields
from the sgtl5000_set_power_regs routine:
	CHIP_ANA_POWER/LINREG_SIMPLE_POWERUP and
	CHIP_LINREG_CTRL/LINREG_VDD_MASK

And remove CHIP_ANA_POWER and CHIP_LINREG_CTRL from the set of default
registers so they don't get clobbered by sgtl5000_fill_defaults().
Signed-off-by: default avatarEric Nelson <eric@nelint.com>
Signed-off-by: default avatarClemens Gruber <clemens.gruber@pqgruber.com>
Tested-by: default avatarFabio Estevam <fabio.estevam@nxp.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent f219b169
...@@ -47,12 +47,10 @@ static const struct reg_default sgtl5000_reg_defaults[] = { ...@@ -47,12 +47,10 @@ static const struct reg_default sgtl5000_reg_defaults[] = {
{ SGTL5000_CHIP_ANA_ADC_CTRL, 0x0000 }, { SGTL5000_CHIP_ANA_ADC_CTRL, 0x0000 },
{ SGTL5000_CHIP_ANA_HP_CTRL, 0x1818 }, { SGTL5000_CHIP_ANA_HP_CTRL, 0x1818 },
{ SGTL5000_CHIP_ANA_CTRL, 0x0111 }, { SGTL5000_CHIP_ANA_CTRL, 0x0111 },
{ SGTL5000_CHIP_LINREG_CTRL, 0x0000 },
{ SGTL5000_CHIP_REF_CTRL, 0x0000 }, { SGTL5000_CHIP_REF_CTRL, 0x0000 },
{ SGTL5000_CHIP_MIC_CTRL, 0x0000 }, { SGTL5000_CHIP_MIC_CTRL, 0x0000 },
{ SGTL5000_CHIP_LINE_OUT_CTRL, 0x0000 }, { SGTL5000_CHIP_LINE_OUT_CTRL, 0x0000 },
{ SGTL5000_CHIP_LINE_OUT_VOL, 0x0404 }, { SGTL5000_CHIP_LINE_OUT_VOL, 0x0404 },
{ SGTL5000_CHIP_ANA_POWER, 0x7060 },
{ SGTL5000_CHIP_PLL_CTRL, 0x5000 }, { SGTL5000_CHIP_PLL_CTRL, 0x5000 },
{ SGTL5000_CHIP_CLK_TOP_CTRL, 0x0000 }, { SGTL5000_CHIP_CLK_TOP_CTRL, 0x0000 },
{ SGTL5000_CHIP_ANA_STATUS, 0x0000 }, { SGTL5000_CHIP_ANA_STATUS, 0x0000 },
...@@ -93,6 +91,7 @@ static const char *supply_names[SGTL5000_SUPPLY_NUM] = { ...@@ -93,6 +91,7 @@ static const char *supply_names[SGTL5000_SUPPLY_NUM] = {
}; };
#define LDO_VOLTAGE 1200000 #define LDO_VOLTAGE 1200000
#define LINREG_VDDD ((1600 - LDO_VOLTAGE / 1000) / 50)
enum sgtl5000_micbias_resistor { enum sgtl5000_micbias_resistor {
SGTL5000_MICBIAS_OFF = 0, SGTL5000_MICBIAS_OFF = 0,
...@@ -1002,25 +1001,6 @@ static int sgtl5000_set_power_regs(struct snd_soc_codec *codec) ...@@ -1002,25 +1001,6 @@ static int sgtl5000_set_power_regs(struct snd_soc_codec *codec)
snd_soc_write(codec, SGTL5000_CHIP_ANA_POWER, ana_pwr); snd_soc_write(codec, SGTL5000_CHIP_ANA_POWER, ana_pwr);
/* set voltage to register */
snd_soc_update_bits(codec, SGTL5000_CHIP_LINREG_CTRL,
SGTL5000_LINREG_VDDD_MASK, 0x8);
/*
* if vddd linear reg has been enabled,
* simple digital supply should be clear to get
* proper VDDD voltage.
*/
if (ana_pwr & SGTL5000_LINEREG_D_POWERUP)
snd_soc_update_bits(codec, SGTL5000_CHIP_ANA_POWER,
SGTL5000_LINREG_SIMPLE_POWERUP,
0);
else
snd_soc_update_bits(codec, SGTL5000_CHIP_ANA_POWER,
SGTL5000_LINREG_SIMPLE_POWERUP |
SGTL5000_STARTUP_POWERUP,
0);
/* /*
* set ADC/DAC VAG to vdda / 2, * set ADC/DAC VAG to vdda / 2,
* should stay in range (0.8v, 1.575v) * should stay in range (0.8v, 1.575v)
...@@ -1242,6 +1222,7 @@ static int sgtl5000_i2c_probe(struct i2c_client *client, ...@@ -1242,6 +1222,7 @@ static int sgtl5000_i2c_probe(struct i2c_client *client,
int ret, reg, rev; int ret, reg, rev;
struct device_node *np = client->dev.of_node; struct device_node *np = client->dev.of_node;
u32 value; u32 value;
u16 ana_pwr;
sgtl5000 = devm_kzalloc(&client->dev, sizeof(*sgtl5000), GFP_KERNEL); sgtl5000 = devm_kzalloc(&client->dev, sizeof(*sgtl5000), GFP_KERNEL);
if (!sgtl5000) if (!sgtl5000)
...@@ -1299,29 +1280,34 @@ static int sgtl5000_i2c_probe(struct i2c_client *client, ...@@ -1299,29 +1280,34 @@ static int sgtl5000_i2c_probe(struct i2c_client *client,
sgtl5000->revision = rev; sgtl5000->revision = rev;
/* Follow section 2.2.1.1 of AN3663 */ /* Follow section 2.2.1.1 of AN3663 */
ana_pwr = SGTL5000_ANA_POWER_DEFAULT;
if (sgtl5000->num_supplies <= VDDD) { if (sgtl5000->num_supplies <= VDDD) {
/* internal VDDD at 1.2V */ /* internal VDDD at 1.2V */
regmap_update_bits(sgtl5000->regmap, ret = regmap_update_bits(sgtl5000->regmap,
SGTL5000_CHIP_LINREG_CTRL, SGTL5000_CHIP_LINREG_CTRL,
SGTL5000_LINREG_VDDD_MASK, 8); SGTL5000_LINREG_VDDD_MASK,
regmap_update_bits(sgtl5000->regmap, LINREG_VDDD);
SGTL5000_CHIP_ANA_POWER, if (ret)
SGTL5000_LINEREG_D_POWERUP dev_err(&client->dev,
| SGTL5000_LINREG_SIMPLE_POWERUP, "Error %d setting LINREG_VDDD\n", ret);
SGTL5000_LINEREG_D_POWERUP);
dev_info(&client->dev, "Using internal LDO instead of VDDD: check ER1\n"); ana_pwr |= SGTL5000_LINEREG_D_POWERUP;
dev_info(&client->dev,
"Using internal LDO instead of VDDD: check ER1\n");
} else { } else {
/* using external LDO for VDDD /* using external LDO for VDDD
* Clear startup powerup and simple powerup * Clear startup powerup and simple powerup
* bits to save power * bits to save power
*/ */
regmap_update_bits(sgtl5000->regmap, ana_pwr &= ~(SGTL5000_STARTUP_POWERUP
SGTL5000_CHIP_ANA_POWER, | SGTL5000_LINREG_SIMPLE_POWERUP);
SGTL5000_STARTUP_POWERUP
| SGTL5000_LINREG_SIMPLE_POWERUP,
0);
dev_dbg(&client->dev, "Using external VDDD\n"); dev_dbg(&client->dev, "Using external VDDD\n");
} }
ret = regmap_write(sgtl5000->regmap, SGTL5000_CHIP_ANA_POWER, ana_pwr);
if (ret)
dev_err(&client->dev,
"Error %d setting CHIP_ANA_POWER to %04x\n",
ret, ana_pwr);
if (np) { if (np) {
if (!of_property_read_u32(np, if (!of_property_read_u32(np,
......
...@@ -325,6 +325,7 @@ ...@@ -325,6 +325,7 @@
/* /*
* SGTL5000_CHIP_ANA_POWER * SGTL5000_CHIP_ANA_POWER
*/ */
#define SGTL5000_ANA_POWER_DEFAULT 0x7060
#define SGTL5000_DAC_STEREO 0x4000 #define SGTL5000_DAC_STEREO 0x4000
#define SGTL5000_LINREG_SIMPLE_POWERUP 0x2000 #define SGTL5000_LINREG_SIMPLE_POWERUP 0x2000
#define SGTL5000_STARTUP_POWERUP 0x1000 #define SGTL5000_STARTUP_POWERUP 0x1000
......
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