diff options
Diffstat (limited to 'sound/soc/pxa')
| -rw-r--r-- | sound/soc/pxa/Kconfig | 15 | ||||
| -rw-r--r-- | sound/soc/pxa/brownstone.c | 8 | ||||
| -rw-r--r-- | sound/soc/pxa/corgi.c | 50 | ||||
| -rw-r--r-- | sound/soc/pxa/e740_wm9705.c | 11 | ||||
| -rw-r--r-- | sound/soc/pxa/e750_wm9705.c | 11 | ||||
| -rw-r--r-- | sound/soc/pxa/e800_wm9712.c | 20 | ||||
| -rw-r--r-- | sound/soc/pxa/hx4700.c | 9 | ||||
| -rw-r--r-- | sound/soc/pxa/imote2.c | 1 | ||||
| -rw-r--r-- | sound/soc/pxa/magician.c | 60 | ||||
| -rw-r--r-- | sound/soc/pxa/mioa701_wm9713.c | 20 | ||||
| -rw-r--r-- | sound/soc/pxa/mmp-pcm.c | 27 | ||||
| -rw-r--r-- | sound/soc/pxa/mmp-sspa.c | 5 | ||||
| -rw-r--r-- | sound/soc/pxa/palm27x.c | 9 | ||||
| -rw-r--r-- | sound/soc/pxa/poodle.c | 9 | ||||
| -rw-r--r-- | sound/soc/pxa/pxa-ssp.c | 3 | ||||
| -rw-r--r-- | sound/soc/pxa/pxa2xx-ac97.c | 56 | ||||
| -rw-r--r-- | sound/soc/pxa/pxa2xx-i2s.c | 3 | ||||
| -rw-r--r-- | sound/soc/pxa/pxa2xx-pcm.c | 13 | ||||
| -rw-r--r-- | sound/soc/pxa/spitz.c | 58 | ||||
| -rw-r--r-- | sound/soc/pxa/tosa.c | 68 | ||||
| -rw-r--r-- | sound/soc/pxa/ttc-dkb.c | 5 | ||||
| -rw-r--r-- | sound/soc/pxa/zylonite.c | 17 | 
22 files changed, 200 insertions, 278 deletions
diff --git a/sound/soc/pxa/Kconfig b/sound/soc/pxa/Kconfig index 4db74a083db..2434b6d6167 100644 --- a/sound/soc/pxa/Kconfig +++ b/sound/soc/pxa/Kconfig @@ -11,7 +11,8 @@ config SND_PXA2XX_SOC  config SND_MMP_SOC  	bool "Soc Audio for Marvell MMP chips"  	depends on ARCH_MMP -	select SND_DMAENGINE_PCM +	select MMP_SRAM +	select SND_SOC_GENERIC_DMAENGINE_PCM  	select SND_ARM  	help  	  Say Y if you want to add support for codecs attached to @@ -40,7 +41,7 @@ config SND_MMP_SOC_SSPA  config SND_PXA2XX_SOC_CORGI  	tristate "SoC Audio support for Sharp Zaurus SL-C7x0" -	depends on SND_PXA2XX_SOC && PXA_SHARP_C7xx +	depends on SND_PXA2XX_SOC && PXA_SHARP_C7xx && I2C  	select SND_PXA2XX_SOC_I2S  	select SND_SOC_WM8731  	help @@ -49,7 +50,7 @@ config SND_PXA2XX_SOC_CORGI  config SND_PXA2XX_SOC_SPITZ  	tristate "SoC Audio support for Sharp Zaurus SL-Cxx00" -	depends on SND_PXA2XX_SOC && PXA_SHARP_Cxx00 +	depends on SND_PXA2XX_SOC && PXA_SHARP_Cxx00 && I2C  	select SND_PXA2XX_SOC_I2S  	select SND_SOC_WM8750  	help @@ -58,7 +59,7 @@ config SND_PXA2XX_SOC_SPITZ  config SND_PXA2XX_SOC_Z2  	tristate "SoC Audio support for Zipit Z2" -	depends on SND_PXA2XX_SOC && MACH_ZIPIT2 +	depends on SND_PXA2XX_SOC && MACH_ZIPIT2 && I2C  	select SND_PXA2XX_SOC_I2S  	select SND_SOC_WM8750  	help @@ -66,7 +67,7 @@ config SND_PXA2XX_SOC_Z2  config SND_PXA2XX_SOC_POODLE  	tristate "SoC Audio support for Poodle" -	depends on SND_PXA2XX_SOC && MACH_POODLE +	depends on SND_PXA2XX_SOC && MACH_POODLE && I2C  	select SND_PXA2XX_SOC_I2S  	select SND_SOC_WM8731  	help @@ -140,7 +141,7 @@ config SND_PXA910_SOC  config SND_SOC_TTC_DKB  	bool "SoC Audio support for TTC DKB" -	depends on SND_PXA910_SOC && MACH_TTC_DKB +	depends on SND_PXA910_SOC && MACH_TTC_DKB && I2C=y  	select PXA_SSP  	select SND_PXA_SOC_SSP  	select SND_MMP_SOC @@ -181,7 +182,7 @@ config SND_PXA2XX_SOC_HX4700  config SND_PXA2XX_SOC_MAGICIAN  	tristate "SoC Audio support for HTC Magician" -	depends on SND_PXA2XX_SOC && MACH_MAGICIAN +	depends on SND_PXA2XX_SOC && MACH_MAGICIAN && I2C  	select SND_PXA2XX_SOC_I2S  	select SND_PXA_SOC_SSP  	select SND_SOC_UDA1380 diff --git a/sound/soc/pxa/brownstone.c b/sound/soc/pxa/brownstone.c index 5b7d969f89a..c8dd53f9c35 100644 --- a/sound/soc/pxa/brownstone.c +++ b/sound/soc/pxa/brownstone.c @@ -50,11 +50,6 @@ static int brownstone_wm8994_init(struct snd_soc_pcm_runtime *rtd)  	struct snd_soc_codec *codec = rtd->codec;  	struct snd_soc_dapm_context *dapm = &codec->dapm; -	snd_soc_dapm_enable_pin(dapm, "Ext Spk"); -	snd_soc_dapm_enable_pin(dapm, "Headset Stereophone"); -	snd_soc_dapm_enable_pin(dapm, "Headset Mic"); -	snd_soc_dapm_enable_pin(dapm, "Main Mic"); -  	/* set endpoints to not connected */  	snd_soc_dapm_nc_pin(dapm, "HPOUT2P");  	snd_soc_dapm_nc_pin(dapm, "HPOUT2N"); @@ -70,8 +65,6 @@ static int brownstone_wm8994_init(struct snd_soc_pcm_runtime *rtd)  	snd_soc_dapm_nc_pin(dapm, "IN2RP:VXRP");  	snd_soc_dapm_nc_pin(dapm, "IN2LN"); -	snd_soc_dapm_sync(dapm); -  	return 0;  } @@ -163,6 +156,7 @@ static struct platform_driver mmp_driver = {  	.driver		= {  		.name	= "brownstone-audio",  		.owner	= THIS_MODULE, +		.pm     = &snd_soc_pm_ops,  	},  	.probe		= brownstone_probe,  	.remove		= brownstone_remove, diff --git a/sound/soc/pxa/corgi.c b/sound/soc/pxa/corgi.c index f4cce1e8011..5a88136aa80 100644 --- a/sound/soc/pxa/corgi.c +++ b/sound/soc/pxa/corgi.c @@ -47,64 +47,63 @@ static int corgi_spk_func;  static void corgi_ext_control(struct snd_soc_dapm_context *dapm)  { +	snd_soc_dapm_mutex_lock(dapm); +  	/* set up jack connection */  	switch (corgi_jack_func) {  	case CORGI_HP:  		/* set = unmute headphone */  		gpio_set_value(CORGI_GPIO_MUTE_L, 1);  		gpio_set_value(CORGI_GPIO_MUTE_R, 1); -		snd_soc_dapm_disable_pin(dapm, "Mic Jack"); -		snd_soc_dapm_disable_pin(dapm, "Line Jack"); -		snd_soc_dapm_enable_pin(dapm, "Headphone Jack"); -		snd_soc_dapm_disable_pin(dapm, "Headset Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "Headphone Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack");  		break;  	case CORGI_MIC:  		/* reset = mute headphone */  		gpio_set_value(CORGI_GPIO_MUTE_L, 0);  		gpio_set_value(CORGI_GPIO_MUTE_R, 0); -		snd_soc_dapm_enable_pin(dapm, "Mic Jack"); -		snd_soc_dapm_disable_pin(dapm, "Line Jack"); -		snd_soc_dapm_disable_pin(dapm, "Headphone Jack"); -		snd_soc_dapm_disable_pin(dapm, "Headset Jack"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "Mic Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack");  		break;  	case CORGI_LINE:  		gpio_set_value(CORGI_GPIO_MUTE_L, 0);  		gpio_set_value(CORGI_GPIO_MUTE_R, 0); -		snd_soc_dapm_disable_pin(dapm, "Mic Jack"); -		snd_soc_dapm_enable_pin(dapm, "Line Jack"); -		snd_soc_dapm_disable_pin(dapm, "Headphone Jack"); -		snd_soc_dapm_disable_pin(dapm, "Headset Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "Line Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack");  		break;  	case CORGI_HEADSET:  		gpio_set_value(CORGI_GPIO_MUTE_L, 0);  		gpio_set_value(CORGI_GPIO_MUTE_R, 1); -		snd_soc_dapm_enable_pin(dapm, "Mic Jack"); -		snd_soc_dapm_disable_pin(dapm, "Line Jack"); -		snd_soc_dapm_disable_pin(dapm, "Headphone Jack"); -		snd_soc_dapm_enable_pin(dapm, "Headset Jack"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "Mic Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "Headset Jack");  		break;  	}  	if (corgi_spk_func == CORGI_SPK_ON) -		snd_soc_dapm_enable_pin(dapm, "Ext Spk"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "Ext Spk");  	else -		snd_soc_dapm_disable_pin(dapm, "Ext Spk"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Ext Spk");  	/* signal a DAPM event */ -	snd_soc_dapm_sync(dapm); +	snd_soc_dapm_sync_unlocked(dapm); + +	snd_soc_dapm_mutex_unlock(dapm);  }  static int corgi_startup(struct snd_pcm_substream *substream)  {  	struct snd_soc_pcm_runtime *rtd = substream->private_data; -	struct snd_soc_codec *codec = rtd->codec; - -	mutex_lock(&codec->mutex);  	/* check the jack status at stream startup */ -	corgi_ext_control(&codec->dapm); - -	mutex_unlock(&codec->mutex); +	corgi_ext_control(&rtd->card->dapm);  	return 0;  } @@ -329,6 +328,7 @@ static struct platform_driver corgi_driver = {  	.driver		= {  		.name	= "corgi-audio",  		.owner	= THIS_MODULE, +		.pm     = &snd_soc_pm_ops,  	},  	.probe		= corgi_probe,  	.remove		= corgi_remove, diff --git a/sound/soc/pxa/e740_wm9705.c b/sound/soc/pxa/e740_wm9705.c index 70d799b13f0..c29fedab2f4 100644 --- a/sound/soc/pxa/e740_wm9705.c +++ b/sound/soc/pxa/e740_wm9705.c @@ -103,11 +103,6 @@ static int e740_ac97_init(struct snd_soc_pcm_runtime *rtd)  	snd_soc_dapm_nc_pin(dapm, "PCBEEP");  	snd_soc_dapm_nc_pin(dapm, "MIC2"); -	snd_soc_dapm_new_controls(dapm, e740_dapm_widgets, -					ARRAY_SIZE(e740_dapm_widgets)); - -	snd_soc_dapm_add_routes(dapm, audio_map, ARRAY_SIZE(audio_map)); -  	return 0;  } @@ -136,6 +131,11 @@ static struct snd_soc_card e740 = {  	.owner = THIS_MODULE,  	.dai_link = e740_dai,  	.num_links = ARRAY_SIZE(e740_dai), + +	.dapm_widgets = e740_dapm_widgets, +	.num_dapm_widgets = ARRAY_SIZE(e740_dapm_widgets), +	.dapm_routes = audio_map, +	.num_dapm_routes = ARRAY_SIZE(audio_map),  };  static struct gpio e740_audio_gpios[] = { @@ -178,6 +178,7 @@ static struct platform_driver e740_driver = {  	.driver		= {  		.name	= "e740-audio",  		.owner	= THIS_MODULE, +		.pm     = &snd_soc_pm_ops,  	},  	.probe		= e740_probe,  	.remove		= e740_remove, diff --git a/sound/soc/pxa/e750_wm9705.c b/sound/soc/pxa/e750_wm9705.c index f94d2ab5135..ee36aba8806 100644 --- a/sound/soc/pxa/e750_wm9705.c +++ b/sound/soc/pxa/e750_wm9705.c @@ -85,11 +85,6 @@ static int e750_ac97_init(struct snd_soc_pcm_runtime *rtd)  	snd_soc_dapm_nc_pin(dapm, "PCBEEP");  	snd_soc_dapm_nc_pin(dapm, "MIC2"); -	snd_soc_dapm_new_controls(dapm, e750_dapm_widgets, -					ARRAY_SIZE(e750_dapm_widgets)); - -	snd_soc_dapm_add_routes(dapm, audio_map, ARRAY_SIZE(audio_map)); -  	return 0;  } @@ -119,6 +114,11 @@ static struct snd_soc_card e750 = {  	.owner = THIS_MODULE,  	.dai_link = e750_dai,  	.num_links = ARRAY_SIZE(e750_dai), + +	.dapm_widgets = e750_dapm_widgets, +	.num_dapm_widgets = ARRAY_SIZE(e750_dapm_widgets), +	.dapm_routes = audio_map, +	.num_dapm_routes = ARRAY_SIZE(audio_map),  };  static struct gpio e750_audio_gpios[] = { @@ -160,6 +160,7 @@ static struct platform_driver e750_driver = {  	.driver		= {  		.name	= "e750-audio",  		.owner	= THIS_MODULE, +		.pm     = &snd_soc_pm_ops,  	},  	.probe		= e750_probe,  	.remove		= e750_remove, diff --git a/sound/soc/pxa/e800_wm9712.c b/sound/soc/pxa/e800_wm9712.c index 8768a640dd7..24c2078ce70 100644 --- a/sound/soc/pxa/e800_wm9712.c +++ b/sound/soc/pxa/e800_wm9712.c @@ -71,19 +71,6 @@ static const struct snd_soc_dapm_route audio_map[] = {  	{"MIC2", NULL, "Mic (Internal2)"},  }; -static int e800_ac97_init(struct snd_soc_pcm_runtime *rtd) -{ -	struct snd_soc_codec *codec = rtd->codec; -	struct snd_soc_dapm_context *dapm = &codec->dapm; - -	snd_soc_dapm_new_controls(dapm, e800_dapm_widgets, -					ARRAY_SIZE(e800_dapm_widgets)); - -	snd_soc_dapm_add_routes(dapm, audio_map, ARRAY_SIZE(audio_map)); - -	return 0; -} -  static struct snd_soc_dai_link e800_dai[] = {  	{  		.name = "AC97", @@ -92,7 +79,6 @@ static struct snd_soc_dai_link e800_dai[] = {  		.codec_dai_name = "wm9712-hifi",  		.platform_name = "pxa-pcm-audio",  		.codec_name = "wm9712-codec", -		.init = e800_ac97_init,  	},  	{  		.name = "AC97 Aux", @@ -109,6 +95,11 @@ static struct snd_soc_card e800 = {  	.owner = THIS_MODULE,  	.dai_link = e800_dai,  	.num_links = ARRAY_SIZE(e800_dai), + +	.dapm_widgets = e800_dapm_widgets, +	.num_dapm_widgets = ARRAY_SIZE(e800_dapm_widgets), +	.dapm_routes = audio_map, +	.num_dapm_routes = ARRAY_SIZE(audio_map),  };  static struct gpio e800_audio_gpios[] = { @@ -150,6 +141,7 @@ static struct platform_driver e800_driver = {  	.driver		= {  		.name	= "e800-audio",  		.owner	= THIS_MODULE, +		.pm     = &snd_soc_pm_ops,  	},  	.probe		= e800_probe,  	.remove		= e800_remove, diff --git a/sound/soc/pxa/hx4700.c b/sound/soc/pxa/hx4700.c index dcc9b04bd92..05559a725be 100644 --- a/sound/soc/pxa/hx4700.c +++ b/sound/soc/pxa/hx4700.c @@ -152,6 +152,13 @@ static int hx4700_ak4641_init(struct snd_soc_pcm_runtime *rtd)  	return err;  } +static int hx4700_card_remove(struct snd_soc_card *card) +{ +	snd_soc_jack_free_gpios(&hs_jack, 1, &hs_jack_gpio); + +	return 0; +} +  /* hx4700 digital audio interface glue - connects codec <--> CPU */  static struct snd_soc_dai_link hx4700_dai = {  	.name = "ak4641", @@ -170,6 +177,7 @@ static struct snd_soc_dai_link hx4700_dai = {  static struct snd_soc_card snd_soc_card_hx4700 = {  	.name			= "iPAQ hx4700",  	.owner			= THIS_MODULE, +	.remove			= hx4700_card_remove,  	.dai_link		= &hx4700_dai,  	.num_links		= 1,  	.dapm_widgets		= hx4700_dapm_widgets, @@ -206,7 +214,6 @@ static int hx4700_audio_probe(struct platform_device *pdev)  static int hx4700_audio_remove(struct platform_device *pdev)  { -	snd_soc_jack_free_gpios(&hs_jack, 1, &hs_jack_gpio);  	snd_soc_unregister_card(&snd_soc_card_hx4700);  	gpio_set_value(GPIO92_HX4700_HP_DRIVER, 0); diff --git a/sound/soc/pxa/imote2.c b/sound/soc/pxa/imote2.c index eef1f7b7b38..fd2f4eda1fd 100644 --- a/sound/soc/pxa/imote2.c +++ b/sound/soc/pxa/imote2.c @@ -91,6 +91,7 @@ static struct platform_driver imote2_driver = {  	.driver		= {  		.name	= "imote2-audio",  		.owner	= THIS_MODULE, +		.pm     = &snd_soc_pm_ops,  	},  	.probe		= imote2_probe,  	.remove		= imote2_remove, diff --git a/sound/soc/pxa/magician.c b/sound/soc/pxa/magician.c index aace19e0fe2..259e048681c 100644 --- a/sound/soc/pxa/magician.c +++ b/sound/soc/pxa/magician.c @@ -41,44 +41,42 @@ static int magician_hp_switch;  static int magician_spk_switch = 1;  static int magician_in_sel = MAGICIAN_MIC; -static void magician_ext_control(struct snd_soc_codec *codec) +static void magician_ext_control(struct snd_soc_dapm_context *dapm)  { -	struct snd_soc_dapm_context *dapm = &codec->dapm; + +	snd_soc_dapm_mutex_lock(dapm);  	if (magician_spk_switch) -		snd_soc_dapm_enable_pin(dapm, "Speaker"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "Speaker");  	else -		snd_soc_dapm_disable_pin(dapm, "Speaker"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Speaker");  	if (magician_hp_switch) -		snd_soc_dapm_enable_pin(dapm, "Headphone Jack"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "Headphone Jack");  	else -		snd_soc_dapm_disable_pin(dapm, "Headphone Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack");  	switch (magician_in_sel) {  	case MAGICIAN_MIC: -		snd_soc_dapm_disable_pin(dapm, "Headset Mic"); -		snd_soc_dapm_enable_pin(dapm, "Call Mic"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Mic"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "Call Mic");  		break;  	case MAGICIAN_MIC_EXT: -		snd_soc_dapm_disable_pin(dapm, "Call Mic"); -		snd_soc_dapm_enable_pin(dapm, "Headset Mic"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Call Mic"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "Headset Mic");  		break;  	} -	snd_soc_dapm_sync(dapm); +	snd_soc_dapm_sync_unlocked(dapm); + +	snd_soc_dapm_mutex_unlock(dapm);  }  static int magician_startup(struct snd_pcm_substream *substream)  {  	struct snd_soc_pcm_runtime *rtd = substream->private_data; -	struct snd_soc_codec *codec = rtd->codec; - -	mutex_lock(&codec->mutex);  	/* check the jack status at stream startup */ -	magician_ext_control(codec); - -	mutex_unlock(&codec->mutex); +	magician_ext_control(&rtd->card->dapm);  	return 0;  } @@ -277,13 +275,13 @@ static int magician_get_hp(struct snd_kcontrol *kcontrol,  static int magician_set_hp(struct snd_kcontrol *kcontrol,  			     struct snd_ctl_elem_value *ucontrol)  { -	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); +	struct snd_soc_card *card = snd_kcontrol_chip(kcontrol);  	if (magician_hp_switch == ucontrol->value.integer.value[0])  		return 0;  	magician_hp_switch = ucontrol->value.integer.value[0]; -	magician_ext_control(codec); +	magician_ext_control(&card->dapm);  	return 1;  } @@ -297,13 +295,13 @@ static int magician_get_spk(struct snd_kcontrol *kcontrol,  static int magician_set_spk(struct snd_kcontrol *kcontrol,  			    struct snd_ctl_elem_value *ucontrol)  { -	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); +	struct snd_soc_card *card = snd_kcontrol_chip(kcontrol);  	if (magician_spk_switch == ucontrol->value.integer.value[0])  		return 0;  	magician_spk_switch = ucontrol->value.integer.value[0]; -	magician_ext_control(codec); +	magician_ext_control(&card->dapm);  	return 1;  } @@ -400,7 +398,6 @@ static int magician_uda1380_init(struct snd_soc_pcm_runtime *rtd)  {  	struct snd_soc_codec *codec = rtd->codec;  	struct snd_soc_dapm_context *dapm = &codec->dapm; -	int err;  	/* NC codec pins */  	snd_soc_dapm_nc_pin(dapm, "VOUTLHP"); @@ -410,19 +407,6 @@ static int magician_uda1380_init(struct snd_soc_pcm_runtime *rtd)  	snd_soc_dapm_nc_pin(dapm, "VINL");  	snd_soc_dapm_nc_pin(dapm, "VINR"); -	/* Add magician specific controls */ -	err = snd_soc_add_codec_controls(codec, uda1380_magician_controls, -				ARRAY_SIZE(uda1380_magician_controls)); -	if (err < 0) -		return err; - -	/* Add magician specific widgets */ -	snd_soc_dapm_new_controls(dapm, uda1380_dapm_widgets, -				  ARRAY_SIZE(uda1380_dapm_widgets)); - -	/* Set up magician specific audio path interconnects */ -	snd_soc_dapm_add_routes(dapm, audio_map, ARRAY_SIZE(audio_map)); -  	return 0;  } @@ -456,6 +440,12 @@ static struct snd_soc_card snd_soc_card_magician = {  	.dai_link = magician_dai,  	.num_links = ARRAY_SIZE(magician_dai), +	.controls = uda1380_magician_controls, +	.num_controls = ARRAY_SIZE(uda1380_magician_controls), +	.dapm_widgets = uda1380_dapm_widgets, +	.num_dapm_widgets = ARRAY_SIZE(uda1380_dapm_widgets), +	.dapm_routes = audio_map, +	.num_dapm_routes = ARRAY_SIZE(audio_map),  };  static struct platform_device *magician_snd_device; diff --git a/sound/soc/pxa/mioa701_wm9713.c b/sound/soc/pxa/mioa701_wm9713.c index bbea7780eac..595eee341e9 100644 --- a/sound/soc/pxa/mioa701_wm9713.c +++ b/sound/soc/pxa/mioa701_wm9713.c @@ -127,16 +127,8 @@ static const struct snd_soc_dapm_route audio_map[] = {  static int mioa701_wm9713_init(struct snd_soc_pcm_runtime *rtd)  {  	struct snd_soc_codec *codec = rtd->codec; -	struct snd_soc_dapm_context *dapm = &codec->dapm;  	unsigned short reg; -	/* Add mioa701 specific widgets */ -	snd_soc_dapm_new_controls(dapm, mioa701_dapm_widgets, -				  ARRAY_SIZE(mioa701_dapm_widgets)); - -	/* Set up mioa701 specific audio path audio_mapnects */ -	snd_soc_dapm_add_routes(dapm, audio_map, ARRAY_SIZE(audio_map)); -  	/* Prepare GPIO8 for rear speaker amplifier */  	reg = codec->driver->read(codec, AC97_GPIO_CFG);  	codec->driver->write(codec, AC97_GPIO_CFG, reg | 0x0100); @@ -145,12 +137,6 @@ static int mioa701_wm9713_init(struct snd_soc_pcm_runtime *rtd)  	reg = codec->driver->read(codec, AC97_3D_CONTROL);  	codec->driver->write(codec, AC97_3D_CONTROL, reg | 0xc000); -	snd_soc_dapm_enable_pin(dapm, "Front Speaker"); -	snd_soc_dapm_enable_pin(dapm, "Rear Speaker"); -	snd_soc_dapm_enable_pin(dapm, "Front Mic"); -	snd_soc_dapm_enable_pin(dapm, "GSM Line In"); -	snd_soc_dapm_enable_pin(dapm, "GSM Line Out"); -  	return 0;  } @@ -183,6 +169,11 @@ static struct snd_soc_card mioa701 = {  	.owner = THIS_MODULE,  	.dai_link = mioa701_dai,  	.num_links = ARRAY_SIZE(mioa701_dai), + +	.dapm_widgets = mioa701_dapm_widgets, +	.num_dapm_widgets = ARRAY_SIZE(mioa701_dapm_widgets), +	.dapm_routes = audio_map, +	.num_dapm_routes = ARRAY_SIZE(audio_map),  };  static int mioa701_wm9713_probe(struct platform_device *pdev) @@ -215,6 +206,7 @@ static struct platform_driver mioa701_wm9713_driver = {  	.driver		= {  		.name		= "mioa701-wm9713",  		.owner		= THIS_MODULE, +		.pm     = &snd_soc_pm_ops,  	},  }; diff --git a/sound/soc/pxa/mmp-pcm.c b/sound/soc/pxa/mmp-pcm.c index 8235e231d89..5e8d8133017 100644 --- a/sound/soc/pxa/mmp-pcm.c +++ b/sound/soc/pxa/mmp-pcm.c @@ -36,14 +36,9 @@ struct mmp_dma_data {  		SNDRV_PCM_INFO_PAUSE |		\  		SNDRV_PCM_INFO_RESUME) -#define MMP_PCM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \ -			 SNDRV_PCM_FMTBIT_S24_LE | \ -			 SNDRV_PCM_FMTBIT_S32_LE) -  static struct snd_pcm_hardware mmp_pcm_hardware[] = {  	{  		.info			= MMP_PCM_INFO, -		.formats		= MMP_PCM_FORMATS,  		.period_bytes_min	= 1024,  		.period_bytes_max	= 2048,  		.periods_min		= 2, @@ -53,7 +48,6 @@ static struct snd_pcm_hardware mmp_pcm_hardware[] = {  	},  	{  		.info			= MMP_PCM_INFO, -		.formats		= MMP_PCM_FORMATS,  		.period_bytes_min	= 1024,  		.period_bytes_max	= 2048,  		.periods_min		= 2, @@ -67,27 +61,15 @@ static int mmp_pcm_hw_params(struct snd_pcm_substream *substream,  			      struct snd_pcm_hw_params *params)  {  	struct dma_chan *chan = snd_dmaengine_pcm_get_chan(substream); -	struct snd_soc_pcm_runtime *rtd = substream->private_data; -	struct snd_dmaengine_dai_dma_data *dma_params;  	struct dma_slave_config slave_config;  	int ret; -	dma_params = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); -	if (!dma_params) -		return 0; - -	ret = snd_hwparams_to_dma_slave_config(substream, params, &slave_config); +	ret = +	    snd_dmaengine_pcm_prepare_slave_config(substream, params, +						   &slave_config);  	if (ret)  		return ret; -	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { -		slave_config.dst_addr     = dma_params->addr; -		slave_config.dst_maxburst = 4; -	} else { -		slave_config.src_addr	  = dma_params->addr; -		slave_config.src_maxburst = 4; -	} -  	ret = dmaengine_slave_config(chan, &slave_config);  	if (ret)  		return ret; @@ -201,10 +183,9 @@ static int mmp_pcm_preallocate_dma_buffer(struct snd_pcm_substream *substream,  	if (!gpool)  		return -ENOMEM; -	buf->area = (unsigned char *)gen_pool_alloc(gpool, size); +	buf->area = gen_pool_dma_alloc(gpool, size, &buf->addr);  	if (!buf->area)  		return -ENOMEM; -	buf->addr = gen_pool_virt_to_phys(gpool, (unsigned long)buf->area);  	buf->bytes = size;  	return 0;  } diff --git a/sound/soc/pxa/mmp-sspa.c b/sound/soc/pxa/mmp-sspa.c index 41752a5fe3b..5bf5f1f7cac 100644 --- a/sound/soc/pxa/mmp-sspa.c +++ b/sound/soc/pxa/mmp-sspa.c @@ -455,8 +455,8 @@ static int asoc_mmp_sspa_probe(struct platform_device *pdev)  	priv->dai_fmt = (unsigned int) -1;  	platform_set_drvdata(pdev, priv); -	return snd_soc_register_component(&pdev->dev, &mmp_sspa_component, -					  &mmp_sspa_dai, 1); +	return devm_snd_soc_register_component(&pdev->dev, &mmp_sspa_component, +					       &mmp_sspa_dai, 1);  }  static int asoc_mmp_sspa_remove(struct platform_device *pdev) @@ -466,7 +466,6 @@ static int asoc_mmp_sspa_remove(struct platform_device *pdev)  	clk_disable(priv->audio_clk);  	clk_put(priv->audio_clk);  	clk_put(priv->sysclk); -	snd_soc_unregister_component(&pdev->dev);  	return 0;  } diff --git a/sound/soc/pxa/palm27x.c b/sound/soc/pxa/palm27x.c index e1ffcdd9a64..17f9521ff6e 100644 --- a/sound/soc/pxa/palm27x.c +++ b/sound/soc/pxa/palm27x.c @@ -79,14 +79,6 @@ static int palm27x_ac97_init(struct snd_soc_pcm_runtime *rtd)  	struct snd_soc_dapm_context *dapm = &codec->dapm;  	int err; -	/* connected pins */ -	if (machine_is_palmld()) -		snd_soc_dapm_enable_pin(dapm, "MIC1"); -	snd_soc_dapm_enable_pin(dapm, "HPOUTL"); -	snd_soc_dapm_enable_pin(dapm, "HPOUTR"); -	snd_soc_dapm_enable_pin(dapm, "LOUT2"); -	snd_soc_dapm_enable_pin(dapm, "ROUT2"); -  	/* not connected pins */  	snd_soc_dapm_nc_pin(dapm, "OUT3");  	snd_soc_dapm_nc_pin(dapm, "MONOOUT"); @@ -181,6 +173,7 @@ static struct platform_driver palm27x_wm9712_driver = {  	.driver		= {  		.name		= "palm27x-asoc",  		.owner		= THIS_MODULE, +		.pm     = &snd_soc_pm_ops,  	},  }; diff --git a/sound/soc/pxa/poodle.c b/sound/soc/pxa/poodle.c index fafe46355c3..21f34006531 100644 --- a/sound/soc/pxa/poodle.c +++ b/sound/soc/pxa/poodle.c @@ -74,14 +74,9 @@ static void poodle_ext_control(struct snd_soc_dapm_context *dapm)  static int poodle_startup(struct snd_pcm_substream *substream)  {  	struct snd_soc_pcm_runtime *rtd = substream->private_data; -	struct snd_soc_codec *codec = rtd->codec; - -	mutex_lock(&codec->mutex);  	/* check the jack status at stream startup */ -	poodle_ext_control(&codec->dapm); - -	mutex_unlock(&codec->mutex); +	poodle_ext_control(&rtd->card->dapm);  	return 0;  } @@ -235,7 +230,6 @@ static int poodle_wm8731_init(struct snd_soc_pcm_runtime *rtd)  	snd_soc_dapm_nc_pin(dapm, "LLINEIN");  	snd_soc_dapm_nc_pin(dapm, "RLINEIN"); -	snd_soc_dapm_enable_pin(dapm, "MICIN");  	return 0;  } @@ -303,6 +297,7 @@ static struct platform_driver poodle_driver = {  	.driver		= {  		.name	= "poodle-audio",  		.owner	= THIS_MODULE, +		.pm     = &snd_soc_pm_ops,  	},  	.probe		= poodle_probe,  	.remove		= poodle_remove, diff --git a/sound/soc/pxa/pxa-ssp.c b/sound/soc/pxa/pxa-ssp.c index a3119a00d8f..199a8b37755 100644 --- a/sound/soc/pxa/pxa-ssp.c +++ b/sound/soc/pxa/pxa-ssp.c @@ -34,8 +34,6 @@  #include <sound/pxa2xx-lib.h>  #include <sound/dmaengine_pcm.h> -#include <mach/hardware.h> -  #include "../../arm/pxa2xx-pcm.h"  #include "pxa-ssp.h" @@ -810,6 +808,7 @@ static const struct snd_soc_component_driver pxa_ssp_component = {  #ifdef CONFIG_OF  static const struct of_device_id pxa_ssp_of_ids[] = {  	{ .compatible = "mrvl,pxa-ssp-dai" }, +	{}  };  #endif diff --git a/sound/soc/pxa/pxa2xx-ac97.c b/sound/soc/pxa/pxa2xx-ac97.c index f1059d999de..ae956e3f4b9 100644 --- a/sound/soc/pxa/pxa2xx-ac97.c +++ b/sound/soc/pxa/pxa2xx-ac97.c @@ -89,33 +89,6 @@ static struct snd_dmaengine_dai_dma_data pxa2xx_ac97_pcm_mic_mono_in = {  	.filter_data	= &pxa2xx_ac97_pcm_aux_mic_mono_req,  }; -#ifdef CONFIG_PM -static int pxa2xx_ac97_suspend(struct snd_soc_dai *dai) -{ -	return pxa2xx_ac97_hw_suspend(); -} - -static int pxa2xx_ac97_resume(struct snd_soc_dai *dai) -{ -	return pxa2xx_ac97_hw_resume(); -} - -#else -#define pxa2xx_ac97_suspend	NULL -#define pxa2xx_ac97_resume	NULL -#endif - -static int pxa2xx_ac97_probe(struct snd_soc_dai *dai) -{ -	return pxa2xx_ac97_hw_probe(to_platform_device(dai->dev)); -} - -static int pxa2xx_ac97_remove(struct snd_soc_dai *dai) -{ -	pxa2xx_ac97_hw_remove(to_platform_device(dai->dev)); -	return 0; -} -  static int pxa2xx_ac97_hw_params(struct snd_pcm_substream *substream,  				 struct snd_pcm_hw_params *params,  				 struct snd_soc_dai *cpu_dai) @@ -185,10 +158,6 @@ static struct snd_soc_dai_driver pxa_ac97_dai_driver[] = {  {  	.name = "pxa2xx-ac97",  	.ac97_control = 1, -	.probe = pxa2xx_ac97_probe, -	.remove = pxa2xx_ac97_remove, -	.suspend = pxa2xx_ac97_suspend, -	.resume = pxa2xx_ac97_resume,  	.playback = {  		.stream_name = "AC97 Playback",  		.channels_min = 2, @@ -246,6 +215,12 @@ static int pxa2xx_ac97_dev_probe(struct platform_device *pdev)  		return -ENXIO;  	} +	ret = pxa2xx_ac97_hw_probe(pdev); +	if (ret) { +		dev_err(&pdev->dev, "PXA2xx AC97 hw probe error (%d)\n", ret); +		return ret; +	} +  	ret = snd_soc_set_ac97_ops(&pxa2xx_ac97_ops);  	if (ret != 0)  		return ret; @@ -262,15 +237,34 @@ static int pxa2xx_ac97_dev_remove(struct platform_device *pdev)  {  	snd_soc_unregister_component(&pdev->dev);  	snd_soc_set_ac97_ops(NULL); +	pxa2xx_ac97_hw_remove(pdev);  	return 0;  } +#ifdef CONFIG_PM_SLEEP +static int pxa2xx_ac97_dev_suspend(struct device *dev) +{ +	return pxa2xx_ac97_hw_suspend(); +} + +static int pxa2xx_ac97_dev_resume(struct device *dev) +{ +	return pxa2xx_ac97_hw_resume(); +} + +static SIMPLE_DEV_PM_OPS(pxa2xx_ac97_pm_ops, +		pxa2xx_ac97_dev_suspend, pxa2xx_ac97_dev_resume); +#endif +  static struct platform_driver pxa2xx_ac97_driver = {  	.probe		= pxa2xx_ac97_dev_probe,  	.remove		= pxa2xx_ac97_dev_remove,  	.driver		= {  		.name	= "pxa2xx-ac97",  		.owner	= THIS_MODULE, +#ifdef CONFIG_PM_SLEEP +		.pm	= &pxa2xx_ac97_pm_ops, +#endif  	},  }; diff --git a/sound/soc/pxa/pxa2xx-i2s.c b/sound/soc/pxa/pxa2xx-i2s.c index d5340a08885..c0d648d3339 100644 --- a/sound/soc/pxa/pxa2xx-i2s.c +++ b/sound/soc/pxa/pxa2xx-i2s.c @@ -165,7 +165,8 @@ static int pxa2xx_i2s_hw_params(struct snd_pcm_substream *substream,  {  	struct snd_dmaengine_dai_dma_data *dma_data; -	BUG_ON(IS_ERR(clk_i2s)); +	if (WARN_ON(IS_ERR(clk_i2s))) +		return -EINVAL;  	clk_prepare_enable(clk_i2s);  	clk_ena = 1;  	pxa_i2s_wait(); diff --git a/sound/soc/pxa/pxa2xx-pcm.c b/sound/soc/pxa/pxa2xx-pcm.c index 806da27b8b6..42f2f017598 100644 --- a/sound/soc/pxa/pxa2xx-pcm.c +++ b/sound/soc/pxa/pxa2xx-pcm.c @@ -15,6 +15,8 @@  #include <linux/dmaengine.h>  #include <linux/of.h> +#include <mach/dma.h> +  #include <sound/core.h>  #include <sound/soc.h>  #include <sound/pxa2xx-lib.h> @@ -87,18 +89,15 @@ static struct snd_pcm_ops pxa2xx_pcm_ops = {  	.mmap		= pxa2xx_pcm_mmap,  }; -static u64 pxa2xx_pcm_dmamask = DMA_BIT_MASK(32); -  static int pxa2xx_soc_pcm_new(struct snd_soc_pcm_runtime *rtd)  {  	struct snd_card *card = rtd->card->snd_card;  	struct snd_pcm *pcm = rtd->pcm; -	int ret = 0; +	int ret; -	if (!card->dev->dma_mask) -		card->dev->dma_mask = &pxa2xx_pcm_dmamask; -	if (!card->dev->coherent_dma_mask) -		card->dev->coherent_dma_mask = DMA_BIT_MASK(32); +	ret = dma_coerce_mask_and_coherent(card->dev, DMA_BIT_MASK(32)); +	if (ret) +		return ret;  	if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) {  		ret = pxa2xx_pcm_preallocate_dma_buffer(pcm, diff --git a/sound/soc/pxa/spitz.c b/sound/soc/pxa/spitz.c index fc052d8247f..1373b017a95 100644 --- a/sound/soc/pxa/spitz.c +++ b/sound/soc/pxa/spitz.c @@ -46,74 +46,74 @@ static int spitz_mic_gpio;  static void spitz_ext_control(struct snd_soc_dapm_context *dapm)  { +	snd_soc_dapm_mutex_lock(dapm); +  	if (spitz_spk_func == SPITZ_SPK_ON) -		snd_soc_dapm_enable_pin(dapm, "Ext Spk"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "Ext Spk");  	else -		snd_soc_dapm_disable_pin(dapm, "Ext Spk"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Ext Spk");  	/* set up jack connection */  	switch (spitz_jack_func) {  	case SPITZ_HP:  		/* enable and unmute hp jack, disable mic bias */ -		snd_soc_dapm_disable_pin(dapm, "Headset Jack"); -		snd_soc_dapm_disable_pin(dapm, "Mic Jack"); -		snd_soc_dapm_disable_pin(dapm, "Line Jack"); -		snd_soc_dapm_enable_pin(dapm, "Headphone Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "Headphone Jack");  		gpio_set_value(SPITZ_GPIO_MUTE_L, 1);  		gpio_set_value(SPITZ_GPIO_MUTE_R, 1);  		break;  	case SPITZ_MIC:  		/* enable mic jack and bias, mute hp */ -		snd_soc_dapm_disable_pin(dapm, "Headphone Jack"); -		snd_soc_dapm_disable_pin(dapm, "Headset Jack"); -		snd_soc_dapm_disable_pin(dapm, "Line Jack"); -		snd_soc_dapm_enable_pin(dapm, "Mic Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "Mic Jack");  		gpio_set_value(SPITZ_GPIO_MUTE_L, 0);  		gpio_set_value(SPITZ_GPIO_MUTE_R, 0);  		break;  	case SPITZ_LINE:  		/* enable line jack, disable mic bias and mute hp */ -		snd_soc_dapm_disable_pin(dapm, "Headphone Jack"); -		snd_soc_dapm_disable_pin(dapm, "Headset Jack"); -		snd_soc_dapm_disable_pin(dapm, "Mic Jack"); -		snd_soc_dapm_enable_pin(dapm, "Line Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "Line Jack");  		gpio_set_value(SPITZ_GPIO_MUTE_L, 0);  		gpio_set_value(SPITZ_GPIO_MUTE_R, 0);  		break;  	case SPITZ_HEADSET:  		/* enable and unmute headset jack enable mic bias, mute L hp */ -		snd_soc_dapm_disable_pin(dapm, "Headphone Jack"); -		snd_soc_dapm_enable_pin(dapm, "Mic Jack"); -		snd_soc_dapm_disable_pin(dapm, "Line Jack"); -		snd_soc_dapm_enable_pin(dapm, "Headset Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "Mic Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "Headset Jack");  		gpio_set_value(SPITZ_GPIO_MUTE_L, 0);  		gpio_set_value(SPITZ_GPIO_MUTE_R, 1);  		break;  	case SPITZ_HP_OFF:  		/* jack removed, everything off */ -		snd_soc_dapm_disable_pin(dapm, "Headphone Jack"); -		snd_soc_dapm_disable_pin(dapm, "Headset Jack"); -		snd_soc_dapm_disable_pin(dapm, "Mic Jack"); -		snd_soc_dapm_disable_pin(dapm, "Line Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack");  		gpio_set_value(SPITZ_GPIO_MUTE_L, 0);  		gpio_set_value(SPITZ_GPIO_MUTE_R, 0);  		break;  	} -	snd_soc_dapm_sync(dapm); + +	snd_soc_dapm_sync_unlocked(dapm); + +	snd_soc_dapm_mutex_unlock(dapm);  }  static int spitz_startup(struct snd_pcm_substream *substream)  {  	struct snd_soc_pcm_runtime *rtd = substream->private_data; -	struct snd_soc_codec *codec = rtd->codec; - -	mutex_lock(&codec->mutex);  	/* check the jack status at stream startup */ -	spitz_ext_control(&codec->dapm); - -	mutex_unlock(&codec->mutex); +	spitz_ext_control(&rtd->card->dapm);  	return 0;  } diff --git a/sound/soc/pxa/tosa.c b/sound/soc/pxa/tosa.c index a3fe19123f0..4a956d1cb26 100644 --- a/sound/soc/pxa/tosa.c +++ b/sound/soc/pxa/tosa.c @@ -44,48 +44,46 @@  static int tosa_jack_func;  static int tosa_spk_func; -static void tosa_ext_control(struct snd_soc_codec *codec) +static void tosa_ext_control(struct snd_soc_dapm_context *dapm)  { -	struct snd_soc_dapm_context *dapm = &codec->dapm; + +	snd_soc_dapm_mutex_lock(dapm);  	/* set up jack connection */  	switch (tosa_jack_func) {  	case TOSA_HP: -		snd_soc_dapm_disable_pin(dapm, "Mic (Internal)"); -		snd_soc_dapm_enable_pin(dapm, "Headphone Jack"); -		snd_soc_dapm_disable_pin(dapm, "Headset Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Mic (Internal)"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "Headphone Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack");  		break;  	case TOSA_MIC_INT: -		snd_soc_dapm_enable_pin(dapm, "Mic (Internal)"); -		snd_soc_dapm_disable_pin(dapm, "Headphone Jack"); -		snd_soc_dapm_disable_pin(dapm, "Headset Jack"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "Mic (Internal)"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack");  		break;  	case TOSA_HEADSET: -		snd_soc_dapm_disable_pin(dapm, "Mic (Internal)"); -		snd_soc_dapm_disable_pin(dapm, "Headphone Jack"); -		snd_soc_dapm_enable_pin(dapm, "Headset Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Mic (Internal)"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "Headset Jack");  		break;  	}  	if (tosa_spk_func == TOSA_SPK_ON) -		snd_soc_dapm_enable_pin(dapm, "Speaker"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "Speaker");  	else -		snd_soc_dapm_disable_pin(dapm, "Speaker"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Speaker"); + +	snd_soc_dapm_sync_unlocked(dapm); -	snd_soc_dapm_sync(dapm); +	snd_soc_dapm_mutex_unlock(dapm);  }  static int tosa_startup(struct snd_pcm_substream *substream)  {  	struct snd_soc_pcm_runtime *rtd = substream->private_data; -	struct snd_soc_codec *codec = rtd->codec; - -	mutex_lock(&codec->mutex);  	/* check the jack status at stream startup */ -	tosa_ext_control(codec); - -	mutex_unlock(&codec->mutex); +	tosa_ext_control(&rtd->card->dapm);  	return 0;  } @@ -104,13 +102,13 @@ static int tosa_get_jack(struct snd_kcontrol *kcontrol,  static int tosa_set_jack(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_value *ucontrol)  { -	struct snd_soc_codec *codec =  snd_kcontrol_chip(kcontrol); +	struct snd_soc_card *card = snd_kcontrol_chip(kcontrol);  	if (tosa_jack_func == ucontrol->value.integer.value[0])  		return 0;  	tosa_jack_func = ucontrol->value.integer.value[0]; -	tosa_ext_control(codec); +	tosa_ext_control(&card->dapm);  	return 1;  } @@ -124,13 +122,13 @@ static int tosa_get_spk(struct snd_kcontrol *kcontrol,  static int tosa_set_spk(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_value *ucontrol)  { -	struct snd_soc_codec *codec =  snd_kcontrol_chip(kcontrol); +	struct snd_soc_card *card = snd_kcontrol_chip(kcontrol);  	if (tosa_spk_func == ucontrol->value.integer.value[0])  		return 0;  	tosa_spk_func = ucontrol->value.integer.value[0]; -	tosa_ext_control(codec); +	tosa_ext_control(&card->dapm);  	return 1;  } @@ -191,24 +189,10 @@ static int tosa_ac97_init(struct snd_soc_pcm_runtime *rtd)  {  	struct snd_soc_codec *codec = rtd->codec;  	struct snd_soc_dapm_context *dapm = &codec->dapm; -	int err;  	snd_soc_dapm_nc_pin(dapm, "OUT3");  	snd_soc_dapm_nc_pin(dapm, "MONOOUT"); -	/* add tosa specific controls */ -	err = snd_soc_add_codec_controls(codec, tosa_controls, -				ARRAY_SIZE(tosa_controls)); -	if (err < 0) -		return err; - -	/* add tosa specific widgets */ -	snd_soc_dapm_new_controls(dapm, tosa_dapm_widgets, -				  ARRAY_SIZE(tosa_dapm_widgets)); - -	/* set up tosa specific audio path audio_map */ -	snd_soc_dapm_add_routes(dapm, audio_map, ARRAY_SIZE(audio_map)); -  	return 0;  } @@ -239,6 +223,13 @@ static struct snd_soc_card tosa = {  	.owner = THIS_MODULE,  	.dai_link = tosa_dai,  	.num_links = ARRAY_SIZE(tosa_dai), + +	.controls = tosa_controls, +	.num_controls = ARRAY_SIZE(tosa_controls), +	.dapm_widgets = tosa_dapm_widgets, +	.num_dapm_widgets = ARRAY_SIZE(tosa_dapm_widgets), +	.dapm_routes = audio_map, +	.num_dapm_routes = ARRAY_SIZE(audio_map),  };  static int tosa_probe(struct platform_device *pdev) @@ -275,6 +266,7 @@ static struct platform_driver tosa_driver = {  	.driver		= {  		.name	= "tosa-audio",  		.owner	= THIS_MODULE, +		.pm     = &snd_soc_pm_ops,  	},  	.probe		= tosa_probe,  	.remove		= tosa_remove, diff --git a/sound/soc/pxa/ttc-dkb.c b/sound/soc/pxa/ttc-dkb.c index 13c9ee0cb83..9d7c5b7e953 100644 --- a/sound/soc/pxa/ttc-dkb.c +++ b/sound/soc/pxa/ttc-dkb.c @@ -78,10 +78,6 @@ static int ttc_pm860x_init(struct snd_soc_pcm_runtime *rtd)  	struct snd_soc_codec *codec = rtd->codec;  	struct snd_soc_dapm_context *dapm = &codec->dapm; -	/* connected pins */ -	snd_soc_dapm_enable_pin(dapm, "Ext Speaker"); -	snd_soc_dapm_enable_pin(dapm, "Ext Mic 1"); -	snd_soc_dapm_enable_pin(dapm, "Ext Mic 3");  	snd_soc_dapm_disable_pin(dapm, "Headset Mic 2");  	snd_soc_dapm_disable_pin(dapm, "Headset Stereophone"); @@ -160,6 +156,7 @@ static struct platform_driver ttc_dkb_driver = {  	.driver		= {  		.name	= "ttc-dkb-audio",  		.owner	= THIS_MODULE, +		.pm     = &snd_soc_pm_ops,  	},  	.probe		= ttc_dkb_probe,  	.remove		= ttc_dkb_remove, diff --git a/sound/soc/pxa/zylonite.c b/sound/soc/pxa/zylonite.c index db8aadf8932..23bf991e95d 100644 --- a/sound/soc/pxa/zylonite.c +++ b/sound/soc/pxa/zylonite.c @@ -71,22 +71,10 @@ static const struct snd_soc_dapm_route audio_map[] = {  static int zylonite_wm9713_init(struct snd_soc_pcm_runtime *rtd)  { -	struct snd_soc_codec *codec = rtd->codec; -	struct snd_soc_dapm_context *dapm = &codec->dapm; -  	if (clk_pout)  		snd_soc_dai_set_pll(rtd->codec_dai, 0, 0,  				    clk_get_rate(pout), 0); -	snd_soc_dapm_new_controls(dapm, zylonite_dapm_widgets, -				  ARRAY_SIZE(zylonite_dapm_widgets)); - -	snd_soc_dapm_add_routes(dapm, audio_map, ARRAY_SIZE(audio_map)); - -	/* Static setup for now */ -	snd_soc_dapm_enable_pin(dapm, "Headphone"); -	snd_soc_dapm_enable_pin(dapm, "Headset Earpiece"); -  	return 0;  } @@ -256,6 +244,11 @@ static struct snd_soc_card zylonite = {  	.resume_pre = &zylonite_resume_pre,  	.dai_link = zylonite_dai,  	.num_links = ARRAY_SIZE(zylonite_dai), + +	.dapm_widgets = zylonite_dapm_widgets, +	.num_dapm_widgets = ARRAY_SIZE(zylonite_dapm_widgets), +	.dapm_routes = audio_map, +	.num_dapm_routes = ARRAY_SIZE(audio_map),  };  static struct platform_device *zylonite_snd_ac97_device;  | 
