diff options
Diffstat (limited to 'sound/soc/omap/n810.c')
| -rw-r--r-- | sound/soc/omap/n810.c | 132 | 
1 files changed, 58 insertions, 74 deletions
diff --git a/sound/soc/omap/n810.c b/sound/soc/omap/n810.c index a3b6d897ad8..5d7f9cebe04 100644 --- a/sound/soc/omap/n810.c +++ b/sound/soc/omap/n810.c @@ -3,7 +3,7 @@   *   * Copyright (C) 2008 Nokia Corporation   * - * Contact: Jarkko Nikula <jhnikula@gmail.com> + * Contact: Jarkko Nikula <jarkko.nikula@bitmer.com>   *   * This program is free software; you can redistribute it and/or   * modify it under the terms of the GNU General Public License @@ -27,16 +27,13 @@  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/soc.h> -#include <sound/soc-dapm.h>  #include <asm/mach-types.h> -#include <mach/hardware.h>  #include <linux/gpio.h> -#include <plat/mcbsp.h> +#include <linux/module.h> +#include <linux/platform_data/asoc-ti-mcbsp.h>  #include "omap-mcbsp.h" -#include "omap-pcm.h" -#include "../codecs/tlv320aic3x.h"  #define N810_HEADSET_AMP_GPIO	10  #define N810_SPEAKER_AMP_GPIO	101 @@ -56,7 +53,7 @@ static int n810_spk_func;  static int n810_jack_func;  static int n810_dmic_func; -static void n810_ext_control(struct snd_soc_codec *codec) +static void n810_ext_control(struct snd_soc_dapm_context *dapm)  {  	int hp = 0, line1l = 0; @@ -71,26 +68,30 @@ static void n810_ext_control(struct snd_soc_codec *codec)  		break;  	} +	snd_soc_dapm_mutex_lock(dapm); +  	if (n810_spk_func) -		snd_soc_dapm_enable_pin(codec, "Ext Spk"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "Ext Spk");  	else -		snd_soc_dapm_disable_pin(codec, "Ext Spk"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Ext Spk");  	if (hp) -		snd_soc_dapm_enable_pin(codec, "Headphone Jack"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "Headphone Jack");  	else -		snd_soc_dapm_disable_pin(codec, "Headphone Jack"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack");  	if (line1l) -		snd_soc_dapm_enable_pin(codec, "LINE1L"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "LINE1L");  	else -		snd_soc_dapm_disable_pin(codec, "LINE1L"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "LINE1L");  	if (n810_dmic_func) -		snd_soc_dapm_enable_pin(codec, "DMic"); +		snd_soc_dapm_enable_pin_unlocked(dapm, "DMic");  	else -		snd_soc_dapm_disable_pin(codec, "DMic"); +		snd_soc_dapm_disable_pin_unlocked(dapm, "DMic"); + +	snd_soc_dapm_sync_unlocked(dapm); -	snd_soc_dapm_sync(codec); +	snd_soc_dapm_mutex_unlock(dapm);  }  static int n810_startup(struct snd_pcm_substream *substream) @@ -102,13 +103,13 @@ static int n810_startup(struct snd_pcm_substream *substream)  	snd_pcm_hw_constraint_minmax(runtime,  				     SNDRV_PCM_HW_PARAM_CHANNELS, 2, 2); -	n810_ext_control(codec); -	return clk_enable(sys_clkout2); +	n810_ext_control(&codec->dapm); +	return clk_prepare_enable(sys_clkout2);  }  static void n810_shutdown(struct snd_pcm_substream *substream)  { -	clk_disable(sys_clkout2); +	clk_disable_unprepare(sys_clkout2);  }  static int n810_hw_params(struct snd_pcm_substream *substream, @@ -116,25 +117,8 @@ static int n810_hw_params(struct snd_pcm_substream *substream,  {  	struct snd_soc_pcm_runtime *rtd = substream->private_data;  	struct snd_soc_dai *codec_dai = rtd->codec_dai; -	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;  	int err; -	/* Set codec DAI configuration */ -	err = snd_soc_dai_set_fmt(codec_dai, -					 SND_SOC_DAIFMT_I2S | -					 SND_SOC_DAIFMT_NB_NF | -					 SND_SOC_DAIFMT_CBM_CFM); -	if (err < 0) -		return err; - -	/* Set cpu DAI configuration */ -	err = snd_soc_dai_set_fmt(cpu_dai, -				       SND_SOC_DAIFMT_I2S | -				       SND_SOC_DAIFMT_NB_NF | -				       SND_SOC_DAIFMT_CBM_CFM); -	if (err < 0) -		return err; -  	/* Set the codec system clock for DAC and ADC */  	err = snd_soc_dai_set_sysclk(codec_dai, 0, 12000000,  					    SND_SOC_CLOCK_IN); @@ -159,13 +143,13 @@ static int n810_get_spk(struct snd_kcontrol *kcontrol,  static int n810_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 (n810_spk_func == ucontrol->value.integer.value[0])  		return 0;  	n810_spk_func = ucontrol->value.integer.value[0]; -	n810_ext_control(codec); +	n810_ext_control(&card->dapm);  	return 1;  } @@ -181,13 +165,13 @@ static int n810_get_jack(struct snd_kcontrol *kcontrol,  static int n810_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 (n810_jack_func == ucontrol->value.integer.value[0])  		return 0;  	n810_jack_func = ucontrol->value.integer.value[0]; -	n810_ext_control(codec); +	n810_ext_control(&card->dapm);  	return 1;  } @@ -203,13 +187,13 @@ static int n810_get_input(struct snd_kcontrol *kcontrol,  static int n810_set_input(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 (n810_dmic_func == ucontrol->value.integer.value[0])  		return 0;  	n810_dmic_func = ucontrol->value.integer.value[0]; -	n810_ext_control(codec); +	n810_ext_control(&card->dapm);  	return 1;  } @@ -249,8 +233,8 @@ static const struct snd_soc_dapm_route audio_map[] = {  	{"Ext Spk", NULL, "LLOUT"},  	{"Ext Spk", NULL, "RLOUT"}, -	{"DMic Rate 64", NULL, "Mic Bias 2V"}, -	{"Mic Bias 2V", NULL, "DMic"}, +	{"DMic Rate 64", NULL, "Mic Bias"}, +	{"Mic Bias", NULL, "DMic"},  };  static const char *spk_function[] = {"Off", "On"}; @@ -274,32 +258,17 @@ static const struct snd_kcontrol_new aic33_n810_controls[] = {  static int n810_aic33_init(struct snd_soc_pcm_runtime *rtd)  {  	struct snd_soc_codec *codec = rtd->codec; -	int err; +	struct snd_soc_dapm_context *dapm = &codec->dapm;  	/* Not connected */ -	snd_soc_dapm_nc_pin(codec, "MONO_LOUT"); -	snd_soc_dapm_nc_pin(codec, "HPLCOM"); -	snd_soc_dapm_nc_pin(codec, "HPRCOM"); -	snd_soc_dapm_nc_pin(codec, "MIC3L"); -	snd_soc_dapm_nc_pin(codec, "MIC3R"); -	snd_soc_dapm_nc_pin(codec, "LINE1R"); -	snd_soc_dapm_nc_pin(codec, "LINE2L"); -	snd_soc_dapm_nc_pin(codec, "LINE2R"); - -	/* Add N810 specific controls */ -	err = snd_soc_add_controls(codec, aic33_n810_controls, -				ARRAY_SIZE(aic33_n810_controls)); -	if (err < 0) -		return err; - -	/* Add N810 specific widgets */ -	snd_soc_dapm_new_controls(codec, aic33_dapm_widgets, -				  ARRAY_SIZE(aic33_dapm_widgets)); - -	/* Set up N810 specific audio path audio_map */ -	snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map)); - -	snd_soc_dapm_sync(codec); +	snd_soc_dapm_nc_pin(dapm, "MONO_LOUT"); +	snd_soc_dapm_nc_pin(dapm, "HPLCOM"); +	snd_soc_dapm_nc_pin(dapm, "HPRCOM"); +	snd_soc_dapm_nc_pin(dapm, "MIC3L"); +	snd_soc_dapm_nc_pin(dapm, "MIC3R"); +	snd_soc_dapm_nc_pin(dapm, "LINE1R"); +	snd_soc_dapm_nc_pin(dapm, "LINE2L"); +	snd_soc_dapm_nc_pin(dapm, "LINE2R");  	return 0;  } @@ -308,10 +277,12 @@ static int n810_aic33_init(struct snd_soc_pcm_runtime *rtd)  static struct snd_soc_dai_link n810_dai = {  	.name = "TLV320AIC33",  	.stream_name = "AIC33", -	.cpu_dai_name = "omap-mcbsp-dai.1", -	.platform_name = "omap-pcm-audio", +	.cpu_dai_name = "omap-mcbsp.2", +	.platform_name = "omap-mcbsp.2",  	.codec_name = "tlv320aic3x-codec.2-0018",  	.codec_dai_name = "tlv320aic3x-hifi", +	.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | +		   SND_SOC_DAIFMT_CBM_CFM,  	.init = n810_aic33_init,  	.ops = &n810_ops,  }; @@ -319,8 +290,16 @@ static struct snd_soc_dai_link n810_dai = {  /* Audio machine driver */  static struct snd_soc_card snd_soc_n810 = {  	.name = "N810", +	.owner = THIS_MODULE,  	.dai_link = &n810_dai,  	.num_links = 1, + +	.controls = aic33_n810_controls, +	.num_controls = ARRAY_SIZE(aic33_n810_controls), +	.dapm_widgets = aic33_dapm_widgets, +	.num_dapm_widgets = ARRAY_SIZE(aic33_dapm_widgets), +	.dapm_routes = audio_map, +	.num_dapm_routes = ARRAY_SIZE(audio_map),  };  static struct platform_device *n810_snd_device; @@ -330,7 +309,9 @@ static int __init n810_soc_init(void)  	int err;  	struct device *dev; -	if (!(machine_is_nokia_n810() || machine_is_nokia_n810_wimax())) +	if (!of_have_populated_dt() || +	    (!of_machine_is_compatible("nokia,n810") && +	     !of_machine_is_compatible("nokia,n810-wimax")))  		return -ENODEV;  	n810_snd_device = platform_device_alloc("soc-audio", -1); @@ -369,8 +350,11 @@ static int __init n810_soc_init(void)  	clk_set_parent(sys_clkout2_src, func96m_clk);  	clk_set_rate(sys_clkout2, 12000000); -	BUG_ON((gpio_request(N810_HEADSET_AMP_GPIO, "hs_amp") < 0) || -	       (gpio_request(N810_SPEAKER_AMP_GPIO, "spk_amp") < 0)); +	if (WARN_ON((gpio_request(N810_HEADSET_AMP_GPIO, "hs_amp") < 0) || +		    (gpio_request(N810_SPEAKER_AMP_GPIO, "spk_amp") < 0))) { +		err = -EINVAL; +		goto err4; +	}  	gpio_direction_output(N810_HEADSET_AMP_GPIO, 0);  	gpio_direction_output(N810_SPEAKER_AMP_GPIO, 0); @@ -402,6 +386,6 @@ static void __exit n810_soc_exit(void)  module_init(n810_soc_init);  module_exit(n810_soc_exit); -MODULE_AUTHOR("Jarkko Nikula <jhnikula@gmail.com>"); +MODULE_AUTHOR("Jarkko Nikula <jarkko.nikula@bitmer.com>");  MODULE_DESCRIPTION("ALSA SoC Nokia N810");  MODULE_LICENSE("GPL");  | 
