diff options
Diffstat (limited to 'sound/soc/codecs/ak4671.c')
| -rw-r--r-- | sound/soc/codecs/ak4671.c | 141 | 
1 files changed, 30 insertions, 111 deletions
diff --git a/sound/soc/codecs/ak4671.c b/sound/soc/codecs/ak4671.c index 87566932a3b..239f0562003 100644 --- a/sound/soc/codecs/ak4671.c +++ b/sound/soc/codecs/ak4671.c @@ -23,11 +23,11 @@  #include "ak4671.h" -static struct snd_soc_codec *ak4671_codec;  /* codec private data */  struct ak4671_priv { -	struct snd_soc_codec codec; +	enum snd_soc_control_type control_type; +	void *control_data;  	u8 reg_cache[AK4671_CACHEREGNUM];  }; @@ -619,8 +619,8 @@ static struct snd_soc_dai_ops ak4671_dai_ops = {  	.set_fmt	= ak4671_set_dai_fmt,  }; -struct snd_soc_dai ak4671_dai = { -	.name = "AK4671", +static struct snd_soc_dai_driver ak4671_dai = { +	.name = "ak4671-hifi",  	.playback = {  		.stream_name = "Playback",  		.channels_min = 1, @@ -635,27 +635,19 @@ struct snd_soc_dai ak4671_dai = {  		.formats = AK4671_FORMATS,},  	.ops = &ak4671_dai_ops,  }; -EXPORT_SYMBOL_GPL(ak4671_dai); -static int ak4671_probe(struct platform_device *pdev) +static int ak4671_probe(struct snd_soc_codec *codec)  { -	struct snd_soc_device *socdev = platform_get_drvdata(pdev); -	struct snd_soc_codec *codec; -	int ret = 0; - -	if (ak4671_codec == NULL) { -		dev_err(&pdev->dev, "Codec device not registered\n"); -		return -ENODEV; -	} +	struct ak4671_priv *ak4671 = snd_soc_codec_get_drvdata(codec); +	int ret; -	socdev->card->codec = ak4671_codec; -	codec = ak4671_codec; +	codec->hw_write = (hw_write_t)i2c_master_send; +	codec->bias_level = SND_SOC_BIAS_OFF; -	/* register pcms */ -	ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); +	ret = snd_soc_codec_set_cache_io(codec, 8, 8, ak4671->control_type);  	if (ret < 0) { -		dev_err(codec->dev, "failed to create pcms: %d\n", ret); -		goto pcm_err; +		dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); +		return ret;  	}  	snd_soc_add_controls(codec, ak4671_snd_controls, @@ -665,121 +657,48 @@ static int ak4671_probe(struct platform_device *pdev)  	ak4671_set_bias_level(codec, SND_SOC_BIAS_STANDBY);  	return ret; - -pcm_err: -	return ret;  } -static int ak4671_remove(struct platform_device *pdev) +static int ak4671_remove(struct snd_soc_codec *codec)  { -	struct snd_soc_device *socdev = platform_get_drvdata(pdev); - -	snd_soc_free_pcms(socdev); -	snd_soc_dapm_free(socdev); - +	ak4671_set_bias_level(codec, SND_SOC_BIAS_OFF);  	return 0;  } -struct snd_soc_codec_device soc_codec_dev_ak4671 = { +static struct snd_soc_codec_driver soc_codec_dev_ak4671 = {  	.probe = ak4671_probe,  	.remove = ak4671_remove, +	.set_bias_level = ak4671_set_bias_level, +	.reg_cache_size = AK4671_CACHEREGNUM, +	.reg_word_size = sizeof(u8), +	.reg_cache_default = ak4671_reg,  }; -EXPORT_SYMBOL_GPL(soc_codec_dev_ak4671); - -static int ak4671_register(struct ak4671_priv *ak4671, -		enum snd_soc_control_type control) -{ -	int ret; -	struct snd_soc_codec *codec = &ak4671->codec; - -	if (ak4671_codec) { -		dev_err(codec->dev, "Another AK4671 is registered\n"); -		ret = -EINVAL; -		goto err; -	} - -	mutex_init(&codec->mutex); -	INIT_LIST_HEAD(&codec->dapm_widgets); -	INIT_LIST_HEAD(&codec->dapm_paths); - -	snd_soc_codec_set_drvdata(codec,  ak4671); -	codec->name = "AK4671"; -	codec->owner = THIS_MODULE; -	codec->bias_level = SND_SOC_BIAS_OFF; -	codec->set_bias_level = ak4671_set_bias_level; -	codec->dai = &ak4671_dai; -	codec->num_dai = 1; -	codec->reg_cache_size = AK4671_CACHEREGNUM; -	codec->reg_cache = &ak4671->reg_cache; - -	memcpy(codec->reg_cache, ak4671_reg, sizeof(ak4671_reg)); - -	ret = snd_soc_codec_set_cache_io(codec, 8, 8, control); -	if (ret < 0) { -		dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); -		goto err; -	} - -	ak4671_dai.dev = codec->dev; -	ak4671_codec = codec; - -	ret = snd_soc_register_codec(codec); -	if (ret != 0) { -		dev_err(codec->dev, "Failed to register codec: %d\n", ret); -		goto err; -	} - -	ret = snd_soc_register_dai(&ak4671_dai); -	if (ret != 0) { -		dev_err(codec->dev, "Failed to register DAI: %d\n", ret); -		goto err_codec; -	} - -	return 0; - -err_codec: -	snd_soc_unregister_codec(codec); -err: -	kfree(ak4671); -	return ret; -} - -static void ak4671_unregister(struct ak4671_priv *ak4671) -{ -	ak4671_set_bias_level(&ak4671->codec, SND_SOC_BIAS_OFF); -	snd_soc_unregister_dai(&ak4671_dai); -	snd_soc_unregister_codec(&ak4671->codec); -	kfree(ak4671); -	ak4671_codec = NULL; -}  static int __devinit ak4671_i2c_probe(struct i2c_client *client,  		const struct i2c_device_id *id)  {  	struct ak4671_priv *ak4671; -	struct snd_soc_codec *codec; +	int ret;  	ak4671 = kzalloc(sizeof(struct ak4671_priv), GFP_KERNEL);  	if (ak4671 == NULL)  		return -ENOMEM; -	codec = &ak4671->codec; -	codec->hw_write = (hw_write_t)i2c_master_send; -  	i2c_set_clientdata(client, ak4671); -	codec->control_data = client; - -	codec->dev = &client->dev; +	ak4671->control_data = client; +	ak4671->control_type = SND_SOC_I2C; -	return ak4671_register(ak4671, SND_SOC_I2C); +	ret = snd_soc_register_codec(&client->dev, +			&soc_codec_dev_ak4671, &ak4671_dai, 1); +	if (ret < 0) +		kfree(ak4671); +	return ret;  }  static __devexit int ak4671_i2c_remove(struct i2c_client *client)  { -	struct ak4671_priv *ak4671 = i2c_get_clientdata(client); - -	ak4671_unregister(ak4671); - +	snd_soc_unregister_codec(&client->dev); +	kfree(i2c_get_clientdata(client));  	return 0;  } @@ -791,7 +710,7 @@ MODULE_DEVICE_TABLE(i2c, ak4671_i2c_id);  static struct i2c_driver ak4671_i2c_driver = {  	.driver = { -		.name = "ak4671", +		.name = "ak4671-codec",  		.owner = THIS_MODULE,  	},  	.probe = ak4671_i2c_probe,  |