Merge branch 'fix/hda' into topic/hda
[linux-2.6] / sound / soc / codecs / ad73311.c
1 /*
2  * ad73311.c  --  ALSA Soc AD73311 codec support
3  *
4  * Copyright:   Analog Device Inc.
5  * Author:      Cliff Cai <cliff.cai@analog.com>
6  *
7  *  This program is free software; you can redistribute  it and/or modify it
8  *  under  the terms of  the GNU General  Public License as published by the
9  *  Free Software Foundation;  either version 2 of the  License, or (at your
10  *  option) any later version.
11  *
12  *  Revision history
13  *    25th Sep 2008   Initial version.
14  */
15
16 #include <linux/init.h>
17 #include <linux/module.h>
18 #include <linux/version.h>
19 #include <linux/kernel.h>
20 #include <linux/device.h>
21 #include <sound/core.h>
22 #include <sound/pcm.h>
23 #include <sound/ac97_codec.h>
24 #include <sound/initval.h>
25 #include <sound/soc.h>
26
27 #include "ad73311.h"
28
29 struct snd_soc_dai ad73311_dai = {
30         .name = "AD73311",
31         .playback = {
32                 .stream_name = "Playback",
33                 .channels_min = 1,
34                 .channels_max = 1,
35                 .rates = SNDRV_PCM_RATE_8000,
36                 .formats = SNDRV_PCM_FMTBIT_S16_LE, },
37         .capture = {
38                 .stream_name = "Capture",
39                 .channels_min = 1,
40                 .channels_max = 1,
41                 .rates = SNDRV_PCM_RATE_8000,
42                 .formats = SNDRV_PCM_FMTBIT_S16_LE, },
43 };
44 EXPORT_SYMBOL_GPL(ad73311_dai);
45
46 static int ad73311_soc_probe(struct platform_device *pdev)
47 {
48         struct snd_soc_device *socdev = platform_get_drvdata(pdev);
49         struct snd_soc_codec *codec;
50         int ret = 0;
51
52         codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
53         if (codec == NULL)
54                 return -ENOMEM;
55         mutex_init(&codec->mutex);
56         codec->name = "AD73311";
57         codec->owner = THIS_MODULE;
58         codec->dai = &ad73311_dai;
59         codec->num_dai = 1;
60         socdev->codec = codec;
61         INIT_LIST_HEAD(&codec->dapm_widgets);
62         INIT_LIST_HEAD(&codec->dapm_paths);
63
64         /* register pcms */
65         ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
66         if (ret < 0) {
67                 printk(KERN_ERR "ad73311: failed to create pcms\n");
68                 goto pcm_err;
69         }
70
71         ret = snd_soc_register_card(socdev);
72         if (ret < 0) {
73                 printk(KERN_ERR "ad73311: failed to register card\n");
74                 goto register_err;
75         }
76
77         return ret;
78
79 register_err:
80         snd_soc_free_pcms(socdev);
81 pcm_err:
82         kfree(socdev->codec);
83         socdev->codec = NULL;
84         return ret;
85 }
86
87 static int ad73311_soc_remove(struct platform_device *pdev)
88 {
89         struct snd_soc_device *socdev = platform_get_drvdata(pdev);
90         struct snd_soc_codec *codec = socdev->codec;
91
92         if (codec == NULL)
93                 return 0;
94         snd_soc_free_pcms(socdev);
95         kfree(codec);
96         return 0;
97 }
98
99 struct snd_soc_codec_device soc_codec_dev_ad73311 = {
100         .probe =        ad73311_soc_probe,
101         .remove =       ad73311_soc_remove,
102 };
103 EXPORT_SYMBOL_GPL(soc_codec_dev_ad73311);
104
105 MODULE_DESCRIPTION("ASoC ad73311 driver");
106 MODULE_AUTHOR("Cliff Cai ");
107 MODULE_LICENSE("GPL");