xref: /openbmc/linux/sound/soc/codecs/ak4642.c (revision 5a0e3ad6)
1a3a83d9aSKuninori Morimoto /*
2a3a83d9aSKuninori Morimoto  * ak4642.c  --  AK4642/AK4643 ALSA Soc Audio driver
3a3a83d9aSKuninori Morimoto  *
4a3a83d9aSKuninori Morimoto  * Copyright (C) 2009 Renesas Solutions Corp.
5a3a83d9aSKuninori Morimoto  * Kuninori Morimoto <morimoto.kuninori@renesas.com>
6a3a83d9aSKuninori Morimoto  *
7a3a83d9aSKuninori Morimoto  * Based on wm8731.c by Richard Purdie
8a3a83d9aSKuninori Morimoto  * Based on ak4535.c by Richard Purdie
9a3a83d9aSKuninori Morimoto  * Based on wm8753.c by Liam Girdwood
10a3a83d9aSKuninori Morimoto  *
11a3a83d9aSKuninori Morimoto  * This program is free software; you can redistribute it and/or modify
12a3a83d9aSKuninori Morimoto  * it under the terms of the GNU General Public License version 2 as
13a3a83d9aSKuninori Morimoto  * published by the Free Software Foundation.
14a3a83d9aSKuninori Morimoto  */
15a3a83d9aSKuninori Morimoto 
16a3a83d9aSKuninori Morimoto /* ** CAUTION **
17a3a83d9aSKuninori Morimoto  *
18a3a83d9aSKuninori Morimoto  * This is very simple driver.
19a3a83d9aSKuninori Morimoto  * It can use headphone output / stereo input only
20a3a83d9aSKuninori Morimoto  *
21a3a83d9aSKuninori Morimoto  * AK4642 is not tested.
22a3a83d9aSKuninori Morimoto  * AK4643 is tested.
23a3a83d9aSKuninori Morimoto  */
24a3a83d9aSKuninori Morimoto 
25a3a83d9aSKuninori Morimoto #include <linux/module.h>
26a3a83d9aSKuninori Morimoto #include <linux/moduleparam.h>
27a3a83d9aSKuninori Morimoto #include <linux/init.h>
28a3a83d9aSKuninori Morimoto #include <linux/delay.h>
29a3a83d9aSKuninori Morimoto #include <linux/pm.h>
30a3a83d9aSKuninori Morimoto #include <linux/i2c.h>
31a3a83d9aSKuninori Morimoto #include <linux/platform_device.h>
325a0e3ad6STejun Heo #include <linux/slab.h>
33a3a83d9aSKuninori Morimoto #include <sound/core.h>
34a3a83d9aSKuninori Morimoto #include <sound/pcm.h>
35a3a83d9aSKuninori Morimoto #include <sound/pcm_params.h>
36a3a83d9aSKuninori Morimoto #include <sound/soc.h>
37a3a83d9aSKuninori Morimoto #include <sound/soc-dapm.h>
38a3a83d9aSKuninori Morimoto #include <sound/initval.h>
39a3a83d9aSKuninori Morimoto 
40a3a83d9aSKuninori Morimoto #include "ak4642.h"
41a3a83d9aSKuninori Morimoto 
42a3a83d9aSKuninori Morimoto #define AK4642_VERSION "0.0.1"
43a3a83d9aSKuninori Morimoto 
44a3a83d9aSKuninori Morimoto #define PW_MGMT1	0x00
45a3a83d9aSKuninori Morimoto #define PW_MGMT2	0x01
46a3a83d9aSKuninori Morimoto #define SG_SL1		0x02
47a3a83d9aSKuninori Morimoto #define SG_SL2		0x03
48a3a83d9aSKuninori Morimoto #define MD_CTL1		0x04
49a3a83d9aSKuninori Morimoto #define MD_CTL2		0x05
50a3a83d9aSKuninori Morimoto #define TIMER		0x06
51a3a83d9aSKuninori Morimoto #define ALC_CTL1	0x07
52a3a83d9aSKuninori Morimoto #define ALC_CTL2	0x08
53a3a83d9aSKuninori Morimoto #define L_IVC		0x09
54a3a83d9aSKuninori Morimoto #define L_DVC		0x0a
55a3a83d9aSKuninori Morimoto #define ALC_CTL3	0x0b
56a3a83d9aSKuninori Morimoto #define R_IVC		0x0c
57a3a83d9aSKuninori Morimoto #define R_DVC		0x0d
58a3a83d9aSKuninori Morimoto #define MD_CTL3		0x0e
59a3a83d9aSKuninori Morimoto #define MD_CTL4		0x0f
60a3a83d9aSKuninori Morimoto #define PW_MGMT3	0x10
61a3a83d9aSKuninori Morimoto #define DF_S		0x11
62a3a83d9aSKuninori Morimoto #define FIL3_0		0x12
63a3a83d9aSKuninori Morimoto #define FIL3_1		0x13
64a3a83d9aSKuninori Morimoto #define FIL3_2		0x14
65a3a83d9aSKuninori Morimoto #define FIL3_3		0x15
66a3a83d9aSKuninori Morimoto #define EQ_0		0x16
67a3a83d9aSKuninori Morimoto #define EQ_1		0x17
68a3a83d9aSKuninori Morimoto #define EQ_2		0x18
69a3a83d9aSKuninori Morimoto #define EQ_3		0x19
70a3a83d9aSKuninori Morimoto #define EQ_4		0x1a
71a3a83d9aSKuninori Morimoto #define EQ_5		0x1b
72a3a83d9aSKuninori Morimoto #define FIL1_0		0x1c
73a3a83d9aSKuninori Morimoto #define FIL1_1		0x1d
74a3a83d9aSKuninori Morimoto #define FIL1_2		0x1e
75a3a83d9aSKuninori Morimoto #define FIL1_3		0x1f
76a3a83d9aSKuninori Morimoto #define PW_MGMT4	0x20
77a3a83d9aSKuninori Morimoto #define MD_CTL5		0x21
78a3a83d9aSKuninori Morimoto #define LO_MS		0x22
79a3a83d9aSKuninori Morimoto #define HP_MS		0x23
80a3a83d9aSKuninori Morimoto #define SPK_MS		0x24
81a3a83d9aSKuninori Morimoto 
82a3a83d9aSKuninori Morimoto #define AK4642_CACHEREGNUM 	0x25
83a3a83d9aSKuninori Morimoto 
84a3a83d9aSKuninori Morimoto struct snd_soc_codec_device soc_codec_dev_ak4642;
85a3a83d9aSKuninori Morimoto 
86a3a83d9aSKuninori Morimoto /* codec private data */
87a3a83d9aSKuninori Morimoto struct ak4642_priv {
88a3a83d9aSKuninori Morimoto 	struct snd_soc_codec codec;
89a3a83d9aSKuninori Morimoto 	unsigned int sysclk;
90a3a83d9aSKuninori Morimoto };
91a3a83d9aSKuninori Morimoto 
92a3a83d9aSKuninori Morimoto static struct snd_soc_codec *ak4642_codec;
93a3a83d9aSKuninori Morimoto 
94a3a83d9aSKuninori Morimoto /*
95a3a83d9aSKuninori Morimoto  * ak4642 register cache
96a3a83d9aSKuninori Morimoto  */
97a3a83d9aSKuninori Morimoto static const u16 ak4642_reg[AK4642_CACHEREGNUM] = {
98a3a83d9aSKuninori Morimoto 	0x0000, 0x0000, 0x0001, 0x0000,
99a3a83d9aSKuninori Morimoto 	0x0002, 0x0000, 0x0000, 0x0000,
100a3a83d9aSKuninori Morimoto 	0x00e1, 0x00e1, 0x0018, 0x0000,
101a3a83d9aSKuninori Morimoto 	0x00e1, 0x0018, 0x0011, 0x0008,
102a3a83d9aSKuninori Morimoto 	0x0000, 0x0000, 0x0000, 0x0000,
103a3a83d9aSKuninori Morimoto 	0x0000, 0x0000, 0x0000, 0x0000,
104a3a83d9aSKuninori Morimoto 	0x0000, 0x0000, 0x0000, 0x0000,
105a3a83d9aSKuninori Morimoto 	0x0000, 0x0000, 0x0000, 0x0000,
106a3a83d9aSKuninori Morimoto 	0x0000, 0x0000, 0x0000, 0x0000,
107a3a83d9aSKuninori Morimoto 	0x0000,
108a3a83d9aSKuninori Morimoto };
109a3a83d9aSKuninori Morimoto 
110a3a83d9aSKuninori Morimoto /*
111a3a83d9aSKuninori Morimoto  * read ak4642 register cache
112a3a83d9aSKuninori Morimoto  */
113a3a83d9aSKuninori Morimoto static inline unsigned int ak4642_read_reg_cache(struct snd_soc_codec *codec,
114a3a83d9aSKuninori Morimoto 	unsigned int reg)
115a3a83d9aSKuninori Morimoto {
116a3a83d9aSKuninori Morimoto 	u16 *cache = codec->reg_cache;
117a3a83d9aSKuninori Morimoto 	if (reg >= AK4642_CACHEREGNUM)
118a3a83d9aSKuninori Morimoto 		return -1;
119a3a83d9aSKuninori Morimoto 	return cache[reg];
120a3a83d9aSKuninori Morimoto }
121a3a83d9aSKuninori Morimoto 
122a3a83d9aSKuninori Morimoto /*
123a3a83d9aSKuninori Morimoto  * write ak4642 register cache
124a3a83d9aSKuninori Morimoto  */
125a3a83d9aSKuninori Morimoto static inline void ak4642_write_reg_cache(struct snd_soc_codec *codec,
126a3a83d9aSKuninori Morimoto 	u16 reg, unsigned int value)
127a3a83d9aSKuninori Morimoto {
128a3a83d9aSKuninori Morimoto 	u16 *cache = codec->reg_cache;
129a3a83d9aSKuninori Morimoto 	if (reg >= AK4642_CACHEREGNUM)
130a3a83d9aSKuninori Morimoto 		return;
131a3a83d9aSKuninori Morimoto 
132a3a83d9aSKuninori Morimoto 	cache[reg] = value;
133a3a83d9aSKuninori Morimoto }
134a3a83d9aSKuninori Morimoto 
135a3a83d9aSKuninori Morimoto /*
136a3a83d9aSKuninori Morimoto  * write to the AK4642 register space
137a3a83d9aSKuninori Morimoto  */
138a3a83d9aSKuninori Morimoto static int ak4642_write(struct snd_soc_codec *codec, unsigned int reg,
139a3a83d9aSKuninori Morimoto 	unsigned int value)
140a3a83d9aSKuninori Morimoto {
141a3a83d9aSKuninori Morimoto 	u8 data[2];
142a3a83d9aSKuninori Morimoto 
143a3a83d9aSKuninori Morimoto 	/* data is
144a3a83d9aSKuninori Morimoto 	 *   D15..D8 AK4642 register offset
145a3a83d9aSKuninori Morimoto 	 *   D7...D0 register data
146a3a83d9aSKuninori Morimoto 	 */
147a3a83d9aSKuninori Morimoto 	data[0] = reg & 0xff;
148a3a83d9aSKuninori Morimoto 	data[1] = value & 0xff;
149a3a83d9aSKuninori Morimoto 
150a3a83d9aSKuninori Morimoto 	if (codec->hw_write(codec->control_data, data, 2) == 2) {
151a3a83d9aSKuninori Morimoto 		ak4642_write_reg_cache(codec, reg, value);
152a3a83d9aSKuninori Morimoto 		return 0;
153a3a83d9aSKuninori Morimoto 	} else
154a3a83d9aSKuninori Morimoto 		return -EIO;
155a3a83d9aSKuninori Morimoto }
156a3a83d9aSKuninori Morimoto 
157a3a83d9aSKuninori Morimoto static int ak4642_sync(struct snd_soc_codec *codec)
158a3a83d9aSKuninori Morimoto {
159a3a83d9aSKuninori Morimoto 	u16 *cache = codec->reg_cache;
160a3a83d9aSKuninori Morimoto 	int i, r = 0;
161a3a83d9aSKuninori Morimoto 
162a3a83d9aSKuninori Morimoto 	for (i = 0; i < AK4642_CACHEREGNUM; i++)
163a3a83d9aSKuninori Morimoto 		r |= ak4642_write(codec, i, cache[i]);
164a3a83d9aSKuninori Morimoto 
165a3a83d9aSKuninori Morimoto 	return r;
166a3a83d9aSKuninori Morimoto };
167a3a83d9aSKuninori Morimoto 
168a3a83d9aSKuninori Morimoto static int ak4642_dai_startup(struct snd_pcm_substream *substream,
169a3a83d9aSKuninori Morimoto 			      struct snd_soc_dai *dai)
170a3a83d9aSKuninori Morimoto {
171a3a83d9aSKuninori Morimoto 	int is_play = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
172a3a83d9aSKuninori Morimoto 	struct snd_soc_codec *codec = dai->codec;
173a3a83d9aSKuninori Morimoto 
174a3a83d9aSKuninori Morimoto 	if (is_play) {
175a3a83d9aSKuninori Morimoto 		/*
176a3a83d9aSKuninori Morimoto 		 * start headphone output
177a3a83d9aSKuninori Morimoto 		 *
178a3a83d9aSKuninori Morimoto 		 * PLL, Master Mode
179a3a83d9aSKuninori Morimoto 		 * Audio I/F Format :MSB justified (ADC & DAC)
180a3a83d9aSKuninori Morimoto 		 * Sampling Frequency: 44.1kHz
181a3a83d9aSKuninori Morimoto 		 * Digital Volume: −8dB
182a3a83d9aSKuninori Morimoto 		 * Bass Boost Level : Middle
183a3a83d9aSKuninori Morimoto 		 *
184a3a83d9aSKuninori Morimoto 		 * This operation came from example code of
185a3a83d9aSKuninori Morimoto 		 * "ASAHI KASEI AK4642" (japanese) manual p97.
186a3a83d9aSKuninori Morimoto 		 *
187a3a83d9aSKuninori Morimoto 		 * Example code use 0x39, 0x79 value for 0x01 address,
188a3a83d9aSKuninori Morimoto 		 * But we need MCKO (0x02) bit now
189a3a83d9aSKuninori Morimoto 		 */
190a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x05, 0x27);
191a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x0f, 0x09);
192a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x0e, 0x19);
193a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x09, 0x91);
194a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x0c, 0x91);
195a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x0a, 0x28);
196a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x0d, 0x28);
197a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x00, 0x64);
198a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x01, 0x3b); /* + MCKO bit */
199a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x01, 0x7b); /* + MCKO bit */
200a3a83d9aSKuninori Morimoto 	} else {
201a3a83d9aSKuninori Morimoto 		/*
202a3a83d9aSKuninori Morimoto 		 * start stereo input
203a3a83d9aSKuninori Morimoto 		 *
204a3a83d9aSKuninori Morimoto 		 * PLL Master Mode
205a3a83d9aSKuninori Morimoto 		 * Audio I/F Format:MSB justified (ADC & DAC)
206a3a83d9aSKuninori Morimoto 		 * Sampling Frequency:44.1kHz
207a3a83d9aSKuninori Morimoto 		 * Pre MIC AMP:+20dB
208a3a83d9aSKuninori Morimoto 		 * MIC Power On
209a3a83d9aSKuninori Morimoto 		 * ALC setting:Refer to Table 35
210a3a83d9aSKuninori Morimoto 		 * ALC bit=“1”
211a3a83d9aSKuninori Morimoto 		 *
212a3a83d9aSKuninori Morimoto 		 * This operation came from example code of
213a3a83d9aSKuninori Morimoto 		 * "ASAHI KASEI AK4642" (japanese) manual p94.
214a3a83d9aSKuninori Morimoto 		 */
215a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x05, 0x27);
216a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x02, 0x05);
217a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x06, 0x3c);
218a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x08, 0xe1);
219a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x0b, 0x00);
220a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x07, 0x21);
221a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x00, 0x41);
222a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x10, 0x01);
223a3a83d9aSKuninori Morimoto 	}
224a3a83d9aSKuninori Morimoto 
225a3a83d9aSKuninori Morimoto 	return 0;
226a3a83d9aSKuninori Morimoto }
227a3a83d9aSKuninori Morimoto 
228a3a83d9aSKuninori Morimoto static void ak4642_dai_shutdown(struct snd_pcm_substream *substream,
229a3a83d9aSKuninori Morimoto 			       struct snd_soc_dai *dai)
230a3a83d9aSKuninori Morimoto {
231a3a83d9aSKuninori Morimoto 	int is_play = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
232a3a83d9aSKuninori Morimoto 	struct snd_soc_codec *codec = dai->codec;
233a3a83d9aSKuninori Morimoto 
234a3a83d9aSKuninori Morimoto 	if (is_play) {
235a3a83d9aSKuninori Morimoto 		/* stop headphone output */
236a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x01, 0x3b);
237a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x01, 0x0b);
238a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x00, 0x40);
239a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x0e, 0x11);
240a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x0f, 0x08);
241a3a83d9aSKuninori Morimoto 	} else {
242a3a83d9aSKuninori Morimoto 		/* stop stereo input */
243a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x00, 0x40);
244a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x10, 0x00);
245a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x07, 0x01);
246a3a83d9aSKuninori Morimoto 	}
247a3a83d9aSKuninori Morimoto }
248a3a83d9aSKuninori Morimoto 
249a3a83d9aSKuninori Morimoto static int ak4642_dai_set_sysclk(struct snd_soc_dai *codec_dai,
250a3a83d9aSKuninori Morimoto 	int clk_id, unsigned int freq, int dir)
251a3a83d9aSKuninori Morimoto {
252a3a83d9aSKuninori Morimoto 	struct snd_soc_codec *codec = codec_dai->codec;
253a3a83d9aSKuninori Morimoto 	struct ak4642_priv *ak4642 = codec->private_data;
254a3a83d9aSKuninori Morimoto 
255a3a83d9aSKuninori Morimoto 	ak4642->sysclk = freq;
256a3a83d9aSKuninori Morimoto 	return 0;
257a3a83d9aSKuninori Morimoto }
258a3a83d9aSKuninori Morimoto 
259a3a83d9aSKuninori Morimoto static struct snd_soc_dai_ops ak4642_dai_ops = {
260a3a83d9aSKuninori Morimoto 	.startup	= ak4642_dai_startup,
261a3a83d9aSKuninori Morimoto 	.shutdown	= ak4642_dai_shutdown,
262a3a83d9aSKuninori Morimoto 	.set_sysclk	= ak4642_dai_set_sysclk,
263a3a83d9aSKuninori Morimoto };
264a3a83d9aSKuninori Morimoto 
265a3a83d9aSKuninori Morimoto struct snd_soc_dai ak4642_dai = {
266a3a83d9aSKuninori Morimoto 	.name = "AK4642",
267a3a83d9aSKuninori Morimoto 	.playback = {
268a3a83d9aSKuninori Morimoto 		.stream_name = "Playback",
269a3a83d9aSKuninori Morimoto 		.channels_min = 1,
270a3a83d9aSKuninori Morimoto 		.channels_max = 2,
271a3a83d9aSKuninori Morimoto 		.rates = SNDRV_PCM_RATE_8000_48000,
272a3a83d9aSKuninori Morimoto 		.formats = SNDRV_PCM_FMTBIT_S16_LE },
273a3a83d9aSKuninori Morimoto 	.capture = {
274a3a83d9aSKuninori Morimoto 		.stream_name = "Capture",
275a3a83d9aSKuninori Morimoto 		.channels_min = 1,
276a3a83d9aSKuninori Morimoto 		.channels_max = 2,
277a3a83d9aSKuninori Morimoto 		.rates = SNDRV_PCM_RATE_8000_48000,
278a3a83d9aSKuninori Morimoto 		.formats = SNDRV_PCM_FMTBIT_S16_LE },
279a3a83d9aSKuninori Morimoto 	.ops = &ak4642_dai_ops,
280a3a83d9aSKuninori Morimoto };
281a3a83d9aSKuninori Morimoto EXPORT_SYMBOL_GPL(ak4642_dai);
282a3a83d9aSKuninori Morimoto 
283a3a83d9aSKuninori Morimoto static int ak4642_resume(struct platform_device *pdev)
284a3a83d9aSKuninori Morimoto {
285a3a83d9aSKuninori Morimoto 	struct snd_soc_device *socdev = platform_get_drvdata(pdev);
286a3a83d9aSKuninori Morimoto 	struct snd_soc_codec *codec = socdev->card->codec;
287a3a83d9aSKuninori Morimoto 
288a3a83d9aSKuninori Morimoto 	ak4642_sync(codec);
289a3a83d9aSKuninori Morimoto 	return 0;
290a3a83d9aSKuninori Morimoto }
291a3a83d9aSKuninori Morimoto 
292a3a83d9aSKuninori Morimoto /*
293a3a83d9aSKuninori Morimoto  * initialise the AK4642 driver
294a3a83d9aSKuninori Morimoto  * register the mixer and dsp interfaces with the kernel
295a3a83d9aSKuninori Morimoto  */
296a3a83d9aSKuninori Morimoto static int ak4642_init(struct ak4642_priv *ak4642)
297a3a83d9aSKuninori Morimoto {
298a3a83d9aSKuninori Morimoto 	struct snd_soc_codec *codec = &ak4642->codec;
299a3a83d9aSKuninori Morimoto 	int ret = 0;
300a3a83d9aSKuninori Morimoto 
301a3a83d9aSKuninori Morimoto 	if (ak4642_codec) {
302a3a83d9aSKuninori Morimoto 		dev_err(codec->dev, "Another ak4642 is registered\n");
303a3a83d9aSKuninori Morimoto 		return -EINVAL;
304a3a83d9aSKuninori Morimoto 	}
305a3a83d9aSKuninori Morimoto 
306a3a83d9aSKuninori Morimoto 	mutex_init(&codec->mutex);
307a3a83d9aSKuninori Morimoto 	INIT_LIST_HEAD(&codec->dapm_widgets);
308a3a83d9aSKuninori Morimoto 	INIT_LIST_HEAD(&codec->dapm_paths);
309a3a83d9aSKuninori Morimoto 
310a3a83d9aSKuninori Morimoto 	codec->private_data	= ak4642;
311a3a83d9aSKuninori Morimoto 	codec->name		= "AK4642";
312a3a83d9aSKuninori Morimoto 	codec->owner		= THIS_MODULE;
313a3a83d9aSKuninori Morimoto 	codec->read		= ak4642_read_reg_cache;
314a3a83d9aSKuninori Morimoto 	codec->write		= ak4642_write;
315a3a83d9aSKuninori Morimoto 	codec->dai		= &ak4642_dai;
316a3a83d9aSKuninori Morimoto 	codec->num_dai		= 1;
317a3a83d9aSKuninori Morimoto 	codec->hw_write		= (hw_write_t)i2c_master_send;
318a3a83d9aSKuninori Morimoto 	codec->reg_cache_size	= ARRAY_SIZE(ak4642_reg);
319a3a83d9aSKuninori Morimoto 	codec->reg_cache	= kmemdup(ak4642_reg,
320a3a83d9aSKuninori Morimoto 					  sizeof(ak4642_reg), GFP_KERNEL);
321a3a83d9aSKuninori Morimoto 
322a3a83d9aSKuninori Morimoto 	if (!codec->reg_cache)
323a3a83d9aSKuninori Morimoto 		return -ENOMEM;
324a3a83d9aSKuninori Morimoto 
325a3a83d9aSKuninori Morimoto 	ak4642_dai.dev = codec->dev;
326a3a83d9aSKuninori Morimoto 	ak4642_codec = codec;
327a3a83d9aSKuninori Morimoto 
328a3a83d9aSKuninori Morimoto 	ret = snd_soc_register_codec(codec);
329a3a83d9aSKuninori Morimoto 	if (ret) {
330a3a83d9aSKuninori Morimoto 		dev_err(codec->dev, "Failed to register codec: %d\n", ret);
331a3a83d9aSKuninori Morimoto 		goto reg_cache_err;
332a3a83d9aSKuninori Morimoto 	}
333a3a83d9aSKuninori Morimoto 
334a3a83d9aSKuninori Morimoto 	ret = snd_soc_register_dai(&ak4642_dai);
335a3a83d9aSKuninori Morimoto 	if (ret) {
336a3a83d9aSKuninori Morimoto 		dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
337a3a83d9aSKuninori Morimoto 		snd_soc_unregister_codec(codec);
338a3a83d9aSKuninori Morimoto 		goto reg_cache_err;
339a3a83d9aSKuninori Morimoto 	}
340a3a83d9aSKuninori Morimoto 
341a3a83d9aSKuninori Morimoto 	/*
342a3a83d9aSKuninori Morimoto 	 * clock setting
343a3a83d9aSKuninori Morimoto 	 *
344a3a83d9aSKuninori Morimoto 	 * Audio I/F Format: MSB justified (ADC & DAC)
345a3a83d9aSKuninori Morimoto 	 * BICK frequency at Master Mode: 64fs
346a3a83d9aSKuninori Morimoto 	 * Input Master Clock Select at PLL Mode: 11.2896MHz
347a3a83d9aSKuninori Morimoto 	 * MCKO: Enable
348a3a83d9aSKuninori Morimoto 	 * Sampling Frequency: 44.1kHz
349a3a83d9aSKuninori Morimoto 	 *
350a3a83d9aSKuninori Morimoto 	 * This operation came from example code of
351a3a83d9aSKuninori Morimoto 	 * "ASAHI KASEI AK4642" (japanese) manual p89.
352a3a83d9aSKuninori Morimoto 	 *
353a3a83d9aSKuninori Morimoto 	 * please fix-me
354a3a83d9aSKuninori Morimoto 	 */
355a3a83d9aSKuninori Morimoto 	ak4642_write(codec, 0x01, 0x08);
356a3a83d9aSKuninori Morimoto 	ak4642_write(codec, 0x04, 0x4a);
357a3a83d9aSKuninori Morimoto 	ak4642_write(codec, 0x05, 0x27);
358a3a83d9aSKuninori Morimoto 	ak4642_write(codec, 0x00, 0x40);
359a3a83d9aSKuninori Morimoto 	ak4642_write(codec, 0x01, 0x0b);
360a3a83d9aSKuninori Morimoto 
361a3a83d9aSKuninori Morimoto 	return ret;
362a3a83d9aSKuninori Morimoto 
363a3a83d9aSKuninori Morimoto reg_cache_err:
364a3a83d9aSKuninori Morimoto 	kfree(codec->reg_cache);
365a3a83d9aSKuninori Morimoto 	codec->reg_cache = NULL;
366a3a83d9aSKuninori Morimoto 
367a3a83d9aSKuninori Morimoto 	return ret;
368a3a83d9aSKuninori Morimoto }
369a3a83d9aSKuninori Morimoto 
370a3a83d9aSKuninori Morimoto #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
371a3a83d9aSKuninori Morimoto static int ak4642_i2c_probe(struct i2c_client *i2c,
372a3a83d9aSKuninori Morimoto 			    const struct i2c_device_id *id)
373a3a83d9aSKuninori Morimoto {
374a3a83d9aSKuninori Morimoto 	struct ak4642_priv *ak4642;
375a3a83d9aSKuninori Morimoto 	struct snd_soc_codec *codec;
376a3a83d9aSKuninori Morimoto 	int ret;
377a3a83d9aSKuninori Morimoto 
378a3a83d9aSKuninori Morimoto 	ak4642 = kzalloc(sizeof(struct ak4642_priv), GFP_KERNEL);
379a3a83d9aSKuninori Morimoto 	if (!ak4642)
380a3a83d9aSKuninori Morimoto 		return -ENOMEM;
381a3a83d9aSKuninori Morimoto 
382a3a83d9aSKuninori Morimoto 	codec = &ak4642->codec;
383a3a83d9aSKuninori Morimoto 	codec->dev = &i2c->dev;
384a3a83d9aSKuninori Morimoto 
385a3a83d9aSKuninori Morimoto 	i2c_set_clientdata(i2c, ak4642);
386a3a83d9aSKuninori Morimoto 	codec->control_data = i2c;
387a3a83d9aSKuninori Morimoto 
388a3a83d9aSKuninori Morimoto 	ret = ak4642_init(ak4642);
389a3a83d9aSKuninori Morimoto 	if (ret < 0)
390a3a83d9aSKuninori Morimoto 		printk(KERN_ERR "failed to initialise AK4642\n");
391a3a83d9aSKuninori Morimoto 
392a3a83d9aSKuninori Morimoto 	return ret;
393a3a83d9aSKuninori Morimoto }
394a3a83d9aSKuninori Morimoto 
395a3a83d9aSKuninori Morimoto static int ak4642_i2c_remove(struct i2c_client *client)
396a3a83d9aSKuninori Morimoto {
397a3a83d9aSKuninori Morimoto 	struct ak4642_priv *ak4642 = i2c_get_clientdata(client);
398a3a83d9aSKuninori Morimoto 
399a3a83d9aSKuninori Morimoto 	snd_soc_unregister_dai(&ak4642_dai);
400a3a83d9aSKuninori Morimoto 	snd_soc_unregister_codec(&ak4642->codec);
401a3a83d9aSKuninori Morimoto 	kfree(ak4642->codec.reg_cache);
402a3a83d9aSKuninori Morimoto 	kfree(ak4642);
403a3a83d9aSKuninori Morimoto 	ak4642_codec = NULL;
404a3a83d9aSKuninori Morimoto 
405a3a83d9aSKuninori Morimoto 	return 0;
406a3a83d9aSKuninori Morimoto }
407a3a83d9aSKuninori Morimoto 
408a3a83d9aSKuninori Morimoto static const struct i2c_device_id ak4642_i2c_id[] = {
409a3a83d9aSKuninori Morimoto 	{ "ak4642", 0 },
410a3a83d9aSKuninori Morimoto 	{ "ak4643", 0 },
411a3a83d9aSKuninori Morimoto 	{ }
412a3a83d9aSKuninori Morimoto };
413a3a83d9aSKuninori Morimoto MODULE_DEVICE_TABLE(i2c, ak4642_i2c_id);
414a3a83d9aSKuninori Morimoto 
415a3a83d9aSKuninori Morimoto static struct i2c_driver ak4642_i2c_driver = {
416a3a83d9aSKuninori Morimoto 	.driver = {
417a3a83d9aSKuninori Morimoto 		.name = "AK4642 I2C Codec",
418a3a83d9aSKuninori Morimoto 		.owner = THIS_MODULE,
419a3a83d9aSKuninori Morimoto 	},
420a3a83d9aSKuninori Morimoto 	.probe		= ak4642_i2c_probe,
421a3a83d9aSKuninori Morimoto 	.remove		= ak4642_i2c_remove,
422a3a83d9aSKuninori Morimoto 	.id_table	= ak4642_i2c_id,
423a3a83d9aSKuninori Morimoto };
424a3a83d9aSKuninori Morimoto 
425a3a83d9aSKuninori Morimoto #endif
426a3a83d9aSKuninori Morimoto 
427a3a83d9aSKuninori Morimoto static int ak4642_probe(struct platform_device *pdev)
428a3a83d9aSKuninori Morimoto {
429a3a83d9aSKuninori Morimoto 	struct snd_soc_device *socdev = platform_get_drvdata(pdev);
430a3a83d9aSKuninori Morimoto 	int ret;
431a3a83d9aSKuninori Morimoto 
432a3a83d9aSKuninori Morimoto 	if (!ak4642_codec) {
433a3a83d9aSKuninori Morimoto 		dev_err(&pdev->dev, "Codec device not registered\n");
434a3a83d9aSKuninori Morimoto 		return -ENODEV;
435a3a83d9aSKuninori Morimoto 	}
436a3a83d9aSKuninori Morimoto 
437a3a83d9aSKuninori Morimoto 	socdev->card->codec = ak4642_codec;
438a3a83d9aSKuninori Morimoto 
439a3a83d9aSKuninori Morimoto 	/* register pcms */
440a3a83d9aSKuninori Morimoto 	ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
441a3a83d9aSKuninori Morimoto 	if (ret < 0) {
442a3a83d9aSKuninori Morimoto 		printk(KERN_ERR "ak4642: failed to create pcms\n");
443a3a83d9aSKuninori Morimoto 		goto pcm_err;
444a3a83d9aSKuninori Morimoto 	}
445a3a83d9aSKuninori Morimoto 
446a3a83d9aSKuninori Morimoto 	dev_info(&pdev->dev, "AK4642 Audio Codec %s", AK4642_VERSION);
447a3a83d9aSKuninori Morimoto 	return ret;
448a3a83d9aSKuninori Morimoto 
449a3a83d9aSKuninori Morimoto pcm_err:
450a3a83d9aSKuninori Morimoto 	return ret;
451a3a83d9aSKuninori Morimoto 
452a3a83d9aSKuninori Morimoto }
453a3a83d9aSKuninori Morimoto 
454a3a83d9aSKuninori Morimoto /* power down chip */
455a3a83d9aSKuninori Morimoto static int ak4642_remove(struct platform_device *pdev)
456a3a83d9aSKuninori Morimoto {
457a3a83d9aSKuninori Morimoto 	struct snd_soc_device *socdev = platform_get_drvdata(pdev);
458a3a83d9aSKuninori Morimoto 
459a3a83d9aSKuninori Morimoto 	snd_soc_free_pcms(socdev);
460a3a83d9aSKuninori Morimoto 	snd_soc_dapm_free(socdev);
461a3a83d9aSKuninori Morimoto 
462a3a83d9aSKuninori Morimoto 	return 0;
463a3a83d9aSKuninori Morimoto }
464a3a83d9aSKuninori Morimoto 
465a3a83d9aSKuninori Morimoto struct snd_soc_codec_device soc_codec_dev_ak4642 = {
466a3a83d9aSKuninori Morimoto 	.probe =	ak4642_probe,
467a3a83d9aSKuninori Morimoto 	.remove =	ak4642_remove,
468a3a83d9aSKuninori Morimoto 	.resume =	ak4642_resume,
469a3a83d9aSKuninori Morimoto };
470a3a83d9aSKuninori Morimoto EXPORT_SYMBOL_GPL(soc_codec_dev_ak4642);
471a3a83d9aSKuninori Morimoto 
472a3a83d9aSKuninori Morimoto static int __init ak4642_modinit(void)
473a3a83d9aSKuninori Morimoto {
4741cf86f6fSKuninori Morimoto 	int ret = 0;
475a3a83d9aSKuninori Morimoto #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
476a3a83d9aSKuninori Morimoto 	ret = i2c_add_driver(&ak4642_i2c_driver);
477a3a83d9aSKuninori Morimoto #endif
478a3a83d9aSKuninori Morimoto 	return ret;
479a3a83d9aSKuninori Morimoto 
480a3a83d9aSKuninori Morimoto }
481a3a83d9aSKuninori Morimoto module_init(ak4642_modinit);
482a3a83d9aSKuninori Morimoto 
483a3a83d9aSKuninori Morimoto static void __exit ak4642_exit(void)
484a3a83d9aSKuninori Morimoto {
485a3a83d9aSKuninori Morimoto #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
486a3a83d9aSKuninori Morimoto 	i2c_del_driver(&ak4642_i2c_driver);
487a3a83d9aSKuninori Morimoto #endif
488a3a83d9aSKuninori Morimoto 
489a3a83d9aSKuninori Morimoto }
490a3a83d9aSKuninori Morimoto module_exit(ak4642_exit);
491a3a83d9aSKuninori Morimoto 
492a3a83d9aSKuninori Morimoto MODULE_DESCRIPTION("Soc AK4642 driver");
493a3a83d9aSKuninori Morimoto MODULE_AUTHOR("Kuninori Morimoto <morimoto.kuninori@renesas.com>");
494a3a83d9aSKuninori Morimoto MODULE_LICENSE("GPL");
495