diff options
Diffstat (limited to 'sound/soc/codecs')
56 files changed, 150 insertions, 72 deletions
diff --git a/sound/soc/codecs/ac97.c b/sound/soc/codecs/ac97.c index a1bbe16b7f9..1f5e57a4bb7 100644 --- a/sound/soc/codecs/ac97.c +++ b/sound/soc/codecs/ac97.c @@ -13,6 +13,7 @@   */  #include <linux/init.h> +#include <linux/slab.h>  #include <linux/kernel.h>  #include <linux/device.h>  #include <sound/core.h> @@ -80,9 +81,11 @@ static int ac97_write(struct snd_soc_codec *codec, unsigned int reg,  static int ac97_soc_probe(struct platform_device *pdev)  {  	struct snd_soc_device *socdev = platform_get_drvdata(pdev); +	struct snd_soc_card *card = socdev->card;  	struct snd_soc_codec *codec;  	struct snd_ac97_bus *ac97_bus;  	struct snd_ac97_template ac97_template; +	int i;  	int ret = 0;  	printk(KERN_INFO "AC97 SoC Audio Codec %s\n", AC97_VERSION); @@ -102,12 +105,6 @@ static int ac97_soc_probe(struct platform_device *pdev)  	INIT_LIST_HEAD(&codec->dapm_widgets);  	INIT_LIST_HEAD(&codec->dapm_paths); -	ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0); -	if (ret < 0) { -		printk(KERN_ERR "ASoC: failed to init gen ac97 glue\n"); -		goto err; -	} -  	/* register pcms */  	ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);  	if (ret < 0) @@ -123,6 +120,13 @@ static int ac97_soc_probe(struct platform_device *pdev)  	if (ret < 0)  		goto bus_err; +	for (i = 0; i < card->num_links; i++) { +		if (card->dai_link[i].codec_dai->ac97_control) { +			snd_ac97_dev_add_pdata(codec->ac97, +				card->dai_link[i].cpu_dai->ac97_pdata); +		} +	} +  	return 0;  bus_err: diff --git a/sound/soc/codecs/ad1836.c b/sound/soc/codecs/ad1836.c index 3c80137d593..11b62dee842 100644 --- a/sound/soc/codecs/ad1836.c +++ b/sound/soc/codecs/ad1836.c @@ -17,6 +17,7 @@   */  #include <linux/init.h> +#include <linux/slab.h>  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/device.h> diff --git a/sound/soc/codecs/ad1938.c b/sound/soc/codecs/ad1938.c index c233810d463..240cd155b31 100644 --- a/sound/soc/codecs/ad1938.c +++ b/sound/soc/codecs/ad1938.c @@ -27,6 +27,7 @@   */  #include <linux/init.h> +#include <linux/slab.h>  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/device.h> diff --git a/sound/soc/codecs/ad1980.c b/sound/soc/codecs/ad1980.c index 39c0f7584e6..042072738cd 100644 --- a/sound/soc/codecs/ad1980.c +++ b/sound/soc/codecs/ad1980.c @@ -12,6 +12,7 @@   */  #include <linux/init.h> +#include <linux/slab.h>  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/device.h> diff --git a/sound/soc/codecs/ad73311.c b/sound/soc/codecs/ad73311.c index d2fcc601722..475807bea2c 100644 --- a/sound/soc/codecs/ad73311.c +++ b/sound/soc/codecs/ad73311.c @@ -11,6 +11,7 @@   */  #include <linux/init.h> +#include <linux/slab.h>  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/device.h> diff --git a/sound/soc/codecs/ads117x.c b/sound/soc/codecs/ads117x.c index cc96411ca3e..f8e75edb27b 100644 --- a/sound/soc/codecs/ads117x.c +++ b/sound/soc/codecs/ads117x.c @@ -11,6 +11,7 @@   */  #include <linux/kernel.h> +#include <linux/slab.h>  #include <linux/init.h>  #include <linux/device.h>  #include <sound/core.h> diff --git a/sound/soc/codecs/ak4104.c b/sound/soc/codecs/ak4104.c index b68d99fb6af..bdeb10dfd88 100644 --- a/sound/soc/codecs/ak4104.c +++ b/sound/soc/codecs/ak4104.c @@ -10,6 +10,7 @@   */  #include <linux/module.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/soc.h>  #include <sound/initval.h> diff --git a/sound/soc/codecs/ak4535.c b/sound/soc/codecs/ak4535.c index ff966567e2b..352d1d08dbd 100644 --- a/sound/soc/codecs/ak4535.c +++ b/sound/soc/codecs/ak4535.c @@ -19,6 +19,7 @@  #include <linux/pm.h>  #include <linux/i2c.h>  #include <linux/platform_device.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index 3ef16bbc8c8..729859cf6ca 100644 --- a/sound/soc/codecs/ak4642.c +++ b/sound/soc/codecs/ak4642.c @@ -29,6 +29,7 @@  #include <linux/pm.h>  #include <linux/i2c.h>  #include <linux/platform_device.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/ak4671.c b/sound/soc/codecs/ak4671.c index 82fca284d00..926797a014c 100644 --- a/sound/soc/codecs/ak4671.c +++ b/sound/soc/codecs/ak4671.c @@ -15,6 +15,7 @@  #include <linux/init.h>  #include <linux/i2c.h>  #include <linux/delay.h> +#include <linux/slab.h>  #include <sound/soc.h>  #include <sound/soc-dapm.h>  #include <sound/initval.h> diff --git a/sound/soc/codecs/cs4270.c b/sound/soc/codecs/cs4270.c index dfbeb2db61b..81a62d198b7 100644 --- a/sound/soc/codecs/cs4270.c +++ b/sound/soc/codecs/cs4270.c @@ -23,6 +23,7 @@  #include <linux/module.h>  #include <linux/platform_device.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/soc.h>  #include <sound/initval.h> diff --git a/sound/soc/codecs/cx20442.c b/sound/soc/codecs/cx20442.c index e000cdfec1e..9f169c47710 100644 --- a/sound/soc/codecs/cx20442.c +++ b/sound/soc/codecs/cx20442.c @@ -14,6 +14,7 @@   */  #include <linux/tty.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/initval.h> diff --git a/sound/soc/codecs/da7210.c b/sound/soc/codecs/da7210.c index cf2975a7294..366daf1d044 100644 --- a/sound/soc/codecs/da7210.c +++ b/sound/soc/codecs/da7210.c @@ -23,6 +23,7 @@  #include <linux/pm.h>  #include <linux/i2c.h>  #include <linux/platform_device.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/pcm3008.c b/sound/soc/codecs/pcm3008.c index 2afcd0a8669..5a5f187a265 100644 --- a/sound/soc/codecs/pcm3008.c +++ b/sound/soc/codecs/pcm3008.c @@ -19,6 +19,7 @@  #include <linux/kernel.h>  #include <linux/device.h>  #include <linux/gpio.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/initval.h> diff --git a/sound/soc/codecs/ssm2602.c b/sound/soc/codecs/ssm2602.c index d2ff1cde688..29d0906a924 100644 --- a/sound/soc/codecs/ssm2602.c +++ b/sound/soc/codecs/ssm2602.c @@ -33,6 +33,7 @@  #include <linux/pm.h>  #include <linux/i2c.h>  #include <linux/platform_device.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/stac9766.c b/sound/soc/codecs/stac9766.c index 81b8c9dfe7f..3293629dcb3 100644 --- a/sound/soc/codecs/stac9766.c +++ b/sound/soc/codecs/stac9766.c @@ -15,6 +15,7 @@   */  #include <linux/init.h> +#include <linux/slab.h>  #include <linux/module.h>  #include <linux/device.h>  #include <sound/core.h> diff --git a/sound/soc/codecs/tlv320aic23.c b/sound/soc/codecs/tlv320aic23.c index da589d8664d..776b79cde90 100644 --- a/sound/soc/codecs/tlv320aic23.c +++ b/sound/soc/codecs/tlv320aic23.c @@ -25,6 +25,7 @@  #include <linux/pm.h>  #include <linux/i2c.h>  #include <linux/platform_device.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/tlv320aic26.c b/sound/soc/codecs/tlv320aic26.c index 357b609196e..b5b7d6a0384 100644 --- a/sound/soc/codecs/tlv320aic26.c +++ b/sound/soc/codecs/tlv320aic26.c @@ -13,6 +13,7 @@  #include <linux/device.h>  #include <linux/sysfs.h>  #include <linux/spi/spi.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c index e4b946a19ea..4a6d56c3fed 100644 --- a/sound/soc/codecs/tlv320aic3x.c +++ b/sound/soc/codecs/tlv320aic3x.c @@ -39,6 +39,7 @@  #include <linux/pm.h>  #include <linux/i2c.h>  #include <linux/platform_device.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/tlv320dac33.c b/sound/soc/codecs/tlv320dac33.c index f9f367d29a9..d1e0e81ef30 100644 --- a/sound/soc/codecs/tlv320dac33.c +++ b/sound/soc/codecs/tlv320dac33.c @@ -31,6 +31,7 @@  #include <linux/interrupt.h>  #include <linux/gpio.h>  #include <linux/regulator/consumer.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> @@ -778,7 +779,7 @@ static int dac33_prepare_chip(struct snd_pcm_substream *substream)  	if (dac33->fifo_mode) {  		/* Generic for all FIFO modes */  		/* 50-51 : ASRC Control registers */ -		dac33_write(codec, DAC33_ASRC_CTRL_A, (1 << 4)); /* div=2 */ +		dac33_write(codec, DAC33_ASRC_CTRL_A, DAC33_SRCLKDIV(1));  		dac33_write(codec, DAC33_ASRC_CTRL_B, 1); /* ??? */  		/* Write registers 0x34 and 0x35 (MSB, LSB) */ @@ -1038,11 +1039,7 @@ static int dac33_set_dai_fmt(struct snd_soc_dai *codec_dai,  	case SND_SOC_DAIFMT_DSP_A:  		aictrl_a |= DAC33_AFMT_DSP;  		aictrl_b &= ~DAC33_DATA_DELAY_MASK; -		aictrl_b |= DAC33_DATA_DELAY(1); /* 1 bit delay */ -		break; -	case SND_SOC_DAIFMT_DSP_B: -		aictrl_a |= DAC33_AFMT_DSP; -		aictrl_b &= ~DAC33_DATA_DELAY_MASK; /* No delay */ +		aictrl_b |= DAC33_DATA_DELAY(0);  		break;  	case SND_SOC_DAIFMT_RIGHT_J:  		aictrl_a |= DAC33_AFMT_RIGHT_J; @@ -1066,7 +1063,7 @@ static void dac33_init_chip(struct snd_soc_codec *codec)  {  	/* 44-46: DAC Control Registers */  	/* A : DAC sample rate Fsref/1.5 */ -	dac33_write(codec, DAC33_DAC_CTRL_A, DAC33_DACRATE(1)); +	dac33_write(codec, DAC33_DAC_CTRL_A, DAC33_DACRATE(0));  	/* B : DAC src=normal, not muted */  	dac33_write(codec, DAC33_DAC_CTRL_B, DAC33_DACSRCR_RIGHT |  					     DAC33_DACSRCL_LEFT); diff --git a/sound/soc/codecs/tpa6130a2.c b/sound/soc/codecs/tpa6130a2.c index 958d49c969a..569ad8758a8 100644 --- a/sound/soc/codecs/tpa6130a2.c +++ b/sound/soc/codecs/tpa6130a2.c @@ -26,6 +26,7 @@  #include <linux/i2c.h>  #include <linux/gpio.h>  #include <linux/regulator/consumer.h> +#include <linux/slab.h>  #include <sound/tpa6130a2-plat.h>  #include <sound/soc.h>  #include <sound/soc-dapm.h> diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c index 6f5d4af2005..520ffd6536c 100644 --- a/sound/soc/codecs/twl4030.c +++ b/sound/soc/codecs/twl4030.c @@ -27,6 +27,7 @@  #include <linux/i2c.h>  #include <linux/platform_device.h>  #include <linux/i2c/twl.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/uda134x.c b/sound/soc/codecs/uda134x.c index 3e99fe5131d..a8dcd5a5bbc 100644 --- a/sound/soc/codecs/uda134x.c +++ b/sound/soc/codecs/uda134x.c @@ -15,6 +15,7 @@  #include <linux/module.h>  #include <linux/delay.h> +#include <linux/slab.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h>  #include <sound/soc.h> diff --git a/sound/soc/codecs/wm2000.c b/sound/soc/codecs/wm2000.c index 217b0268059..002e289d125 100644 --- a/sound/soc/codecs/wm2000.c +++ b/sound/soc/codecs/wm2000.c @@ -23,7 +23,6 @@  #include <linux/module.h>  #include <linux/moduleparam.h> -#include <linux/version.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/firmware.h> @@ -32,6 +31,7 @@  #include <linux/i2c.h>  #include <linux/platform_device.h>  #include <linux/debugfs.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/wm8350.c b/sound/soc/codecs/wm8350.c index df2c6d9617f..2e0772f9c45 100644 --- a/sound/soc/codecs/wm8350.c +++ b/sound/soc/codecs/wm8350.c @@ -13,6 +13,7 @@  #include <linux/module.h>  #include <linux/moduleparam.h>  #include <linux/init.h> +#include <linux/slab.h>  #include <linux/delay.h>  #include <linux/pm.h>  #include <linux/platform_device.h> diff --git a/sound/soc/codecs/wm8400.c b/sound/soc/codecs/wm8400.c index b432f4d4a32..6acc885cf9b 100644 --- a/sound/soc/codecs/wm8400.c +++ b/sound/soc/codecs/wm8400.c @@ -14,6 +14,7 @@  #include <linux/module.h>  #include <linux/moduleparam.h>  #include <linux/kernel.h> +#include <linux/slab.h>  #include <linux/init.h>  #include <linux/delay.h>  #include <linux/pm.h> diff --git a/sound/soc/codecs/wm8510.c b/sound/soc/codecs/wm8510.c index af8cb6995a1..9000b1d19af 100644 --- a/sound/soc/codecs/wm8510.c +++ b/sound/soc/codecs/wm8510.c @@ -19,6 +19,7 @@  #include <linux/i2c.h>  #include <linux/platform_device.h>  #include <linux/spi/spi.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/wm8523.c b/sound/soc/codecs/wm8523.c index d3a61d7ea0c..19cd4729342 100644 --- a/sound/soc/codecs/wm8523.c +++ b/sound/soc/codecs/wm8523.c @@ -19,6 +19,7 @@  #include <linux/i2c.h>  #include <linux/platform_device.h>  #include <linux/regulator/consumer.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/wm8580.c b/sound/soc/codecs/wm8580.c index d077df6f5e7..8cc9042965e 100644 --- a/sound/soc/codecs/wm8580.c +++ b/sound/soc/codecs/wm8580.c @@ -25,6 +25,7 @@  #include <linux/i2c.h>  #include <linux/platform_device.h>  #include <linux/regulator/consumer.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h> diff --git a/sound/soc/codecs/wm8711.c b/sound/soc/codecs/wm8711.c index 24a35603bcf..8ca3812f2f2 100644 --- a/sound/soc/codecs/wm8711.c +++ b/sound/soc/codecs/wm8711.c @@ -20,6 +20,7 @@  #include <linux/i2c.h>  #include <linux/platform_device.h>  #include <linux/spi/spi.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/wm8727.c b/sound/soc/codecs/wm8727.c index 63a254e293c..1072621e93f 100644 --- a/sound/soc/codecs/wm8727.c +++ b/sound/soc/codecs/wm8727.c @@ -13,6 +13,7 @@   */  #include <linux/init.h> +#include <linux/slab.h>  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/device.h> diff --git a/sound/soc/codecs/wm8728.c b/sound/soc/codecs/wm8728.c index 3fb653ba363..07adc375a70 100644 --- a/sound/soc/codecs/wm8728.c +++ b/sound/soc/codecs/wm8728.c @@ -18,6 +18,7 @@  #include <linux/i2c.h>  #include <linux/platform_device.h>  #include <linux/spi/spi.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/wm8731.c b/sound/soc/codecs/wm8731.c index 5a2619dbf28..e7c6bf16318 100644 --- a/sound/soc/codecs/wm8731.c +++ b/sound/soc/codecs/wm8731.c @@ -18,6 +18,7 @@  #include <linux/delay.h>  #include <linux/pm.h>  #include <linux/i2c.h> +#include <linux/slab.h>  #include <linux/platform_device.h>  #include <linux/regulator/consumer.h>  #include <linux/spi/spi.h> diff --git a/sound/soc/codecs/wm8750.c b/sound/soc/codecs/wm8750.c index 475c67ac781..2916ed4d384 100644 --- a/sound/soc/codecs/wm8750.c +++ b/sound/soc/codecs/wm8750.c @@ -20,6 +20,7 @@  #include <linux/i2c.h>  #include <linux/platform_device.h>  #include <linux/spi/spi.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/wm8753.c b/sound/soc/codecs/wm8753.c index c2444e7c848..613199a0f79 100644 --- a/sound/soc/codecs/wm8753.c +++ b/sound/soc/codecs/wm8753.c @@ -40,6 +40,7 @@  #include <linux/i2c.h>  #include <linux/platform_device.h>  #include <linux/spi/spi.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/wm8776.c b/sound/soc/codecs/wm8776.c index 44e7d9d82f8..60b1b3e1094 100644 --- a/sound/soc/codecs/wm8776.c +++ b/sound/soc/codecs/wm8776.c @@ -20,6 +20,7 @@  #include <linux/i2c.h>  #include <linux/platform_device.h>  #include <linux/spi/spi.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/wm8900.c b/sound/soc/codecs/wm8900.c index dbc368c0826..b7fd96adac6 100644 --- a/sound/soc/codecs/wm8900.c +++ b/sound/soc/codecs/wm8900.c @@ -24,6 +24,7 @@  #include <linux/pm.h>  #include <linux/i2c.h>  #include <linux/platform_device.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/wm8903.c b/sound/soc/codecs/wm8903.c index 3595bd57c4e..fa5f99fde68 100644 --- a/sound/soc/codecs/wm8903.c +++ b/sound/soc/codecs/wm8903.c @@ -23,6 +23,7 @@  #include <linux/pm.h>  #include <linux/i2c.h>  #include <linux/platform_device.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/wm8904.c b/sound/soc/codecs/wm8904.c index 593e47d0e0e..c6f0abcc571 100644 --- a/sound/soc/codecs/wm8904.c +++ b/sound/soc/codecs/wm8904.c @@ -19,6 +19,7 @@  #include <linux/i2c.h>  #include <linux/platform_device.h>  #include <linux/regulator/consumer.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/wm8940.c b/sound/soc/codecs/wm8940.c index 31e39ffd1d8..0c04b476487 100644 --- a/sound/soc/codecs/wm8940.c +++ b/sound/soc/codecs/wm8940.c @@ -30,6 +30,7 @@  #include <linux/i2c.h>  #include <linux/platform_device.h>  #include <linux/spi/spi.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/wm8955.c b/sound/soc/codecs/wm8955.c index 615dab2b62e..c8d7a809af4 100644 --- a/sound/soc/codecs/wm8955.c +++ b/sound/soc/codecs/wm8955.c @@ -18,6 +18,7 @@  #include <linux/i2c.h>  #include <linux/platform_device.h>  #include <linux/regulator/consumer.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c index d07bcc1e1c6..f1e63e01b04 100644 --- a/sound/soc/codecs/wm8960.c +++ b/sound/soc/codecs/wm8960.c @@ -15,6 +15,7 @@  #include <linux/pm.h>  #include <linux/i2c.h>  #include <linux/platform_device.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/wm8961.c b/sound/soc/codecs/wm8961.c index d2342c5e042..50634ab76a5 100644 --- a/sound/soc/codecs/wm8961.c +++ b/sound/soc/codecs/wm8961.c @@ -18,6 +18,7 @@  #include <linux/pm.h>  #include <linux/i2c.h>  #include <linux/platform_device.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/wm8971.c b/sound/soc/codecs/wm8971.c index d9540d55fc8..a65b781af51 100644 --- a/sound/soc/codecs/wm8971.c +++ b/sound/soc/codecs/wm8971.c @@ -20,6 +20,7 @@  #include <linux/pm.h>  #include <linux/i2c.h>  #include <linux/platform_device.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/wm8974.c b/sound/soc/codecs/wm8974.c index ee637af4737..69708c4cc00 100644 --- a/sound/soc/codecs/wm8974.c +++ b/sound/soc/codecs/wm8974.c @@ -18,6 +18,7 @@  #include <linux/pm.h>  #include <linux/i2c.h>  #include <linux/platform_device.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/wm8978.c b/sound/soc/codecs/wm8978.c index 28bb59ea6ea..526f56b0906 100644 --- a/sound/soc/codecs/wm8978.c +++ b/sound/soc/codecs/wm8978.c @@ -19,6 +19,7 @@  #include <linux/pm.h>  #include <linux/i2c.h>  #include <linux/platform_device.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/wm8988.c b/sound/soc/codecs/wm8988.c index 2862e4dced2..bb18c3ecfeb 100644 --- a/sound/soc/codecs/wm8988.c +++ b/sound/soc/codecs/wm8988.c @@ -19,6 +19,7 @@  #include <linux/i2c.h>  #include <linux/spi/spi.h>  #include <linux/platform_device.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/wm8990.c b/sound/soc/codecs/wm8990.c index 056b787b6ee..831f4730bfd 100644 --- a/sound/soc/codecs/wm8990.c +++ b/sound/soc/codecs/wm8990.c @@ -18,6 +18,7 @@  #include <linux/pm.h>  #include <linux/i2c.h>  #include <linux/platform_device.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/wm8993.c b/sound/soc/codecs/wm8993.c index bf022f68b84..03e8b1a6a56 100644 --- a/sound/soc/codecs/wm8993.c +++ b/sound/soc/codecs/wm8993.c @@ -18,6 +18,7 @@  #include <linux/i2c.h>  #include <linux/regulator/consumer.h>  #include <linux/spi/spi.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index 29f3771c33a..9da0724cd47 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c @@ -19,6 +19,7 @@  #include <linux/i2c.h>  #include <linux/platform_device.h>  #include <linux/regulator/consumer.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> @@ -3007,34 +3008,39 @@ static int wm8994_set_bias_level(struct snd_soc_codec *codec,  		break;  	case SND_SOC_BIAS_OFF: -		/* Switch over to startup biases */ -		snd_soc_update_bits(codec, WM8994_ANTIPOP_2, -				    WM8994_BIAS_SRC | WM8994_STARTUP_BIAS_ENA | -				    WM8994_VMID_BUF_ENA | -				    WM8994_VMID_RAMP_MASK, -				    WM8994_BIAS_SRC | WM8994_STARTUP_BIAS_ENA | -				    WM8994_VMID_BUF_ENA | -				    (1 << WM8994_VMID_RAMP_SHIFT)); - -		/* Disable main biases */ -		snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_1, -				    WM8994_BIAS_ENA | WM8994_VMID_SEL_MASK, 0); +		if (codec->bias_level == SND_SOC_BIAS_STANDBY) { +			/* Switch over to startup biases */ +			snd_soc_update_bits(codec, WM8994_ANTIPOP_2, +					    WM8994_BIAS_SRC | +					    WM8994_STARTUP_BIAS_ENA | +					    WM8994_VMID_BUF_ENA | +					    WM8994_VMID_RAMP_MASK, +					    WM8994_BIAS_SRC | +					    WM8994_STARTUP_BIAS_ENA | +					    WM8994_VMID_BUF_ENA | +					    (1 << WM8994_VMID_RAMP_SHIFT)); -		/* Discharge line */ -		snd_soc_update_bits(codec, WM8994_ANTIPOP_1, -				    WM8994_LINEOUT1_DISCH | -				    WM8994_LINEOUT2_DISCH, -				    WM8994_LINEOUT1_DISCH | -				    WM8994_LINEOUT2_DISCH); +			/* Disable main biases */ +			snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_1, +					    WM8994_BIAS_ENA | +					    WM8994_VMID_SEL_MASK, 0); -		msleep(5); +			/* Discharge line */ +			snd_soc_update_bits(codec, WM8994_ANTIPOP_1, +					    WM8994_LINEOUT1_DISCH | +					    WM8994_LINEOUT2_DISCH, +					    WM8994_LINEOUT1_DISCH | +					    WM8994_LINEOUT2_DISCH); -		/* Switch off startup biases */ -		snd_soc_update_bits(codec, WM8994_ANTIPOP_2, -				    WM8994_BIAS_SRC | WM8994_STARTUP_BIAS_ENA | -				    WM8994_VMID_BUF_ENA | -				    WM8994_VMID_RAMP_MASK, 0); +			msleep(5); +			/* Switch off startup biases */ +			snd_soc_update_bits(codec, WM8994_ANTIPOP_2, +					    WM8994_BIAS_SRC | +					    WM8994_STARTUP_BIAS_ENA | +					    WM8994_VMID_BUF_ENA | +					    WM8994_VMID_RAMP_MASK, 0); +		}  		break;  	}  	codec->bias_level = level; @@ -3401,7 +3407,7 @@ struct snd_soc_dai wm8994_dai[] = {  			.rates = WM8994_RATES,  			.formats = WM8994_FORMATS,  		}, -		.playback = { +		.capture = {  			.stream_name = "AIF3 Capture",  			.channels_min = 2,  			.channels_max = 2, @@ -3730,11 +3736,12 @@ static int wm8994_codec_probe(struct platform_device *pdev)  	case 3:  		wm8994->hubs.dcs_codes = -5;  		wm8994->hubs.hp_startup_mode = 1; +		wm8994->hubs.dcs_readback_mode = 1;  		break;  	default: +		wm8994->hubs.dcs_readback_mode = 1;  		break;  	} -			     	/* Remember if AIFnLRCLK is configured as a GPIO.  This should be  	 * configured on init - if a system wants to do this dynamically diff --git a/sound/soc/codecs/wm9081.c b/sound/soc/codecs/wm9081.c index c468497314b..3a184fcb702 100644 --- a/sound/soc/codecs/wm9081.c +++ b/sound/soc/codecs/wm9081.c @@ -18,6 +18,7 @@  #include <linux/pm.h>  #include <linux/i2c.h>  #include <linux/platform_device.h> +#include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h> diff --git a/sound/soc/codecs/wm9705.c b/sound/soc/codecs/wm9705.c index ec54c6da985..8793341849d 100644 --- a/sound/soc/codecs/wm9705.c +++ b/sound/soc/codecs/wm9705.c @@ -10,6 +10,7 @@   */  #include <linux/init.h> +#include <linux/slab.h>  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/device.h> diff --git a/sound/soc/codecs/wm9712.c b/sound/soc/codecs/wm9712.c index e237bf61512..2f48a8aae22 100644 --- a/sound/soc/codecs/wm9712.c +++ b/sound/soc/codecs/wm9712.c @@ -11,6 +11,7 @@   */  #include <linux/init.h> +#include <linux/slab.h>  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/device.h> diff --git a/sound/soc/codecs/wm9713.c b/sound/soc/codecs/wm9713.c index ceb86b4ddb2..2fca514fde5 100644 --- a/sound/soc/codecs/wm9713.c +++ b/sound/soc/codecs/wm9713.c @@ -16,6 +16,7 @@   */  #include <linux/init.h> +#include <linux/slab.h>  #include <linux/module.h>  #include <linux/device.h>  #include <sound/core.h> diff --git a/sound/soc/codecs/wm_hubs.c b/sound/soc/codecs/wm_hubs.c index 0ad9f5d536c..e1f225a3ac4 100644 --- a/sound/soc/codecs/wm_hubs.c +++ b/sound/soc/codecs/wm_hubs.c @@ -62,21 +62,27 @@ static const char *speaker_mode_text[] = {  static const struct soc_enum speaker_mode =  	SOC_ENUM_SINGLE(WM8993_SPKMIXR_ATTENUATION, 8, 2, speaker_mode_text); -static void wait_for_dc_servo(struct snd_soc_codec *codec) +static void wait_for_dc_servo(struct snd_soc_codec *codec, unsigned int op)  {  	unsigned int reg;  	int count = 0; +	unsigned int val; + +	val = op | WM8993_DCS_ENA_CHAN_0 | WM8993_DCS_ENA_CHAN_1; + +	/* Trigger the command */ +	snd_soc_write(codec, WM8993_DC_SERVO_0, val);  	dev_dbg(codec->dev, "Waiting for DC servo...\n");  	do {  		count++;  		msleep(1); -		reg = snd_soc_read(codec, WM8993_DC_SERVO_READBACK_0); +		reg = snd_soc_read(codec, WM8993_DC_SERVO_0);  		dev_dbg(codec->dev, "DC servo: %x\n", reg); -	} while (reg & WM8993_DCS_DATAPATH_BUSY); +	} while (reg & op && count < 400); -	if (reg & WM8993_DCS_DATAPATH_BUSY) +	if (reg & op)  		dev_err(codec->dev, "Timed out waiting for DC Servo\n");  } @@ -86,51 +92,58 @@ static void wait_for_dc_servo(struct snd_soc_codec *codec)  static void calibrate_dc_servo(struct snd_soc_codec *codec)  {  	struct wm_hubs_data *hubs = codec->private_data; -	u16 reg, dcs_cfg; +	u16 reg, reg_l, reg_r, dcs_cfg;  	/* Set for 32 series updates */  	snd_soc_update_bits(codec, WM8993_DC_SERVO_1,  			    WM8993_DCS_SERIES_NO_01_MASK,  			    32 << WM8993_DCS_SERIES_NO_01_SHIFT); - -	/* Enable the DC servo.  Write all bits to avoid triggering startup -	 * or write calibration. -	 */ -	snd_soc_update_bits(codec, WM8993_DC_SERVO_0, -			    0xFFFF, -			    WM8993_DCS_ENA_CHAN_0 | -			    WM8993_DCS_ENA_CHAN_1 | -			    WM8993_DCS_TRIG_SERIES_1 | -			    WM8993_DCS_TRIG_SERIES_0); - -	wait_for_dc_servo(codec); +	wait_for_dc_servo(codec, +			  WM8993_DCS_TRIG_SERIES_0 | WM8993_DCS_TRIG_SERIES_1);  	/* Apply correction to DC servo result */  	if (hubs->dcs_codes) {  		dev_dbg(codec->dev, "Applying %d code DC servo correction\n",  			hubs->dcs_codes); +		/* Different chips in the family support different +		 * readback methods. +		 */ +		switch (hubs->dcs_readback_mode) { +		case 0: +			reg_l = snd_soc_read(codec, WM8993_DC_SERVO_READBACK_1) +				& WM8993_DCS_INTEG_CHAN_0_MASK;; +			reg_r = snd_soc_read(codec, WM8993_DC_SERVO_READBACK_2) +				& WM8993_DCS_INTEG_CHAN_1_MASK; +			break; +		case 1: +			reg = snd_soc_read(codec, WM8993_DC_SERVO_3); +			reg_l = (reg & WM8993_DCS_DAC_WR_VAL_1_MASK) +				>> WM8993_DCS_DAC_WR_VAL_1_SHIFT; +			reg_r = reg & WM8993_DCS_DAC_WR_VAL_0_MASK; +			break; +		default: +			WARN(1, "Unknown DCS readback method"); +			break; +		} +  		/* HPOUT1L */ -		reg = snd_soc_read(codec, WM8993_DC_SERVO_READBACK_1) & -			WM8993_DCS_INTEG_CHAN_0_MASK;; -		reg += hubs->dcs_codes; -		dcs_cfg = reg << WM8993_DCS_DAC_WR_VAL_1_SHIFT; +		if (reg_l + hubs->dcs_codes > 0 && +		    reg_l + hubs->dcs_codes < 0xff) +			reg_l += hubs->dcs_codes; +		dcs_cfg = reg_l << WM8993_DCS_DAC_WR_VAL_1_SHIFT;  		/* HPOUT1R */ -		reg = snd_soc_read(codec, WM8993_DC_SERVO_READBACK_2) & -			WM8993_DCS_INTEG_CHAN_1_MASK; -		reg += hubs->dcs_codes; -		dcs_cfg |= reg; +		if (reg_r + hubs->dcs_codes > 0 && +		    reg_r + hubs->dcs_codes < 0xff) +			reg_r += hubs->dcs_codes; +		dcs_cfg |= reg_r;  		/* Do it */  		snd_soc_write(codec, WM8993_DC_SERVO_3, dcs_cfg); -		snd_soc_update_bits(codec, WM8993_DC_SERVO_0, -				    WM8993_DCS_TRIG_DAC_WR_0 | -				    WM8993_DCS_TRIG_DAC_WR_1, -				    WM8993_DCS_TRIG_DAC_WR_0 | -				    WM8993_DCS_TRIG_DAC_WR_1); - -		wait_for_dc_servo(codec); +		wait_for_dc_servo(codec, +				  WM8993_DCS_TRIG_DAC_WR_0 | +				  WM8993_DCS_TRIG_DAC_WR_1);  	}  } @@ -141,10 +154,16 @@ static int wm8993_put_dc_servo(struct snd_kcontrol *kcontrol,  			       struct snd_ctl_elem_value *ucontrol)  {  	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); +	struct wm_hubs_data *hubs = codec->private_data;  	int ret;  	ret = snd_soc_put_volsw_2r(kcontrol, ucontrol); +	/* If we're applying an offset correction then updating the +	 * callibration would be likely to introduce further offsets. */ +	if (hubs->dcs_codes) +		return ret; +  	/* Only need to do this if the outputs are active */  	if (snd_soc_read(codec, WM8993_POWER_MANAGEMENT_1)  	    & (WM8993_HPOUT1L_ENA | WM8993_HPOUT1R_ENA)) diff --git a/sound/soc/codecs/wm_hubs.h b/sound/soc/codecs/wm_hubs.h index 420104fe9c9..e51c1668358 100644 --- a/sound/soc/codecs/wm_hubs.h +++ b/sound/soc/codecs/wm_hubs.h @@ -21,6 +21,7 @@ extern const unsigned int wm_hubs_spkmix_tlv[];  /* This *must* be the first element of the codec->private_data struct */  struct wm_hubs_data {  	int dcs_codes; +	int dcs_readback_mode;  	int hp_startup_mode;  };  |