On Thu, Jan 08, 2009 at 10:07:04PM +0100, Robert Jarzmik wrote:
> Mark Brown <broonie at sirena.org.uk> writes:
> > It'd probably be easier to split this up still further, with one patch
> > providing a standard ASoC machine and another adding the scenario stuff
> > after that.
> Wish for 2 patches instead of that one, one for core support and one for
> scenarii ? As this patch has already been reviewed and include into your tree,
> I had hopped I shouldn't inject any more work that what had already be done ...
Exactly the same sort of scrutiny is being applied to the v2 core as it
moves into mainline - it's being broken up into smaller patches and
merged gradually too, often in not quite the same form as it went into
the out of tree branch.
Also note that there's a two stage thing I'm saying here: as well as
"should we do scenarios at all?" there's also the question of how it's
implemented. This is a generic problem and most of your implementation
looks like it's not so far away from something that could be used by
other boards too so it deserves to be hoisted out into something that
those other systems can use, rather than having people reinvent the
wheel or cut'n'paste.
Right now my feeling is that we probably want to do at least some
scenario stuff in kernel space and that what's sensible for a given
machine will depend on both the capabilities of the machine (having both
GSM and WiFi causes the number of use cases to get much larger, for
example) and if there's hardware restrictions that need to be enforced
(like not being able to use both speaker and headphones at the same
time, which is fairly common but easily enforced without scenarios as
such).
> I'd like to recall what happened to one of the mioa701 users here, when scenarii
> were handled in userspace. The wm9713 chip overheated, and destroyed the battery
> underneath. That was the reason to put that stuff into the kernel :
> protection. This was also already discussed when this was _previously_
> submitted.
If the system is overheating that's something that it's worth
preventing in kernel space. Do you know what they did to make that
happen - is it a case of enabling more outputs than can comfortably be
driven, for example?
> And I know Liam's API, I tried it. Let me tell you my point of view : the
> mioa701 users have a standard API (alsa) to control the sound of the mioa701. I
> could force them to migrate towards Liam's library. But I can't have a guarantee
> of maintainance over that library. I don't even know if it will be the final
> solution.
The idea is not to replace ALSA for regular applications but rather to
provide an adjunct to it which a central management process can use to
do setup depending on the current system state. There is no desire at
all to replace ALSA, only to configure it.
At the minute the majority of deployments seem to use alsactl and state
files managed by a central daemon to do this job - though obviously
a dedicated scenario API could just be dropped into that daemon.
> >> +#define ARRAY_AND_SIZE(x) (x), ARRAY_SIZE(x)
> > This is also defined somewhere or other in the PXA or ARM architecture
> There was a discussion to include it in kernel.h. ATM, it is defined in
Yeah, I know - it was pretty strongly NACKed so I'd be shocked if it
ever went in.
> arch/arm/mach-pxa/generic.h, which is not easily reachable, hence the
> definition.
#include <mach/generic.h>? (not tested at all)
> Moreover, if you look at that file, you'll see the definition is the same, and I
> think it is perfectly correct.
Given the strong NACKs, though... I do believe it's OK but it'd be
better to just include the PXA file (the driver is board-specific after
all).
> >> + memset(mname, 0, 44);
> >> + strncpy(mname, mixes[pos].mixname, 43);
> > It's bikesheding but strcpy plus termination would do the job, wouldn't
> > it?
> I don't get that ...
The memset() is mostly redundant and the above should be equivalent to
strncpy() plus an assignment to make sure the string is terminated.
> >> + kctl->get(kctl, &ucontrol);
> >> + ucontrol.value.enumerated.item[0] = mixes[pos].val;
> >> + kctl->put(kctl, &ucontrol);
> >> + }
> > Does an open application (eg, alsamixer) notice these changes without
> > the driver telling it? snd_ctl_notify() is the API call, IIRC though
> > there's a reasonable chance I am misremembering. Though if you do mask
> > them from user space it shoudn't matter anyway, I expect.
> It does. At least when I change the mode, all the muxers the drivers touches
> change state. I don't know how, but it works ...
So the UI of interactive applications update immediately? In that case
it's fine.
<nitpick>mixers and muxes</nitpick>
> >> +static int phone_stream_start(struct snd_soc_codec *codec)
> >> +{
> >> + snd_soc_dapm_stream_event(codec, "AC97 HiFi",
> >> + SND_SOC_DAPM_STREAM_START);
> >> + return 0;
> >> +}
> > Hrm. What are these needed for? I'd have expected that DAPM would
> > power active bypass paths up without this (I test that case frequently)
> > and this isn't coordinated with what the core is doing at all.
> Without this, in asoc-v2, the dapm is not powering any of the elements in the
> phone audio path without this. Will check in asoc-v1, but I see no reason this
Is the phone using the I2S interface for digital audio out from the GSM
chipset by any chance? Some comments at the head of the driver
describing the wiring might be useful.
> has changed. I don't quite understand what you mean by "active bypass path" so I
> will make the test myself.
A bypass path is a path through the codec which doesn't use any DACs and
ADCs but is analogue only.