diff options
Diffstat (limited to 'sound/soc/pxa/tosa.c')
| -rw-r--r-- | sound/soc/pxa/tosa.c | 154 | 
1 files changed, 68 insertions, 86 deletions
diff --git a/sound/soc/pxa/tosa.c b/sound/soc/pxa/tosa.c index 73d0edd8ded..4a956d1cb26 100644 --- a/sound/soc/pxa/tosa.c +++ b/sound/soc/pxa/tosa.c @@ -26,7 +26,6 @@  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/soc.h> -#include <sound/soc-dapm.h>  #include <asm/mach-types.h>  #include <mach/tosa.h> @@ -35,8 +34,6 @@  #include "../codecs/wm9712.h"  #include "pxa2xx-ac97.h" -static struct snd_soc_card tosa; -  #define TOSA_HP        0  #define TOSA_MIC_INT   1  #define TOSA_HEADSET   2 @@ -47,42 +44,47 @@ static struct snd_soc_card tosa;  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)  { + +	snd_soc_dapm_mutex_lock(dapm); +  	/* set up jack connection */  	switch (tosa_jack_func) {  	case TOSA_HP: -		snd_soc_dapm_disable_pin(codec, "Mic (Internal)"); -		snd_soc_dapm_enable_pin(codec, "Headphone Jack"); -		snd_soc_dapm_disable_pin(codec, "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(codec, "Mic (Internal)"); -		snd_soc_dapm_disable_pin(codec, "Headphone Jack"); -		snd_soc_dapm_disable_pin(codec, "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(codec, "Mic (Internal)"); -		snd_soc_dapm_disable_pin(codec, "Headphone Jack"); -		snd_soc_dapm_enable_pin(codec, "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(codec, "Speaker"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "Speaker");  	else -		snd_soc_dapm_disable_pin(codec, "Speaker"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Speaker"); -	snd_soc_dapm_sync(codec); +	snd_soc_dapm_sync_unlocked(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;  	/* check the jack status at stream startup */ -	tosa_ext_control(codec); +	tosa_ext_control(&rtd->card->dapm); +  	return 0;  } @@ -100,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;  } @@ -120,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;  } @@ -186,25 +188,11 @@ static const struct snd_kcontrol_new tosa_controls[] = {  static int tosa_ac97_init(struct snd_soc_pcm_runtime *rtd)  {  	struct snd_soc_codec *codec = rtd->codec; -	int err; +	struct snd_soc_dapm_context *dapm = &codec->dapm; -	snd_soc_dapm_nc_pin(codec, "OUT3"); -	snd_soc_dapm_nc_pin(codec, "MONOOUT"); +	snd_soc_dapm_nc_pin(dapm, "OUT3"); +	snd_soc_dapm_nc_pin(dapm, "MONOOUT"); -	/* add tosa specific controls */ -	err = snd_soc_add_controls(codec, tosa_controls, -				ARRAY_SIZE(tosa_controls)); -	if (err < 0) -		return err; - -	/* add tosa specific widgets */ -	snd_soc_dapm_new_controls(codec, tosa_dapm_widgets, -				  ARRAY_SIZE(tosa_dapm_widgets)); - -	/* set up tosa specific audio path audio_map */ -	snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map)); - -	snd_soc_dapm_sync(codec);  	return 0;  } @@ -212,7 +200,7 @@ static struct snd_soc_dai_link tosa_dai[] = {  {  	.name = "AC97",  	.stream_name = "AC97 HiFi", -	.cpu_dai_name = "pxa-ac97.0", +	.cpu_dai_name = "pxa2xx-ac97",  	.codec_dai_name = "wm9712-hifi",  	.platform_name = "pxa-pcm-audio",  	.codec_name = "wm9712-codec", @@ -222,7 +210,7 @@ static struct snd_soc_dai_link tosa_dai[] = {  {  	.name = "AC97 Aux",  	.stream_name = "AC97 Aux", -	.cpu_dai_name = "pxa-ac97.1", +	.cpu_dai_name = "pxa2xx-ac97-aux",  	.codec_dai_name = "wm9712-aux",  	.platform_name = "pxa-pcm-audio",  	.codec_name = "wm9712-codec", @@ -230,70 +218,64 @@ static struct snd_soc_dai_link tosa_dai[] = {  },  }; -static int tosa_probe(struct platform_device *dev) -{ -	int ret; - -	ret = gpio_request(TOSA_GPIO_L_MUTE, "Headphone Jack"); -	if (ret) -		return ret; -	ret = gpio_direction_output(TOSA_GPIO_L_MUTE, 0); -	if (ret) -		gpio_free(TOSA_GPIO_L_MUTE); - -	return ret; -} - -static int tosa_remove(struct platform_device *dev) -{ -	gpio_free(TOSA_GPIO_L_MUTE); -	return 0; -} -  static struct snd_soc_card tosa = {  	.name = "Tosa", +	.owner = THIS_MODULE,  	.dai_link = tosa_dai,  	.num_links = ARRAY_SIZE(tosa_dai), -	.probe = tosa_probe, -	.remove = tosa_remove, -}; -static struct platform_device *tosa_snd_device; +	.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 __init tosa_init(void) +static int tosa_probe(struct platform_device *pdev)  { +	struct snd_soc_card *card = ⤩  	int ret; -	if (!machine_is_tosa()) -		return -ENODEV; - -	tosa_snd_device = platform_device_alloc("soc-audio", -1); -	if (!tosa_snd_device) { -		ret = -ENOMEM; -		goto err_alloc; -	} - -	platform_set_drvdata(tosa_snd_device, &tosa); -	ret = platform_device_add(tosa_snd_device); - -	if (!ret) -		return 0; +	ret = gpio_request_one(TOSA_GPIO_L_MUTE, GPIOF_OUT_INIT_LOW, +			       "Headphone Jack"); +	if (ret) +		return ret; -	platform_device_put(tosa_snd_device); +	card->dev = &pdev->dev; -err_alloc: +	ret = snd_soc_register_card(card); +	if (ret) { +		dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", +			ret); +		gpio_free(TOSA_GPIO_L_MUTE); +	}  	return ret;  } -static void __exit tosa_exit(void) +static int tosa_remove(struct platform_device *pdev)  { -	platform_device_unregister(tosa_snd_device); +	struct snd_soc_card *card = platform_get_drvdata(pdev); + +	gpio_free(TOSA_GPIO_L_MUTE); +	snd_soc_unregister_card(card); +	return 0;  } -module_init(tosa_init); -module_exit(tosa_exit); +static struct platform_driver tosa_driver = { +	.driver		= { +		.name	= "tosa-audio", +		.owner	= THIS_MODULE, +		.pm     = &snd_soc_pm_ops, +	}, +	.probe		= tosa_probe, +	.remove		= tosa_remove, +}; + +module_platform_driver(tosa_driver);  /* Module information */  MODULE_AUTHOR("Richard Purdie");  MODULE_DESCRIPTION("ALSA SoC Tosa");  MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:tosa-audio");  | 
