2 * ak4642.c -- AK4642/AK4643 ALSA Soc Audio driver
4 * Copyright (C) 2009 Renesas Solutions Corp.
5 * Kuninori Morimoto <morimoto.kuninori@renesas.com>
7 * Based on wm8731.c by Richard Purdie
8 * Based on ak4535.c by Richard Purdie
9 * Based on wm8753.c by Liam Girdwood
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
18 * This is very simple driver.
19 * It can use headphone output / stereo input only
21 * AK4642 is not tested.
25 #include <linux/delay.h>
26 #include <linux/i2c.h>
27 #include <linux/platform_device.h>
28 #include <linux/slab.h>
29 #include <linux/module.h>
30 #include <sound/soc.h>
31 #include <sound/initval.h>
32 #include <sound/tlv.h>
34 #define AK4642_VERSION "0.0.1"
74 #define AK4642_CACHEREGNUM 0x25
77 #define PMVCM (1 << 6) /* VCOM Power Management */
78 #define PMMIN (1 << 5) /* MIN Input Power Management */
79 #define PMDAC (1 << 2) /* DAC Power Management */
80 #define PMADL (1 << 0) /* MIC Amp Lch and ADC Lch Power Management */
83 #define HPMTN (1 << 6)
84 #define PMHPL (1 << 5)
85 #define PMHPR (1 << 4)
86 #define MS (1 << 3) /* master/slave select */
88 #define PMPLL (1 << 0)
90 #define PMHP_MASK (PMHPL | PMHPR)
91 #define PMHP PMHP_MASK
94 #define PMADR (1 << 0) /* MIC L / ADC R Power Management */
97 #define MINS (1 << 6) /* Switch from MIN to Speaker */
98 #define DACL (1 << 4) /* Switch from DAC to Stereo or Receiver */
99 #define PMMP (1 << 2) /* MPWR pin Power Management */
100 #define MGAIN0 (1 << 0) /* MIC amp gain*/
103 #define ZTM(param) ((param & 0x3) << 4) /* ALC Zoro Crossing TimeOut */
104 #define WTM(param) (((param & 0x4) << 4) | ((param & 0x3) << 2))
107 #define ALC (1 << 5) /* ALC Enable */
108 #define LMTH0 (1 << 0) /* ALC Limiter / Recovery Level */
111 #define PLL3 (1 << 7)
112 #define PLL2 (1 << 6)
113 #define PLL1 (1 << 5)
114 #define PLL0 (1 << 4)
115 #define PLL_MASK (PLL3 | PLL2 | PLL1 | PLL0)
117 #define BCKO_MASK (1 << 3)
118 #define BCKO_64 BCKO_MASK
120 #define DIF_MASK (3 << 0)
122 #define RIGHT_J (1 << 0)
123 #define LEFT_J (2 << 0)
131 #define FS_MASK (FS0 | FS1 | FS2 | FS3)
134 #define BST1 (1 << 3)
137 #define DACH (1 << 0)
140 * Playback Volume (table 39)
142 * max : 0x00 : +12.0 dB
144 * min : 0xFE : -115.0 dB
147 static const DECLARE_TLV_DB_SCALE(out_tlv
, -11500, 50, 1);
149 static const struct snd_kcontrol_new ak4642_snd_controls
[] = {
151 SOC_DOUBLE_R_TLV("Digital Playback Volume", L_DVC
, R_DVC
,
152 0, 0xFF, 1, out_tlv
),
156 /* codec private data */
159 enum snd_soc_control_type control_type
;
163 * ak4642 register cache
165 static const u8 ak4642_reg
[AK4642_CACHEREGNUM
] = {
166 0x00, 0x00, 0x01, 0x00,
167 0x02, 0x00, 0x00, 0x00,
168 0xe1, 0xe1, 0x18, 0x00,
169 0xe1, 0x18, 0x11, 0x08,
170 0x00, 0x00, 0x00, 0x00,
171 0x00, 0x00, 0x00, 0x00,
172 0x00, 0x00, 0x00, 0x00,
173 0x00, 0x00, 0x00, 0x00,
174 0x00, 0x00, 0x00, 0x00,
178 static int ak4642_dai_startup(struct snd_pcm_substream
*substream
,
179 struct snd_soc_dai
*dai
)
181 int is_play
= substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
;
182 struct snd_soc_codec
*codec
= dai
->codec
;
186 * start headphone output
189 * Audio I/F Format :MSB justified (ADC & DAC)
190 * Bass Boost Level : Middle
192 * This operation came from example code of
193 * "ASAHI KASEI AK4642" (japanese) manual p97.
195 snd_soc_update_bits(codec
, MD_CTL4
, DACH
, DACH
);
196 snd_soc_update_bits(codec
, MD_CTL3
, BST1
, BST1
);
197 snd_soc_write(codec
, L_IVC
, 0x91); /* volume */
198 snd_soc_write(codec
, R_IVC
, 0x91); /* volume */
199 snd_soc_update_bits(codec
, PW_MGMT1
, PMVCM
| PMMIN
| PMDAC
,
200 PMVCM
| PMMIN
| PMDAC
);
201 snd_soc_update_bits(codec
, PW_MGMT2
, PMHP_MASK
, PMHP
);
202 snd_soc_update_bits(codec
, PW_MGMT2
, HPMTN
, HPMTN
);
208 * Audio I/F Format:MSB justified (ADC & DAC)
211 * ALC setting:Refer to Table 35
214 * This operation came from example code of
215 * "ASAHI KASEI AK4642" (japanese) manual p94.
217 snd_soc_write(codec
, SG_SL1
, PMMP
| MGAIN0
);
218 snd_soc_write(codec
, TIMER
, ZTM(0x3) | WTM(0x3));
219 snd_soc_write(codec
, ALC_CTL1
, ALC
| LMTH0
);
220 snd_soc_update_bits(codec
, PW_MGMT1
, PMVCM
| PMADL
,
222 snd_soc_update_bits(codec
, PW_MGMT3
, PMADR
, PMADR
);
228 static void ak4642_dai_shutdown(struct snd_pcm_substream
*substream
,
229 struct snd_soc_dai
*dai
)
231 int is_play
= substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
;
232 struct snd_soc_codec
*codec
= dai
->codec
;
235 /* stop headphone output */
236 snd_soc_update_bits(codec
, PW_MGMT2
, HPMTN
, 0);
237 snd_soc_update_bits(codec
, PW_MGMT2
, PMHP_MASK
, 0);
238 snd_soc_update_bits(codec
, PW_MGMT1
, PMMIN
| PMDAC
, 0);
239 snd_soc_update_bits(codec
, MD_CTL3
, BST1
, 0);
240 snd_soc_update_bits(codec
, MD_CTL4
, DACH
, 0);
242 /* stop stereo input */
243 snd_soc_update_bits(codec
, PW_MGMT1
, PMADL
, 0);
244 snd_soc_update_bits(codec
, PW_MGMT3
, PMADR
, 0);
245 snd_soc_update_bits(codec
, ALC_CTL1
, ALC
, 0);
249 static int ak4642_dai_set_sysclk(struct snd_soc_dai
*codec_dai
,
250 int clk_id
, unsigned int freq
, int dir
)
252 struct snd_soc_codec
*codec
= codec_dai
->codec
;
266 pll
= PLL2
| PLL1
| PLL0
;
272 pll
= PLL3
| PLL2
| PLL0
;
277 snd_soc_update_bits(codec
, MD_CTL1
, PLL_MASK
, pll
);
282 static int ak4642_dai_set_fmt(struct snd_soc_dai
*dai
, unsigned int fmt
)
284 struct snd_soc_codec
*codec
= dai
->codec
;
288 data
= MCKO
| PMPLL
; /* use MCKO */
291 /* set master/slave audio interface */
292 switch (fmt
& SND_SOC_DAIFMT_MASTER_MASK
) {
293 case SND_SOC_DAIFMT_CBM_CFM
:
297 case SND_SOC_DAIFMT_CBS_CFS
:
302 snd_soc_update_bits(codec
, PW_MGMT2
, MS
| MCKO
| PMPLL
, data
);
303 snd_soc_update_bits(codec
, MD_CTL1
, BCKO_MASK
, bcko
);
307 switch (fmt
& SND_SOC_DAIFMT_FORMAT_MASK
) {
308 case SND_SOC_DAIFMT_LEFT_J
:
311 case SND_SOC_DAIFMT_I2S
:
315 * Please add RIGHT_J / DSP support here
321 snd_soc_update_bits(codec
, MD_CTL1
, DIF_MASK
, data
);
326 static int ak4642_dai_hw_params(struct snd_pcm_substream
*substream
,
327 struct snd_pcm_hw_params
*params
,
328 struct snd_soc_dai
*dai
)
330 struct snd_soc_codec
*codec
= dai
->codec
;
333 switch (params_rate(params
)) {
353 rate
= FS2
| FS1
| FS0
;
359 rate
= FS3
| FS2
| FS1
;
365 rate
= FS3
| FS2
| FS1
| FS0
;
368 rate
= FS3
| FS1
| FS0
;
374 snd_soc_update_bits(codec
, MD_CTL2
, FS_MASK
, rate
);
379 static struct snd_soc_dai_ops ak4642_dai_ops
= {
380 .startup
= ak4642_dai_startup
,
381 .shutdown
= ak4642_dai_shutdown
,
382 .set_sysclk
= ak4642_dai_set_sysclk
,
383 .set_fmt
= ak4642_dai_set_fmt
,
384 .hw_params
= ak4642_dai_hw_params
,
387 static struct snd_soc_dai_driver ak4642_dai
= {
388 .name
= "ak4642-hifi",
390 .stream_name
= "Playback",
393 .rates
= SNDRV_PCM_RATE_8000_48000
,
394 .formats
= SNDRV_PCM_FMTBIT_S16_LE
},
396 .stream_name
= "Capture",
399 .rates
= SNDRV_PCM_RATE_8000_48000
,
400 .formats
= SNDRV_PCM_FMTBIT_S16_LE
},
401 .ops
= &ak4642_dai_ops
,
402 .symmetric_rates
= 1,
405 static int ak4642_resume(struct snd_soc_codec
*codec
)
407 snd_soc_cache_sync(codec
);
412 static int ak4642_probe(struct snd_soc_codec
*codec
)
414 struct ak4642_priv
*ak4642
= snd_soc_codec_get_drvdata(codec
);
417 dev_info(codec
->dev
, "AK4642 Audio Codec %s", AK4642_VERSION
);
419 ret
= snd_soc_codec_set_cache_io(codec
, 8, 8, ak4642
->control_type
);
421 dev_err(codec
->dev
, "Failed to set cache I/O: %d\n", ret
);
425 snd_soc_add_controls(codec
, ak4642_snd_controls
,
426 ARRAY_SIZE(ak4642_snd_controls
));
431 static struct snd_soc_codec_driver soc_codec_dev_ak4642
= {
432 .probe
= ak4642_probe
,
433 .resume
= ak4642_resume
,
434 .reg_cache_size
= ARRAY_SIZE(ak4642_reg
),
435 .reg_word_size
= sizeof(u8
),
436 .reg_cache_default
= ak4642_reg
,
439 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
440 static __devinit
int ak4642_i2c_probe(struct i2c_client
*i2c
,
441 const struct i2c_device_id
*id
)
443 struct ak4642_priv
*ak4642
;
446 ak4642
= kzalloc(sizeof(struct ak4642_priv
), GFP_KERNEL
);
450 i2c_set_clientdata(i2c
, ak4642
);
451 ak4642
->control_type
= SND_SOC_I2C
;
453 ret
= snd_soc_register_codec(&i2c
->dev
,
454 &soc_codec_dev_ak4642
, &ak4642_dai
, 1);
460 static __devexit
int ak4642_i2c_remove(struct i2c_client
*client
)
462 snd_soc_unregister_codec(&client
->dev
);
463 kfree(i2c_get_clientdata(client
));
467 static const struct i2c_device_id ak4642_i2c_id
[] = {
472 MODULE_DEVICE_TABLE(i2c
, ak4642_i2c_id
);
474 static struct i2c_driver ak4642_i2c_driver
= {
476 .name
= "ak4642-codec",
477 .owner
= THIS_MODULE
,
479 .probe
= ak4642_i2c_probe
,
480 .remove
= __devexit_p(ak4642_i2c_remove
),
481 .id_table
= ak4642_i2c_id
,
485 static int __init
ak4642_modinit(void)
488 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
489 ret
= i2c_add_driver(&ak4642_i2c_driver
);
494 module_init(ak4642_modinit
);
496 static void __exit
ak4642_exit(void)
498 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
499 i2c_del_driver(&ak4642_i2c_driver
);
503 module_exit(ak4642_exit
);
505 MODULE_DESCRIPTION("Soc AK4642 driver");
506 MODULE_AUTHOR("Kuninori Morimoto <morimoto.kuninori@renesas.com>");
507 MODULE_LICENSE("GPL");