2 * Driver for ADAU1701 SigmaDSP processor
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>
8 * Licensed under the GPL-2 or later.
11 #include <linux/module.h>
12 #include <linux/init.h>
13 #include <linux/i2c.h>
14 #include <linux/delay.h>
15 #include <linux/slab.h>
17 #include <linux/of_gpio.h>
18 #include <linux/of_device.h>
19 #include <sound/core.h>
20 #include <sound/pcm.h>
21 #include <sound/pcm_params.h>
22 #include <sound/soc.h>
27 #define ADAU1701_DSPCTRL 0x1c
28 #define ADAU1701_SEROCTL 0x1e
29 #define ADAU1701_SERICTL 0x1f
31 #define ADAU1701_AUXNPOW 0x22
33 #define ADAU1701_OSCIPOW 0x26
34 #define ADAU1701_DACSET 0x27
36 #define ADAU1701_NUM_REGS 0x28
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
46 #define ADAU1701_SEROCTL_INV_LRCLK 0x2000
47 #define ADAU1701_SEROCTL_INV_BCLK 0x1000
48 #define ADAU1701_SEROCTL_MASTER 0x0800
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
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
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
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
73 #define ADAU1701_AUXNPOW_VBPD 0x40
74 #define ADAU1701_AUXNPOW_VRPD 0x20
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)
87 #define ADAU1701_OSCIPOW_OPD 0x04
88 #define ADAU1701_DACSET_DACINIT 1
90 #define ADAU1701_FIRMWARE "adau1701.bin"
97 static const struct snd_kcontrol_new adau1701_controls
[] = {
98 SOC_SINGLE("Master Capture Switch", ADAU1701_DSPCTRL
, 4, 1, 0),
101 static const struct snd_soc_dapm_widget adau1701_dapm_widgets
[] = {
102 SND_SOC_DAPM_DAC("DAC0", "Playback", ADAU1701_AUXNPOW
, 3, 1),
103 SND_SOC_DAPM_DAC("DAC1", "Playback", ADAU1701_AUXNPOW
, 2, 1),
104 SND_SOC_DAPM_DAC("DAC2", "Playback", ADAU1701_AUXNPOW
, 1, 1),
105 SND_SOC_DAPM_DAC("DAC3", "Playback", ADAU1701_AUXNPOW
, 0, 1),
106 SND_SOC_DAPM_ADC("ADC", "Capture", ADAU1701_AUXNPOW
, 7, 1),
108 SND_SOC_DAPM_OUTPUT("OUT0"),
109 SND_SOC_DAPM_OUTPUT("OUT1"),
110 SND_SOC_DAPM_OUTPUT("OUT2"),
111 SND_SOC_DAPM_OUTPUT("OUT3"),
112 SND_SOC_DAPM_INPUT("IN0"),
113 SND_SOC_DAPM_INPUT("IN1"),
116 static const struct snd_soc_dapm_route adau1701_dapm_routes
[] = {
117 { "OUT0", NULL
, "DAC0" },
118 { "OUT1", NULL
, "DAC1" },
119 { "OUT2", NULL
, "DAC2" },
120 { "OUT3", NULL
, "DAC3" },
122 { "ADC", NULL
, "IN0" },
123 { "ADC", NULL
, "IN1" },
126 static unsigned int adau1701_register_size(struct snd_soc_codec
*codec
,
130 case ADAU1701_DSPCTRL
:
131 case ADAU1701_SEROCTL
:
132 case ADAU1701_AUXNPOW
:
133 case ADAU1701_OSCIPOW
:
134 case ADAU1701_DACSET
:
136 case ADAU1701_SERICTL
:
140 dev_err(codec
->dev
, "Unsupported register address: %d\n", reg
);
144 static int adau1701_write(struct snd_soc_codec
*codec
, unsigned int reg
,
152 size
= adau1701_register_size(codec
, reg
);
156 snd_soc_cache_write(codec
, reg
, value
);
161 for (i
= size
+ 1; i
>= 2; --i
) {
166 ret
= i2c_master_send(to_i2c_client(codec
->dev
), buf
, size
+ 2);
175 static unsigned int adau1701_read(struct snd_soc_codec
*codec
, unsigned int reg
)
180 ret
= snd_soc_cache_read(codec
, reg
, &value
);
187 static int adau1701_reset(struct snd_soc_codec
*codec
)
189 struct adau1701
*adau1701
= snd_soc_codec_get_drvdata(codec
);
190 struct i2c_client
*client
= to_i2c_client(codec
->dev
);
193 if (gpio_is_valid(adau1701
->gpio_nreset
)) {
194 gpio_set_value(adau1701
->gpio_nreset
, 0);
195 /* minimum reset time is 20ns */
197 gpio_set_value(adau1701
->gpio_nreset
, 1);
198 /* power-up time may be as long as 85ms */
202 ret
= process_sigma_firmware(client
, ADAU1701_FIRMWARE
);
204 dev_warn(codec
->dev
, "Failed to load firmware\n");
208 snd_soc_write(codec
, ADAU1701_DACSET
, ADAU1701_DACSET_DACINIT
);
209 snd_soc_write(codec
, ADAU1701_DSPCTRL
, ADAU1701_DSPCTRL_CR
);
214 static int adau1701_set_capture_pcm_format(struct snd_soc_codec
*codec
,
215 snd_pcm_format_t format
)
217 struct adau1701
*adau1701
= snd_soc_codec_get_drvdata(codec
);
218 unsigned int mask
= ADAU1701_SEROCTL_WORD_LEN_MASK
;
222 case SNDRV_PCM_FORMAT_S16_LE
:
223 val
= ADAU1701_SEROCTL_WORD_LEN_16
;
225 case SNDRV_PCM_FORMAT_S20_3LE
:
226 val
= ADAU1701_SEROCTL_WORD_LEN_20
;
228 case SNDRV_PCM_FORMAT_S24_LE
:
229 val
= ADAU1701_SEROCTL_WORD_LEN_24
;
235 if (adau1701
->dai_fmt
== SND_SOC_DAIFMT_RIGHT_J
) {
237 case SNDRV_PCM_FORMAT_S16_LE
:
238 val
|= ADAU1701_SEROCTL_MSB_DEALY16
;
240 case SNDRV_PCM_FORMAT_S20_3LE
:
241 val
|= ADAU1701_SEROCTL_MSB_DEALY12
;
243 case SNDRV_PCM_FORMAT_S24_LE
:
244 val
|= ADAU1701_SEROCTL_MSB_DEALY8
;
247 mask
|= ADAU1701_SEROCTL_MSB_DEALY_MASK
;
250 snd_soc_update_bits(codec
, ADAU1701_SEROCTL
, mask
, val
);
255 static int adau1701_set_playback_pcm_format(struct snd_soc_codec
*codec
,
256 snd_pcm_format_t format
)
258 struct adau1701
*adau1701
= snd_soc_codec_get_drvdata(codec
);
261 if (adau1701
->dai_fmt
!= SND_SOC_DAIFMT_RIGHT_J
)
265 case SNDRV_PCM_FORMAT_S16_LE
:
266 val
= ADAU1701_SERICTL_RIGHTJ_16
;
268 case SNDRV_PCM_FORMAT_S20_3LE
:
269 val
= ADAU1701_SERICTL_RIGHTJ_20
;
271 case SNDRV_PCM_FORMAT_S24_LE
:
272 val
= ADAU1701_SERICTL_RIGHTJ_24
;
278 snd_soc_update_bits(codec
, ADAU1701_SERICTL
,
279 ADAU1701_SERICTL_MODE_MASK
, val
);
284 static int adau1701_hw_params(struct snd_pcm_substream
*substream
,
285 struct snd_pcm_hw_params
*params
, struct snd_soc_dai
*dai
)
287 struct snd_soc_codec
*codec
= dai
->codec
;
288 snd_pcm_format_t format
;
291 switch (params_rate(params
)) {
293 val
= ADAU1701_DSPCTRL_SR_192
;
296 val
= ADAU1701_DSPCTRL_SR_96
;
299 val
= ADAU1701_DSPCTRL_SR_48
;
305 snd_soc_update_bits(codec
, ADAU1701_DSPCTRL
,
306 ADAU1701_DSPCTRL_SR_MASK
, val
);
308 format
= params_format(params
);
309 if (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
)
310 return adau1701_set_playback_pcm_format(codec
, format
);
312 return adau1701_set_capture_pcm_format(codec
, format
);
315 static int adau1701_set_dai_fmt(struct snd_soc_dai
*codec_dai
,
318 struct snd_soc_codec
*codec
= codec_dai
->codec
;
319 struct adau1701
*adau1701
= snd_soc_codec_get_drvdata(codec
);
320 unsigned int serictl
= 0x00, seroctl
= 0x00;
323 switch (fmt
& SND_SOC_DAIFMT_MASTER_MASK
) {
324 case SND_SOC_DAIFMT_CBM_CFM
:
325 /* master, 64-bits per sample, 1 frame per sample */
326 seroctl
|= ADAU1701_SEROCTL_MASTER
| ADAU1701_SEROCTL_OBF16
327 | ADAU1701_SEROCTL_OLF1024
;
329 case SND_SOC_DAIFMT_CBS_CFS
:
335 /* clock inversion */
336 switch (fmt
& SND_SOC_DAIFMT_INV_MASK
) {
337 case SND_SOC_DAIFMT_NB_NF
:
338 invert_lrclk
= false;
340 case SND_SOC_DAIFMT_NB_IF
:
343 case SND_SOC_DAIFMT_IB_NF
:
344 invert_lrclk
= false;
345 serictl
|= ADAU1701_SERICTL_INV_BCLK
;
346 seroctl
|= ADAU1701_SEROCTL_INV_BCLK
;
348 case SND_SOC_DAIFMT_IB_IF
:
350 serictl
|= ADAU1701_SERICTL_INV_BCLK
;
351 seroctl
|= ADAU1701_SEROCTL_INV_BCLK
;
357 switch (fmt
& SND_SOC_DAIFMT_FORMAT_MASK
) {
358 case SND_SOC_DAIFMT_I2S
:
360 case SND_SOC_DAIFMT_LEFT_J
:
361 serictl
|= ADAU1701_SERICTL_LEFTJ
;
362 seroctl
|= ADAU1701_SEROCTL_MSB_DEALY0
;
363 invert_lrclk
= !invert_lrclk
;
365 case SND_SOC_DAIFMT_RIGHT_J
:
366 serictl
|= ADAU1701_SERICTL_RIGHTJ_24
;
367 seroctl
|= ADAU1701_SEROCTL_MSB_DEALY8
;
368 invert_lrclk
= !invert_lrclk
;
375 seroctl
|= ADAU1701_SEROCTL_INV_LRCLK
;
376 serictl
|= ADAU1701_SERICTL_INV_LRCLK
;
379 adau1701
->dai_fmt
= fmt
& SND_SOC_DAIFMT_FORMAT_MASK
;
381 snd_soc_write(codec
, ADAU1701_SERICTL
, serictl
);
382 snd_soc_update_bits(codec
, ADAU1701_SEROCTL
,
383 ~ADAU1701_SEROCTL_WORD_LEN_MASK
, seroctl
);
388 static int adau1701_set_bias_level(struct snd_soc_codec
*codec
,
389 enum snd_soc_bias_level level
)
391 unsigned int mask
= ADAU1701_AUXNPOW_VBPD
| ADAU1701_AUXNPOW_VRPD
;
394 case SND_SOC_BIAS_ON
:
396 case SND_SOC_BIAS_PREPARE
:
398 case SND_SOC_BIAS_STANDBY
:
399 /* Enable VREF and VREF buffer */
400 snd_soc_update_bits(codec
, ADAU1701_AUXNPOW
, mask
, 0x00);
402 case SND_SOC_BIAS_OFF
:
403 /* Disable VREF and VREF buffer */
404 snd_soc_update_bits(codec
, ADAU1701_AUXNPOW
, mask
, mask
);
408 codec
->dapm
.bias_level
= level
;
412 static int adau1701_digital_mute(struct snd_soc_dai
*dai
, int mute
)
414 struct snd_soc_codec
*codec
= dai
->codec
;
415 unsigned int mask
= ADAU1701_DSPCTRL_DAM
;
423 snd_soc_update_bits(codec
, ADAU1701_DSPCTRL
, mask
, val
);
428 static int adau1701_set_sysclk(struct snd_soc_codec
*codec
, int clk_id
,
429 int source
, unsigned int freq
, int dir
)
434 case ADAU1701_CLK_SRC_OSC
:
437 case ADAU1701_CLK_SRC_MCLK
:
438 val
= ADAU1701_OSCIPOW_OPD
;
444 snd_soc_update_bits(codec
, ADAU1701_OSCIPOW
, ADAU1701_OSCIPOW_OPD
, val
);
449 #define ADAU1701_RATES (SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | \
450 SNDRV_PCM_RATE_192000)
452 #define ADAU1701_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
453 SNDRV_PCM_FMTBIT_S24_LE)
455 static const struct snd_soc_dai_ops adau1701_dai_ops
= {
456 .set_fmt
= adau1701_set_dai_fmt
,
457 .hw_params
= adau1701_hw_params
,
458 .digital_mute
= adau1701_digital_mute
,
461 static struct snd_soc_dai_driver adau1701_dai
= {
464 .stream_name
= "Playback",
467 .rates
= ADAU1701_RATES
,
468 .formats
= ADAU1701_FORMATS
,
471 .stream_name
= "Capture",
474 .rates
= ADAU1701_RATES
,
475 .formats
= ADAU1701_FORMATS
,
477 .ops
= &adau1701_dai_ops
,
478 .symmetric_rates
= 1,
482 static const struct of_device_id adau1701_dt_ids
[] = {
483 { .compatible
= "adi,adau1701", },
486 MODULE_DEVICE_TABLE(of
, adau1701_dt_ids
);
489 static int adau1701_probe(struct snd_soc_codec
*codec
)
493 codec
->control_data
= to_i2c_client(codec
->dev
);
495 ret
= adau1701_reset(codec
);
502 static struct snd_soc_codec_driver adau1701_codec_drv
= {
503 .probe
= adau1701_probe
,
504 .set_bias_level
= adau1701_set_bias_level
,
505 .idle_bias_off
= true,
507 .reg_cache_size
= ADAU1701_NUM_REGS
,
508 .reg_word_size
= sizeof(u16
),
510 .controls
= adau1701_controls
,
511 .num_controls
= ARRAY_SIZE(adau1701_controls
),
512 .dapm_widgets
= adau1701_dapm_widgets
,
513 .num_dapm_widgets
= ARRAY_SIZE(adau1701_dapm_widgets
),
514 .dapm_routes
= adau1701_dapm_routes
,
515 .num_dapm_routes
= ARRAY_SIZE(adau1701_dapm_routes
),
517 .write
= adau1701_write
,
518 .read
= adau1701_read
,
520 .set_sysclk
= adau1701_set_sysclk
,
523 static int adau1701_i2c_probe(struct i2c_client
*client
,
524 const struct i2c_device_id
*id
)
526 struct adau1701
*adau1701
;
527 struct device
*dev
= &client
->dev
;
528 int gpio_nreset
= -EINVAL
;
531 adau1701
= devm_kzalloc(dev
, sizeof(*adau1701
), GFP_KERNEL
);
536 gpio_nreset
= of_get_named_gpio(dev
->of_node
, "reset-gpio", 0);
537 if (gpio_nreset
< 0 && gpio_nreset
!= -ENOENT
)
541 if (gpio_is_valid(gpio_nreset
)) {
542 ret
= devm_gpio_request_one(dev
, gpio_nreset
, GPIOF_OUT_INIT_LOW
,
548 adau1701
->gpio_nreset
= gpio_nreset
;
550 i2c_set_clientdata(client
, adau1701
);
551 ret
= snd_soc_register_codec(&client
->dev
, &adau1701_codec_drv
,
556 static int adau1701_i2c_remove(struct i2c_client
*client
)
558 snd_soc_unregister_codec(&client
->dev
);
562 static const struct i2c_device_id adau1701_i2c_id
[] = {
566 MODULE_DEVICE_TABLE(i2c
, adau1701_i2c_id
);
568 static struct i2c_driver adau1701_i2c_driver
= {
571 .owner
= THIS_MODULE
,
572 .of_match_table
= of_match_ptr(adau1701_dt_ids
),
574 .probe
= adau1701_i2c_probe
,
575 .remove
= adau1701_i2c_remove
,
576 .id_table
= adau1701_i2c_id
,
579 module_i2c_driver(adau1701_i2c_driver
);
581 MODULE_DESCRIPTION("ASoC ADAU1701 SigmaDSP driver");
582 MODULE_AUTHOR("Cliff Cai <cliff.cai@analog.com>");
583 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
584 MODULE_LICENSE("GPL");