[alsa-devel] [PATCH 10/11] ASoC: codecs: Add AB8500 codec-driver

Ola Lilja ola.o.lilja at stericsson.com
Wed May 9 09:48:35 CEST 2012


On 05/08/2012 08:27 PM, Mark Brown wrote:

> On Tue, May 08, 2012 at 03:57:30PM +0200, Ola Lilja wrote:
> 
>> +static void show_regulator_status(struct snd_soc_dapm_context *dapm)
>> +{
>> +	struct device *dev = dapm->dev;
>> +
>> +	dev_dbg(dev, "%s: Regulator-status:\n", __func__);
>> +	dev_dbg(dev, "%s:     V-AUD: %s\n", __func__,
>> +		(snd_soc_dapm_get_regulator_status(dapm, "V-AUD") > 0) ?
>> +			"On" : "Off");
> 
> So, you were adding this just for debug...  Let's not do that.  There's
> already diagnostic infrastructure in the regulator API and at the DAPM
> level too.  If we need this sort of stuff it's probably not device
> specific so we should probably improve the core if it's not easy enough
> to figure out what's going on already.


Well, I want this in our driver and you told me to use the regulator-widget, so
now the only way for us to have this information, which I find very useful when
we debug, is to let the core have some means to provide the information to our
driver. I don't want to be forced to enable debug prints in a lot of other
places than our driver. That just makes it harder.

> 
>> +static void show_clock_status(struct snd_soc_dapm_context *dapm)
>> +{
>> +	struct device *dev = dapm->dev;
> 
> Similarly here (though the clock API diagnostics are probably a bit
> weaker).


Same answer as above. I want to have this debug-information in our driver!

> 
>> +	SND_SOC_DAPM_ADC("ADC", "ab8500_0c", SND_SOC_NOPM, 0, 0),
>> +
>> +	SND_SOC_DAPM_DAC("DAC", "ab8500_0p", SND_SOC_NOPM, 0, 0),
> 
> Please convert all these to use DAPM to hook up the streams to their
> audio interfaces rather than having a stream attached to the widget.
> 
>> +	{"Mic 1a or 1b Select", "Mic 1a", "MIC1A V-AMICx Enable"},
>> +	{"Mic 1a or 1b Select", "Mic 1b", "MIC1B V-AMICx Enable"},
> 
> This also looks very odd...  is this the micbias stuff again?


I'll rename them to "MIC1A Enable" and "MIC1B Enable". They are connected
connected to the correct regulator-supply from the machine-driver.

> 
>> +static int mclk_input_control_get(struct snd_kcontrol *kcontrol,
>> +				struct snd_ctl_elem_value *ucontrol)
>> +{
>> +	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
>> +	struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(codec->dev);
>> +
>> +	ucontrol->value.enumerated.item[0] = drvdata->mclk_sel;
>> +
>> +	return 0;
>> +}
> 
> Same as last time this should be configured by the machine driver.


I also told you last time that I have a hard time doing this from the
machine-driver. The switch between these clocks comes from a component in
user-space getting its information from a DSP running its own life. If we just
run the ASoC-driver normally without Android this will never change, but our
whole system-design form Android needs to be able to do this clock-switch in the
way we do it. I have no means of getting this information inside the linux-kernel.

> 
>> +	/* Mic 1, Mic 2, LineIn */
>> +	SOC_DOUBLE_R_TLV("Mic Master Gain",
>> +		AB8500_ADDIGGAIN3, AB8500_ADDIGGAIN4,
>> +		0, AB8500_ADDIGGAINX_ADXGAIN_MAX, 1, adx_dig_gain_tlv),
> 
> All volume controls should be "...Volume".


So what you are saying is that "Gain" is not an accepted term for a volume?!

> 
>> +	SOC_ENUM("Digital Interface 0 Bit-clock Switch", soc_enum_fsbitclk0),
>> +	SOC_ENUM("Digital Interface 1 Bit-clock Switch", soc_enum_fsbitclk1),
> 
> Hrm?


In our current Android-design this is also needed to be controlled for the same
reasons as the switching of clocks.

> 
>> +	/* Attach regulators to AMic DAPM-paths */
>> +	dev_dbg(codec->dev, "%s: Mic 1a regulator: %s\n", __func__,
>> +		amic_micbias_str(amics->mic1a_micbias));
>> +	route = &ab8500_dapm_routes_mic1a_vamicx[amics->mic1a_micbias];
>> +	status = snd_soc_dapm_add_routes(&codec->dapm, route, 1);
>> +	dev_dbg(codec->dev, "%s: Mic 1b regulator: %s\n", __func__,
>> +		amic_micbias_str(amics->mic1b_micbias));
>> +	route = &ab8500_dapm_routes_mic1b_vamicx[amics->mic1b_micbias];
>> +	status |= snd_soc_dapm_add_routes(&codec->dapm, route, 1);
>> +	dev_dbg(codec->dev, "%s: Mic 2 regulator: %s\n", __func__,
>> +		amic_micbias_str(amics->mic2_micbias));
>> +	route = &ab8500_dapm_routes_mic2_vamicx[amics->mic2_micbias];
>> +	status |= snd_soc_dapm_add_routes(&codec->dapm, route, 1);
> 
> This is fairly impenetrable and would usually be done in hte machine
> driver.  Machines might not use the chip biases for some or all of the
> mics but it looks like this code assumes they do.


OK, so it will be fine if I just move the code to the machine-driver?

> 
>> +int ab8500_audio_setup_if1(struct snd_soc_codec *codec,
>> +			unsigned int fmt,
>> +			unsigned int wl,
>> +			unsigned int delay)
> 
> Why is this not static?


Because it is called from the machine-driver.



More information about the Alsa-devel mailing list