diff options
Diffstat (limited to 'sound/soc/pxa/poodle.c')
| -rw-r--r-- | sound/soc/pxa/poodle.c | 114 | 
1 files changed, 50 insertions, 64 deletions
diff --git a/sound/soc/pxa/poodle.c b/sound/soc/pxa/poodle.c index af84ee9c5e1..21f34006531 100644 --- a/sound/soc/pxa/poodle.c +++ b/sound/soc/pxa/poodle.c @@ -23,7 +23,6 @@  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/soc.h> -#include <sound/soc-dapm.h>  #include <asm/mach-types.h>  #include <asm/hardware/locomo.h> @@ -44,7 +43,7 @@  static int poodle_jack_func;  static int poodle_spk_func; -static void poodle_ext_control(struct snd_soc_codec *codec) +static void poodle_ext_control(struct snd_soc_dapm_context *dapm)  {  	/* set up jack connection */  	if (poodle_jack_func == POODLE_HP) { @@ -53,32 +52,32 @@ static void poodle_ext_control(struct snd_soc_codec *codec)  			POODLE_LOCOMO_GPIO_MUTE_L, 1);  		locomo_gpio_write(&poodle_locomo_device.dev,  			POODLE_LOCOMO_GPIO_MUTE_R, 1); -		snd_soc_dapm_enable_pin(codec, "Headphone Jack"); +		snd_soc_dapm_enable_pin(dapm, "Headphone Jack");  	} else {  		locomo_gpio_write(&poodle_locomo_device.dev,  			POODLE_LOCOMO_GPIO_MUTE_L, 0);  		locomo_gpio_write(&poodle_locomo_device.dev,  			POODLE_LOCOMO_GPIO_MUTE_R, 0); -		snd_soc_dapm_disable_pin(codec, "Headphone Jack"); +		snd_soc_dapm_disable_pin(dapm, "Headphone Jack");  	}  	/* set the enpoints to their new connetion states */  	if (poodle_spk_func == POODLE_SPK_ON) -		snd_soc_dapm_enable_pin(codec, "Ext Spk"); +		snd_soc_dapm_enable_pin(dapm, "Ext Spk");  	else -		snd_soc_dapm_disable_pin(codec, "Ext Spk"); +		snd_soc_dapm_disable_pin(dapm, "Ext Spk");  	/* signal a DAPM event */ -	snd_soc_dapm_sync(codec); +	snd_soc_dapm_sync(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;  	/* check the jack status at stream startup */ -	poodle_ext_control(codec); +	poodle_ext_control(&rtd->card->dapm); +  	return 0;  } @@ -115,18 +114,6 @@ static int poodle_hw_params(struct snd_pcm_substream *substream,  		break;  	} -	/* set codec DAI configuration */ -	ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S | -		SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS); -	if (ret < 0) -		return ret; - -	/* set cpu DAI configuration */ -	ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S | -		SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS); -	if (ret < 0) -		return ret; -  	/* set the codec system clock for DAC and ADC */  	ret = snd_soc_dai_set_sysclk(codec_dai, WM8731_SYSCLK_XTAL, clk,  		SND_SOC_CLOCK_IN); @@ -158,13 +145,13 @@ static int poodle_get_jack(struct snd_kcontrol *kcontrol,  static int poodle_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 (poodle_jack_func == ucontrol->value.integer.value[0])  		return 0;  	poodle_jack_func = ucontrol->value.integer.value[0]; -	poodle_ext_control(codec); +	poodle_ext_control(&card->dapm);  	return 1;  } @@ -178,13 +165,13 @@ static int poodle_get_spk(struct snd_kcontrol *kcontrol,  static int poodle_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 (poodle_spk_func == ucontrol->value.integer.value[0])  		return 0;  	poodle_spk_func = ucontrol->value.integer.value[0]; -	poodle_ext_control(codec); +	poodle_ext_control(&card->dapm);  	return 1;  } @@ -208,7 +195,7 @@ SND_SOC_DAPM_SPK("Ext Spk", poodle_amp_event),  };  /* Corgi machine connections to the codec pins */ -static const struct snd_soc_dapm_route audio_map[] = { +static const struct snd_soc_dapm_route poodle_audio_map[] = {  	/* headphone connected to LHPOUT1, RHPOUT1 */  	{"Headphone Jack", NULL, "LHPOUT"}, @@ -239,26 +226,11 @@ static const struct snd_kcontrol_new wm8731_poodle_controls[] = {  static int poodle_wm8731_init(struct snd_soc_pcm_runtime *rtd)  {  	struct snd_soc_codec *codec = rtd->codec; -	int err; - -	snd_soc_dapm_nc_pin(codec, "LLINEIN"); -	snd_soc_dapm_nc_pin(codec, "RLINEIN"); -	snd_soc_dapm_enable_pin(codec, "MICIN"); - -	/* Add poodle specific controls */ -	err = snd_soc_add_controls(codec, wm8731_poodle_controls, -				ARRAY_SIZE(wm8731_poodle_controls)); -	if (err < 0) -		return err; +	struct snd_soc_dapm_context *dapm = &codec->dapm; -	/* Add poodle specific widgets */ -	snd_soc_dapm_new_controls(codec, wm8731_dapm_widgets, -				  ARRAY_SIZE(wm8731_dapm_widgets)); +	snd_soc_dapm_nc_pin(dapm, "LLINEIN"); +	snd_soc_dapm_nc_pin(dapm, "RLINEIN"); -	/* Set up poodle specific audio path audio_map */ -	snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map)); - -	snd_soc_dapm_sync(codec);  	return 0;  } @@ -269,28 +241,33 @@ static struct snd_soc_dai_link poodle_dai = {  	.cpu_dai_name = "pxa2xx-i2s",  	.codec_dai_name = "wm8731-hifi",  	.platform_name = "pxa-pcm-audio", -	.codec_name = "wm8731-codec.0-001a", +	.codec_name = "wm8731.0-001b",  	.init = poodle_wm8731_init, +	.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | +		   SND_SOC_DAIFMT_CBS_CFS,  	.ops = &poodle_ops,  };  /* poodle audio machine driver */ -static struct snd_soc_card snd_soc_poodle = { +static struct snd_soc_card poodle = {  	.name = "Poodle",  	.dai_link = &poodle_dai,  	.num_links = 1,  	.owner = THIS_MODULE, -}; -static struct platform_device *poodle_snd_device; +	.controls = wm8731_poodle_controls, +	.num_controls = ARRAY_SIZE(wm8731_poodle_controls), +	.dapm_widgets = wm8731_dapm_widgets, +	.num_dapm_widgets = ARRAY_SIZE(wm8731_dapm_widgets), +	.dapm_routes = poodle_audio_map, +	.num_dapm_routes = ARRAY_SIZE(poodle_audio_map), +}; -static int __init poodle_init(void) +static int poodle_probe(struct platform_device *pdev)  { +	struct snd_soc_card *card = &poodle;  	int ret; -	if (!machine_is_poodle()) -		return -ENODEV; -  	locomo_gpio_set_dir(&poodle_locomo_device.dev,  		POODLE_LOCOMO_GPIO_AMP_ON, 0);  	/* should we mute HP at startup - burning power ?*/ @@ -299,28 +276,37 @@ static int __init poodle_init(void)  	locomo_gpio_set_dir(&poodle_locomo_device.dev,  		POODLE_LOCOMO_GPIO_MUTE_R, 0); -	poodle_snd_device = platform_device_alloc("soc-audio", -1); -	if (!poodle_snd_device) -		return -ENOMEM; - -	platform_set_drvdata(poodle_snd_device, &snd_soc_poodle); -	ret = platform_device_add(poodle_snd_device); +	card->dev = &pdev->dev; +	ret = snd_soc_register_card(card);  	if (ret) -		platform_device_put(poodle_snd_device); - +		dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", +			ret);  	return ret;  } -static void __exit poodle_exit(void) +static int poodle_remove(struct platform_device *pdev)  { -	platform_device_unregister(poodle_snd_device); +	struct snd_soc_card *card = platform_get_drvdata(pdev); + +	snd_soc_unregister_card(card); +	return 0;  } -module_init(poodle_init); -module_exit(poodle_exit); +static struct platform_driver poodle_driver = { +	.driver		= { +		.name	= "poodle-audio", +		.owner	= THIS_MODULE, +		.pm     = &snd_soc_pm_ops, +	}, +	.probe		= poodle_probe, +	.remove		= poodle_remove, +}; + +module_platform_driver(poodle_driver);  /* Module information */  MODULE_AUTHOR("Richard Purdie");  MODULE_DESCRIPTION("ALSA SoC Poodle");  MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:poodle-audio");  | 
