blob: 3fc176387351d522babcdcab5750d4fd3ca6ba5c [file] [log] [blame]
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +02001/*
2 * Driver for ADAU1701 SigmaDSP processor
3 *
4 * Copyright 2011 Analog Devices Inc.
5 * Author: Lars-Peter Clausen <lars@metafoo.de>
6 * based on an inital version by Cliff Cai <cliff.cai@analog.com>
7 *
8 * Licensed under the GPL-2 or later.
9 */
10
11#include <linux/module.h>
12#include <linux/init.h>
13#include <linux/i2c.h>
14#include <linux/delay.h>
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +020015#include <linux/slab.h>
Daniel Mack04561ea2013-05-23 15:46:05 +020016#include <linux/of.h>
17#include <linux/of_gpio.h>
18#include <linux/of_device.h>
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +020019#include <sound/core.h>
20#include <sound/pcm.h>
21#include <sound/pcm_params.h>
22#include <sound/soc.h>
23
Lars-Peter Clausen40216ce2011-11-28 09:44:17 +010024#include "sigmadsp.h"
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +020025#include "adau1701.h"
26
27#define ADAU1701_DSPCTRL 0x1c
28#define ADAU1701_SEROCTL 0x1e
29#define ADAU1701_SERICTL 0x1f
30
31#define ADAU1701_AUXNPOW 0x22
32
33#define ADAU1701_OSCIPOW 0x26
34#define ADAU1701_DACSET 0x27
35
36#define ADAU1701_NUM_REGS 0x28
37
38#define ADAU1701_DSPCTRL_CR (1 << 2)
39#define ADAU1701_DSPCTRL_DAM (1 << 3)
40#define ADAU1701_DSPCTRL_ADM (1 << 4)
41#define ADAU1701_DSPCTRL_SR_48 0x00
42#define ADAU1701_DSPCTRL_SR_96 0x01
43#define ADAU1701_DSPCTRL_SR_192 0x02
44#define ADAU1701_DSPCTRL_SR_MASK 0x03
45
46#define ADAU1701_SEROCTL_INV_LRCLK 0x2000
47#define ADAU1701_SEROCTL_INV_BCLK 0x1000
48#define ADAU1701_SEROCTL_MASTER 0x0800
49
50#define ADAU1701_SEROCTL_OBF16 0x0000
51#define ADAU1701_SEROCTL_OBF8 0x0200
52#define ADAU1701_SEROCTL_OBF4 0x0400
53#define ADAU1701_SEROCTL_OBF2 0x0600
54#define ADAU1701_SEROCTL_OBF_MASK 0x0600
55
56#define ADAU1701_SEROCTL_OLF1024 0x0000
57#define ADAU1701_SEROCTL_OLF512 0x0080
58#define ADAU1701_SEROCTL_OLF256 0x0100
59#define ADAU1701_SEROCTL_OLF_MASK 0x0180
60
61#define ADAU1701_SEROCTL_MSB_DEALY1 0x0000
62#define ADAU1701_SEROCTL_MSB_DEALY0 0x0004
63#define ADAU1701_SEROCTL_MSB_DEALY8 0x0008
64#define ADAU1701_SEROCTL_MSB_DEALY12 0x000c
65#define ADAU1701_SEROCTL_MSB_DEALY16 0x0010
66#define ADAU1701_SEROCTL_MSB_DEALY_MASK 0x001c
67
68#define ADAU1701_SEROCTL_WORD_LEN_24 0x0000
69#define ADAU1701_SEROCTL_WORD_LEN_20 0x0001
70#define ADAU1701_SEROCTL_WORD_LEN_16 0x0010
71#define ADAU1701_SEROCTL_WORD_LEN_MASK 0x0003
72
73#define ADAU1701_AUXNPOW_VBPD 0x40
74#define ADAU1701_AUXNPOW_VRPD 0x20
75
76#define ADAU1701_SERICTL_I2S 0
77#define ADAU1701_SERICTL_LEFTJ 1
78#define ADAU1701_SERICTL_TDM 2
79#define ADAU1701_SERICTL_RIGHTJ_24 3
80#define ADAU1701_SERICTL_RIGHTJ_20 4
81#define ADAU1701_SERICTL_RIGHTJ_18 5
82#define ADAU1701_SERICTL_RIGHTJ_16 6
83#define ADAU1701_SERICTL_MODE_MASK 7
84#define ADAU1701_SERICTL_INV_BCLK BIT(3)
85#define ADAU1701_SERICTL_INV_LRCLK BIT(4)
86
87#define ADAU1701_OSCIPOW_OPD 0x04
88#define ADAU1701_DACSET_DACINIT 1
89
90#define ADAU1701_FIRMWARE "adau1701.bin"
91
92struct adau1701 {
93 unsigned int dai_fmt;
94};
95
96static const struct snd_kcontrol_new adau1701_controls[] = {
97 SOC_SINGLE("Master Capture Switch", ADAU1701_DSPCTRL, 4, 1, 0),
98};
99
100static const struct snd_soc_dapm_widget adau1701_dapm_widgets[] = {
101 SND_SOC_DAPM_DAC("DAC0", "Playback", ADAU1701_AUXNPOW, 3, 1),
102 SND_SOC_DAPM_DAC("DAC1", "Playback", ADAU1701_AUXNPOW, 2, 1),
103 SND_SOC_DAPM_DAC("DAC2", "Playback", ADAU1701_AUXNPOW, 1, 1),
104 SND_SOC_DAPM_DAC("DAC3", "Playback", ADAU1701_AUXNPOW, 0, 1),
105 SND_SOC_DAPM_ADC("ADC", "Capture", ADAU1701_AUXNPOW, 7, 1),
106
107 SND_SOC_DAPM_OUTPUT("OUT0"),
108 SND_SOC_DAPM_OUTPUT("OUT1"),
109 SND_SOC_DAPM_OUTPUT("OUT2"),
110 SND_SOC_DAPM_OUTPUT("OUT3"),
111 SND_SOC_DAPM_INPUT("IN0"),
112 SND_SOC_DAPM_INPUT("IN1"),
113};
114
115static const struct snd_soc_dapm_route adau1701_dapm_routes[] = {
116 { "OUT0", NULL, "DAC0" },
117 { "OUT1", NULL, "DAC1" },
118 { "OUT2", NULL, "DAC2" },
119 { "OUT3", NULL, "DAC3" },
120
121 { "ADC", NULL, "IN0" },
122 { "ADC", NULL, "IN1" },
123};
124
125static unsigned int adau1701_register_size(struct snd_soc_codec *codec,
126 unsigned int reg)
127{
128 switch (reg) {
129 case ADAU1701_DSPCTRL:
130 case ADAU1701_SEROCTL:
131 case ADAU1701_AUXNPOW:
132 case ADAU1701_OSCIPOW:
133 case ADAU1701_DACSET:
134 return 2;
135 case ADAU1701_SERICTL:
136 return 1;
137 }
138
139 dev_err(codec->dev, "Unsupported register address: %d\n", reg);
140 return 0;
141}
142
143static int adau1701_write(struct snd_soc_codec *codec, unsigned int reg,
144 unsigned int value)
145{
Dan Carpenterc2097402011-06-20 10:11:25 +0300146 unsigned int i;
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +0200147 unsigned int size;
148 uint8_t buf[4];
Dan Carpenterc2097402011-06-20 10:11:25 +0300149 int ret;
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +0200150
151 size = adau1701_register_size(codec, reg);
152 if (size == 0)
153 return -EINVAL;
154
155 snd_soc_cache_write(codec, reg, value);
156
157 buf[0] = 0x08;
158 buf[1] = reg;
159
160 for (i = size + 1; i >= 2; --i) {
161 buf[i] = value;
162 value >>= 8;
163 }
164
165 ret = i2c_master_send(to_i2c_client(codec->dev), buf, size + 2);
166 if (ret == size + 2)
167 return 0;
168 else if (ret < 0)
169 return ret;
170 else
171 return -EIO;
172}
173
174static unsigned int adau1701_read(struct snd_soc_codec *codec, unsigned int reg)
175{
176 unsigned int value;
177 unsigned int ret;
178
179 ret = snd_soc_cache_read(codec, reg, &value);
180 if (ret)
181 return ret;
182
183 return value;
184}
185
Daniel Mack47f5b692013-05-23 13:58:00 +0200186static int adau1701_load_firmware(struct i2c_client *client)
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +0200187{
Daniel Mack47f5b692013-05-23 13:58:00 +0200188 return process_sigma_firmware(client, ADAU1701_FIRMWARE);
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +0200189}
190
191static int adau1701_set_capture_pcm_format(struct snd_soc_codec *codec,
192 snd_pcm_format_t format)
193{
194 struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(codec);
195 unsigned int mask = ADAU1701_SEROCTL_WORD_LEN_MASK;
196 unsigned int val;
197
198 switch (format) {
199 case SNDRV_PCM_FORMAT_S16_LE:
200 val = ADAU1701_SEROCTL_WORD_LEN_16;
201 break;
202 case SNDRV_PCM_FORMAT_S20_3LE:
203 val = ADAU1701_SEROCTL_WORD_LEN_20;
204 break;
205 case SNDRV_PCM_FORMAT_S24_LE:
206 val = ADAU1701_SEROCTL_WORD_LEN_24;
207 break;
208 default:
209 return -EINVAL;
210 }
211
212 if (adau1701->dai_fmt == SND_SOC_DAIFMT_RIGHT_J) {
213 switch (format) {
214 case SNDRV_PCM_FORMAT_S16_LE:
215 val |= ADAU1701_SEROCTL_MSB_DEALY16;
216 break;
217 case SNDRV_PCM_FORMAT_S20_3LE:
218 val |= ADAU1701_SEROCTL_MSB_DEALY12;
219 break;
220 case SNDRV_PCM_FORMAT_S24_LE:
221 val |= ADAU1701_SEROCTL_MSB_DEALY8;
222 break;
223 }
224 mask |= ADAU1701_SEROCTL_MSB_DEALY_MASK;
225 }
226
227 snd_soc_update_bits(codec, ADAU1701_SEROCTL, mask, val);
228
229 return 0;
230}
231
232static int adau1701_set_playback_pcm_format(struct snd_soc_codec *codec,
233 snd_pcm_format_t format)
234{
235 struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(codec);
236 unsigned int val;
237
238 if (adau1701->dai_fmt != SND_SOC_DAIFMT_RIGHT_J)
239 return 0;
240
241 switch (format) {
242 case SNDRV_PCM_FORMAT_S16_LE:
243 val = ADAU1701_SERICTL_RIGHTJ_16;
244 break;
245 case SNDRV_PCM_FORMAT_S20_3LE:
246 val = ADAU1701_SERICTL_RIGHTJ_20;
247 break;
248 case SNDRV_PCM_FORMAT_S24_LE:
249 val = ADAU1701_SERICTL_RIGHTJ_24;
250 break;
251 default:
252 return -EINVAL;
253 }
254
255 snd_soc_update_bits(codec, ADAU1701_SERICTL,
256 ADAU1701_SERICTL_MODE_MASK, val);
257
258 return 0;
259}
260
261static int adau1701_hw_params(struct snd_pcm_substream *substream,
262 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
263{
Mark Browne6968a12012-04-04 15:58:16 +0100264 struct snd_soc_codec *codec = dai->codec;
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +0200265 snd_pcm_format_t format;
266 unsigned int val;
267
268 switch (params_rate(params)) {
269 case 192000:
270 val = ADAU1701_DSPCTRL_SR_192;
271 break;
272 case 96000:
273 val = ADAU1701_DSPCTRL_SR_96;
274 break;
275 case 48000:
276 val = ADAU1701_DSPCTRL_SR_48;
277 break;
278 default:
279 return -EINVAL;
280 }
281
282 snd_soc_update_bits(codec, ADAU1701_DSPCTRL,
283 ADAU1701_DSPCTRL_SR_MASK, val);
284
285 format = params_format(params);
286 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
287 return adau1701_set_playback_pcm_format(codec, format);
288 else
289 return adau1701_set_capture_pcm_format(codec, format);
290}
291
292static int adau1701_set_dai_fmt(struct snd_soc_dai *codec_dai,
293 unsigned int fmt)
294{
295 struct snd_soc_codec *codec = codec_dai->codec;
296 struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(codec);
297 unsigned int serictl = 0x00, seroctl = 0x00;
298 bool invert_lrclk;
299
300 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
301 case SND_SOC_DAIFMT_CBM_CFM:
302 /* master, 64-bits per sample, 1 frame per sample */
303 seroctl |= ADAU1701_SEROCTL_MASTER | ADAU1701_SEROCTL_OBF16
304 | ADAU1701_SEROCTL_OLF1024;
305 break;
306 case SND_SOC_DAIFMT_CBS_CFS:
307 break;
308 default:
309 return -EINVAL;
310 }
311
312 /* clock inversion */
313 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
314 case SND_SOC_DAIFMT_NB_NF:
315 invert_lrclk = false;
316 break;
317 case SND_SOC_DAIFMT_NB_IF:
318 invert_lrclk = true;
319 break;
320 case SND_SOC_DAIFMT_IB_NF:
321 invert_lrclk = false;
322 serictl |= ADAU1701_SERICTL_INV_BCLK;
323 seroctl |= ADAU1701_SEROCTL_INV_BCLK;
324 break;
325 case SND_SOC_DAIFMT_IB_IF:
326 invert_lrclk = true;
327 serictl |= ADAU1701_SERICTL_INV_BCLK;
328 seroctl |= ADAU1701_SEROCTL_INV_BCLK;
329 break;
330 default:
331 return -EINVAL;
332 }
333
334 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
335 case SND_SOC_DAIFMT_I2S:
336 break;
337 case SND_SOC_DAIFMT_LEFT_J:
338 serictl |= ADAU1701_SERICTL_LEFTJ;
339 seroctl |= ADAU1701_SEROCTL_MSB_DEALY0;
340 invert_lrclk = !invert_lrclk;
341 break;
342 case SND_SOC_DAIFMT_RIGHT_J:
343 serictl |= ADAU1701_SERICTL_RIGHTJ_24;
344 seroctl |= ADAU1701_SEROCTL_MSB_DEALY8;
345 invert_lrclk = !invert_lrclk;
346 break;
347 default:
348 return -EINVAL;
349 }
350
351 if (invert_lrclk) {
352 seroctl |= ADAU1701_SEROCTL_INV_LRCLK;
353 serictl |= ADAU1701_SERICTL_INV_LRCLK;
354 }
355
356 adau1701->dai_fmt = fmt & SND_SOC_DAIFMT_FORMAT_MASK;
357
358 snd_soc_write(codec, ADAU1701_SERICTL, serictl);
359 snd_soc_update_bits(codec, ADAU1701_SEROCTL,
360 ~ADAU1701_SEROCTL_WORD_LEN_MASK, seroctl);
361
362 return 0;
363}
364
365static int adau1701_set_bias_level(struct snd_soc_codec *codec,
366 enum snd_soc_bias_level level)
367{
368 unsigned int mask = ADAU1701_AUXNPOW_VBPD | ADAU1701_AUXNPOW_VRPD;
369
370 switch (level) {
371 case SND_SOC_BIAS_ON:
372 break;
373 case SND_SOC_BIAS_PREPARE:
374 break;
375 case SND_SOC_BIAS_STANDBY:
376 /* Enable VREF and VREF buffer */
377 snd_soc_update_bits(codec, ADAU1701_AUXNPOW, mask, 0x00);
378 break;
379 case SND_SOC_BIAS_OFF:
380 /* Disable VREF and VREF buffer */
381 snd_soc_update_bits(codec, ADAU1701_AUXNPOW, mask, mask);
382 break;
383 }
384
385 codec->dapm.bias_level = level;
386 return 0;
387}
388
389static int adau1701_digital_mute(struct snd_soc_dai *dai, int mute)
390{
391 struct snd_soc_codec *codec = dai->codec;
392 unsigned int mask = ADAU1701_DSPCTRL_DAM;
393 unsigned int val;
394
395 if (mute)
396 val = 0;
397 else
398 val = mask;
399
400 snd_soc_update_bits(codec, ADAU1701_DSPCTRL, mask, val);
401
402 return 0;
403}
404
405static int adau1701_set_sysclk(struct snd_soc_codec *codec, int clk_id,
Axel Lin21326db2011-09-28 13:48:35 +0800406 int source, unsigned int freq, int dir)
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +0200407{
408 unsigned int val;
409
410 switch (clk_id) {
411 case ADAU1701_CLK_SRC_OSC:
412 val = 0x0;
413 break;
414 case ADAU1701_CLK_SRC_MCLK:
415 val = ADAU1701_OSCIPOW_OPD;
416 break;
417 default:
418 return -EINVAL;
419 }
420
421 snd_soc_update_bits(codec, ADAU1701_OSCIPOW, ADAU1701_OSCIPOW_OPD, val);
422
423 return 0;
424}
425
426#define ADAU1701_RATES (SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | \
427 SNDRV_PCM_RATE_192000)
428
429#define ADAU1701_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
430 SNDRV_PCM_FMTBIT_S24_LE)
431
Lars-Peter Clausen890754a2011-11-23 14:11:21 +0100432static const struct snd_soc_dai_ops adau1701_dai_ops = {
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +0200433 .set_fmt = adau1701_set_dai_fmt,
434 .hw_params = adau1701_hw_params,
435 .digital_mute = adau1701_digital_mute,
436};
437
438static struct snd_soc_dai_driver adau1701_dai = {
439 .name = "adau1701",
440 .playback = {
441 .stream_name = "Playback",
442 .channels_min = 2,
443 .channels_max = 8,
444 .rates = ADAU1701_RATES,
445 .formats = ADAU1701_FORMATS,
446 },
447 .capture = {
448 .stream_name = "Capture",
449 .channels_min = 2,
450 .channels_max = 8,
451 .rates = ADAU1701_RATES,
452 .formats = ADAU1701_FORMATS,
453 },
454 .ops = &adau1701_dai_ops,
455 .symmetric_rates = 1,
456};
457
Daniel Mack04561ea2013-05-23 15:46:05 +0200458#ifdef CONFIG_OF
459static const struct of_device_id adau1701_dt_ids[] = {
460 { .compatible = "adi,adau1701", },
461 { }
462};
463MODULE_DEVICE_TABLE(of, adau1701_dt_ids);
464#endif
465
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +0200466static int adau1701_probe(struct snd_soc_codec *codec)
467{
468 int ret;
Daniel Mack47f5b692013-05-23 13:58:00 +0200469 struct i2c_client *client = to_i2c_client(codec->dev);
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +0200470
Daniel Mack47f5b692013-05-23 13:58:00 +0200471 codec->control_data = client;
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +0200472
Daniel Mack47f5b692013-05-23 13:58:00 +0200473 ret = adau1701_load_firmware(client);
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +0200474 if (ret)
475 dev_warn(codec->dev, "Failed to load firmware\n");
476
477 snd_soc_write(codec, ADAU1701_DACSET, ADAU1701_DACSET_DACINIT);
478 snd_soc_write(codec, ADAU1701_DSPCTRL, ADAU1701_DSPCTRL_CR);
479
480 return 0;
481}
482
483static struct snd_soc_codec_driver adau1701_codec_drv = {
484 .probe = adau1701_probe,
485 .set_bias_level = adau1701_set_bias_level,
Axel Lineb3032f2012-01-27 18:02:09 +0800486 .idle_bias_off = true,
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +0200487
488 .reg_cache_size = ADAU1701_NUM_REGS,
489 .reg_word_size = sizeof(u16),
490
491 .controls = adau1701_controls,
492 .num_controls = ARRAY_SIZE(adau1701_controls),
493 .dapm_widgets = adau1701_dapm_widgets,
494 .num_dapm_widgets = ARRAY_SIZE(adau1701_dapm_widgets),
495 .dapm_routes = adau1701_dapm_routes,
496 .num_dapm_routes = ARRAY_SIZE(adau1701_dapm_routes),
497
498 .write = adau1701_write,
499 .read = adau1701_read,
500
501 .set_sysclk = adau1701_set_sysclk,
502};
503
Bill Pemberton7a79e942012-12-07 09:26:37 -0500504static int adau1701_i2c_probe(struct i2c_client *client,
505 const struct i2c_device_id *id)
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +0200506{
507 struct adau1701 *adau1701;
Daniel Mack04561ea2013-05-23 15:46:05 +0200508 struct device *dev = &client->dev;
509 int gpio_nreset = -EINVAL;
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +0200510 int ret;
511
Daniel Mack04561ea2013-05-23 15:46:05 +0200512 adau1701 = devm_kzalloc(dev, sizeof(*adau1701), GFP_KERNEL);
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +0200513 if (!adau1701)
514 return -ENOMEM;
515
Daniel Mack04561ea2013-05-23 15:46:05 +0200516 if (dev->of_node) {
517 gpio_nreset = of_get_named_gpio(dev->of_node, "reset-gpio", 0);
518 if (gpio_nreset < 0 && gpio_nreset != -ENOENT)
519 return gpio_nreset;
520 }
521
522 if (gpio_is_valid(gpio_nreset)) {
523 ret = devm_gpio_request_one(dev, gpio_nreset, GPIOF_OUT_INIT_LOW,
524 "ADAU1701 Reset");
525 if (ret < 0)
526 return ret;
527
528 /* minimum reset time is 20ns */
529 udelay(1);
530 gpio_set_value(gpio_nreset, 1);
531 /* power-up time may be as long as 85ms */
532 mdelay(85);
533 }
534
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +0200535 i2c_set_clientdata(client, adau1701);
536 ret = snd_soc_register_codec(&client->dev, &adau1701_codec_drv,
537 &adau1701_dai, 1);
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +0200538 return ret;
539}
540
Bill Pemberton7a79e942012-12-07 09:26:37 -0500541static int adau1701_i2c_remove(struct i2c_client *client)
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +0200542{
543 snd_soc_unregister_codec(&client->dev);
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +0200544 return 0;
545}
546
547static const struct i2c_device_id adau1701_i2c_id[] = {
548 { "adau1701", 0 },
549 { }
550};
551MODULE_DEVICE_TABLE(i2c, adau1701_i2c_id);
552
553static struct i2c_driver adau1701_i2c_driver = {
554 .driver = {
555 .name = "adau1701",
556 .owner = THIS_MODULE,
Daniel Mack04561ea2013-05-23 15:46:05 +0200557 .of_match_table = of_match_ptr(adau1701_dt_ids),
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +0200558 },
559 .probe = adau1701_i2c_probe,
Bill Pemberton7a79e942012-12-07 09:26:37 -0500560 .remove = adau1701_i2c_remove,
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +0200561 .id_table = adau1701_i2c_id,
562};
563
Sachin Kamatbeb22de2012-08-06 17:25:45 +0530564module_i2c_driver(adau1701_i2c_driver);
Lars-Peter Clausen631ed8a2011-06-13 15:26:20 +0200565
566MODULE_DESCRIPTION("ASoC ADAU1701 SigmaDSP driver");
567MODULE_AUTHOR("Cliff Cai <cliff.cai@analog.com>");
568MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
569MODULE_LICENSE("GPL");