* tlv320aic32x4 Codec ADC and DAC must shutdown to alter clocks
@ 2014-03-12 15:08 Mike Looijmans
2014-03-12 23:31 ` Mark Brown
0 siblings, 1 reply; 6+ messages in thread
From: Mike Looijmans @ 2014-03-12 15:08 UTC (permalink / raw)
To: Linux-ALSA
My general question: If "my" codec needs to alter the state of the DAPM
tree, how can the codec ask or inform the DAPM components of this?
This problem occurs on tlv320aic32x4 codecs, but probably applies to
many others as well.
Using the tlv320aic32x4 a simple loop like this may "crash" the codec:
while true
do
speaker-test -c 2 -t sine -l 1 -r 48000 > /dev/null
speaker-test -c 2 -t sine -l 1 -r 44100 > /dev/null
done
A "crash" means, in this respect that the chip loses some of its
settings, malfunctions and often it results in NACKs on I2C commands.
I've been trying to properly fix this, but it just won't fit in the
framework.
The cause is that the DAPM starts the DAC and/or ADC cores while the
clocks aren't running, and stops the clocks before shutting down the cores.
There is the overall bug of the driver that starts and stops all the
clocks in the aic32x4_set_bias_level in the wrong order - it should
start them from source to sink, and stop them in the opposite direction,
so the PLL must be the first to start and last to stop. Apparently this
isn't really critical as I've never observed failure as a result of this.
What I cannot fix is that changing the parameters (like clock frequency)
must stop the DAC core.
The DAPM framework just sets the BIAS to "ON" only once, and does not
shut down until after a time out. Which is good.
But if the next stream to play needs a different clock setting, the DAC
must be stopped first, the code must wait until the DAC has powered
down, and then the clocks can be stopped and altered. When all settings
are done, the DAC can be restarted.
Starting the DAC is the DAPM's task, it's this line that does the job:
SND_SOC_DAPM_DAC("Left DAC", "Left Playback", AIC32X4_DACSETUP, 7, 0),
I can detect the change in the hw_params, and on the first stream to
play, this is called while still in STANDBY or lower levels. However,
when the codec is already in ON bias level, how do I tell DAPM that I
had to shut down the DAC in order to change the parameters? Just
toggling the related bits will keep the DAC powered down. A routine to
store and restore the power state is possible, but very ineffective.
Especially since the "I must shutdown" conclusion can also be in the
clock setting routine. That would result in multiple down-up cycles.
--
Mike Looijmans
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: tlv320aic32x4 Codec ADC and DAC must shutdown to alter clocks
2014-03-12 15:08 tlv320aic32x4 Codec ADC and DAC must shutdown to alter clocks Mike Looijmans
@ 2014-03-12 23:31 ` Mark Brown
2014-03-13 7:09 ` Mike Looijmans
0 siblings, 1 reply; 6+ messages in thread
From: Mark Brown @ 2014-03-12 23:31 UTC (permalink / raw)
To: Mike Looijmans; +Cc: Linux-ALSA
[-- Attachment #1.1: Type: text/plain, Size: 1415 bytes --]
On Wed, Mar 12, 2014 at 04:08:40PM +0100, Mike Looijmans wrote:
> What I cannot fix is that changing the parameters (like clock
> frequency) must stop the DAC core.
> The DAPM framework just sets the BIAS to "ON" only once, and does
> not shut down until after a time out. Which is good.
> But if the next stream to play needs a different clock setting, the
> DAC must be stopped first, the code must wait until the DAC has
> powered down, and then the clocks can be stopped and altered. When
> all settings are done, the DAC can be restarted.
As a first order fix the driver should just refuse to reconfigure if the
clocks are active.
> I can detect the change in the hw_params, and on the first stream to
> play, this is called while still in STANDBY or lower levels.
> However, when the codec is already in ON bias level, how do I tell
> DAPM that I had to shut down the DAC in order to change the
> parameters? Just toggling the related bits will keep the DAC powered
> down. A routine to store and restore the power state is possible,
> but very ineffective. Especially since the "I must shutdown"
> conclusion can also be in the clock setting routine. That would
> result in multiple down-up cycles.
The big problem with shutting down is disruption to other activity - if
there's something going on using the clocks. For some devices that
don't have long startup times ignore_pmdow_time may help a lot.
[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: tlv320aic32x4 Codec ADC and DAC must shutdown to alter clocks
2014-03-12 23:31 ` Mark Brown
@ 2014-03-13 7:09 ` Mike Looijmans
2014-03-13 14:04 ` Mark Brown
0 siblings, 1 reply; 6+ messages in thread
From: Mike Looijmans @ 2014-03-13 7:09 UTC (permalink / raw)
To: Mark Brown; +Cc: Linux-ALSA
On 03/13/2014 12:31 AM, Mark Brown wrote:
> On Wed, Mar 12, 2014 at 04:08:40PM +0100, Mike Looijmans wrote:
>
>> What I cannot fix is that changing the parameters (like clock
>> frequency) must stop the DAC core.
>
>> The DAPM framework just sets the BIAS to "ON" only once, and does
>> not shut down until after a time out. Which is good.
>> But if the next stream to play needs a different clock setting, the
>> DAC must be stopped first, the code must wait until the DAC has
>> powered down, and then the clocks can be stopped and altered. When
>> all settings are done, the DAC can be restarted.
>
> As a first order fix the driver should just refuse to reconfigure if the
> clocks are active.
Which would result in the driver often failing to work and the user
having no clue why.
>> I can detect the change in the hw_params, and on the first stream to
>> play, this is called while still in STANDBY or lower levels.
>> However, when the codec is already in ON bias level, how do I tell
>> DAPM that I had to shut down the DAC in order to change the
>> parameters? Just toggling the related bits will keep the DAC powered
>> down. A routine to store and restore the power state is possible,
>> but very ineffective. Especially since the "I must shutdown"
>> conclusion can also be in the clock setting routine. That would
>> result in multiple down-up cycles.
>
> The big problem with shutting down is disruption to other activity - if
> there's something going on using the clocks. For some devices that
> don't have long startup times ignore_pmdow_time may help a lot.
The bias level can remain where it is, it's just the DACSETUP or
ADCSETUP bits that need toggling. They're independent, so only the
affected parts need to stop. Using ignore_pmdow_time would result in the
codec going to a lower bias state, and that is not what should happen
here. Restarting the ADC or DAC is just a matter of milliseconds, but a
complete power-down will result in reference voltage instability and
capacitors recharging, and it may take several minutes for the system to
completely recover from that.
I'm mostly asking to think about the "big picture" here. As a generic
case, not specific to this codec.
--
Mike Looijmans
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: tlv320aic32x4 Codec ADC and DAC must shutdown to alter clocks
2014-03-13 7:09 ` Mike Looijmans
@ 2014-03-13 14:04 ` Mark Brown
2014-03-14 9:47 ` Mike Looijmans
0 siblings, 1 reply; 6+ messages in thread
From: Mark Brown @ 2014-03-13 14:04 UTC (permalink / raw)
To: Mike Looijmans; +Cc: Linux-ALSA
[-- Attachment #1.1: Type: text/plain, Size: 1903 bytes --]
On Thu, Mar 13, 2014 at 08:09:25AM +0100, Mike Looijmans wrote:
> On 03/13/2014 12:31 AM, Mark Brown wrote:
> >As a first order fix the driver should just refuse to reconfigure if the
> >clocks are active.
> Which would result in the driver often failing to work and the user having
> no clue why.
Print an error message.
> >The big problem with shutting down is disruption to other activity - if
> >there's something going on using the clocks. For some devices that
> >don't have long startup times ignore_pmdow_time may help a lot.
> The bias level can remain where it is, it's just the DACSETUP or ADCSETUP
> bits that need toggling. They're independent, so only the affected parts
> need to stop. Using ignore_pmdow_time would result in the codec going to a
> lower bias state, and that is not what should happen here. Restarting the
> ADC or DAC is just a matter of milliseconds, but a complete power-down will
> result in reference voltage instability and capacitors recharging, and it
> may take several minutes for the system to completely recover from that.
*Any* glitch in an active digital audio path will be noticable to users,
If you're taking several minutes to do a bias level transition there's
something seriously wrong with either the hardware or with the way it's
being managed by the driver.
> I'm mostly asking to think about the "big picture" here. As a generic case,
> not specific to this codec.
The general solution here is essentially don't do that; if the hardware
is fragile on reconfiguration you will tend to end up hitting cases
where trying to do a reconfiguration will glitch or fail so the sound
server will generally fix the configuration and handle things in
software. Otherwise pmdown_time is the general solution for modern
devices with quick startup/shutdown times, older devices probably need
some custom hacks.
[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: tlv320aic32x4 Codec ADC and DAC must shutdown to alter clocks
2014-03-13 14:04 ` Mark Brown
@ 2014-03-14 9:47 ` Mike Looijmans
2014-03-28 14:13 ` Mark Brown
0 siblings, 1 reply; 6+ messages in thread
From: Mike Looijmans @ 2014-03-14 9:47 UTC (permalink / raw)
To: alsa-devel
On 03/13/2014 03:04 PM, Mark Brown wrote:
> On Thu, Mar 13, 2014 at 08:09:25AM +0100, Mike Looijmans wrote:
>> On 03/13/2014 12:31 AM, Mark Brown wrote:
>
>>> As a first order fix the driver should just refuse to reconfigure if the
>>> clocks are active.
>
>> Which would result in the driver often failing to work and the user having
>> no clue why.
>
> Print an error message.
>
>>> The big problem with shutting down is disruption to other activity - if
>>> there's something going on using the clocks. For some devices that
>>> don't have long startup times ignore_pmdow_time may help a lot.
>
>> The bias level can remain where it is, it's just the DACSETUP or ADCSETUP
>> bits that need toggling. They're independent, so only the affected parts
>> need to stop. Using ignore_pmdow_time would result in the codec going to a
>> lower bias state, and that is not what should happen here. Restarting the
>> ADC or DAC is just a matter of milliseconds, but a complete power-down will
>> result in reference voltage instability and capacitors recharging, and it
>> may take several minutes for the system to completely recover from that.
>
> *Any* glitch in an active digital audio path will be noticable to users,
The reconfiguration only occurs when switching from say 44100 to 48000
sampling rates (but not when going from 24 to 16 bits, for example). I don't
think users will actually expect a switch from one sampling rate to another to
proceed without any glitch or delay.
> If you're taking several minutes to do a bias level transition there's
> something seriously wrong with either the hardware or with the way it's
> being managed by the driver.
Good enough for human ears, but this project uses codecs for measurement and
is sensitive to microvolt changes in reference voltages and such. The audible
effects are gone in less than a second, but the measurable effects last a lot
longer.
>> I'm mostly asking to think about the "big picture" here. As a generic case,
>> not specific to this codec.
>
> The general solution here is essentially don't do that; if the hardware
> is fragile on reconfiguration you will tend to end up hitting cases
> where trying to do a reconfiguration will glitch or fail so the sound
> server will generally fix the configuration and handle things in
> software. Otherwise pmdown_time is the general solution for modern
> devices with quick startup/shutdown times, older devices probably need
> some custom hacks.
It's not about "fragile", it's about managing codec power states. For some
transistions, like clock changes, a codec will likely need to go to a lower
state. The current core does not even attempt to mute the DAC for example.
Well, custom hacks is 95% of what i've done to the driver (and I hacked a few
lines in the core as well to get what I wanted). I was hoping to lower the
"custom" part a bit in future.
Met vriendelijke groet / kind regards,
Mike Looijmans
TOPIC Embedded Systems
Eindhovenseweg 32-C, NL-5683 KH Best
Postbus 440, NL-5680 AK Best
Telefoon: (+31) (0) 499 33 69 79
Telefax: (+31) (0) 499 33 69 70
E-mail: mike.looijmans@topic.nl
Website: www.topic.nl
Please consider the environment before printing this e-mail
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: tlv320aic32x4 Codec ADC and DAC must shutdown to alter clocks
2014-03-14 9:47 ` Mike Looijmans
@ 2014-03-28 14:13 ` Mark Brown
0 siblings, 0 replies; 6+ messages in thread
From: Mark Brown @ 2014-03-28 14:13 UTC (permalink / raw)
To: Mike Looijmans; +Cc: alsa-devel
[-- Attachment #1.1: Type: text/plain, Size: 2943 bytes --]
On Fri, Mar 14, 2014 at 10:47:50AM +0100, Mike Looijmans wrote:
Don't drop CCs on kernel lists if you want people to read replies - the
bit about always CCing maintainers applies too...
> >*Any* glitch in an active digital audio path will be noticable to users,
> The reconfiguration only occurs when switching from say 44100 to 48000
> sampling rates (but not when going from 24 to 16 bits, for example). I don't
> think users will actually expect a switch from one sampling rate to another
> to proceed without any glitch or delay.
This has a wider effect than just the digital playback path though
doesn't it - the capture path for example, and if this is a modern
device there's doubtless charge pumps in play.
> >If you're taking several minutes to do a bias level transition there's
> >something seriously wrong with either the hardware or with the way it's
> >being managed by the driver.
> Good enough for human ears, but this project uses codecs for measurement and
> is sensitive to microvolt changes in reference voltages and such. The
> audible effects are gone in less than a second, but the measurable effects
> last a lot longer.
Less than a second still sounds like an awfully long time here and if
you've got constraints like this it sounds like you need to force the
device to be always running anyway. Glancing at the code we're only
managing clocks in the bias level operations...
> >The general solution here is essentially don't do that; if the hardware
> >is fragile on reconfiguration you will tend to end up hitting cases
> >where trying to do a reconfiguration will glitch or fail so the sound
> >server will generally fix the configuration and handle things in
> >software. Otherwise pmdown_time is the general solution for modern
> >devices with quick startup/shutdown times, older devices probably need
> >some custom hacks.
> It's not about "fragile", it's about managing codec power states. For some
> transistions, like clock changes, a codec will likely need to go to a lower
It certainly sounds a lot like it's fragile - there seem to be fairly
tight constraints on reconfiguring, you're saying it's hard to implement
something that bounces the power around reconfiguration, the device
requires symmetric rates so it won't cope if there's capture activity
too and who knows what happens with the analogue bypass paths.
Equally well you've not been specific about anything so it's possible
that the restrictions and/or what needs doing are looser than you're
making them sound; looking at the code I'm not seeing anything except
clocks being managed as part of the bias level management and there's no
effort to selectively manage the clocks.
> state. The current core does not even attempt to mute the DAC for example.
Yes it does - you can only reconfigure the sample rate for the audio
stream when it's not running and we mute (if the device supports it)
whenever the audio stream is halted.
[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2014-03-29 10:46 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-03-12 15:08 tlv320aic32x4 Codec ADC and DAC must shutdown to alter clocks Mike Looijmans
2014-03-12 23:31 ` Mark Brown
2014-03-13 7:09 ` Mike Looijmans
2014-03-13 14:04 ` Mark Brown
2014-03-14 9:47 ` Mike Looijmans
2014-03-28 14:13 ` Mark Brown
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).