Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
[deliverable/linux.git] / sound / soc / codecs / ak4642.c
1 /*
2 * ak4642.c -- AK4642/AK4643 ALSA Soc Audio driver
3 *
4 * Copyright (C) 2009 Renesas Solutions Corp.
5 * Kuninori Morimoto <morimoto.kuninori@renesas.com>
6 *
7 * Based on wm8731.c by Richard Purdie
8 * Based on ak4535.c by Richard Purdie
9 * Based on wm8753.c by Liam Girdwood
10 *
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.
14 */
15
16 /* ** CAUTION **
17 *
18 * This is very simple driver.
19 * It can use headphone output / stereo input only
20 *
21 * AK4642 is not tested.
22 * AK4643 is tested.
23 */
24
25 #include <linux/module.h>
26 #include <linux/moduleparam.h>
27 #include <linux/init.h>
28 #include <linux/delay.h>
29 #include <linux/pm.h>
30 #include <linux/i2c.h>
31 #include <linux/platform_device.h>
32 #include <linux/slab.h>
33 #include <sound/core.h>
34 #include <sound/pcm.h>
35 #include <sound/pcm_params.h>
36 #include <sound/soc.h>
37 #include <sound/soc-dapm.h>
38 #include <sound/initval.h>
39
40 #include "ak4642.h"
41
42 #define AK4642_VERSION "0.0.1"
43
44 #define PW_MGMT1 0x00
45 #define PW_MGMT2 0x01
46 #define SG_SL1 0x02
47 #define SG_SL2 0x03
48 #define MD_CTL1 0x04
49 #define MD_CTL2 0x05
50 #define TIMER 0x06
51 #define ALC_CTL1 0x07
52 #define ALC_CTL2 0x08
53 #define L_IVC 0x09
54 #define L_DVC 0x0a
55 #define ALC_CTL3 0x0b
56 #define R_IVC 0x0c
57 #define R_DVC 0x0d
58 #define MD_CTL3 0x0e
59 #define MD_CTL4 0x0f
60 #define PW_MGMT3 0x10
61 #define DF_S 0x11
62 #define FIL3_0 0x12
63 #define FIL3_1 0x13
64 #define FIL3_2 0x14
65 #define FIL3_3 0x15
66 #define EQ_0 0x16
67 #define EQ_1 0x17
68 #define EQ_2 0x18
69 #define EQ_3 0x19
70 #define EQ_4 0x1a
71 #define EQ_5 0x1b
72 #define FIL1_0 0x1c
73 #define FIL1_1 0x1d
74 #define FIL1_2 0x1e
75 #define FIL1_3 0x1f
76 #define PW_MGMT4 0x20
77 #define MD_CTL5 0x21
78 #define LO_MS 0x22
79 #define HP_MS 0x23
80 #define SPK_MS 0x24
81
82 #define AK4642_CACHEREGNUM 0x25
83
84 /* PW_MGMT2 */
85 #define HPMTN (1 << 6)
86 #define PMHPL (1 << 5)
87 #define PMHPR (1 << 4)
88 #define MS (1 << 3) /* master/slave select */
89 #define MCKO (1 << 1)
90 #define PMPLL (1 << 0)
91
92 #define PMHP_MASK (PMHPL | PMHPR)
93 #define PMHP PMHP_MASK
94
95 /* MD_CTL1 */
96 #define PLL3 (1 << 7)
97 #define PLL2 (1 << 6)
98 #define PLL1 (1 << 5)
99 #define PLL0 (1 << 4)
100 #define PLL_MASK (PLL3 | PLL2 | PLL1 | PLL0)
101
102 #define BCKO_MASK (1 << 3)
103 #define BCKO_64 BCKO_MASK
104
105 /* MD_CTL2 */
106 #define FS0 (1 << 0)
107 #define FS1 (1 << 1)
108 #define FS2 (1 << 2)
109 #define FS3 (1 << 5)
110 #define FS_MASK (FS0 | FS1 | FS2 | FS3)
111
112 struct snd_soc_codec_device soc_codec_dev_ak4642;
113
114 /* codec private data */
115 struct ak4642_priv {
116 struct snd_soc_codec codec;
117 };
118
119 static struct snd_soc_codec *ak4642_codec;
120
121 /*
122 * ak4642 register cache
123 */
124 static const u16 ak4642_reg[AK4642_CACHEREGNUM] = {
125 0x0000, 0x0000, 0x0001, 0x0000,
126 0x0002, 0x0000, 0x0000, 0x0000,
127 0x00e1, 0x00e1, 0x0018, 0x0000,
128 0x00e1, 0x0018, 0x0011, 0x0008,
129 0x0000, 0x0000, 0x0000, 0x0000,
130 0x0000, 0x0000, 0x0000, 0x0000,
131 0x0000, 0x0000, 0x0000, 0x0000,
132 0x0000, 0x0000, 0x0000, 0x0000,
133 0x0000, 0x0000, 0x0000, 0x0000,
134 0x0000,
135 };
136
137 /*
138 * read ak4642 register cache
139 */
140 static inline unsigned int ak4642_read_reg_cache(struct snd_soc_codec *codec,
141 unsigned int reg)
142 {
143 u16 *cache = codec->reg_cache;
144 if (reg >= AK4642_CACHEREGNUM)
145 return -1;
146 return cache[reg];
147 }
148
149 /*
150 * write ak4642 register cache
151 */
152 static inline void ak4642_write_reg_cache(struct snd_soc_codec *codec,
153 u16 reg, unsigned int value)
154 {
155 u16 *cache = codec->reg_cache;
156 if (reg >= AK4642_CACHEREGNUM)
157 return;
158
159 cache[reg] = value;
160 }
161
162 /*
163 * write to the AK4642 register space
164 */
165 static int ak4642_write(struct snd_soc_codec *codec, unsigned int reg,
166 unsigned int value)
167 {
168 u8 data[2];
169
170 /* data is
171 * D15..D8 AK4642 register offset
172 * D7...D0 register data
173 */
174 data[0] = reg & 0xff;
175 data[1] = value & 0xff;
176
177 if (codec->hw_write(codec->control_data, data, 2) == 2) {
178 ak4642_write_reg_cache(codec, reg, value);
179 return 0;
180 } else
181 return -EIO;
182 }
183
184 static int ak4642_sync(struct snd_soc_codec *codec)
185 {
186 u16 *cache = codec->reg_cache;
187 int i, r = 0;
188
189 for (i = 0; i < AK4642_CACHEREGNUM; i++)
190 r |= ak4642_write(codec, i, cache[i]);
191
192 return r;
193 };
194
195 static int ak4642_dai_startup(struct snd_pcm_substream *substream,
196 struct snd_soc_dai *dai)
197 {
198 int is_play = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
199 struct snd_soc_codec *codec = dai->codec;
200
201 if (is_play) {
202 /*
203 * start headphone output
204 *
205 * PLL, Master Mode
206 * Audio I/F Format :MSB justified (ADC & DAC)
207 * Digital Volume: -8dB
208 * Bass Boost Level : Middle
209 *
210 * This operation came from example code of
211 * "ASAHI KASEI AK4642" (japanese) manual p97.
212 */
213 ak4642_write(codec, 0x0f, 0x09);
214 ak4642_write(codec, 0x0e, 0x19);
215 ak4642_write(codec, 0x09, 0x91);
216 ak4642_write(codec, 0x0c, 0x91);
217 ak4642_write(codec, 0x0a, 0x28);
218 ak4642_write(codec, 0x0d, 0x28);
219 ak4642_write(codec, 0x00, 0x64);
220 snd_soc_update_bits(codec, PW_MGMT2, PMHP_MASK, PMHP);
221 snd_soc_update_bits(codec, PW_MGMT2, HPMTN, HPMTN);
222 } else {
223 /*
224 * start stereo input
225 *
226 * PLL Master Mode
227 * Audio I/F Format:MSB justified (ADC & DAC)
228 * Pre MIC AMP:+20dB
229 * MIC Power On
230 * ALC setting:Refer to Table 35
231 * ALC bit=“1”
232 *
233 * This operation came from example code of
234 * "ASAHI KASEI AK4642" (japanese) manual p94.
235 */
236 ak4642_write(codec, 0x02, 0x05);
237 ak4642_write(codec, 0x06, 0x3c);
238 ak4642_write(codec, 0x08, 0xe1);
239 ak4642_write(codec, 0x0b, 0x00);
240 ak4642_write(codec, 0x07, 0x21);
241 ak4642_write(codec, 0x00, 0x41);
242 ak4642_write(codec, 0x10, 0x01);
243 }
244
245 return 0;
246 }
247
248 static void ak4642_dai_shutdown(struct snd_pcm_substream *substream,
249 struct snd_soc_dai *dai)
250 {
251 int is_play = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
252 struct snd_soc_codec *codec = dai->codec;
253
254 if (is_play) {
255 /* stop headphone output */
256 snd_soc_update_bits(codec, PW_MGMT2, HPMTN, 0);
257 snd_soc_update_bits(codec, PW_MGMT2, PMHP_MASK, 0);
258 ak4642_write(codec, 0x00, 0x40);
259 ak4642_write(codec, 0x0e, 0x11);
260 ak4642_write(codec, 0x0f, 0x08);
261 } else {
262 /* stop stereo input */
263 ak4642_write(codec, 0x00, 0x40);
264 ak4642_write(codec, 0x10, 0x00);
265 ak4642_write(codec, 0x07, 0x01);
266 }
267 }
268
269 static int ak4642_dai_set_sysclk(struct snd_soc_dai *codec_dai,
270 int clk_id, unsigned int freq, int dir)
271 {
272 struct snd_soc_codec *codec = codec_dai->codec;
273 u8 pll;
274
275 switch (freq) {
276 case 11289600:
277 pll = PLL2;
278 break;
279 case 12288000:
280 pll = PLL2 | PLL0;
281 break;
282 case 12000000:
283 pll = PLL2 | PLL1;
284 break;
285 case 24000000:
286 pll = PLL2 | PLL1 | PLL0;
287 break;
288 case 13500000:
289 pll = PLL3 | PLL2;
290 break;
291 case 27000000:
292 pll = PLL3 | PLL2 | PLL0;
293 break;
294 default:
295 return -EINVAL;
296 }
297 snd_soc_update_bits(codec, MD_CTL1, PLL_MASK, pll);
298
299 return 0;
300 }
301
302 static int ak4642_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
303 {
304 struct snd_soc_codec *codec = dai->codec;
305 u8 data;
306 u8 bcko;
307
308 data = MCKO | PMPLL; /* use MCKO */
309 bcko = 0;
310
311 /* set master/slave audio interface */
312 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
313 case SND_SOC_DAIFMT_CBM_CFM:
314 data |= MS;
315 bcko = BCKO_64;
316 break;
317 case SND_SOC_DAIFMT_CBS_CFS:
318 break;
319 default:
320 return -EINVAL;
321 }
322 snd_soc_update_bits(codec, PW_MGMT2, MS, data);
323 snd_soc_update_bits(codec, MD_CTL1, BCKO_MASK, bcko);
324
325 return 0;
326 }
327
328 static int ak4642_dai_hw_params(struct snd_pcm_substream *substream,
329 struct snd_pcm_hw_params *params,
330 struct snd_soc_dai *dai)
331 {
332 struct snd_soc_codec *codec = dai->codec;
333 u8 rate;
334
335 switch (params_rate(params)) {
336 case 7350:
337 rate = FS2;
338 break;
339 case 8000:
340 rate = 0;
341 break;
342 case 11025:
343 rate = FS2 | FS0;
344 break;
345 case 12000:
346 rate = FS0;
347 break;
348 case 14700:
349 rate = FS2 | FS1;
350 break;
351 case 16000:
352 rate = FS1;
353 break;
354 case 22050:
355 rate = FS2 | FS1 | FS0;
356 break;
357 case 24000:
358 rate = FS1 | FS0;
359 break;
360 case 29400:
361 rate = FS3 | FS2 | FS1;
362 break;
363 case 32000:
364 rate = FS3 | FS1;
365 break;
366 case 44100:
367 rate = FS3 | FS2 | FS1 | FS0;
368 break;
369 case 48000:
370 rate = FS3 | FS1 | FS0;
371 break;
372 default:
373 return -EINVAL;
374 break;
375 }
376 snd_soc_update_bits(codec, MD_CTL2, FS_MASK, rate);
377
378 return 0;
379 }
380
381 static struct snd_soc_dai_ops ak4642_dai_ops = {
382 .startup = ak4642_dai_startup,
383 .shutdown = ak4642_dai_shutdown,
384 .set_sysclk = ak4642_dai_set_sysclk,
385 .set_fmt = ak4642_dai_set_fmt,
386 .hw_params = ak4642_dai_hw_params,
387 };
388
389 struct snd_soc_dai ak4642_dai = {
390 .name = "AK4642",
391 .playback = {
392 .stream_name = "Playback",
393 .channels_min = 1,
394 .channels_max = 2,
395 .rates = SNDRV_PCM_RATE_8000_48000,
396 .formats = SNDRV_PCM_FMTBIT_S16_LE },
397 .capture = {
398 .stream_name = "Capture",
399 .channels_min = 1,
400 .channels_max = 2,
401 .rates = SNDRV_PCM_RATE_8000_48000,
402 .formats = SNDRV_PCM_FMTBIT_S16_LE },
403 .ops = &ak4642_dai_ops,
404 .symmetric_rates = 1,
405 };
406 EXPORT_SYMBOL_GPL(ak4642_dai);
407
408 static int ak4642_resume(struct platform_device *pdev)
409 {
410 struct snd_soc_device *socdev = platform_get_drvdata(pdev);
411 struct snd_soc_codec *codec = socdev->card->codec;
412
413 ak4642_sync(codec);
414 return 0;
415 }
416
417 /*
418 * initialise the AK4642 driver
419 * register the mixer and dsp interfaces with the kernel
420 */
421 static int ak4642_init(struct ak4642_priv *ak4642)
422 {
423 struct snd_soc_codec *codec = &ak4642->codec;
424 int ret = 0;
425
426 if (ak4642_codec) {
427 dev_err(codec->dev, "Another ak4642 is registered\n");
428 return -EINVAL;
429 }
430
431 mutex_init(&codec->mutex);
432 INIT_LIST_HEAD(&codec->dapm_widgets);
433 INIT_LIST_HEAD(&codec->dapm_paths);
434
435 snd_soc_codec_set_drvdata(codec, ak4642);
436 codec->name = "AK4642";
437 codec->owner = THIS_MODULE;
438 codec->read = ak4642_read_reg_cache;
439 codec->write = ak4642_write;
440 codec->dai = &ak4642_dai;
441 codec->num_dai = 1;
442 codec->hw_write = (hw_write_t)i2c_master_send;
443 codec->reg_cache_size = ARRAY_SIZE(ak4642_reg);
444 codec->reg_cache = kmemdup(ak4642_reg,
445 sizeof(ak4642_reg), GFP_KERNEL);
446
447 if (!codec->reg_cache)
448 return -ENOMEM;
449
450 ak4642_dai.dev = codec->dev;
451 ak4642_codec = codec;
452
453 ret = snd_soc_register_codec(codec);
454 if (ret) {
455 dev_err(codec->dev, "Failed to register codec: %d\n", ret);
456 goto reg_cache_err;
457 }
458
459 ret = snd_soc_register_dai(&ak4642_dai);
460 if (ret) {
461 dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
462 snd_soc_unregister_codec(codec);
463 goto reg_cache_err;
464 }
465
466 return ret;
467
468 reg_cache_err:
469 kfree(codec->reg_cache);
470 codec->reg_cache = NULL;
471
472 return ret;
473 }
474
475 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
476 static int ak4642_i2c_probe(struct i2c_client *i2c,
477 const struct i2c_device_id *id)
478 {
479 struct ak4642_priv *ak4642;
480 struct snd_soc_codec *codec;
481 int ret;
482
483 ak4642 = kzalloc(sizeof(struct ak4642_priv), GFP_KERNEL);
484 if (!ak4642)
485 return -ENOMEM;
486
487 codec = &ak4642->codec;
488 codec->dev = &i2c->dev;
489
490 i2c_set_clientdata(i2c, ak4642);
491 codec->control_data = i2c;
492
493 ret = ak4642_init(ak4642);
494 if (ret < 0)
495 printk(KERN_ERR "failed to initialise AK4642\n");
496
497 return ret;
498 }
499
500 static int ak4642_i2c_remove(struct i2c_client *client)
501 {
502 struct ak4642_priv *ak4642 = i2c_get_clientdata(client);
503
504 snd_soc_unregister_dai(&ak4642_dai);
505 snd_soc_unregister_codec(&ak4642->codec);
506 kfree(ak4642->codec.reg_cache);
507 kfree(ak4642);
508 ak4642_codec = NULL;
509
510 return 0;
511 }
512
513 static const struct i2c_device_id ak4642_i2c_id[] = {
514 { "ak4642", 0 },
515 { "ak4643", 0 },
516 { }
517 };
518 MODULE_DEVICE_TABLE(i2c, ak4642_i2c_id);
519
520 static struct i2c_driver ak4642_i2c_driver = {
521 .driver = {
522 .name = "AK4642 I2C Codec",
523 .owner = THIS_MODULE,
524 },
525 .probe = ak4642_i2c_probe,
526 .remove = ak4642_i2c_remove,
527 .id_table = ak4642_i2c_id,
528 };
529
530 #endif
531
532 static int ak4642_probe(struct platform_device *pdev)
533 {
534 struct snd_soc_device *socdev = platform_get_drvdata(pdev);
535 int ret;
536
537 if (!ak4642_codec) {
538 dev_err(&pdev->dev, "Codec device not registered\n");
539 return -ENODEV;
540 }
541
542 socdev->card->codec = ak4642_codec;
543
544 /* register pcms */
545 ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
546 if (ret < 0) {
547 printk(KERN_ERR "ak4642: failed to create pcms\n");
548 goto pcm_err;
549 }
550
551 dev_info(&pdev->dev, "AK4642 Audio Codec %s", AK4642_VERSION);
552 return ret;
553
554 pcm_err:
555 return ret;
556
557 }
558
559 /* power down chip */
560 static int ak4642_remove(struct platform_device *pdev)
561 {
562 struct snd_soc_device *socdev = platform_get_drvdata(pdev);
563
564 snd_soc_free_pcms(socdev);
565 snd_soc_dapm_free(socdev);
566
567 return 0;
568 }
569
570 struct snd_soc_codec_device soc_codec_dev_ak4642 = {
571 .probe = ak4642_probe,
572 .remove = ak4642_remove,
573 .resume = ak4642_resume,
574 };
575 EXPORT_SYMBOL_GPL(soc_codec_dev_ak4642);
576
577 static int __init ak4642_modinit(void)
578 {
579 int ret = 0;
580 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
581 ret = i2c_add_driver(&ak4642_i2c_driver);
582 #endif
583 return ret;
584
585 }
586 module_init(ak4642_modinit);
587
588 static void __exit ak4642_exit(void)
589 {
590 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
591 i2c_del_driver(&ak4642_i2c_driver);
592 #endif
593
594 }
595 module_exit(ak4642_exit);
596
597 MODULE_DESCRIPTION("Soc AK4642 driver");
598 MODULE_AUTHOR("Kuninori Morimoto <morimoto.kuninori@renesas.com>");
599 MODULE_LICENSE("GPL");
This page took 0.055028 seconds and 6 git commands to generate.