diff options
Diffstat (limited to 'sound/soc/codecs/wm8727.c')
-rw-r--r-- | sound/soc/codecs/wm8727.c | 106 |
1 files changed, 10 insertions, 96 deletions
diff --git a/sound/soc/codecs/wm8727.c b/sound/soc/codecs/wm8727.c index 9d1df2628136..6a40080ba701 100644 --- a/sound/soc/codecs/wm8727.c +++ b/sound/soc/codecs/wm8727.c | |||
@@ -23,7 +23,6 @@ | |||
23 | #include <sound/initval.h> | 23 | #include <sound/initval.h> |
24 | #include <sound/soc.h> | 24 | #include <sound/soc.h> |
25 | 25 | ||
26 | #include "wm8727.h" | ||
27 | /* | 26 | /* |
28 | * Note this is a simple chip with no configuration interface, sample rate is | 27 | * Note this is a simple chip with no configuration interface, sample rate is |
29 | * determined automatically by examining the Master clock and Bit clock ratios | 28 | * determined automatically by examining the Master clock and Bit clock ratios |
@@ -33,8 +32,8 @@ | |||
33 | SNDRV_PCM_RATE_192000) | 32 | SNDRV_PCM_RATE_192000) |
34 | 33 | ||
35 | 34 | ||
36 | struct snd_soc_dai wm8727_dai = { | 35 | static struct snd_soc_dai_driver wm8727_dai = { |
37 | .name = "WM8727", | 36 | .name = "wm8727-hifi", |
38 | .playback = { | 37 | .playback = { |
39 | .stream_name = "Playback", | 38 | .stream_name = "Playback", |
40 | .channels_min = 2, | 39 | .channels_min = 2, |
@@ -43,103 +42,18 @@ struct snd_soc_dai wm8727_dai = { | |||
43 | .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE, | 42 | .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE, |
44 | }, | 43 | }, |
45 | }; | 44 | }; |
46 | EXPORT_SYMBOL_GPL(wm8727_dai); | ||
47 | 45 | ||
48 | static struct snd_soc_codec *wm8727_codec; | 46 | struct snd_soc_codec_driver soc_codec_dev_wm8727; |
49 | 47 | ||
50 | static int wm8727_soc_probe(struct platform_device *pdev) | 48 | static __devinit int wm8727_probe(struct platform_device *pdev) |
51 | { | 49 | { |
52 | struct snd_soc_device *socdev = platform_get_drvdata(pdev); | 50 | return snd_soc_register_codec(&pdev->dev, |
53 | int ret = 0; | 51 | &soc_codec_dev_wm8727, &wm8727_dai, 1); |
54 | |||
55 | BUG_ON(!wm8727_codec); | ||
56 | |||
57 | socdev->card->codec = wm8727_codec; | ||
58 | |||
59 | /* register pcms */ | ||
60 | ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); | ||
61 | if (ret < 0) { | ||
62 | printk(KERN_ERR "wm8727: failed to create pcms\n"); | ||
63 | goto pcm_err; | ||
64 | } | ||
65 | |||
66 | return ret; | ||
67 | |||
68 | pcm_err: | ||
69 | kfree(socdev->card->codec); | ||
70 | socdev->card->codec = NULL; | ||
71 | return ret; | ||
72 | } | ||
73 | |||
74 | static int wm8727_soc_remove(struct platform_device *pdev) | ||
75 | { | ||
76 | struct snd_soc_device *socdev = platform_get_drvdata(pdev); | ||
77 | |||
78 | snd_soc_free_pcms(socdev); | ||
79 | |||
80 | return 0; | ||
81 | } | ||
82 | |||
83 | struct snd_soc_codec_device soc_codec_dev_wm8727 = { | ||
84 | .probe = wm8727_soc_probe, | ||
85 | .remove = wm8727_soc_remove, | ||
86 | }; | ||
87 | EXPORT_SYMBOL_GPL(soc_codec_dev_wm8727); | ||
88 | |||
89 | |||
90 | static __devinit int wm8727_platform_probe(struct platform_device *pdev) | ||
91 | { | ||
92 | struct snd_soc_codec *codec; | ||
93 | int ret; | ||
94 | |||
95 | if (wm8727_codec) { | ||
96 | dev_err(&pdev->dev, "Another WM8727 is registered\n"); | ||
97 | return -EBUSY; | ||
98 | } | ||
99 | |||
100 | codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); | ||
101 | if (codec == NULL) | ||
102 | return -ENOMEM; | ||
103 | wm8727_codec = codec; | ||
104 | |||
105 | platform_set_drvdata(pdev, codec); | ||
106 | |||
107 | mutex_init(&codec->mutex); | ||
108 | codec->dev = &pdev->dev; | ||
109 | codec->name = "WM8727"; | ||
110 | codec->owner = THIS_MODULE; | ||
111 | codec->dai = &wm8727_dai; | ||
112 | codec->num_dai = 1; | ||
113 | INIT_LIST_HEAD(&codec->dapm_widgets); | ||
114 | INIT_LIST_HEAD(&codec->dapm_paths); | ||
115 | |||
116 | wm8727_dai.dev = &pdev->dev; | ||
117 | |||
118 | ret = snd_soc_register_codec(codec); | ||
119 | if (ret != 0) { | ||
120 | dev_err(&pdev->dev, "Failed to register CODEC: %d\n", ret); | ||
121 | goto err; | ||
122 | } | ||
123 | |||
124 | ret = snd_soc_register_dai(&wm8727_dai); | ||
125 | if (ret != 0) { | ||
126 | dev_err(&pdev->dev, "Failed to register DAI: %d\n", ret); | ||
127 | goto err_codec; | ||
128 | } | ||
129 | |||
130 | return 0; | ||
131 | |||
132 | err_codec: | ||
133 | snd_soc_unregister_codec(codec); | ||
134 | err: | ||
135 | kfree(codec); | ||
136 | return ret; | ||
137 | } | 52 | } |
138 | 53 | ||
139 | static int __devexit wm8727_platform_remove(struct platform_device *pdev) | 54 | static int __devexit wm8727_remove(struct platform_device *pdev) |
140 | { | 55 | { |
141 | snd_soc_unregister_dai(&wm8727_dai); | 56 | snd_soc_unregister_codec(&pdev->dev); |
142 | snd_soc_unregister_codec(platform_get_drvdata(pdev)); | ||
143 | return 0; | 57 | return 0; |
144 | } | 58 | } |
145 | 59 | ||
@@ -149,8 +63,8 @@ static struct platform_driver wm8727_codec_driver = { | |||
149 | .owner = THIS_MODULE, | 63 | .owner = THIS_MODULE, |
150 | }, | 64 | }, |
151 | 65 | ||
152 | .probe = wm8727_platform_probe, | 66 | .probe = wm8727_probe, |
153 | .remove = __devexit_p(wm8727_platform_remove), | 67 | .remove = __devexit_p(wm8727_remove), |
154 | }; | 68 | }; |
155 | 69 | ||
156 | static int __init wm8727_init(void) | 70 | static int __init wm8727_init(void) |