2 * Texas Instruments TLV320AIC26 low power audio CODEC
3 * ALSA SoC CODEC driver
5 * Copyright (C) 2008 Secret Lab Technologies Ltd.
8 #include <linux/module.h>
9 #include <linux/moduleparam.h>
10 #include <linux/init.h>
11 #include <linux/delay.h>
13 #include <linux/device.h>
14 #include <linux/sysfs.h>
15 #include <linux/spi/spi.h>
16 #include <linux/slab.h>
17 #include <sound/core.h>
18 #include <sound/pcm.h>
19 #include <sound/pcm_params.h>
20 #include <sound/soc.h>
21 #include <sound/initval.h>
23 #include "tlv320aic26.h"
25 MODULE_DESCRIPTION("ASoC TLV320AIC26 codec driver");
26 MODULE_AUTHOR("Grant Likely <grant.likely@secretlab.ca>");
27 MODULE_LICENSE("GPL");
29 /* AIC26 driver private data */
31 struct spi_device
*spi
;
32 struct regmap
*regmap
;
33 struct snd_soc_codec
*codec
;
38 /* Keyclick parameters */
39 int keyclick_amplitude
;
44 static const struct snd_soc_dapm_widget tlv320aic26_dapm_widgets
[] = {
45 SND_SOC_DAPM_INPUT("MICIN"),
46 SND_SOC_DAPM_INPUT("AUX"),
48 SND_SOC_DAPM_OUTPUT("HPL"),
49 SND_SOC_DAPM_OUTPUT("HPR"),
52 static const struct snd_soc_dapm_route tlv320aic26_dapm_routes
[] = {
53 { "Capture", NULL
, "MICIN" },
54 { "Capture", NULL
, "AUX" },
56 { "HPL", NULL
, "Playback" },
57 { "HPR", NULL
, "Playback" },
60 /* ---------------------------------------------------------------------
61 * Digital Audio Interface Operations
63 static int aic26_hw_params(struct snd_pcm_substream
*substream
,
64 struct snd_pcm_hw_params
*params
,
65 struct snd_soc_dai
*dai
)
67 struct snd_soc_codec
*codec
= dai
->codec
;
68 struct aic26
*aic26
= snd_soc_codec_get_drvdata(codec
);
69 int fsref
, divisor
, wlen
, pval
, jval
, dval
, qval
;
72 dev_dbg(&aic26
->spi
->dev
, "aic26_hw_params(substream=%p, params=%p)\n",
74 dev_dbg(&aic26
->spi
->dev
, "rate=%i width=%d\n", params_rate(params
),
75 params_width(params
));
77 switch (params_rate(params
)) {
78 case 8000: fsref
= 48000; divisor
= AIC26_DIV_6
; break;
79 case 11025: fsref
= 44100; divisor
= AIC26_DIV_4
; break;
80 case 12000: fsref
= 48000; divisor
= AIC26_DIV_4
; break;
81 case 16000: fsref
= 48000; divisor
= AIC26_DIV_3
; break;
82 case 22050: fsref
= 44100; divisor
= AIC26_DIV_2
; break;
83 case 24000: fsref
= 48000; divisor
= AIC26_DIV_2
; break;
84 case 32000: fsref
= 48000; divisor
= AIC26_DIV_1_5
; break;
85 case 44100: fsref
= 44100; divisor
= AIC26_DIV_1
; break;
86 case 48000: fsref
= 48000; divisor
= AIC26_DIV_1
; break;
88 dev_dbg(&aic26
->spi
->dev
, "bad rate\n"); return -EINVAL
;
91 /* select data word length */
92 switch (params_width(params
)) {
93 case 8: wlen
= AIC26_WLEN_16
; break;
94 case 16: wlen
= AIC26_WLEN_16
; break;
95 case 24: wlen
= AIC26_WLEN_24
; break;
96 case 32: wlen
= AIC26_WLEN_32
; break;
98 dev_dbg(&aic26
->spi
->dev
, "bad format\n"); return -EINVAL
;
103 * fsref = (mclk * PLLM) / 2048
104 * where PLLM = J.DDDD (DDDD register ranges from 0 to 9999, decimal)
107 /* compute J portion of multiplier */
108 jval
= fsref
/ (aic26
->mclk
/ 2048);
109 /* compute fractional DDDD component of multiplier */
110 dval
= fsref
- (jval
* (aic26
->mclk
/ 2048));
111 dval
= (10000 * dval
) / (aic26
->mclk
/ 2048);
112 dev_dbg(&aic26
->spi
->dev
, "Setting PLLM to %d.%04d\n", jval
, dval
);
114 reg
= 0x8000 | qval
<< 11 | pval
<< 8 | jval
<< 2;
115 snd_soc_write(codec
, AIC26_REG_PLL_PROG1
, reg
);
117 snd_soc_write(codec
, AIC26_REG_PLL_PROG2
, reg
);
119 /* Audio Control 3 (master mode, fsref rate) */
124 snd_soc_update_bits(codec
, AIC26_REG_AUDIO_CTRL3
, 0xf800, reg
);
126 /* Audio Control 1 (FSref divisor) */
127 reg
= wlen
| aic26
->datfm
| (divisor
<< 3) | divisor
;
128 snd_soc_update_bits(codec
, AIC26_REG_AUDIO_CTRL1
, 0xfff, reg
);
134 * aic26_mute - Mute control to reduce noise when changing audio format
136 static int aic26_mute(struct snd_soc_dai
*dai
, int mute
)
138 struct snd_soc_codec
*codec
= dai
->codec
;
139 struct aic26
*aic26
= snd_soc_codec_get_drvdata(codec
);
142 dev_dbg(&aic26
->spi
->dev
, "aic26_mute(dai=%p, mute=%i)\n",
149 snd_soc_update_bits(codec
, AIC26_REG_DAC_GAIN
, 0x8000, reg
);
154 static int aic26_set_sysclk(struct snd_soc_dai
*codec_dai
,
155 int clk_id
, unsigned int freq
, int dir
)
157 struct snd_soc_codec
*codec
= codec_dai
->codec
;
158 struct aic26
*aic26
= snd_soc_codec_get_drvdata(codec
);
160 dev_dbg(&aic26
->spi
->dev
, "aic26_set_sysclk(dai=%p, clk_id==%i,"
161 " freq=%i, dir=%i)\n",
162 codec_dai
, clk_id
, freq
, dir
);
164 /* MCLK needs to fall between 2MHz and 50 MHz */
165 if ((freq
< 2000000) || (freq
> 50000000))
172 static int aic26_set_fmt(struct snd_soc_dai
*codec_dai
, unsigned int fmt
)
174 struct snd_soc_codec
*codec
= codec_dai
->codec
;
175 struct aic26
*aic26
= snd_soc_codec_get_drvdata(codec
);
177 dev_dbg(&aic26
->spi
->dev
, "aic26_set_fmt(dai=%p, fmt==%i)\n",
180 /* set master/slave audio interface */
181 switch (fmt
& SND_SOC_DAIFMT_MASTER_MASK
) {
182 case SND_SOC_DAIFMT_CBM_CFM
: aic26
->master
= 1; break;
183 case SND_SOC_DAIFMT_CBS_CFS
: aic26
->master
= 0; break;
185 dev_dbg(&aic26
->spi
->dev
, "bad master\n"); return -EINVAL
;
188 /* interface format */
189 switch (fmt
& SND_SOC_DAIFMT_FORMAT_MASK
) {
190 case SND_SOC_DAIFMT_I2S
: aic26
->datfm
= AIC26_DATFM_I2S
; break;
191 case SND_SOC_DAIFMT_DSP_A
: aic26
->datfm
= AIC26_DATFM_DSP
; break;
192 case SND_SOC_DAIFMT_RIGHT_J
: aic26
->datfm
= AIC26_DATFM_RIGHTJ
; break;
193 case SND_SOC_DAIFMT_LEFT_J
: aic26
->datfm
= AIC26_DATFM_LEFTJ
; break;
195 dev_dbg(&aic26
->spi
->dev
, "bad format\n"); return -EINVAL
;
201 /* ---------------------------------------------------------------------
202 * Digital Audio Interface Definition
204 #define AIC26_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |\
205 SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |\
206 SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |\
207 SNDRV_PCM_RATE_48000)
208 #define AIC26_FORMATS (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_BE |\
209 SNDRV_PCM_FMTBIT_S24_BE | SNDRV_PCM_FMTBIT_S32_BE)
211 static const struct snd_soc_dai_ops aic26_dai_ops
= {
212 .hw_params
= aic26_hw_params
,
213 .digital_mute
= aic26_mute
,
214 .set_sysclk
= aic26_set_sysclk
,
215 .set_fmt
= aic26_set_fmt
,
218 static struct snd_soc_dai_driver aic26_dai
= {
219 .name
= "tlv320aic26-hifi",
221 .stream_name
= "Playback",
224 .rates
= AIC26_RATES
,
225 .formats
= AIC26_FORMATS
,
228 .stream_name
= "Capture",
231 .rates
= AIC26_RATES
,
232 .formats
= AIC26_FORMATS
,
234 .ops
= &aic26_dai_ops
,
237 /* ---------------------------------------------------------------------
240 static const char *aic26_capture_src_text
[] = {"Mic", "Aux"};
241 static SOC_ENUM_SINGLE_DECL(aic26_capture_src_enum
,
242 AIC26_REG_AUDIO_CTRL1
, 12,
243 aic26_capture_src_text
);
245 static const struct snd_kcontrol_new aic26_snd_controls
[] = {
247 SOC_DOUBLE("PCM Playback Volume", AIC26_REG_DAC_GAIN
, 8, 0, 0x7f, 1),
248 SOC_DOUBLE("PCM Playback Switch", AIC26_REG_DAC_GAIN
, 15, 7, 1, 1),
249 SOC_SINGLE("PCM Capture Volume", AIC26_REG_ADC_GAIN
, 8, 0x7f, 0),
250 SOC_SINGLE("PCM Capture Mute", AIC26_REG_ADC_GAIN
, 15, 1, 1),
251 SOC_SINGLE("Keyclick activate", AIC26_REG_AUDIO_CTRL2
, 15, 0x1, 0),
252 SOC_SINGLE("Keyclick amplitude", AIC26_REG_AUDIO_CTRL2
, 12, 0x7, 0),
253 SOC_SINGLE("Keyclick frequency", AIC26_REG_AUDIO_CTRL2
, 8, 0x7, 0),
254 SOC_SINGLE("Keyclick period", AIC26_REG_AUDIO_CTRL2
, 4, 0xf, 0),
255 SOC_ENUM("Capture Source", aic26_capture_src_enum
),
258 /* ---------------------------------------------------------------------
259 * SPI device portion of driver: sysfs files for debugging
262 static ssize_t
aic26_keyclick_show(struct device
*dev
,
263 struct device_attribute
*attr
, char *buf
)
265 struct aic26
*aic26
= dev_get_drvdata(dev
);
266 int val
, amp
, freq
, len
;
268 val
= snd_soc_read(aic26
->codec
, AIC26_REG_AUDIO_CTRL2
);
269 amp
= (val
>> 12) & 0x7;
270 freq
= (125 << ((val
>> 8) & 0x7)) >> 1;
271 len
= 2 * (1 + ((val
>> 4) & 0xf));
273 return sprintf(buf
, "amp=%x freq=%iHz len=%iclks\n", amp
, freq
, len
);
276 /* Any write to the keyclick attribute will trigger the keyclick event */
277 static ssize_t
aic26_keyclick_set(struct device
*dev
,
278 struct device_attribute
*attr
,
279 const char *buf
, size_t count
)
281 struct aic26
*aic26
= dev_get_drvdata(dev
);
283 snd_soc_update_bits(aic26
->codec
, AIC26_REG_AUDIO_CTRL2
,
289 static DEVICE_ATTR(keyclick
, 0644, aic26_keyclick_show
, aic26_keyclick_set
);
291 /* ---------------------------------------------------------------------
292 * SoC CODEC portion of driver: probe and release routines
294 static int aic26_probe(struct snd_soc_codec
*codec
)
296 struct aic26
*aic26
= dev_get_drvdata(codec
->dev
);
299 aic26
->codec
= codec
;
301 /* Reset the codec to power on defaults */
302 snd_soc_write(codec
, AIC26_REG_RESET
, 0xBB00);
305 snd_soc_write(codec
, AIC26_REG_POWER_CTRL
, 0);
307 /* Audio Control 3 (master mode, fsref rate) */
308 reg
= snd_soc_read(codec
, AIC26_REG_AUDIO_CTRL3
);
310 reg
|= 0x0800; /* set master mode */
311 snd_soc_write(codec
, AIC26_REG_AUDIO_CTRL3
, reg
);
313 /* Register the sysfs files for debugging */
314 /* Create SysFS files */
315 ret
= device_create_file(codec
->dev
, &dev_attr_keyclick
);
317 dev_info(codec
->dev
, "error creating sysfs files\n");
322 static struct snd_soc_codec_driver aic26_soc_codec_dev
= {
323 .probe
= aic26_probe
,
324 .component_driver
= {
325 .controls
= aic26_snd_controls
,
326 .num_controls
= ARRAY_SIZE(aic26_snd_controls
),
327 .dapm_widgets
= tlv320aic26_dapm_widgets
,
328 .num_dapm_widgets
= ARRAY_SIZE(tlv320aic26_dapm_widgets
),
329 .dapm_routes
= tlv320aic26_dapm_routes
,
330 .num_dapm_routes
= ARRAY_SIZE(tlv320aic26_dapm_routes
),
334 static const struct regmap_config aic26_regmap
= {
339 /* ---------------------------------------------------------------------
340 * SPI device portion of driver: probe and release routines and SPI
341 * driver registration.
343 static int aic26_spi_probe(struct spi_device
*spi
)
348 dev_dbg(&spi
->dev
, "probing tlv320aic26 spi device\n");
350 /* Allocate driver data */
351 aic26
= devm_kzalloc(&spi
->dev
, sizeof *aic26
, GFP_KERNEL
);
355 aic26
->regmap
= devm_regmap_init_spi(spi
, &aic26_regmap
);
356 if (IS_ERR(aic26
->regmap
))
357 return PTR_ERR(aic26
->regmap
);
359 /* Initialize the driver data */
361 dev_set_drvdata(&spi
->dev
, aic26
);
364 ret
= snd_soc_register_codec(&spi
->dev
,
365 &aic26_soc_codec_dev
, &aic26_dai
, 1);
369 static int aic26_spi_remove(struct spi_device
*spi
)
371 snd_soc_unregister_codec(&spi
->dev
);
375 static struct spi_driver aic26_spi
= {
377 .name
= "tlv320aic26-codec",
379 .probe
= aic26_spi_probe
,
380 .remove
= aic26_spi_remove
,
383 module_spi_driver(aic26_spi
);