OpenCloudOS-Kernel/sound
Peter Ujfalusi c96907f21f ASoC: TWL4030: PM fix for output amplifiers
Gain controls on outputs affect the power consumption
when the gain is set to non 0 value.

Outputs with amps have one register to configure the
routing and the gain:
PREDL_CTL (0x25):
bit 0: Voice enable
bit 1: Audio L1 enable
bit 2: Audio L2 enable
bit 3: Audio R2 enable
bit 4-5: Gain (0x0 - power down, 0x1 - 6dB, 0x2 - 0dB, 0x3 - -6dB)

bit 0 - 3: is handled in DAPM domain (DAPM_MIXER)
bit 4 - 5: has simple volume control

If there is no audio activity (BIAS_STANDBY), and
user changes the volume, than the output amplifier will
be enabled.
If the user changes the routing (but the codec remains in
BIAS_STANDBY), than the cached gain value also be written
to the register, which enables the amplifier.

The existing workaround for this is to have virtual
PGAs associated with the outputs, and whit DAPM PMD
the gain on the output will be forced to 0 (off) by
bypassing the regcache.
This failed to disable the amplifiers in several
scenario (as mentioned above).

Also if the codec is in BIAS_ON state, and user modifies
a volume control, which path is actually not enabled, than
that amplifier will be enabled as well, but it will
be not turned off, since there is no DAPM path, which
would make mute it.

To prevent amps being enabled, when they are not
needed, introduce the following workaround:
Track the state of each of this type of output.
In twl4030_write only allow actual write, when the
given output is enabled, otherwise only update
the reg_cache.
The PGA event handlers on power up will write the cached
value to the chip (restoring gain, routing selection).
On power down 0 is written to the register (disabling
the amp, and also just in case clearing the routing).

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@nokia.com>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2010-03-22 16:47:12 +00:00
..
aoa of: unify phandle name in struct device_node 2010-01-28 14:06:53 -07:00
arm ALSA: sound/arm: Fix build failure caused by missing struct aaci definition 2009-12-26 10:16:07 +01:00
atmel ALSA: snd-atmel-abdac: increase periods_min to 6 instead of 4 2009-04-06 03:56:28 +02:00
core ALSA: Add support for key reporting via the jack interface 2010-03-17 18:10:46 +00:00
drivers Merge remote branch 'alsa/devel' into topic/misc 2010-02-12 10:42:38 +01:00
i2c Merge branch 'topic/hda' into for-linus 2009-12-04 16:22:45 +01:00
isa ALSA: fix jazz16 compile (udelay) 2010-03-05 08:13:20 +01:00
mips ALSA: pcm - Call pgprot_noncached() for vmalloc'ed buffers 2010-01-18 15:00:34 +01:00
oss Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6 2010-03-08 07:34:26 -08:00
parisc ALSA: sound/parisc: Move dereference after NULL test 2009-10-30 12:01:38 +01:00
pci Merge branch 'topic/misc' into for-linus 2010-03-08 09:35:50 +01:00
pcmcia ALSA: pcm - Call pgprot_noncached() for vmalloc'ed buffers 2010-01-18 15:00:34 +01:00
ppc of: add 'of_' prefix to machine_is_compatible() 2010-02-09 08:33:00 -07:00
sh Merge branch 'topic/beep-rename' into topic/core-change 2009-12-01 15:58:10 +01:00
soc ASoC: TWL4030: PM fix for output amplifiers 2010-03-22 16:47:12 +00:00
sparc ALSA: Add missing SNDRV_PCM_INFO_BATCH flag to some drivers 2009-04-28 15:06:44 +02:00
spi ALSA: Convert to snd_card_create() in other sound/* 2009-01-12 15:21:19 +01:00
synth tree-wide: fix typos "couter" -> "counter" 2009-12-04 15:39:51 +01:00
usb ALSA: usbaudio - remove debug "SAMPLE BYTES" printk line 2010-03-03 22:40:04 +01:00
Kconfig tree-wide: fix assorted typos all over the place 2009-12-04 15:39:55 +01:00
Makefile ALSA: Add Atmel ALSA drivers directory 2009-02-05 15:08:53 +01:00
ac97_bus.c ALSA: ac97 - Include ac97_codec.h for ac97_bus_type declaration 2008-12-02 16:25:37 +01:00
last.c [ALSA] Remove sound/driver.h 2008-01-31 17:29:48 +01:00
sound_core.c ALSA: use subsys_initcall for sound core instead of module_init 2010-01-14 21:21:47 +01:00
sound_firmware.c