diff options
Diffstat (limited to 'sound/soc/codecs/ad193x.c')
| -rw-r--r-- | sound/soc/codecs/ad193x.c | 164 | 
1 files changed, 23 insertions, 141 deletions
diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c index aea7e52cf71..6844d0b2af6 100644 --- a/sound/soc/codecs/ad193x.c +++ b/sound/soc/codecs/ad193x.c @@ -6,12 +6,10 @@   * Licensed under the GPL-2 or later.   */ -#include <linux/init.h>  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/device.h> -#include <linux/i2c.h> -#include <linux/spi/spi.h> +#include <linux/regmap.h>  #include <linux/slab.h>  #include <sound/core.h>  #include <sound/pcm.h> @@ -19,6 +17,7 @@  #include <sound/initval.h>  #include <sound/soc.h>  #include <sound/tlv.h> +  #include "ad193x.h"  /* codec private data */ @@ -32,8 +31,8 @@ struct ad193x_priv {   */  static const char * const ad193x_deemp[] = {"None", "48kHz", "44.1kHz", "32kHz"}; -static const struct soc_enum ad193x_deemp_enum = -	SOC_ENUM_SINGLE(AD193X_DAC_CTRL2, 1, 4, ad193x_deemp); +static SOC_ENUM_SINGLE_DECL(ad193x_deemp_enum, AD193X_DAC_CTRL2, 1, +			    ad193x_deemp);  static const DECLARE_TLV_DB_MINMAX(adau193x_tlv, -9563, 0); @@ -249,15 +248,15 @@ static int ad193x_hw_params(struct snd_pcm_substream *substream,  	struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(codec);  	/* bit size */ -	switch (params_format(params)) { -	case SNDRV_PCM_FORMAT_S16_LE: +	switch (params_width(params)) { +	case 16:  		word_len = 3;  		break; -	case SNDRV_PCM_FORMAT_S20_3LE: +	case 20:  		word_len = 1;  		break; -	case SNDRV_PCM_FORMAT_S24_LE: -	case SNDRV_PCM_FORMAT_S32_LE: +	case 24: +	case 32:  		word_len = 0;  		break;  	} @@ -320,17 +319,9 @@ static struct snd_soc_dai_driver ad193x_dai = {  	.ops = &ad193x_dai_ops,  }; -static int ad193x_probe(struct snd_soc_codec *codec) +static int ad193x_codec_probe(struct snd_soc_codec *codec)  {  	struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(codec); -	int ret; - -	codec->control_data = ad193x->regmap; -	ret = snd_soc_codec_set_cache_io(codec, 0, 0, SND_SOC_REGMAP); -	if (ret < 0) { -		dev_err(codec->dev, "failed to set cache I/O: %d\n", ret); -		return ret; -	}  	/* default setting for ad193x */ @@ -348,11 +339,11 @@ static int ad193x_probe(struct snd_soc_codec *codec)  	regmap_write(ad193x->regmap, AD193X_PLL_CLK_CTRL0, 0x99); /* mclk=24.576Mhz: 0x9D; mclk=12.288Mhz: 0x99 */  	regmap_write(ad193x->regmap, AD193X_PLL_CLK_CTRL1, 0x04); -	return ret; +	return 0;  }  static struct snd_soc_codec_driver soc_codec_dev_ad193x = { -	.probe = 	ad193x_probe, +	.probe = ad193x_codec_probe,  	.controls = ad193x_snd_controls,  	.num_controls = ARRAY_SIZE(ad193x_snd_controls),  	.dapm_widgets = ad193x_dapm_widgets, @@ -366,140 +357,31 @@ static bool adau193x_reg_volatile(struct device *dev, unsigned int reg)  	return false;  } -#if defined(CONFIG_SPI_MASTER) - -static const struct regmap_config ad193x_spi_regmap_config = { -	.val_bits = 8, -	.reg_bits = 16, -	.read_flag_mask = 0x09, -	.write_flag_mask = 0x08, - +const struct regmap_config ad193x_regmap_config = {  	.max_register = AD193X_NUM_REGS - 1,  	.volatile_reg = adau193x_reg_volatile,  }; +EXPORT_SYMBOL_GPL(ad193x_regmap_config); -static int ad193x_spi_probe(struct spi_device *spi) +int ad193x_probe(struct device *dev, struct regmap *regmap)  {  	struct ad193x_priv *ad193x; -	ad193x = devm_kzalloc(&spi->dev, sizeof(struct ad193x_priv), -			      GFP_KERNEL); -	if (ad193x == NULL) -		return -ENOMEM; - -	ad193x->regmap = devm_regmap_init_spi(spi, &ad193x_spi_regmap_config); -	if (IS_ERR(ad193x->regmap)) -		return PTR_ERR(ad193x->regmap); - -	spi_set_drvdata(spi, ad193x); - -	return snd_soc_register_codec(&spi->dev, &soc_codec_dev_ad193x, -			&ad193x_dai, 1); -} +	if (IS_ERR(regmap)) +		return PTR_ERR(regmap); -static int ad193x_spi_remove(struct spi_device *spi) -{ -	snd_soc_unregister_codec(&spi->dev); -	return 0; -} - -static struct spi_driver ad193x_spi_driver = { -	.driver = { -		.name	= "ad193x", -		.owner	= THIS_MODULE, -	}, -	.probe		= ad193x_spi_probe, -	.remove		= ad193x_spi_remove, -}; -#endif - -#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) - -static const struct regmap_config ad193x_i2c_regmap_config = { -	.val_bits = 8, -	.reg_bits = 8, - -	.max_register = AD193X_NUM_REGS - 1, -	.volatile_reg = adau193x_reg_volatile, -}; - -static const struct i2c_device_id ad193x_id[] = { -	{ "ad1936", 0 }, -	{ "ad1937", 0 }, -	{ } -}; -MODULE_DEVICE_TABLE(i2c, ad193x_id); - -static int ad193x_i2c_probe(struct i2c_client *client, -			    const struct i2c_device_id *id) -{ -	struct ad193x_priv *ad193x; - -	ad193x = devm_kzalloc(&client->dev, sizeof(struct ad193x_priv), -			      GFP_KERNEL); +	ad193x = devm_kzalloc(dev, sizeof(*ad193x), GFP_KERNEL);  	if (ad193x == NULL)  		return -ENOMEM; -	ad193x->regmap = devm_regmap_init_i2c(client, &ad193x_i2c_regmap_config); -	if (IS_ERR(ad193x->regmap)) -		return PTR_ERR(ad193x->regmap); - -	i2c_set_clientdata(client, ad193x); - -	return snd_soc_register_codec(&client->dev, &soc_codec_dev_ad193x, -			&ad193x_dai, 1); -} - -static int ad193x_i2c_remove(struct i2c_client *client) -{ -	snd_soc_unregister_codec(&client->dev); -	return 0; -} - -static struct i2c_driver ad193x_i2c_driver = { -	.driver = { -		.name = "ad193x", -	}, -	.probe    = ad193x_i2c_probe, -	.remove   = ad193x_i2c_remove, -	.id_table = ad193x_id, -}; -#endif - -static int __init ad193x_modinit(void) -{ -	int ret; - -#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) -	ret =  i2c_add_driver(&ad193x_i2c_driver); -	if (ret != 0) { -		printk(KERN_ERR "Failed to register AD193X I2C driver: %d\n", -				ret); -	} -#endif - -#if defined(CONFIG_SPI_MASTER) -	ret = spi_register_driver(&ad193x_spi_driver); -	if (ret != 0) { -		printk(KERN_ERR "Failed to register AD193X SPI driver: %d\n", -				ret); -	} -#endif -	return ret; -} -module_init(ad193x_modinit); +	ad193x->regmap = regmap; -static void __exit ad193x_modexit(void) -{ -#if defined(CONFIG_SPI_MASTER) -	spi_unregister_driver(&ad193x_spi_driver); -#endif +	dev_set_drvdata(dev, ad193x); -#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) -	i2c_del_driver(&ad193x_i2c_driver); -#endif +	return snd_soc_register_codec(dev, &soc_codec_dev_ad193x, +		&ad193x_dai, 1);  } -module_exit(ad193x_modexit); +EXPORT_SYMBOL_GPL(ad193x_probe);  MODULE_DESCRIPTION("ASoC ad193x driver");  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");  | 
