ASoC: Additional updates for 3.6
A few updates for issues discovered during the merge window, the main one being the fix for the issues with defaulting to use of regmap without properly checking if there was I/O in place already. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAABAgAGBQJQGor+AAoJEOoSHmUN5Tg4ZKsQAIiCNOpd91VgloeFh7dLWAm7 7SJNrknxAfqPGdVt4r08i4ktosinXi02Hje7Mx9cdqCnVSRQGdlMtmK6EG++zQ1k 3GoTYttWsNHdn/vjyfs6Hrf9yMk983eAiSVhGUN4nTvvD3uotRMtXJgSgTsOfXDj Od0sB62grDr8EZOoEr+7Hyo2fZoj7uHVFfZvj5UuUeXOj5uCMgtrcKAvLZ7R3N76 2Ao3x7enYOaWoU/dXHzxjvQN9bKuJXn3SL5lt8qC1EWnaA54D3Vc3ZL3ktPvU7Rs uqWlE91P85JFzrTecNpkTTLUYSAf6XueVPreuOJ7YE0M0Er84xzPhQORdk30QMpm 50mXr03yIZHYLSrLGAPdkFc/DVJVnsuC/NZ2QNaNWiBwds9l7/IDo7Ohcq4L6M3y En3LxLVrevjo+IAWAHg5UmWTT7KzkUqjHHlbIrvC3EpgK/P8+uqJWubiozfw+zCR 8qKklccGcEJqPlaeRAWqTKTnKmGaIxRbjhK2NsBVsFgft9q4V6SuCGnemECTXNV5 KRZFKm5WoKbWQrUsmxr5L6urmYzogVF5iVx93z5qr4s6jl3p3KpxsdKsn6XAsuDP 0pbBA240F6LEN+rYPxm+K8CACoPB6i3MfFi7YTMcKC3hZmJwpqagwjIPK5tAbZIK XrKBXPGsnY5r14HWTFDE =pxAa -----END PGP SIGNATURE----- Merge tag 'asoc-3.6' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus ASoC: Additional updates for 3.6 A few updates for issues discovered during the merge window, the main one being the fix for the issues with defaulting to use of regmap without properly checking if there was I/O in place already.
This commit is contained in:
		
				commit
				
					
						ac190c7668
					
				
			
		
					 18 changed files with 64 additions and 13 deletions
				
			
		|  | @ -2406,6 +2406,10 @@ static int ab8500_codec_probe(struct snd_soc_codec *codec) | |||
| 
 | ||||
| 	/* Setup AB8500 according to board-settings */ | ||||
| 	pdata = (struct ab8500_platform_data *)dev_get_platdata(dev->parent); | ||||
| 
 | ||||
| 	/* Inform SoC Core that we have our own I/O arrangements. */ | ||||
| 	codec->control_data = (void *)true; | ||||
| 
 | ||||
