diff options
Diffstat (limited to 'sound/soc/codecs/uda134x.c')
| -rw-r--r-- | sound/soc/codecs/uda134x.c | 135 | 
1 files changed, 69 insertions, 66 deletions
diff --git a/sound/soc/codecs/uda134x.c b/sound/soc/codecs/uda134x.c index 7540a509a6f..edf27acc1d7 100644 --- a/sound/soc/codecs/uda134x.c +++ b/sound/soc/codecs/uda134x.c @@ -19,7 +19,6 @@  #include <sound/pcm.h>  #include <sound/pcm_params.h>  #include <sound/soc.h> -#include <sound/soc-dapm.h>  #include <sound/initval.h>  #include <sound/uda134x.h> @@ -160,8 +159,7 @@ static int uda134x_mute(struct snd_soc_dai *dai, int mute)  static int uda134x_startup(struct snd_pcm_substream *substream,  	struct snd_soc_dai *dai)  { -	struct snd_soc_pcm_runtime *rtd = substream->private_data; -	struct snd_soc_codec *codec =rtd->codec; +	struct snd_soc_codec *codec = dai->codec;  	struct uda134x_priv *uda134x = snd_soc_codec_get_drvdata(codec);  	struct snd_pcm_runtime *master_runtime; @@ -192,8 +190,7 @@ static int uda134x_startup(struct snd_pcm_substream *substream,  static void uda134x_shutdown(struct snd_pcm_substream *substream,  	struct snd_soc_dai *dai)  { -	struct snd_soc_pcm_runtime *rtd = substream->private_data; -	struct snd_soc_codec *codec = rtd->codec; +	struct snd_soc_codec *codec = dai->codec;  	struct uda134x_priv *uda134x = snd_soc_codec_get_drvdata(codec);  	if (uda134x->master_substream == substream) @@ -206,8 +203,7 @@ static int uda134x_hw_params(struct snd_pcm_substream *substream,  	struct snd_pcm_hw_params *params,  	struct snd_soc_dai *dai)  { -	struct snd_soc_pcm_runtime *rtd = substream->private_data; -	struct snd_soc_codec *codec = rtd->codec; +	struct snd_soc_codec *codec = dai->codec;  	struct uda134x_priv *uda134x = snd_soc_codec_get_drvdata(codec);  	u8 hw_params; @@ -328,7 +324,6 @@ static int uda134x_set_dai_fmt(struct snd_soc_dai *codec_dai,  static int uda134x_set_bias_level(struct snd_soc_codec *codec,  				  enum snd_soc_bias_level level)  { -	u8 reg;  	struct uda134x_platform_data *pd = codec->control_data;  	int i;  	u8 *cache = codec->reg_cache; @@ -337,23 +332,6 @@ static int uda134x_set_bias_level(struct snd_soc_codec *codec,  	switch (level) {  	case SND_SOC_BIAS_ON: -		/* ADC, DAC on */ -		switch (pd->model) { -		case UDA134X_UDA1340: -		case UDA134X_UDA1344: -		case UDA134X_UDA1345: -			reg = uda134x_read_reg_cache(codec, UDA134X_DATA011); -			uda134x_write(codec, UDA134X_DATA011, reg | 0x03); -			break; -		case UDA134X_UDA1341: -			reg = uda134x_read_reg_cache(codec, UDA134X_STATUS1); -			uda134x_write(codec, UDA134X_STATUS1, reg | 0x03); -			break; -		default: -			printk(KERN_ERR "UDA134X SoC codec: " -			       "unsupported model %d\n", pd->model); -			return -EINVAL; -		}  		break;  	case SND_SOC_BIAS_PREPARE:  		/* power on */ @@ -365,23 +343,6 @@ static int uda134x_set_bias_level(struct snd_soc_codec *codec,  		}  		break;  	case SND_SOC_BIAS_STANDBY: -		/* ADC, DAC power off */ -		switch (pd->model) { -		case UDA134X_UDA1340: -		case UDA134X_UDA1344: -		case UDA134X_UDA1345: -			reg = uda134x_read_reg_cache(codec, UDA134X_DATA011); -			uda134x_write(codec, UDA134X_DATA011, reg & ~(0x03)); -			break; -		case UDA134X_UDA1341: -			reg = uda134x_read_reg_cache(codec, UDA134X_STATUS1); -			uda134x_write(codec, UDA134X_STATUS1, reg & ~(0x03)); -			break; -		default: -			printk(KERN_ERR "UDA134X SoC codec: " -			       "unsupported model %d\n", pd->model); -			return -EINVAL; -		}  		break;  	case SND_SOC_BIAS_OFF:  		/* power off */ @@ -389,7 +350,7 @@ static int uda134x_set_bias_level(struct snd_soc_codec *codec,  			pd->power(0);  		break;  	} -	codec->bias_level = level; +	codec->dapm.bias_level = level;  	return 0;  } @@ -453,7 +414,38 @@ SOC_ENUM("PCM Playback De-emphasis", uda134x_mixer_enum[1]),  SOC_SINGLE("DC Filter Enable Switch", UDA134X_STATUS0, 0, 1, 0),  }; -static struct snd_soc_dai_ops uda134x_dai_ops = { +/* UDA1341 has the DAC/ADC power down in STATUS1 */ +static const struct snd_soc_dapm_widget uda1341_dapm_widgets[] = { +	SND_SOC_DAPM_DAC("DAC", "Playback", UDA134X_STATUS1, 0, 0), +	SND_SOC_DAPM_ADC("ADC", "Capture", UDA134X_STATUS1, 1, 0), +}; + +/* UDA1340/4/5 has the DAC/ADC pwoer down in DATA0 11 */ +static const struct snd_soc_dapm_widget uda1340_dapm_widgets[] = { +	SND_SOC_DAPM_DAC("DAC", "Playback", UDA134X_DATA011, 0, 0), +	SND_SOC_DAPM_ADC("ADC", "Capture", UDA134X_DATA011, 1, 0), +}; + +/* Common DAPM widgets */ +static const struct snd_soc_dapm_widget uda134x_dapm_widgets[] = { +	SND_SOC_DAPM_INPUT("VINL1"), +	SND_SOC_DAPM_INPUT("VINR1"), +	SND_SOC_DAPM_INPUT("VINL2"), +	SND_SOC_DAPM_INPUT("VINR2"), +	SND_SOC_DAPM_OUTPUT("VOUTL"), +	SND_SOC_DAPM_OUTPUT("VOUTR"), +}; + +static const struct snd_soc_dapm_route uda134x_dapm_routes[] = { +	{ "ADC", NULL, "VINL1" }, +	{ "ADC", NULL, "VINR1" }, +	{ "ADC", NULL, "VINL2" }, +	{ "ADC", NULL, "VINR2" }, +	{ "VOUTL", NULL, "DAC" }, +	{ "VOUTR", NULL, "DAC" }, +}; + +static const struct snd_soc_dai_ops uda134x_dai_ops = {  	.startup	= uda134x_startup,  	.shutdown	= uda134x_shutdown,  	.hw_params	= uda134x_hw_params, @@ -487,7 +479,10 @@ static struct snd_soc_dai_driver uda134x_dai = {  static int uda134x_soc_probe(struct snd_soc_codec *codec)  {  	struct uda134x_priv *uda134x; -	struct uda134x_platform_data *pd = dev_get_drvdata(codec->card->dev); +	struct uda134x_platform_data *pd = codec->card->dev->platform_data; +	const struct snd_soc_dapm_widget *widgets; +	unsigned num_widgets; +  	int ret;  	printk(KERN_INFO "UDA134X SoC Audio Codec\n"); @@ -528,18 +523,34 @@ static int uda134x_soc_probe(struct snd_soc_codec *codec)  	else  		uda134x_set_bias_level(codec, SND_SOC_BIAS_STANDBY); +	if (pd->model == UDA134X_UDA1341) { +		widgets = uda1341_dapm_widgets; +		num_widgets = ARRAY_SIZE(uda1341_dapm_widgets); +	} else { +		widgets = uda1340_dapm_widgets; +		num_widgets = ARRAY_SIZE(uda1340_dapm_widgets); +	} + +	ret = snd_soc_dapm_new_controls(&codec->dapm, widgets, num_widgets); +	if (ret) { +		printk(KERN_ERR "%s failed to register dapm controls: %d", +			__func__, ret); +		kfree(uda134x); +		return ret; +	} +  	switch (pd->model) {  	case UDA134X_UDA1340:  	case UDA134X_UDA1344: -		ret = snd_soc_add_controls(codec, uda1340_snd_controls, +		ret = snd_soc_add_codec_controls(codec, uda1340_snd_controls,  					ARRAY_SIZE(uda1340_snd_controls));  	break;  	case UDA134X_UDA1341: -		ret = snd_soc_add_controls(codec, uda1341_snd_controls, +		ret = snd_soc_add_codec_controls(codec, uda1341_snd_controls,  					ARRAY_SIZE(uda1341_snd_controls));  	break;  	case UDA134X_UDA1345: -		ret = snd_soc_add_controls(codec, uda1345_snd_controls, +		ret = snd_soc_add_codec_controls(codec, uda1345_snd_controls,  					ARRAY_SIZE(uda1345_snd_controls));  	break;  	default: @@ -571,8 +582,7 @@ static int uda134x_soc_remove(struct snd_soc_codec *codec)  }  #if defined(CONFIG_PM) -static int uda134x_soc_suspend(struct snd_soc_codec *codec, -						pm_message_t state) +static int uda134x_soc_suspend(struct snd_soc_codec *codec)  {  	uda134x_set_bias_level(codec, SND_SOC_BIAS_STANDBY);  	uda134x_set_bias_level(codec, SND_SOC_BIAS_OFF); @@ -597,21 +607,24 @@ static struct snd_soc_codec_driver soc_codec_dev_uda134x = {  	.resume =       uda134x_soc_resume,  	.reg_cache_size = sizeof(uda134x_reg),  	.reg_word_size = sizeof(u8), +	.reg_cache_default = uda134x_reg,  	.reg_cache_step = 1,  	.read = uda134x_read_reg_cache,  	.write = uda134x_write, -#ifdef POWER_OFF_ON_STANDBY  	.set_bias_level = uda134x_set_bias_level, -#endif +	.dapm_widgets = uda134x_dapm_widgets, +	.num_dapm_widgets = ARRAY_SIZE(uda134x_dapm_widgets), +	.dapm_routes = uda134x_dapm_routes, +	.num_dapm_routes = ARRAY_SIZE(uda134x_dapm_routes),  }; -static int __devinit uda134x_codec_probe(struct platform_device *pdev) +static int uda134x_codec_probe(struct platform_device *pdev)  {  	return snd_soc_register_codec(&pdev->dev,  			&soc_codec_dev_uda134x, &uda134x_dai, 1);  } -static int __devexit uda134x_codec_remove(struct platform_device *pdev) +static int uda134x_codec_remove(struct platform_device *pdev)  {  	snd_soc_unregister_codec(&pdev->dev);  	return 0; @@ -623,20 +636,10 @@ static struct platform_driver uda134x_codec_driver = {  		.owner = THIS_MODULE,  	},  	.probe = uda134x_codec_probe, -	.remove = __devexit_p(uda134x_codec_remove), +	.remove = uda134x_codec_remove,  }; -static int __init uda134x_codec_init(void) -{ -	return platform_driver_register(&uda134x_codec_driver); -} -module_init(uda134x_codec_init); - -static void __exit uda134x_codec_exit(void) -{ -	platform_driver_unregister(&uda134x_codec_driver); -} -module_exit(uda134x_codec_exit); +module_platform_driver(uda134x_codec_driver);  MODULE_DESCRIPTION("UDA134X ALSA soc codec driver");  MODULE_AUTHOR("Zoltan Devai, Christian Pellegrin <chripell@evolware.org>");  | 
