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");