| 	status = ab8500_audio_setup_mics(codec, &pdata->codec->amics); | ||||
| 	if (status < 0) { | ||||
| 		pr_err("%s: Failed to setup mics (%d)!\n", __func__, status); | ||||
|  |  | |||
|  | @ -186,6 +186,7 @@ static int ad1980_soc_probe(struct snd_soc_codec *codec) | |||
| 
 | ||||
| 	printk(KERN_INFO "AD1980 SoC Audio Codec\n"); | ||||
| 
 | ||||
| 	codec->control_data = codec;	/* we don't use regmap! */ | ||||
| 	ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0); | ||||
| 	if (ret < 0) { | ||||
| 		printk(KERN_ERR "ad1980: failed to register AC97 codec\n"); | ||||
|  |  | |||
|  | @ -581,6 +581,8 @@ static int mc13783_probe(struct snd_soc_codec *codec) | |||
| { | ||||
| 	struct mc13783_priv *priv = snd_soc_codec_get_drvdata(codec); | ||||
| 
 | ||||
| 	codec->control_data = priv->mc13xxx; | ||||
| 
 | ||||
| 	mc13xxx_lock(priv->mc13xxx); | ||||
| 
 | ||||
| 	/* these are the reset values */ | ||||
|  |  | |||
|  | @ -239,6 +239,7 @@ static const struct snd_soc_dapm_route sgtl5000_dapm_routes[] = { | |||
| 	{"Headphone Mux", "DAC", "DAC"},	/* dac --> hp_mux */ | ||||
| 	{"LO", NULL, "DAC"},			/* dac --> line_out */ | ||||
| 
 | ||||
| 	{"LINE_IN", NULL, "VAG_POWER"}, | ||||
| 	{"Headphone Mux", "LINE_IN", "LINE_IN"},/* line_in --> hp_mux */ | ||||
| 	{"HP", NULL, "Headphone Mux"},		/* hp_mux --> hp */ | ||||
| 
 | ||||
|  | @ -1357,8 +1358,6 @@ static int sgtl5000_probe(struct snd_soc_codec *codec) | |||
| 	if (ret) | ||||
| 		goto err; | ||||
| 
 | ||||
| 	snd_soc_dapm_new_widgets(&codec->dapm); | ||||
| 
 | ||||
| 	return 0; | ||||
| 
 | ||||
| err: | ||||
|  |  | |||
|  | @ -340,6 +340,7 @@ static int stac9766_codec_probe(struct snd_soc_codec *codec) | |||
| 
 | ||||
| 	printk(KERN_INFO "STAC9766 SoC Audio Codec %s\n", STAC9766_VERSION); | ||||
| 
 | ||||
| 	codec->control_data = codec;	/* we don't use regmap! */ | ||||
| 	ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0); | ||||
| 	if (ret < 0) | ||||
| 		goto codec_err; | ||||
|  |  | |||
|  | @ -2501,6 +2501,9 @@ static int wm8962_set_bias_level(struct snd_soc_codec *codec, | |||
| 		/* VMID 2*250k */ | ||||
| 		snd_soc_update_bits(codec, WM8962_PWR_MGMT_1, | ||||
| 				    WM8962_VMID_SEL_MASK, 0x100); | ||||
| 
 | ||||
| 		if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) | ||||
| 			msleep(100); | ||||
| 		break; | ||||
| 
 | ||||
| 	case SND_SOC_BIAS_OFF: | ||||
|  |  | |||
|  | @ -2649,7 +2649,7 @@ static int wm8994_hw_params(struct snd_pcm_substream *substream, | |||
| 		return -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
| 	bclk_rate = params_rate(params) * 2; | ||||
| 	bclk_rate = params_rate(params) * 4; | ||||
| 	switch (params_format(params)) { | ||||
| 	case SNDRV_PCM_FORMAT_S16_LE: | ||||
| 		bclk_rate *= 16; | ||||
|  | @ -3253,10 +3253,13 @@ static void wm8994_mic_work(struct work_struct *work) | |||
| 	int ret; | ||||
| 	int report; | ||||
| 
 | ||||
| 	pm_runtime_get_sync(dev); | ||||
| 
 | ||||
| 	ret = regmap_read(regmap, WM8994_INTERRUPT_RAW_STATUS_2, ®); | ||||
| 	if (ret < 0) { | ||||
| 		dev_err(dev, "Failed to read microphone status: %d\n", | ||||
| 			ret); | ||||
| 		pm_runtime_put(dev); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -3299,6 +3302,8 @@ static void wm8994_mic_work(struct work_struct *work) | |||
| 
 | ||||
| 	snd_soc_jack_report(priv->micdet[1].jack, report, | ||||
| 			    SND_JACK_HEADSET | SND_JACK_BTN_0); | ||||
| 
 | ||||
| 	pm_runtime_put(dev); | ||||
| } | ||||
| 
 | ||||
| static irqreturn_t wm8994_mic_irq(int irq, void *data) | ||||
|  | @ -3421,12 +3426,15 @@ static irqreturn_t wm1811_jackdet_irq(int irq, void *data) | |||
| 	int reg; | ||||
| 	bool present; | ||||
| 
 | ||||
| 	pm_runtime_get_sync(codec->dev); | ||||
| 
 | ||||
| 	mutex_lock(&wm8994->accdet_lock); | ||||
| 
 | ||||
| 	reg = snd_soc_read(codec, WM1811_JACKDET_CTRL); | ||||
| 	if (reg < 0) { | ||||
| 		dev_err(codec->dev, "Failed to read jack status: %d\n", reg); | ||||
| 		mutex_unlock(&wm8994->accdet_lock); | ||||
| 		pm_runtime_put(codec->dev); | ||||
| 		return IRQ_NONE; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -3491,6 +3499,7 @@ static irqreturn_t wm1811_jackdet_irq(int irq, void *data) | |||
| 				    SND_JACK_MECHANICAL | SND_JACK_HEADSET | | ||||
| 				    wm8994->btn_mask); | ||||
| 
 | ||||
| 	pm_runtime_put(codec->dev); | ||||
| 	return IRQ_HANDLED; | ||||
| } | ||||
| 
 | ||||
|  | @ -3602,6 +3611,8 @@ static irqreturn_t wm8958_mic_irq(int irq, void *data) | |||
| 	if (!(snd_soc_read(codec, WM8958_MIC_DETECT_1) & WM8958_MICD_ENA)) | ||||
| 		return IRQ_HANDLED; | ||||
| 
 | ||||
| 	pm_runtime_get_sync(codec->dev); | ||||
| 
 | ||||
| 	/* We may occasionally read a detection without an impedence
 | ||||
| 	 * range being provided - if that happens loop again. | ||||
| 	 */ | ||||
|  | @ -3612,6 +3623,7 @@ static irqreturn_t wm8958_mic_irq(int irq, void *data) | |||
| 			dev_err(codec->dev, | ||||
| 				"Failed to read mic detect status: %d\n", | ||||
| 				reg); | ||||
| 			pm_runtime_put(codec->dev); | ||||
| 			return IRQ_NONE; | ||||
| 		} | ||||
| 
 | ||||
|  | @ -3639,6 +3651,7 @@ static irqreturn_t wm8958_mic_irq(int irq, void *data) | |||
| 		dev_warn(codec->dev, "Accessory detection with no callback\n"); | ||||
| 
 | ||||
| out: | ||||
| 	pm_runtime_put(codec->dev); | ||||
| 	return IRQ_HANDLED; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -619,6 +619,7 @@ static int wm9712_soc_probe(struct snd_soc_codec *codec) | |||
| { | ||||
| 	int ret = 0; | ||||
| 
 | ||||
| 	codec->control_data = codec;	/* we don't use regmap! */ | ||||
| 	ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0); | ||||
| 	if (ret < 0) { | ||||
| 		printk(KERN_ERR "wm9712: failed to register AC97 codec\n"); | ||||
|  |  | |||
|  | @ -1196,6 +1196,7 @@ static int wm9713_soc_probe(struct snd_soc_codec *codec) | |||
| 	if (wm9713 == NULL) | ||||
| 		return -ENOMEM; | ||||
| 	snd_soc_codec_set_drvdata(codec, wm9713); | ||||
| 	codec->control_data = wm9713;	/* we don't use regmap! */ | ||||
| 
 | ||||
| 	ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0); | ||||
| 	if (ret < 0) | ||||
|  |  | |||
|  | @ -394,9 +394,14 @@ static int mxs_saif_hw_params(struct snd_pcm_substream *substream, | |||
| 			     struct snd_soc_dai *cpu_dai) | ||||
| { | ||||
| 	struct mxs_saif *saif = snd_soc_dai_get_drvdata(cpu_dai); | ||||
| 	struct mxs_saif *master_saif; | ||||
| 	u32 scr, stat; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	master_saif = mxs_saif_get_master(saif); | ||||
| 	if (!master_saif) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	/* mclk should already be set */ | ||||
| 	if (!saif->mclk && saif->mclk_in_use) { | ||||
| 		dev_err(cpu_dai->dev, "set mclk first\n"); | ||||
|  | @ -420,6 +425,25 @@ static int mxs_saif_hw_params(struct snd_pcm_substream *substream, | |||
| 		return ret; | ||||
| 	} | ||||
| 
 | ||||
| 	/* prepare clk in hw_param, enable in trigger */ | ||||
| 	clk_prepare(saif->clk); | ||||
| 	if (saif != master_saif) { | ||||
| 		/*
 | ||||
| 		* Set an initial clock rate for the saif internal logic to work | ||||
| 		* properly. This is important when working in EXTMASTER mode | ||||
| 		* that uses the other saif's BITCLK&LRCLK but it still needs a | ||||
| 		* basic clock which should be fast enough for the internal | ||||
| 		* logic. | ||||
| 		*/ | ||||
| 		clk_enable(saif->clk); | ||||
| 		ret = clk_set_rate(saif->clk, 24000000); | ||||
| 		clk_disable(saif->clk); | ||||
| 		if (ret) | ||||
| 			return ret; | ||||
| 
 | ||||
| 		clk_prepare(master_saif->clk); | ||||
| 	} | ||||
| 
 | ||||
| 	scr = __raw_readl(saif->base + SAIF_CTRL); | ||||
| 
 | ||||
| 	scr &= ~BM_SAIF_CTRL_WORD_LENGTH; | ||||
|  |  | |||
|  | @ -820,3 +820,4 @@ module_platform_driver(asoc_mcbsp_driver); | |||
| MODULE_AUTHOR("Jarkko Nikula <jarkko.nikula@bitmer.com>"); | ||||
| MODULE_DESCRIPTION("OMAP I2S SoC Interface"); | ||||
| MODULE_LICENSE("GPL"); | ||||
| MODULE_ALIAS("platform:omap-mcbsp"); | ||||
|  |  | |||
|  | @ -441,3 +441,4 @@ module_platform_driver(omap_pcm_driver); | |||
| MODULE_AUTHOR("Jarkko Nikula <jarkko.nikula@bitmer.com>"); | ||||
| MODULE_DESCRIPTION("OMAP PCM DMA module"); | ||||
| MODULE_LICENSE("GPL"); | ||||
| MODULE_ALIAS("platform:omap-pcm-audio"); | ||||
|  |  | |||
|  | @ -1096,7 +1096,7 @@ static int soc_probe_codec(struct snd_soc_card *card, | |||
| 	} | ||||
| 
 | ||||
| 	/* If the driver didn't set I/O up try regmap */ | ||||
| 	if (!codec->control_data) | ||||
| 	if (!codec->write && dev_get_regmap(codec->dev, NULL)) | ||||
| 		snd_soc_codec_set_cache_io(codec, 0, 0, SND_SOC_REGMAP); | ||||
| 
 | ||||
| 	if (driver->controls) | ||||
|  |  | |||
|  | @ -177,7 +177,7 @@ static __devinit int tegra_alc5632_probe(struct platform_device *pdev) | |||
| 	} | ||||
| 
 | ||||
| 	alc5632->gpio_hp_det = of_get_named_gpio(np, "nvidia,hp-det-gpios", 0); | ||||
| 	if (alc5632->gpio_hp_det == -ENODEV) | ||||
| 	if (alc5632->gpio_hp_det == -EPROBE_DEFER) | ||||
| 		return -EPROBE_DEFER; | ||||
| 
 | ||||
| 	ret = snd_soc_of_parse_card_name(card, "nvidia,model"); | ||||
|  |  | |||
|  | @ -284,27 +284,27 @@ static __devinit int tegra_wm8903_driver_probe(struct platform_device *pdev) | |||
| 	} else if (np) { | ||||
| 		pdata->gpio_spkr_en = of_get_named_gpio(np, | ||||
| 						"nvidia,spkr-en-gpios", 0); | ||||
| 		if (pdata->gpio_spkr_en == -ENODEV) | ||||
| 		if (pdata->gpio_spkr_en == -EPROBE_DEFER) | ||||
| 			return -EPROBE_DEFER; | ||||
| 
 | ||||
| 		pdata->gpio_hp_mute = of_get_named_gpio(np, | ||||
| 						"nvidia,hp-mute-gpios", 0); | ||||
| 		if (pdata->gpio_hp_mute == -ENODEV) | ||||
| 		if (pdata->gpio_hp_mute == -EPROBE_DEFER) | ||||
| 			return -EPROBE_DEFER; | ||||
| 
 | ||||
| 		pdata->gpio_hp_det = of_get_named_gpio(np, | ||||
| 						"nvidia,hp-det-gpios", 0); | ||||
| 		if (pdata->gpio_hp_det == -ENODEV) | ||||
| 		if (pdata->gpio_hp_det == -EPROBE_DEFER) | ||||
| 			return -EPROBE_DEFER; | ||||
| 
 | ||||
| 		pdata->gpio_int_mic_en = of_get_named_gpio(np, | ||||
| 						"nvidia,int-mic-en-gpios", 0); | ||||
| 		if (pdata->gpio_int_mic_en == -ENODEV) | ||||
| 		if (pdata->gpio_int_mic_en == -EPROBE_DEFER) | ||||
| 			return -EPROBE_DEFER; | ||||
| 
 | ||||
| 		pdata->gpio_ext_mic_en = of_get_named_gpio(np, | ||||
| 						"nvidia,ext-mic-en-gpios", 0); | ||||
| 		if (pdata->gpio_ext_mic_en == -ENODEV) | ||||
| 		if (pdata->gpio_ext_mic_en == -EPROBE_DEFER) | ||||
| 			return -EPROBE_DEFER; | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -21,7 +21,7 @@ | |||
| #include <linux/mfd/dbx500-prcmu.h> | ||||
| 
 | ||||
| #include <mach/hardware.h> | ||||
| #include <mach/board-mop500-msp.h> | ||||
| #include <mach/msp.h> | ||||
| 
 | ||||
| #include <sound/soc.h> | ||||
| #include <sound/soc-dai.h> | ||||
|  |  | |||
|  | @ -19,7 +19,7 @@ | |||
| #include <linux/slab.h> | ||||
| 
 | ||||
| #include <mach/hardware.h> | ||||
| #include <mach/board-mop500-msp.h> | ||||
| #include <mach/msp.h> | ||||
| 
 | ||||
| #include <sound/soc.h> | ||||
| 
 | ||||
|  |  | |||
|  | @ -17,7 +17,7 @@ | |||
| 
 | ||||
| #include <linux/platform_device.h> | ||||
| 
 | ||||
| #include <mach/board-mop500-msp.h> | ||||
| #include <mach/msp.h> | ||||
| 
 | ||||
| #define MSP_INPUT_FREQ_APB 48000000 | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Takashi Iwai
				Takashi Iwai