Skip to content

Commit

Permalink
ASoC: tas5086: fix Mid-Z implementation
Browse files Browse the repository at this point in the history
It turns out that the TAS5086 doesn't like channel start parts to be
empty, and if all channels are configured to Mid-Z, part 1 has to be
used.

Signed-off-by: Daniel Mack <zonque@gmail.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
  • Loading branch information
zonque authored and broonie committed Jun 28, 2013
1 parent 9f24dc8 commit a975873
Showing 1 changed file with 9 additions and 6 deletions.
15 changes: 9 additions & 6 deletions sound/soc/codecs/tas5086.c
Original file line number Diff line number Diff line change
Expand Up @@ -721,7 +721,7 @@ static int tas5086_probe(struct snd_soc_codec *codec)
{
struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec);
int charge_period = 1300000; /* hardware default is 1300 ms */
u8 pwm_start = TAS5086_PWM_START_CHANNEL_MASK;
u8 pwm_start_mid_z = 0;
int i, ret;

if (of_match_device(of_match_ptr(tas5086_dt_ids), codec->dev)) {
Expand All @@ -735,16 +735,19 @@ static int tas5086_probe(struct snd_soc_codec *codec)
"ti,mid-z-channel-%d", i + 1);

if (of_get_property(of_node, name, NULL) != NULL)
pwm_start &= ~(1 << i);
pwm_start_mid_z |= 1 << i;
}
}

/*
* Configure 'part 2' of the PWM starts to always use MID-Z, and tell
* all configured mid-z channels to start start under 'part 2'.
* If any of the channels is configured to start in Mid-Z mode,
* configure 'part 1' of the PWM starts to use Mid-Z, and tell
* all configured mid-z channels to start start under 'part 1'.
*/
regmap_write(priv->regmap, TAS5086_PWM_START,
TAS5086_PWM_START_MIDZ_FOR_START_2 | pwm_start);
if (pwm_start_mid_z)
regmap_write(priv->regmap, TAS5086_PWM_START,
TAS5086_PWM_START_MIDZ_FOR_START_1 |
pwm_start_mid_z);

/* lookup and set split-capacitor charge period */
if (charge_period == 0) {
Expand Down

0 comments on commit a975873

Please sign in to comment.