[alsa-devel] [PATCH 1/5] [RFC] ALSA ASoC driver for TLVaic23b audio codec

Arun KS arunks at mistralsolutions.com
Mon Sep 29 14:20:27 CEST 2008


Mark Brown wrote:
> On Mon, Sep 29, 2008 at 03:15:04PM +0530, Arun KS wrote:
>> ASOC Audio driver for TLVaic23b audio codec
>
> This looks good overall, thanks!  There's quite a few comments below but
> they're mostly minor things at the coding style issues.
>
> The only issue I've got overall is that the name of the codec seems to
> vary through the driver - sometimes it's referred to as the tlv320aic23,
> sometimes as aic23 and sometimes as tlvaic23.  It'd be good if the
> naming scheme were more consistent.  My inclination would be to go with
> tlv320aic23 since it will reduce the risk of collisions and the general
> style is to use the full part number (then again, I know the tlv320aic3x
> driver didn't do that).

>
>> --- a/sound/soc/codecs/Kconfig
>> +++ b/sound/soc/codecs/Kconfig
>> @@ -55,3 +55,7 @@ config SND_SOC_TWL4030
>>  	tristate
>>  	depends on SND_SOC && TWL4030_CORE
>>
>
> This patch is against the OMAP tree - please generate all submitted
> patches against either the ASoC dev tree or the topic/asoc branch of:
>
> 	git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git
>
> Even if other patches in the series depend on the OMAP tree there should
> be no reason not to merge an I2C codec driver like this with no external
> dependencies immediately.
>
>> +config SND_SOC_TLV320AIC23
>> +	tristate
>> +	depends on I2C
>> +
>
> Please also add this to the SND_SOC_ALL_CODECS Kconfig option.
>
>> +static int aic23_write(struct snd_soc_codec *codec, unsigned int reg,
>> +		       unsigned int value)
>> +{
>> +
>> +	u8 data;
>> +
>> +	/* TLV320AIC23 has 7 bit address and 9 bits of data
>> +	 * so we need to switch one data bit into reg and rest
>> +	 * of data into val
>> +	 */
>> +
>> +	if ((reg < 0 || reg > 9) && (reg != 15)) {
>> +		printk(KERN_WARNING "Invalid register R%d\n", reg);
>> +		return -1;
>> +	}
>
> It'd be nice if this said which device was being written to - adding in
> the driver name to the printk(), for example.  It'd make it easier for
> someone seeing the message in their logs to work out where it came from.
>
>> +	data = (reg << 1) | (value >> 8 & 0x01);
>> +
>> +	aic23_write_reg_cache(codec, reg, value);
>> +
>> +	if (codec->hw_write(codec->control_data, (u8) data,
>> +			    (u8) (value & 0xff)) == 0)
>> +		return 0;
>> +
>> +	printk(KERN_ERR "I2C: cannot write %03x to register R%d\n", value, reg);
>
> Again, saying where the error came from would be nice.
>
>> +       SOC_SINGLE("Mic Mute", ANALOG_AUDIO_CONTROL_ADDR, 1, 0x01, 0),
>
> This should be "Mic Switch" to help UIs display the control correctly.
>
>> +/* aic23 related */
>> +static const struct aic23_samplerate_reg_info
>> + rate_reg_info[NUMBER_SAMPLE_RATES_SUPPORTED] = {
>> +	{4000, 0x06, 1},	/*  4000 */
>
> You could just use [] for the size of the array and let the compiler
> figure it out - you actually use ARRAY_SIZE() rather than the #define
> for the array size later anyway.
>
>> +static int aic23_set_bias_level(struct snd_soc_codec *codec,
>> +				enum snd_soc_bias_level level)
>> +{
>> +	u16 reg;
>> +
>> +	switch (level) {
>> +	case SND_SOC_BIAS_ON:
>> +		reg = aic23_read_reg_cache(codec, POWER_DOWN_CONTROL_ADDR);
>> +		aic23_write(codec, POWER_DOWN_CONTROL_ADDR,
>> +			    reg & (~DEVICE_POWER_OFF));
>> +		/* Activate interface */
>> +		reg = aic23_read_reg_cache(codec, DIGITAL_INTERFACE_ACT_ADDR);
>> +		aic23_write(codec, DIGITAL_INTERFACE_ACT_ADDR, reg | ACT_ON);
>> +		break;
>> +	case SND_SOC_BIAS_PREPARE:
>> +		break;
>> +	case SND_SOC_BIAS_STANDBY:
>> +		reg = aic23_read_reg_cache(codec, POWER_DOWN_CONTROL_ADDR);
>> +		aic23_write(codec, POWER_DOWN_CONTROL_ADDR,
>> +			    reg | DEVICE_POWER_OFF);
>> +		/* Deactivate interface */
>> +		reg = aic23_read_reg_cache(codec, DIGITAL_INTERFACE_ACT_ADDR);
>> +		aic23_write(codec, DIGITAL_INTERFACE_ACT_ADDR, reg & (~ACT_ON));
>
> Hrm.  This probably deserves a comment about what DEVICE_POWER_OFF does
> that the normal DAPM control doesn't.  Given that there are no bypass
> paths there should be no risk of interfering with DAPM but it raises a
> bit of an eyebrow.


There is bypass for Line and sidetone for Mic.

I will add that also and will make DEVICE_POWER_OFF also as DAPM control.
Will send the patches against ASoC dev tree.


>
>> +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
>> +	codec->hw_write = (hw_write_t) i2c_smbus_write_byte_data;
>> +	codec->hw_read = NULL;
>> +	ret = i2c_add_driver(&aic23b_i2c_driver);
>> +	if (ret != 0)
>> +		printk(KERN_ERR "can't add i2c driver");
>> +#else
>> +	/* Add other interfaces here */
>> +#endif
>
> If the device doesn't support anything except I2C then please remove all
> the conditionals on I2C support from the driver (they don't add
> anything).  If the device does support other control methods then please
> change this to be something like:
>
>    #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
>    ...
>    #endif
>    /* Add other interfaces here */
>
> That way if someone adds support for the other control interfaces
> they'll be encouraged to do it in a way that allows kernels to be built
> supporting multiple systems simultaneously.
>
>> +#define AIC23_CACHEREGNUM		16
>> +/* Codec TLV320AIC23 */
>> +#define LEFT_LINE_VOLUME_ADDR		0x00
>> +#define RIGHT_LINE_VOLUME_ADDR		0x01
>> +#define LEFT_CHANNEL_VOLUME_ADDR	0x02
>> +#define RIGHT_CHANNEL_VOLUME_ADDR	0x03
>> +#define ANALOG_AUDIO_CONTROL_ADDR	0x04
>> +#define DIGITAL_AUDIO_CONTROL_ADDR	0x05
>> +#define POWER_DOWN_CONTROL_ADDR		0x06
>> +#define DIGITAL_AUDIO_FORMAT_ADDR	0x07
>> +#define SAMPLE_RATE_CONTROL_ADDR	0x08
>> +#define DIGITAL_INTERFACE_ACT_ADDR	0x09
>> +#define RESET_CONTROL_ADDR		0x0F
>
> These (and most of the rest of the defines in the header) should all be
> namespaced - there's a very good chance of them colliding with other
> things and this header is going to be included in the machine drivers.
>
>> +/* Define to set the AIC23 as the master w.r.t McBSP */
>> +#define AIC23_MASTER
>
>> +#ifndef DEFAULT_BITPERSAMPLE
>> +#define DEFAULT_BITPERSAMPLE		16
>> +#endif
>
>> +#define DEFAULT_SAMPLE_RATE		44100
>> +#define CODEC_CLOCK			12000000
>> +#define AUDIO_MCBSP			OMAP_MCBSP1
>
> None of these should be in this driver - they should all be part of the
> machine driver.
>
>> +struct aic23_samplerate_reg_info {
>> +	u32 sample_rate;
>> +	u8 control;		/* SR3, SR2, SR1, SR0 and BOSR */
>> +	u8 divider		/* if 0 CLKIN = MCLK, if 1 CLKIN = MCLK/2 */
>> +};
>
> This could just be pushed into the driver.
>
>


More information about the Alsa-devel mailing list