xref: /openbmc/linux/sound/soc/codecs/ak4642.c (revision 73bb379f)
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/delay.h>
26a3a83d9aSKuninori Morimoto #include <linux/i2c.h>
27a3a83d9aSKuninori Morimoto #include <linux/platform_device.h>
285a0e3ad6STejun Heo #include <linux/slab.h>
29a3a83d9aSKuninori Morimoto #include <sound/soc-dapm.h>
30a3a83d9aSKuninori Morimoto #include <sound/initval.h>
31a300de3cSKuninori Morimoto #include <sound/tlv.h>
32a3a83d9aSKuninori Morimoto 
33a3a83d9aSKuninori Morimoto #define AK4642_VERSION "0.0.1"
34a3a83d9aSKuninori Morimoto 
35a3a83d9aSKuninori Morimoto #define PW_MGMT1	0x00
36a3a83d9aSKuninori Morimoto #define PW_MGMT2	0x01
37a3a83d9aSKuninori Morimoto #define SG_SL1		0x02
38a3a83d9aSKuninori Morimoto #define SG_SL2		0x03
39a3a83d9aSKuninori Morimoto #define MD_CTL1		0x04
40a3a83d9aSKuninori Morimoto #define MD_CTL2		0x05
41a3a83d9aSKuninori Morimoto #define TIMER		0x06
42a3a83d9aSKuninori Morimoto #define ALC_CTL1	0x07
43a3a83d9aSKuninori Morimoto #define ALC_CTL2	0x08
44a3a83d9aSKuninori Morimoto #define L_IVC		0x09
45a3a83d9aSKuninori Morimoto #define L_DVC		0x0a
46a3a83d9aSKuninori Morimoto #define ALC_CTL3	0x0b
47a3a83d9aSKuninori Morimoto #define R_IVC		0x0c
48a3a83d9aSKuninori Morimoto #define R_DVC		0x0d
49a3a83d9aSKuninori Morimoto #define MD_CTL3		0x0e
50a3a83d9aSKuninori Morimoto #define MD_CTL4		0x0f
51a3a83d9aSKuninori Morimoto #define PW_MGMT3	0x10
52a3a83d9aSKuninori Morimoto #define DF_S		0x11
53a3a83d9aSKuninori Morimoto #define FIL3_0		0x12
54a3a83d9aSKuninori Morimoto #define FIL3_1		0x13
55a3a83d9aSKuninori Morimoto #define FIL3_2		0x14
56a3a83d9aSKuninori Morimoto #define FIL3_3		0x15
57a3a83d9aSKuninori Morimoto #define EQ_0		0x16
58a3a83d9aSKuninori Morimoto #define EQ_1		0x17
59a3a83d9aSKuninori Morimoto #define EQ_2		0x18
60a3a83d9aSKuninori Morimoto #define EQ_3		0x19
61a3a83d9aSKuninori Morimoto #define EQ_4		0x1a
62a3a83d9aSKuninori Morimoto #define EQ_5		0x1b
63a3a83d9aSKuninori Morimoto #define FIL1_0		0x1c
64a3a83d9aSKuninori Morimoto #define FIL1_1		0x1d
65a3a83d9aSKuninori Morimoto #define FIL1_2		0x1e
66a3a83d9aSKuninori Morimoto #define FIL1_3		0x1f
67a3a83d9aSKuninori Morimoto #define PW_MGMT4	0x20
68a3a83d9aSKuninori Morimoto #define MD_CTL5		0x21
69a3a83d9aSKuninori Morimoto #define LO_MS		0x22
70a3a83d9aSKuninori Morimoto #define HP_MS		0x23
71a3a83d9aSKuninori Morimoto #define SPK_MS		0x24
72a3a83d9aSKuninori Morimoto 
73a3a83d9aSKuninori Morimoto #define AK4642_CACHEREGNUM 	0x25
74a3a83d9aSKuninori Morimoto 
750643ce8fSKuninori Morimoto /* PW_MGMT2 */
760643ce8fSKuninori Morimoto #define HPMTN		(1 << 6)
770643ce8fSKuninori Morimoto #define PMHPL		(1 << 5)
780643ce8fSKuninori Morimoto #define PMHPR		(1 << 4)
790643ce8fSKuninori Morimoto #define MS		(1 << 3) /* master/slave select */
800643ce8fSKuninori Morimoto #define MCKO		(1 << 1)
810643ce8fSKuninori Morimoto #define PMPLL		(1 << 0)
820643ce8fSKuninori Morimoto 
830643ce8fSKuninori Morimoto #define PMHP_MASK	(PMHPL | PMHPR)
840643ce8fSKuninori Morimoto #define PMHP		PMHP_MASK
850643ce8fSKuninori Morimoto 
864b6316b4SKuninori Morimoto /* MD_CTL1 */
874b6316b4SKuninori Morimoto #define PLL3		(1 << 7)
884b6316b4SKuninori Morimoto #define PLL2		(1 << 6)
894b6316b4SKuninori Morimoto #define PLL1		(1 << 5)
904b6316b4SKuninori Morimoto #define PLL0		(1 << 4)
914b6316b4SKuninori Morimoto #define PLL_MASK	(PLL3 | PLL2 | PLL1 | PLL0)
924b6316b4SKuninori Morimoto 
930643ce8fSKuninori Morimoto #define BCKO_MASK	(1 << 3)
940643ce8fSKuninori Morimoto #define BCKO_64		BCKO_MASK
950643ce8fSKuninori Morimoto 
961ad747caSKuninori Morimoto /* MD_CTL2 */
971ad747caSKuninori Morimoto #define FS0		(1 << 0)
981ad747caSKuninori Morimoto #define FS1		(1 << 1)
991ad747caSKuninori Morimoto #define FS2		(1 << 2)
1001ad747caSKuninori Morimoto #define FS3		(1 << 5)
1011ad747caSKuninori Morimoto #define FS_MASK		(FS0 | FS1 | FS2 | FS3)
1021ad747caSKuninori Morimoto 
103a3a83d9aSKuninori Morimoto 
104a300de3cSKuninori Morimoto /*
105a300de3cSKuninori Morimoto  * Playback Volume (table 39)
106a300de3cSKuninori Morimoto  *
107a300de3cSKuninori Morimoto  * max : 0x00 : +12.0 dB
108a300de3cSKuninori Morimoto  *       ( 0.5 dB step )
109a300de3cSKuninori Morimoto  * min : 0xFE : -115.0 dB
110a300de3cSKuninori Morimoto  * mute: 0xFF
111a300de3cSKuninori Morimoto  */
112a300de3cSKuninori Morimoto static const DECLARE_TLV_DB_SCALE(out_tlv, -11500, 50, 1);
113a300de3cSKuninori Morimoto 
114a300de3cSKuninori Morimoto static const struct snd_kcontrol_new ak4642_snd_controls[] = {
115a300de3cSKuninori Morimoto 
116a300de3cSKuninori Morimoto 	SOC_DOUBLE_R_TLV("Digital Playback Volume", L_DVC, R_DVC,
117a300de3cSKuninori Morimoto 			 0, 0xFF, 1, out_tlv),
118a300de3cSKuninori Morimoto };
119a300de3cSKuninori Morimoto 
120a300de3cSKuninori Morimoto 
121a3a83d9aSKuninori Morimoto /* codec private data */
122a3a83d9aSKuninori Morimoto struct ak4642_priv {
123f0fba2adSLiam Girdwood 	unsigned int sysclk;
124f0fba2adSLiam Girdwood 	enum snd_soc_control_type control_type;
125f0fba2adSLiam Girdwood 	void *control_data;
126a3a83d9aSKuninori Morimoto };
127a3a83d9aSKuninori Morimoto 
128a3a83d9aSKuninori Morimoto /*
129a3a83d9aSKuninori Morimoto  * ak4642 register cache
130a3a83d9aSKuninori Morimoto  */
131a3a83d9aSKuninori Morimoto static const u16 ak4642_reg[AK4642_CACHEREGNUM] = {
132a3a83d9aSKuninori Morimoto 	0x0000, 0x0000, 0x0001, 0x0000,
133a3a83d9aSKuninori Morimoto 	0x0002, 0x0000, 0x0000, 0x0000,
134a3a83d9aSKuninori Morimoto 	0x00e1, 0x00e1, 0x0018, 0x0000,
135a3a83d9aSKuninori Morimoto 	0x00e1, 0x0018, 0x0011, 0x0008,
136a3a83d9aSKuninori Morimoto 	0x0000, 0x0000, 0x0000, 0x0000,
137a3a83d9aSKuninori Morimoto 	0x0000, 0x0000, 0x0000, 0x0000,
138a3a83d9aSKuninori Morimoto 	0x0000, 0x0000, 0x0000, 0x0000,
139a3a83d9aSKuninori Morimoto 	0x0000, 0x0000, 0x0000, 0x0000,
140a3a83d9aSKuninori Morimoto 	0x0000, 0x0000, 0x0000, 0x0000,
141a3a83d9aSKuninori Morimoto 	0x0000,
142a3a83d9aSKuninori Morimoto };
143a3a83d9aSKuninori Morimoto 
144a3a83d9aSKuninori Morimoto /*
145a3a83d9aSKuninori Morimoto  * read ak4642 register cache
146a3a83d9aSKuninori Morimoto  */
147a3a83d9aSKuninori Morimoto static inline unsigned int ak4642_read_reg_cache(struct snd_soc_codec *codec,
148a3a83d9aSKuninori Morimoto 	unsigned int reg)
149a3a83d9aSKuninori Morimoto {
150a3a83d9aSKuninori Morimoto 	u16 *cache = codec->reg_cache;
151a3a83d9aSKuninori Morimoto 	if (reg >= AK4642_CACHEREGNUM)
152a3a83d9aSKuninori Morimoto 		return -1;
153a3a83d9aSKuninori Morimoto 	return cache[reg];
154a3a83d9aSKuninori Morimoto }
155a3a83d9aSKuninori Morimoto 
156a3a83d9aSKuninori Morimoto /*
157a3a83d9aSKuninori Morimoto  * write ak4642 register cache
158a3a83d9aSKuninori Morimoto  */
159a3a83d9aSKuninori Morimoto static inline void ak4642_write_reg_cache(struct snd_soc_codec *codec,
160a3a83d9aSKuninori Morimoto 	u16 reg, unsigned int value)
161a3a83d9aSKuninori Morimoto {
162a3a83d9aSKuninori Morimoto 	u16 *cache = codec->reg_cache;
163a3a83d9aSKuninori Morimoto 	if (reg >= AK4642_CACHEREGNUM)
164a3a83d9aSKuninori Morimoto 		return;
165a3a83d9aSKuninori Morimoto 
166a3a83d9aSKuninori Morimoto 	cache[reg] = value;
167a3a83d9aSKuninori Morimoto }
168a3a83d9aSKuninori Morimoto 
169a3a83d9aSKuninori Morimoto /*
170a3a83d9aSKuninori Morimoto  * write to the AK4642 register space
171a3a83d9aSKuninori Morimoto  */
172a3a83d9aSKuninori Morimoto static int ak4642_write(struct snd_soc_codec *codec, unsigned int reg,
173a3a83d9aSKuninori Morimoto 	unsigned int value)
174a3a83d9aSKuninori Morimoto {
175a3a83d9aSKuninori Morimoto 	u8 data[2];
176a3a83d9aSKuninori Morimoto 
177a3a83d9aSKuninori Morimoto 	/* data is
178a3a83d9aSKuninori Morimoto 	 *   D15..D8 AK4642 register offset
179a3a83d9aSKuninori Morimoto 	 *   D7...D0 register data
180a3a83d9aSKuninori Morimoto 	 */
181a3a83d9aSKuninori Morimoto 	data[0] = reg & 0xff;
182a3a83d9aSKuninori Morimoto 	data[1] = value & 0xff;
183a3a83d9aSKuninori Morimoto 
184a3a83d9aSKuninori Morimoto 	if (codec->hw_write(codec->control_data, data, 2) == 2) {
185a3a83d9aSKuninori Morimoto 		ak4642_write_reg_cache(codec, reg, value);
186a3a83d9aSKuninori Morimoto 		return 0;
187a3a83d9aSKuninori Morimoto 	} else
188a3a83d9aSKuninori Morimoto 		return -EIO;
189a3a83d9aSKuninori Morimoto }
190a3a83d9aSKuninori Morimoto 
191a3a83d9aSKuninori Morimoto static int ak4642_sync(struct snd_soc_codec *codec)
192a3a83d9aSKuninori Morimoto {
193a3a83d9aSKuninori Morimoto 	u16 *cache = codec->reg_cache;
194a3a83d9aSKuninori Morimoto 	int i, r = 0;
195a3a83d9aSKuninori Morimoto 
196a3a83d9aSKuninori Morimoto 	for (i = 0; i < AK4642_CACHEREGNUM; i++)
197a3a83d9aSKuninori Morimoto 		r |= ak4642_write(codec, i, cache[i]);
198a3a83d9aSKuninori Morimoto 
199a3a83d9aSKuninori Morimoto 	return r;
200a3a83d9aSKuninori Morimoto };
201a3a83d9aSKuninori Morimoto 
202a3a83d9aSKuninori Morimoto static int ak4642_dai_startup(struct snd_pcm_substream *substream,
203a3a83d9aSKuninori Morimoto 			      struct snd_soc_dai *dai)
204a3a83d9aSKuninori Morimoto {
205a3a83d9aSKuninori Morimoto 	int is_play = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
206a3a83d9aSKuninori Morimoto 	struct snd_soc_codec *codec = dai->codec;
207a3a83d9aSKuninori Morimoto 
208a3a83d9aSKuninori Morimoto 	if (is_play) {
209a3a83d9aSKuninori Morimoto 		/*
210a3a83d9aSKuninori Morimoto 		 * start headphone output
211a3a83d9aSKuninori Morimoto 		 *
212a3a83d9aSKuninori Morimoto 		 * PLL, Master Mode
213a3a83d9aSKuninori Morimoto 		 * Audio I/F Format :MSB justified (ADC & DAC)
214a3a83d9aSKuninori Morimoto 		 * Bass Boost Level : Middle
215a3a83d9aSKuninori Morimoto 		 *
216a3a83d9aSKuninori Morimoto 		 * This operation came from example code of
217a3a83d9aSKuninori Morimoto 		 * "ASAHI KASEI AK4642" (japanese) manual p97.
218a3a83d9aSKuninori Morimoto 		 */
219a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x0f, 0x09);
220a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x0e, 0x19);
221a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x09, 0x91);
222a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x0c, 0x91);
223a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x00, 0x64);
2240643ce8fSKuninori Morimoto 		snd_soc_update_bits(codec, PW_MGMT2, PMHP_MASK,	PMHP);
2250643ce8fSKuninori Morimoto 		snd_soc_update_bits(codec, PW_MGMT2, HPMTN,	HPMTN);
226a3a83d9aSKuninori Morimoto 	} else {
227a3a83d9aSKuninori Morimoto 		/*
228a3a83d9aSKuninori Morimoto 		 * start stereo input
229a3a83d9aSKuninori Morimoto 		 *
230a3a83d9aSKuninori Morimoto 		 * PLL Master Mode
231a3a83d9aSKuninori Morimoto 		 * Audio I/F Format:MSB justified (ADC & DAC)
232a3a83d9aSKuninori Morimoto 		 * Pre MIC AMP:+20dB
233a3a83d9aSKuninori Morimoto 		 * MIC Power On
234a3a83d9aSKuninori Morimoto 		 * ALC setting:Refer to Table 35
235a3a83d9aSKuninori Morimoto 		 * ALC bit=“1”
236a3a83d9aSKuninori Morimoto 		 *
237a3a83d9aSKuninori Morimoto 		 * This operation came from example code of
238a3a83d9aSKuninori Morimoto 		 * "ASAHI KASEI AK4642" (japanese) manual p94.
239a3a83d9aSKuninori Morimoto 		 */
240a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x02, 0x05);
241a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x06, 0x3c);
242a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x08, 0xe1);
243a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x0b, 0x00);
244a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x07, 0x21);
245a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x00, 0x41);
246a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x10, 0x01);
247a3a83d9aSKuninori Morimoto 	}
248a3a83d9aSKuninori Morimoto 
249a3a83d9aSKuninori Morimoto 	return 0;
250a3a83d9aSKuninori Morimoto }
251a3a83d9aSKuninori Morimoto 
252a3a83d9aSKuninori Morimoto static void ak4642_dai_shutdown(struct snd_pcm_substream *substream,
253a3a83d9aSKuninori Morimoto 			       struct snd_soc_dai *dai)
254a3a83d9aSKuninori Morimoto {
255a3a83d9aSKuninori Morimoto 	int is_play = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
256a3a83d9aSKuninori Morimoto 	struct snd_soc_codec *codec = dai->codec;
257a3a83d9aSKuninori Morimoto 
258a3a83d9aSKuninori Morimoto 	if (is_play) {
259a3a83d9aSKuninori Morimoto 		/* stop headphone output */
2600643ce8fSKuninori Morimoto 		snd_soc_update_bits(codec, PW_MGMT2, HPMTN,	0);
2610643ce8fSKuninori Morimoto 		snd_soc_update_bits(codec, PW_MGMT2, PMHP_MASK,	0);
262a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x00, 0x40);
263a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x0e, 0x11);
264a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x0f, 0x08);
265a3a83d9aSKuninori Morimoto 	} else {
266a3a83d9aSKuninori Morimoto 		/* stop stereo input */
267a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x00, 0x40);
268a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x10, 0x00);
269a3a83d9aSKuninori Morimoto 		ak4642_write(codec, 0x07, 0x01);
270a3a83d9aSKuninori Morimoto 	}
271a3a83d9aSKuninori Morimoto }
272a3a83d9aSKuninori Morimoto 
273a3a83d9aSKuninori Morimoto static int ak4642_dai_set_sysclk(struct snd_soc_dai *codec_dai,
274a3a83d9aSKuninori Morimoto 	int clk_id, unsigned int freq, int dir)
275a3a83d9aSKuninori Morimoto {
276a3a83d9aSKuninori Morimoto 	struct snd_soc_codec *codec = codec_dai->codec;
2774b6316b4SKuninori Morimoto 	u8 pll;
278a3a83d9aSKuninori Morimoto 
2794b6316b4SKuninori Morimoto 	switch (freq) {
2804b6316b4SKuninori Morimoto 	case 11289600:
2814b6316b4SKuninori Morimoto 		pll = PLL2;
2824b6316b4SKuninori Morimoto 		break;
2834b6316b4SKuninori Morimoto 	case 12288000:
2844b6316b4SKuninori Morimoto 		pll = PLL2 | PLL0;
2854b6316b4SKuninori Morimoto 		break;
2864b6316b4SKuninori Morimoto 	case 12000000:
2874b6316b4SKuninori Morimoto 		pll = PLL2 | PLL1;
2884b6316b4SKuninori Morimoto 		break;
2894b6316b4SKuninori Morimoto 	case 24000000:
2904b6316b4SKuninori Morimoto 		pll = PLL2 | PLL1 | PLL0;
2914b6316b4SKuninori Morimoto 		break;
2924b6316b4SKuninori Morimoto 	case 13500000:
2934b6316b4SKuninori Morimoto 		pll = PLL3 | PLL2;
2944b6316b4SKuninori Morimoto 		break;
2954b6316b4SKuninori Morimoto 	case 27000000:
2964b6316b4SKuninori Morimoto 		pll = PLL3 | PLL2 | PLL0;
2974b6316b4SKuninori Morimoto 		break;
2984b6316b4SKuninori Morimoto 	default:
2994b6316b4SKuninori Morimoto 		return -EINVAL;
3004b6316b4SKuninori Morimoto 	}
3014b6316b4SKuninori Morimoto 	snd_soc_update_bits(codec, MD_CTL1, PLL_MASK, pll);
3024b6316b4SKuninori Morimoto 
303a3a83d9aSKuninori Morimoto 	return 0;
304a3a83d9aSKuninori Morimoto }
305a3a83d9aSKuninori Morimoto 
3060643ce8fSKuninori Morimoto static int ak4642_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
3070643ce8fSKuninori Morimoto {
3080643ce8fSKuninori Morimoto 	struct snd_soc_codec *codec = dai->codec;
3090643ce8fSKuninori Morimoto 	u8 data;
3100643ce8fSKuninori Morimoto 	u8 bcko;
3110643ce8fSKuninori Morimoto 
3120643ce8fSKuninori Morimoto 	data = MCKO | PMPLL; /* use MCKO */
3130643ce8fSKuninori Morimoto 	bcko = 0;
3140643ce8fSKuninori Morimoto 
3150643ce8fSKuninori Morimoto 	/* set master/slave audio interface */
3160643ce8fSKuninori Morimoto 	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
3170643ce8fSKuninori Morimoto 	case SND_SOC_DAIFMT_CBM_CFM:
3180643ce8fSKuninori Morimoto 		data |= MS;
3190643ce8fSKuninori Morimoto 		bcko = BCKO_64;
3200643ce8fSKuninori Morimoto 		break;
3210643ce8fSKuninori Morimoto 	case SND_SOC_DAIFMT_CBS_CFS:
3220643ce8fSKuninori Morimoto 		break;
3230643ce8fSKuninori Morimoto 	default:
3240643ce8fSKuninori Morimoto 		return -EINVAL;
3250643ce8fSKuninori Morimoto 	}
3260643ce8fSKuninori Morimoto 	snd_soc_update_bits(codec, PW_MGMT2, MS, data);
3270643ce8fSKuninori Morimoto 	snd_soc_update_bits(codec, MD_CTL1, BCKO_MASK, bcko);
3280643ce8fSKuninori Morimoto 
3290643ce8fSKuninori Morimoto 	return 0;
3300643ce8fSKuninori Morimoto }
3310643ce8fSKuninori Morimoto 
3321ad747caSKuninori Morimoto static int ak4642_dai_hw_params(struct snd_pcm_substream *substream,
3331ad747caSKuninori Morimoto 				struct snd_pcm_hw_params *params,
3341ad747caSKuninori Morimoto 				struct snd_soc_dai *dai)
3351ad747caSKuninori Morimoto {
3361ad747caSKuninori Morimoto 	struct snd_soc_codec *codec = dai->codec;
3371ad747caSKuninori Morimoto 	u8 rate;
3381ad747caSKuninori Morimoto 
3391ad747caSKuninori Morimoto 	switch (params_rate(params)) {
3401ad747caSKuninori Morimoto 	case 7350:
3411ad747caSKuninori Morimoto 		rate = FS2;
3421ad747caSKuninori Morimoto 		break;
3431ad747caSKuninori Morimoto 	case 8000:
3441ad747caSKuninori Morimoto 		rate = 0;
3451ad747caSKuninori Morimoto 		break;
3461ad747caSKuninori Morimoto 	case 11025:
3471ad747caSKuninori Morimoto 		rate = FS2 | FS0;
3481ad747caSKuninori Morimoto 		break;
3491ad747caSKuninori Morimoto 	case 12000:
3501ad747caSKuninori Morimoto 		rate = FS0;
3511ad747caSKuninori Morimoto 		break;
3521ad747caSKuninori Morimoto 	case 14700:
3531ad747caSKuninori Morimoto 		rate = FS2 | FS1;
3541ad747caSKuninori Morimoto 		break;
3551ad747caSKuninori Morimoto 	case 16000:
3561ad747caSKuninori Morimoto 		rate = FS1;
3571ad747caSKuninori Morimoto 		break;
3581ad747caSKuninori Morimoto 	case 22050:
3591ad747caSKuninori Morimoto 		rate = FS2 | FS1 | FS0;
3601ad747caSKuninori Morimoto 		break;
3611ad747caSKuninori Morimoto 	case 24000:
3621ad747caSKuninori Morimoto 		rate = FS1 | FS0;
3631ad747caSKuninori Morimoto 		break;
3641ad747caSKuninori Morimoto 	case 29400:
3651ad747caSKuninori Morimoto 		rate = FS3 | FS2 | FS1;
3661ad747caSKuninori Morimoto 		break;
3671ad747caSKuninori Morimoto 	case 32000:
3681ad747caSKuninori Morimoto 		rate = FS3 | FS1;
3691ad747caSKuninori Morimoto 		break;
3701ad747caSKuninori Morimoto 	case 44100:
3711ad747caSKuninori Morimoto 		rate = FS3 | FS2 | FS1 | FS0;
3721ad747caSKuninori Morimoto 		break;
3731ad747caSKuninori Morimoto 	case 48000:
3741ad747caSKuninori Morimoto 		rate = FS3 | FS1 | FS0;
3751ad747caSKuninori Morimoto 		break;
3761ad747caSKuninori Morimoto 	default:
3771ad747caSKuninori Morimoto 		return -EINVAL;
3781ad747caSKuninori Morimoto 		break;
3791ad747caSKuninori Morimoto 	}
3801ad747caSKuninori Morimoto 	snd_soc_update_bits(codec, MD_CTL2, FS_MASK, rate);
3811ad747caSKuninori Morimoto 
382a3a83d9aSKuninori Morimoto 	return 0;
383a3a83d9aSKuninori Morimoto }
384a3a83d9aSKuninori Morimoto 
385a3a83d9aSKuninori Morimoto static struct snd_soc_dai_ops ak4642_dai_ops = {
386a3a83d9aSKuninori Morimoto 	.startup	= ak4642_dai_startup,
387a3a83d9aSKuninori Morimoto 	.shutdown	= ak4642_dai_shutdown,
388a3a83d9aSKuninori Morimoto 	.set_sysclk	= ak4642_dai_set_sysclk,
3890643ce8fSKuninori Morimoto 	.set_fmt	= ak4642_dai_set_fmt,
3901ad747caSKuninori Morimoto 	.hw_params	= ak4642_dai_hw_params,
391a3a83d9aSKuninori Morimoto };
392a3a83d9aSKuninori Morimoto 
393f0fba2adSLiam Girdwood static struct snd_soc_dai_driver ak4642_dai = {
394f0fba2adSLiam Girdwood 	.name = "ak4642-hifi",
395a3a83d9aSKuninori Morimoto 	.playback = {
396a3a83d9aSKuninori Morimoto 		.stream_name = "Playback",
397a3a83d9aSKuninori Morimoto 		.channels_min = 1,
398a3a83d9aSKuninori Morimoto 		.channels_max = 2,
399a3a83d9aSKuninori Morimoto 		.rates = SNDRV_PCM_RATE_8000_48000,
400a3a83d9aSKuninori Morimoto 		.formats = SNDRV_PCM_FMTBIT_S16_LE },
401a3a83d9aSKuninori Morimoto 	.capture = {
402a3a83d9aSKuninori Morimoto 		.stream_name = "Capture",
403a3a83d9aSKuninori Morimoto 		.channels_min = 1,
404a3a83d9aSKuninori Morimoto 		.channels_max = 2,
405a3a83d9aSKuninori Morimoto 		.rates = SNDRV_PCM_RATE_8000_48000,
406a3a83d9aSKuninori Morimoto 		.formats = SNDRV_PCM_FMTBIT_S16_LE },
407a3a83d9aSKuninori Morimoto 	.ops = &ak4642_dai_ops,
4081ad747caSKuninori Morimoto 	.symmetric_rates = 1,
409a3a83d9aSKuninori Morimoto };
410a3a83d9aSKuninori Morimoto 
411f0fba2adSLiam Girdwood static int ak4642_resume(struct snd_soc_codec *codec)
412a3a83d9aSKuninori Morimoto {
413a3a83d9aSKuninori Morimoto 	ak4642_sync(codec);
414a3a83d9aSKuninori Morimoto 	return 0;
415a3a83d9aSKuninori Morimoto }
416a3a83d9aSKuninori Morimoto 
417f0fba2adSLiam Girdwood 
418f0fba2adSLiam Girdwood static int ak4642_probe(struct snd_soc_codec *codec)
419a3a83d9aSKuninori Morimoto {
420f0fba2adSLiam Girdwood 	struct ak4642_priv *ak4642 = snd_soc_codec_get_drvdata(codec);
421a3a83d9aSKuninori Morimoto 
422f0fba2adSLiam Girdwood 	dev_info(codec->dev, "AK4642 Audio Codec %s", AK4642_VERSION);
423a3a83d9aSKuninori Morimoto 
424a3a83d9aSKuninori Morimoto 	codec->hw_write		= (hw_write_t)i2c_master_send;
425f0fba2adSLiam Girdwood 	codec->control_data = ak4642->control_data;
426a3a83d9aSKuninori Morimoto 
42773bb379fSKuninori Morimoto 	snd_soc_add_controls(codec, ak4642_snd_controls,
42873bb379fSKuninori Morimoto 			     ARRAY_SIZE(ak4642_snd_controls));
429a3a83d9aSKuninori Morimoto 
430f0fba2adSLiam Girdwood 	return 0;
431a3a83d9aSKuninori Morimoto }
432a3a83d9aSKuninori Morimoto 
433f0fba2adSLiam Girdwood static struct snd_soc_codec_driver soc_codec_dev_ak4642 = {
434f0fba2adSLiam Girdwood 	.probe =	ak4642_probe,
435f0fba2adSLiam Girdwood 	.resume =	ak4642_resume,
436f0fba2adSLiam Girdwood 	.read		= ak4642_read_reg_cache,
437f0fba2adSLiam Girdwood 	.write		= ak4642_write,
438f0fba2adSLiam Girdwood 	.reg_cache_size	= ARRAY_SIZE(ak4642_reg),
439f0fba2adSLiam Girdwood 	.reg_word_size = sizeof(u8),
440f0fba2adSLiam Girdwood 	.reg_cache_default	= ak4642_reg,
441f0fba2adSLiam Girdwood };
442a3a83d9aSKuninori Morimoto 
443a3a83d9aSKuninori Morimoto #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
444f0fba2adSLiam Girdwood static __devinit int ak4642_i2c_probe(struct i2c_client *i2c,
445a3a83d9aSKuninori Morimoto 				      const struct i2c_device_id *id)
446a3a83d9aSKuninori Morimoto {
447a3a83d9aSKuninori Morimoto 	struct ak4642_priv *ak4642;
448a3a83d9aSKuninori Morimoto 	int ret;
449a3a83d9aSKuninori Morimoto 
450a3a83d9aSKuninori Morimoto 	ak4642 = kzalloc(sizeof(struct ak4642_priv), GFP_KERNEL);
451f0fba2adSLiam Girdwood 	if (ak4642 == NULL)
452a3a83d9aSKuninori Morimoto 		return -ENOMEM;
453a3a83d9aSKuninori Morimoto 
454a3a83d9aSKuninori Morimoto 	i2c_set_clientdata(i2c, ak4642);
455f0fba2adSLiam Girdwood 	ak4642->control_data = i2c;
456f0fba2adSLiam Girdwood 	ak4642->control_type = SND_SOC_I2C;
457a3a83d9aSKuninori Morimoto 
458f0fba2adSLiam Girdwood 	ret =  snd_soc_register_codec(&i2c->dev,
459f0fba2adSLiam Girdwood 			&soc_codec_dev_ak4642, &ak4642_dai, 1);
460f0fba2adSLiam Girdwood 	if (ret < 0)
4617bcaad91SAxel Lin 		kfree(ak4642);
462a3a83d9aSKuninori Morimoto 	return ret;
463a3a83d9aSKuninori Morimoto }
464a3a83d9aSKuninori Morimoto 
465f0fba2adSLiam Girdwood static __devexit int ak4642_i2c_remove(struct i2c_client *client)
466a3a83d9aSKuninori Morimoto {
467f0fba2adSLiam Girdwood 	snd_soc_unregister_codec(&client->dev);
468f0fba2adSLiam Girdwood 	kfree(i2c_get_clientdata(client));
469a3a83d9aSKuninori Morimoto 	return 0;
470a3a83d9aSKuninori Morimoto }
471a3a83d9aSKuninori Morimoto 
472a3a83d9aSKuninori Morimoto static const struct i2c_device_id ak4642_i2c_id[] = {
473a3a83d9aSKuninori Morimoto 	{ "ak4642", 0 },
474a3a83d9aSKuninori Morimoto 	{ "ak4643", 0 },
475a3a83d9aSKuninori Morimoto 	{ }
476a3a83d9aSKuninori Morimoto };
477a3a83d9aSKuninori Morimoto MODULE_DEVICE_TABLE(i2c, ak4642_i2c_id);
478a3a83d9aSKuninori Morimoto 
479a3a83d9aSKuninori Morimoto static struct i2c_driver ak4642_i2c_driver = {
480a3a83d9aSKuninori Morimoto 	.driver = {
481f0fba2adSLiam Girdwood 		.name = "ak4642-codec",
482a3a83d9aSKuninori Morimoto 		.owner = THIS_MODULE,
483a3a83d9aSKuninori Morimoto 	},
484a3a83d9aSKuninori Morimoto 	.probe =    ak4642_i2c_probe,
485f0fba2adSLiam Girdwood 	.remove =   __devexit_p(ak4642_i2c_remove),
486a3a83d9aSKuninori Morimoto 	.id_table = ak4642_i2c_id,
487a3a83d9aSKuninori Morimoto };
488a3a83d9aSKuninori Morimoto #endif
489a3a83d9aSKuninori Morimoto 
490a3a83d9aSKuninori Morimoto static int __init ak4642_modinit(void)
491a3a83d9aSKuninori Morimoto {
4921cf86f6fSKuninori Morimoto 	int ret = 0;
493a3a83d9aSKuninori Morimoto #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
494a3a83d9aSKuninori Morimoto 	ret = i2c_add_driver(&ak4642_i2c_driver);
495a3a83d9aSKuninori Morimoto #endif
496a3a83d9aSKuninori Morimoto 	return ret;
497a3a83d9aSKuninori Morimoto 
498a3a83d9aSKuninori Morimoto }
499a3a83d9aSKuninori Morimoto module_init(ak4642_modinit);
500a3a83d9aSKuninori Morimoto 
501a3a83d9aSKuninori Morimoto static void __exit ak4642_exit(void)
502a3a83d9aSKuninori Morimoto {
503a3a83d9aSKuninori Morimoto #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
504a3a83d9aSKuninori Morimoto 	i2c_del_driver(&ak4642_i2c_driver);
505a3a83d9aSKuninori Morimoto #endif
506a3a83d9aSKuninori Morimoto 
507a3a83d9aSKuninori Morimoto }
508a3a83d9aSKuninori Morimoto module_exit(ak4642_exit);
509a3a83d9aSKuninori Morimoto 
510a3a83d9aSKuninori Morimoto MODULE_DESCRIPTION("Soc AK4642 driver");
511a3a83d9aSKuninori Morimoto MODULE_AUTHOR("Kuninori Morimoto <morimoto.kuninori@renesas.com>");
512a3a83d9aSKuninori Morimoto MODULE_LICENSE("GPL");
513