/* * ad73311.c -- ALSA Soc AD73311 codec support * * Copyright: Analog Device Inc. * Author: Cliff Cai * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. */ #include #include #include #include #include #include #include #include #include #include "ad73311.h" struct snd_soc_dai ad73311_dai = { .name = "AD73311", .playback = { .stream_name = "Playback", .channels_min = 1, .channels_max = 1, .rates = SNDRV_PCM_RATE_8000, .formats = SNDRV_PCM_FMTBIT_S16_LE, }, .capture = { .stream_name = "Capture", .channels_min = 1, .channels_max = 1, .rates = SNDRV_PCM_RATE_8000, .formats = SNDRV_PCM_FMTBIT_S16_LE, }, }; EXPORT_SYMBOL_GPL(ad73311_dai); static int ad73311_soc_probe(struct platform_device *pdev) { struct snd_soc_device *socdev = platform_get_drvdata(pdev); struct snd_soc_codec *codec; int ret = 0; codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); if (codec == NULL) return -ENOMEM; mutex_init(&codec->mutex); codec->name = "AD73311"; codec->owner = THIS_MODULE; codec->dai = &ad73311_dai; codec->num_dai = 1; socdev->card->codec = codec; INIT_LIST_HEAD(&codec->dapm_widgets); INIT_LIST_HEAD(&codec->dapm_paths); /* register pcms */ ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); if (ret < 0) { printk(KERN_ERR "ad73311: failed to create pcms\n"); goto pcm_err; } ret = snd_soc_init_card(socdev); if (ret < 0) { printk(KERN_ERR "ad73311: failed to register card\n"); goto register_err; } return ret; register_err: snd_soc_free_pcms(socdev); pcm_err: kfree(socdev->card->codec); socdev->card->codec = NULL; return ret; } static int ad73311_soc_remove(struct platform_device *pdev) { struct snd_soc_device *socdev = platform_get_drvdata(pdev); struct snd_soc_codec *codec = socdev->card->codec; if (codec == NULL) return 0; snd_soc_free_pcms(socdev); kfree(codec); return 0; } struct snd_soc_codec_device soc_codec_dev_ad73311 = { .probe = ad73311_soc_probe, .remove = ad73311_soc_remove, }; EXPORT_SYMBOL_GPL(soc_codec_dev_ad73311); static int __init ad73311_init(void) { return snd_soc_register_dai(&ad73311_dai); } module_init(ad73311_init); static void __exit ad73311_exit(void) { snd_soc_unregister_dai(&ad73311_dai); } module_exit(ad73311_exit); MODULE_DESCRIPTION("ASoC ad73311 driver"); MODULE_AUTHOR("Cliff Cai "); MODULE_LICENSE("GPL");