xref: /openbmc/linux/sound/soc/codecs/ak4642.c (revision bd7fdbca)
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>
29ce6120ccSLiam Girdwood #include <sound/soc.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 
75a3471239SKuninori Morimoto /* PW_MGMT1*/
76a3471239SKuninori Morimoto #define PMVCM		(1 << 6) /* VCOM Power Management */
77a3471239SKuninori Morimoto #define PMMIN		(1 << 5) /* MIN Input Power Management */
78a3471239SKuninori Morimoto #define PMDAC		(1 << 2) /* DAC Power Management */
79a3471239SKuninori Morimoto #define PMADL		(1 << 0) /* MIC Amp Lch and ADC Lch Power Management */
80a3471239SKuninori Morimoto 
810643ce8fSKuninori Morimoto /* PW_MGMT2 */
820643ce8fSKuninori Morimoto #define HPMTN		(1 << 6)
830643ce8fSKuninori Morimoto #define PMHPL		(1 << 5)
840643ce8fSKuninori Morimoto #define PMHPR		(1 << 4)
850643ce8fSKuninori Morimoto #define MS		(1 << 3) /* master/slave select */
860643ce8fSKuninori Morimoto #define MCKO		(1 << 1)
870643ce8fSKuninori Morimoto #define PMPLL		(1 << 0)
880643ce8fSKuninori Morimoto 
890643ce8fSKuninori Morimoto #define PMHP_MASK	(PMHPL | PMHPR)
900643ce8fSKuninori Morimoto #define PMHP		PMHP_MASK
910643ce8fSKuninori Morimoto 
92a3471239SKuninori Morimoto /* PW_MGMT3 */
93a3471239SKuninori Morimoto #define PMADR		(1 << 0) /* MIC L / ADC R Power Management */
94a3471239SKuninori Morimoto 
95a3471239SKuninori Morimoto /* SG_SL1 */
96a3471239SKuninori Morimoto #define MINS		(1 << 6) /* Switch from MIN to Speaker */
97a3471239SKuninori Morimoto #define DACL		(1 << 4) /* Switch from DAC to Stereo or Receiver */
98a3471239SKuninori Morimoto #define PMMP		(1 << 2) /* MPWR pin Power Management */
99a3471239SKuninori Morimoto #define MGAIN0		(1 << 0) /* MIC amp gain*/
100a3471239SKuninori Morimoto 
101a3471239SKuninori Morimoto /* TIMER */
102a3471239SKuninori Morimoto #define ZTM(param)	((param & 0x3) << 4) /* ALC Zoro Crossing TimeOut */
103a3471239SKuninori Morimoto #define WTM(param)	(((param & 0x4) << 4) | ((param & 0x3) << 2))
104a3471239SKuninori Morimoto 
105a3471239SKuninori Morimoto /* ALC_CTL1 */
106a3471239SKuninori Morimoto #define ALC		(1 << 5) /* ALC Enable */
107a3471239SKuninori Morimoto #define LMTH0		(1 << 0) /* ALC Limiter / Recovery Level */
108a3471239SKuninori Morimoto 
1094b6316b4SKuninori Morimoto /* MD_CTL1 */
1104b6316b4SKuninori Morimoto #define PLL3		(1 << 7)
1114b6316b4SKuninori Morimoto #define PLL2		(1 << 6)
1124b6316b4SKuninori Morimoto #define PLL1		(1 << 5)
1134b6316b4SKuninori Morimoto #define PLL0		(1 << 4)
1144b6316b4SKuninori Morimoto #define PLL_MASK	(PLL3 | PLL2 | PLL1 | PLL0)
1154b6316b4SKuninori Morimoto 
1160643ce8fSKuninori Morimoto #define BCKO_MASK	(1 << 3)
1170643ce8fSKuninori Morimoto #define BCKO_64		BCKO_MASK
1180643ce8fSKuninori Morimoto 
119cb9c130aSKuninori Morimoto #define DIF_MASK	(3 << 0)
120cb9c130aSKuninori Morimoto #define DSP		(0 << 0)
121cb9c130aSKuninori Morimoto #define RIGHT_J		(1 << 0)
122cb9c130aSKuninori Morimoto #define LEFT_J		(2 << 0)
123cb9c130aSKuninori Morimoto #define I2S		(3 << 0)
124cb9c130aSKuninori Morimoto 
1251ad747caSKuninori Morimoto /* MD_CTL2 */
1261ad747caSKuninori Morimoto #define FS0		(1 << 0)
1271ad747caSKuninori Morimoto #define FS1		(1 << 1)
1281ad747caSKuninori Morimoto #define FS2		(1 << 2)
1291ad747caSKuninori Morimoto #define FS3		(1 << 5)
1301ad747caSKuninori Morimoto #define FS_MASK		(FS0 | FS1 | FS2 | FS3)
1311ad747caSKuninori Morimoto 
132a3471239SKuninori Morimoto /* MD_CTL3 */
133a3471239SKuninori Morimoto #define BST1		(1 << 3)
134a3471239SKuninori Morimoto 
135a3471239SKuninori Morimoto /* MD_CTL4 */
136a3471239SKuninori Morimoto #define DACH		(1 << 0)
137a3a83d9aSKuninori Morimoto 
138a300de3cSKuninori Morimoto /*
139a300de3cSKuninori Morimoto  * Playback Volume (table 39)
140a300de3cSKuninori Morimoto  *
141a300de3cSKuninori Morimoto  * max : 0x00 : +12.0 dB
142a300de3cSKuninori Morimoto  *       ( 0.5 dB step )
143a300de3cSKuninori Morimoto  * min : 0xFE : -115.0 dB
144a300de3cSKuninori Morimoto  * mute: 0xFF
145a300de3cSKuninori Morimoto  */
146a300de3cSKuninori Morimoto static const DECLARE_TLV_DB_SCALE(out_tlv, -11500, 50, 1);
147a300de3cSKuninori Morimoto 
148a300de3cSKuninori Morimoto static const struct snd_kcontrol_new ak4642_snd_controls[] = {
149a300de3cSKuninori Morimoto 
150a300de3cSKuninori Morimoto 	SOC_DOUBLE_R_TLV("Digital Playback Volume", L_DVC, R_DVC,
151a300de3cSKuninori Morimoto 			 0, 0xFF, 1, out_tlv),
152a300de3cSKuninori Morimoto };
153a300de3cSKuninori Morimoto 
154a300de3cSKuninori Morimoto 
155a3a83d9aSKuninori Morimoto /* codec private data */
156a3a83d9aSKuninori Morimoto struct ak4642_priv {
157f0fba2adSLiam Girdwood 	unsigned int sysclk;
158f0fba2adSLiam Girdwood 	enum snd_soc_control_type control_type;
159f0fba2adSLiam Girdwood 	void *control_data;
160a3a83d9aSKuninori Morimoto };
161a3a83d9aSKuninori Morimoto 
162a3a83d9aSKuninori Morimoto /*
163a3a83d9aSKuninori Morimoto  * ak4642 register cache
164a3a83d9aSKuninori Morimoto  */
165a3a83d9aSKuninori Morimoto static const u16 ak4642_reg[AK4642_CACHEREGNUM] = {
166a3a83d9aSKuninori Morimoto 	0x0000, 0x0000, 0x0001, 0x0000,
167a3a83d9aSKuninori Morimoto 	0x0002, 0x0000, 0x0000, 0x0000,
168a3a83d9aSKuninori Morimoto 	0x00e1, 0x00e1, 0x0018, 0x0000,
169a3a83d9aSKuninori Morimoto 	0x00e1, 0x0018, 0x0011, 0x0008,
170a3a83d9aSKuninori Morimoto 	0x0000, 0x0000, 0x0000, 0x0000,
171a3a83d9aSKuninori Morimoto 	0x0000, 0x0000, 0x0000, 0x0000,
172a3a83d9aSKuninori Morimoto 	0x0000, 0x0000, 0x0000, 0x0000,
173a3a83d9aSKuninori Morimoto 	0x0000, 0x0000, 0x0000, 0x0000,
174a3a83d9aSKuninori Morimoto 	0x0000, 0x0000, 0x0000, 0x0000,
175a3a83d9aSKuninori Morimoto 	0x0000,
176a3a83d9aSKuninori Morimoto };
177a3a83d9aSKuninori Morimoto 
178a3a83d9aSKuninori Morimoto /*
179a3a83d9aSKuninori Morimoto  * read ak4642 register cache
180a3a83d9aSKuninori Morimoto  */
181a3a83d9aSKuninori Morimoto static inline unsigned int ak4642_read_reg_cache(struct snd_soc_codec *codec,
182a3a83d9aSKuninori Morimoto 	unsigned int reg)
183a3a83d9aSKuninori Morimoto {
184a3a83d9aSKuninori Morimoto 	u16 *cache = codec->reg_cache;
185a3a83d9aSKuninori Morimoto 	if (reg >= AK4642_CACHEREGNUM)
186a3a83d9aSKuninori Morimoto 		return -1;
187a3a83d9aSKuninori Morimoto 	return cache[reg];
188a3a83d9aSKuninori Morimoto }
189a3a83d9aSKuninori Morimoto 
190a3a83d9aSKuninori Morimoto /*
191a3a83d9aSKuninori Morimoto  * write ak4642 register cache
192a3a83d9aSKuninori Morimoto  */
193a3a83d9aSKuninori Morimoto static inline void ak4642_write_reg_cache(struct snd_soc_codec *codec,
194a3a83d9aSKuninori Morimoto 	u16 reg, unsigned int value)
195a3a83d9aSKuninori Morimoto {
196a3a83d9aSKuninori Morimoto 	u16 *cache = codec->reg_cache;
197a3a83d9aSKuninori Morimoto 	if (reg >= AK4642_CACHEREGNUM)
198a3a83d9aSKuninori Morimoto 		return;
199a3a83d9aSKuninori Morimoto 
200a3a83d9aSKuninori Morimoto 	cache[reg] = value;
201a3a83d9aSKuninori Morimoto }
202a3a83d9aSKuninori Morimoto 
203a3a83d9aSKuninori Morimoto /*
204a3a83d9aSKuninori Morimoto  * write to the AK4642 register space
205a3a83d9aSKuninori Morimoto  */
206a3a83d9aSKuninori Morimoto static int ak4642_write(struct snd_soc_codec *codec, unsigned int reg,
207a3a83d9aSKuninori Morimoto 	unsigned int value)
208a3a83d9aSKuninori Morimoto {
209a3a83d9aSKuninori Morimoto 	u8 data[2];
210a3a83d9aSKuninori Morimoto 
211a3a83d9aSKuninori Morimoto 	/* data is
212a3a83d9aSKuninori Morimoto 	 *   D15..D8 AK4642 register offset
213a3a83d9aSKuninori Morimoto 	 *   D7...D0 register data
214a3a83d9aSKuninori Morimoto 	 */
215a3a83d9aSKuninori Morimoto 	data[0] = reg & 0xff;
216a3a83d9aSKuninori Morimoto 	data[1] = value & 0xff;
217a3a83d9aSKuninori Morimoto 
218a3a83d9aSKuninori Morimoto 	if (codec->hw_write(codec->control_data, data, 2) == 2) {
219a3a83d9aSKuninori Morimoto 		ak4642_write_reg_cache(codec, reg, value);
220a3a83d9aSKuninori Morimoto 		return 0;
221a3a83d9aSKuninori Morimoto 	} else
222a3a83d9aSKuninori Morimoto 		return -EIO;
223a3a83d9aSKuninori Morimoto }
224a3a83d9aSKuninori Morimoto 
225a3a83d9aSKuninori Morimoto static int ak4642_sync(struct snd_soc_codec *codec)
226a3a83d9aSKuninori Morimoto {
227a3a83d9aSKuninori Morimoto 	u16 *cache = codec->reg_cache;
228a3a83d9aSKuninori Morimoto 	int i, r = 0;
229a3a83d9aSKuninori Morimoto 
230a3a83d9aSKuninori Morimoto 	for (i = 0; i < AK4642_CACHEREGNUM; i++)
231a3a83d9aSKuninori Morimoto 		r |= ak4642_write(codec, i, cache[i]);
232a3a83d9aSKuninori Morimoto 
233a3a83d9aSKuninori Morimoto 	return r;
234a3a83d9aSKuninori Morimoto };
235a3a83d9aSKuninori Morimoto 
236a3a83d9aSKuninori Morimoto static int ak4642_dai_startup(struct snd_pcm_substream *substream,
237a3a83d9aSKuninori Morimoto 			      struct snd_soc_dai *dai)
238a3a83d9aSKuninori Morimoto {
239a3a83d9aSKuninori Morimoto 	int is_play = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
240a3a83d9aSKuninori Morimoto 	struct snd_soc_codec *codec = dai->codec;
241a3a83d9aSKuninori Morimoto 
242a3a83d9aSKuninori Morimoto 	if (is_play) {
243a3a83d9aSKuninori Morimoto 		/*
244a3a83d9aSKuninori Morimoto 		 * start headphone output
245a3a83d9aSKuninori Morimoto 		 *
246a3a83d9aSKuninori Morimoto 		 * PLL, Master Mode
247a3a83d9aSKuninori Morimoto 		 * Audio I/F Format :MSB justified (ADC & DAC)
248a3a83d9aSKuninori Morimoto 		 * Bass Boost Level : Middle
249a3a83d9aSKuninori Morimoto 		 *
250a3a83d9aSKuninori Morimoto 		 * This operation came from example code of
251a3a83d9aSKuninori Morimoto 		 * "ASAHI KASEI AK4642" (japanese) manual p97.
252a3a83d9aSKuninori Morimoto 		 */
253a3471239SKuninori Morimoto 		snd_soc_update_bits(codec, MD_CTL4, DACH, DACH);
254a3471239SKuninori Morimoto 		snd_soc_update_bits(codec, MD_CTL3, BST1, BST1);
255a3471239SKuninori Morimoto 		ak4642_write(codec, L_IVC, 0x91); /* volume */
256a3471239SKuninori Morimoto 		ak4642_write(codec, R_IVC, 0x91); /* volume */
257a3471239SKuninori Morimoto 		snd_soc_update_bits(codec, PW_MGMT1, PMVCM | PMMIN | PMDAC,
258a3471239SKuninori Morimoto 						     PMVCM | PMMIN | PMDAC);
2590643ce8fSKuninori Morimoto 		snd_soc_update_bits(codec, PW_MGMT2, PMHP_MASK,	PMHP);
2600643ce8fSKuninori Morimoto 		snd_soc_update_bits(codec, PW_MGMT2, HPMTN,	HPMTN);
261a3a83d9aSKuninori Morimoto 	} else {
262a3a83d9aSKuninori Morimoto 		/*
263a3a83d9aSKuninori Morimoto 		 * start stereo input
264a3a83d9aSKuninori Morimoto 		 *
265a3a83d9aSKuninori Morimoto 		 * PLL Master Mode
266a3a83d9aSKuninori Morimoto 		 * Audio I/F Format:MSB justified (ADC & DAC)
267a3a83d9aSKuninori Morimoto 		 * Pre MIC AMP:+20dB
268a3a83d9aSKuninori Morimoto 		 * MIC Power On
269a3a83d9aSKuninori Morimoto 		 * ALC setting:Refer to Table 35
270a3a83d9aSKuninori Morimoto 		 * ALC bit=“1”
271a3a83d9aSKuninori Morimoto 		 *
272a3a83d9aSKuninori Morimoto 		 * This operation came from example code of
273a3a83d9aSKuninori Morimoto 		 * "ASAHI KASEI AK4642" (japanese) manual p94.
274a3a83d9aSKuninori Morimoto 		 */
275a3471239SKuninori Morimoto 		ak4642_write(codec, SG_SL1, PMMP | MGAIN0);
276a3471239SKuninori Morimoto 		ak4642_write(codec, TIMER, ZTM(0x3) | WTM(0x3));
277a3471239SKuninori Morimoto 		ak4642_write(codec, ALC_CTL1, ALC | LMTH0);
278a3471239SKuninori Morimoto 		snd_soc_update_bits(codec, PW_MGMT1, PMVCM | PMADL,
279a3471239SKuninori Morimoto 						     PMVCM | PMADL);
280a3471239SKuninori Morimoto 		snd_soc_update_bits(codec, PW_MGMT3, PMADR, PMADR);
281a3a83d9aSKuninori Morimoto 	}
282a3a83d9aSKuninori Morimoto 
283a3a83d9aSKuninori Morimoto 	return 0;
284a3a83d9aSKuninori Morimoto }
285a3a83d9aSKuninori Morimoto 
286a3a83d9aSKuninori Morimoto static void ak4642_dai_shutdown(struct snd_pcm_substream *substream,
287a3a83d9aSKuninori Morimoto 			       struct snd_soc_dai *dai)
288a3a83d9aSKuninori Morimoto {
289a3a83d9aSKuninori Morimoto 	int is_play = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
290a3a83d9aSKuninori Morimoto 	struct snd_soc_codec *codec = dai->codec;
291a3a83d9aSKuninori Morimoto 
292a3a83d9aSKuninori Morimoto 	if (is_play) {
293a3a83d9aSKuninori Morimoto 		/* stop headphone output */
2940643ce8fSKuninori Morimoto 		snd_soc_update_bits(codec, PW_MGMT2, HPMTN,	0);
2950643ce8fSKuninori Morimoto 		snd_soc_update_bits(codec, PW_MGMT2, PMHP_MASK,	0);
296a3471239SKuninori Morimoto 		snd_soc_update_bits(codec, PW_MGMT1, PMMIN | PMDAC, 0);
297a3471239SKuninori Morimoto 		snd_soc_update_bits(codec, MD_CTL3, BST1, 0);
298a3471239SKuninori Morimoto 		snd_soc_update_bits(codec, MD_CTL4, DACH, 0);
299a3a83d9aSKuninori Morimoto 	} else {
300a3a83d9aSKuninori Morimoto 		/* stop stereo input */
301a3471239SKuninori Morimoto 		snd_soc_update_bits(codec, PW_MGMT1, PMADL, 0);
302a3471239SKuninori Morimoto 		snd_soc_update_bits(codec, PW_MGMT3, PMADR, 0);
303a3471239SKuninori Morimoto 		snd_soc_update_bits(codec, ALC_CTL1, ALC, 0);
304a3a83d9aSKuninori Morimoto 	}
305a3a83d9aSKuninori Morimoto }
306a3a83d9aSKuninori Morimoto 
307a3a83d9aSKuninori Morimoto static int ak4642_dai_set_sysclk(struct snd_soc_dai *codec_dai,
308a3a83d9aSKuninori Morimoto 	int clk_id, unsigned int freq, int dir)
309a3a83d9aSKuninori Morimoto {
310a3a83d9aSKuninori Morimoto 	struct snd_soc_codec *codec = codec_dai->codec;
3114b6316b4SKuninori Morimoto 	u8 pll;
312a3a83d9aSKuninori Morimoto 
3134b6316b4SKuninori Morimoto 	switch (freq) {
3144b6316b4SKuninori Morimoto 	case 11289600:
3154b6316b4SKuninori Morimoto 		pll = PLL2;
3164b6316b4SKuninori Morimoto 		break;
3174b6316b4SKuninori Morimoto 	case 12288000:
3184b6316b4SKuninori Morimoto 		pll = PLL2 | PLL0;
3194b6316b4SKuninori Morimoto 		break;
3204b6316b4SKuninori Morimoto 	case 12000000:
3214b6316b4SKuninori Morimoto 		pll = PLL2 | PLL1;
3224b6316b4SKuninori Morimoto 		break;
3234b6316b4SKuninori Morimoto 	case 24000000:
3244b6316b4SKuninori Morimoto 		pll = PLL2 | PLL1 | PLL0;
3254b6316b4SKuninori Morimoto 		break;
3264b6316b4SKuninori Morimoto 	case 13500000:
3274b6316b4SKuninori Morimoto 		pll = PLL3 | PLL2;
3284b6316b4SKuninori Morimoto 		break;
3294b6316b4SKuninori Morimoto 	case 27000000:
3304b6316b4SKuninori Morimoto 		pll = PLL3 | PLL2 | PLL0;
3314b6316b4SKuninori Morimoto 		break;
3324b6316b4SKuninori Morimoto 	default:
3334b6316b4SKuninori Morimoto 		return -EINVAL;
3344b6316b4SKuninori Morimoto 	}
3354b6316b4SKuninori Morimoto 	snd_soc_update_bits(codec, MD_CTL1, PLL_MASK, pll);
3364b6316b4SKuninori Morimoto 
337a3a83d9aSKuninori Morimoto 	return 0;
338a3a83d9aSKuninori Morimoto }
339a3a83d9aSKuninori Morimoto 
3400643ce8fSKuninori Morimoto static int ak4642_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
3410643ce8fSKuninori Morimoto {
3420643ce8fSKuninori Morimoto 	struct snd_soc_codec *codec = dai->codec;
3430643ce8fSKuninori Morimoto 	u8 data;
3440643ce8fSKuninori Morimoto 	u8 bcko;
3450643ce8fSKuninori Morimoto 
3460643ce8fSKuninori Morimoto 	data = MCKO | PMPLL; /* use MCKO */
3470643ce8fSKuninori Morimoto 	bcko = 0;
3480643ce8fSKuninori Morimoto 
3490643ce8fSKuninori Morimoto 	/* set master/slave audio interface */
3500643ce8fSKuninori Morimoto 	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
3510643ce8fSKuninori Morimoto 	case SND_SOC_DAIFMT_CBM_CFM:
3520643ce8fSKuninori Morimoto 		data |= MS;
3530643ce8fSKuninori Morimoto 		bcko = BCKO_64;
3540643ce8fSKuninori Morimoto 		break;
3550643ce8fSKuninori Morimoto 	case SND_SOC_DAIFMT_CBS_CFS:
3560643ce8fSKuninori Morimoto 		break;
3570643ce8fSKuninori Morimoto 	default:
3580643ce8fSKuninori Morimoto 		return -EINVAL;
3590643ce8fSKuninori Morimoto 	}
360bd7fdbcaSKuninori Morimoto 	snd_soc_update_bits(codec, PW_MGMT2, MS | MCKO | PMPLL, data);
3610643ce8fSKuninori Morimoto 	snd_soc_update_bits(codec, MD_CTL1, BCKO_MASK, bcko);
3620643ce8fSKuninori Morimoto 
363cb9c130aSKuninori Morimoto 	/* format type */
364cb9c130aSKuninori Morimoto 	data = 0;
365cb9c130aSKuninori Morimoto 	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
366cb9c130aSKuninori Morimoto 	case SND_SOC_DAIFMT_LEFT_J:
367cb9c130aSKuninori Morimoto 		data = LEFT_J;
368cb9c130aSKuninori Morimoto 		break;
369cb9c130aSKuninori Morimoto 	case SND_SOC_DAIFMT_I2S:
370cb9c130aSKuninori Morimoto 		data = I2S;
371cb9c130aSKuninori Morimoto 		break;
372cb9c130aSKuninori Morimoto 	/* FIXME
373cb9c130aSKuninori Morimoto 	 * Please add RIGHT_J / DSP support here
374cb9c130aSKuninori Morimoto 	 */
375cb9c130aSKuninori Morimoto 	default:
376cb9c130aSKuninori Morimoto 		return -EINVAL;
377cb9c130aSKuninori Morimoto 		break;
378cb9c130aSKuninori Morimoto 	}
379cb9c130aSKuninori Morimoto 	snd_soc_update_bits(codec, MD_CTL1, DIF_MASK, data);
380cb9c130aSKuninori Morimoto 
3810643ce8fSKuninori Morimoto 	return 0;
3820643ce8fSKuninori Morimoto }
3830643ce8fSKuninori Morimoto 
3841ad747caSKuninori Morimoto static int ak4642_dai_hw_params(struct snd_pcm_substream *substream,
3851ad747caSKuninori Morimoto 				struct snd_pcm_hw_params *params,
3861ad747caSKuninori Morimoto 				struct snd_soc_dai *dai)
3871ad747caSKuninori Morimoto {
3881ad747caSKuninori Morimoto 	struct snd_soc_codec *codec = dai->codec;
3891ad747caSKuninori Morimoto 	u8 rate;
3901ad747caSKuninori Morimoto 
3911ad747caSKuninori Morimoto 	switch (params_rate(params)) {
3921ad747caSKuninori Morimoto 	case 7350:
3931ad747caSKuninori Morimoto 		rate = FS2;
3941ad747caSKuninori Morimoto 		break;
3951ad747caSKuninori Morimoto 	case 8000:
3961ad747caSKuninori Morimoto 		rate = 0;
3971ad747caSKuninori Morimoto 		break;
3981ad747caSKuninori Morimoto 	case 11025:
3991ad747caSKuninori Morimoto 		rate = FS2 | FS0;
4001ad747caSKuninori Morimoto 		break;
4011ad747caSKuninori Morimoto 	case 12000:
4021ad747caSKuninori Morimoto 		rate = FS0;
4031ad747caSKuninori Morimoto 		break;
4041ad747caSKuninori Morimoto 	case 14700:
4051ad747caSKuninori Morimoto 		rate = FS2 | FS1;
4061ad747caSKuninori Morimoto 		break;
4071ad747caSKuninori Morimoto 	case 16000:
4081ad747caSKuninori Morimoto 		rate = FS1;
4091ad747caSKuninori Morimoto 		break;
4101ad747caSKuninori Morimoto 	case 22050:
4111ad747caSKuninori Morimoto 		rate = FS2 | FS1 | FS0;
4121ad747caSKuninori Morimoto 		break;
4131ad747caSKuninori Morimoto 	case 24000:
4141ad747caSKuninori Morimoto 		rate = FS1 | FS0;
4151ad747caSKuninori Morimoto 		break;
4161ad747caSKuninori Morimoto 	case 29400:
4171ad747caSKuninori Morimoto 		rate = FS3 | FS2 | FS1;
4181ad747caSKuninori Morimoto 		break;
4191ad747caSKuninori Morimoto 	case 32000:
4201ad747caSKuninori Morimoto 		rate = FS3 | FS1;
4211ad747caSKuninori Morimoto 		break;
4221ad747caSKuninori Morimoto 	case 44100:
4231ad747caSKuninori Morimoto 		rate = FS3 | FS2 | FS1 | FS0;
4241ad747caSKuninori Morimoto 		break;
4251ad747caSKuninori Morimoto 	case 48000:
4261ad747caSKuninori Morimoto 		rate = FS3 | FS1 | FS0;
4271ad747caSKuninori Morimoto 		break;
4281ad747caSKuninori Morimoto 	default:
4291ad747caSKuninori Morimoto 		return -EINVAL;
4301ad747caSKuninori Morimoto 		break;
4311ad747caSKuninori Morimoto 	}
4321ad747caSKuninori Morimoto 	snd_soc_update_bits(codec, MD_CTL2, FS_MASK, rate);
4331ad747caSKuninori Morimoto 
434a3a83d9aSKuninori Morimoto 	return 0;
435a3a83d9aSKuninori Morimoto }
436a3a83d9aSKuninori Morimoto 
437a3a83d9aSKuninori Morimoto static struct snd_soc_dai_ops ak4642_dai_ops = {
438a3a83d9aSKuninori Morimoto 	.startup	= ak4642_dai_startup,
439a3a83d9aSKuninori Morimoto 	.shutdown	= ak4642_dai_shutdown,
440a3a83d9aSKuninori Morimoto 	.set_sysclk	= ak4642_dai_set_sysclk,
4410643ce8fSKuninori Morimoto 	.set_fmt	= ak4642_dai_set_fmt,
4421ad747caSKuninori Morimoto 	.hw_params	= ak4642_dai_hw_params,
443a3a83d9aSKuninori Morimoto };
444a3a83d9aSKuninori Morimoto 
445f0fba2adSLiam Girdwood static struct snd_soc_dai_driver ak4642_dai = {
446f0fba2adSLiam Girdwood 	.name = "ak4642-hifi",
447a3a83d9aSKuninori Morimoto 	.playback = {
448a3a83d9aSKuninori Morimoto 		.stream_name = "Playback",
449a3a83d9aSKuninori Morimoto 		.channels_min = 1,
450a3a83d9aSKuninori Morimoto 		.channels_max = 2,
451a3a83d9aSKuninori Morimoto 		.rates = SNDRV_PCM_RATE_8000_48000,
452a3a83d9aSKuninori Morimoto 		.formats = SNDRV_PCM_FMTBIT_S16_LE },
453a3a83d9aSKuninori Morimoto 	.capture = {
454a3a83d9aSKuninori Morimoto 		.stream_name = "Capture",
455a3a83d9aSKuninori Morimoto 		.channels_min = 1,
456a3a83d9aSKuninori Morimoto 		.channels_max = 2,
457a3a83d9aSKuninori Morimoto 		.rates = SNDRV_PCM_RATE_8000_48000,
458a3a83d9aSKuninori Morimoto 		.formats = SNDRV_PCM_FMTBIT_S16_LE },
459a3a83d9aSKuninori Morimoto 	.ops = &ak4642_dai_ops,
4601ad747caSKuninori Morimoto 	.symmetric_rates = 1,
461a3a83d9aSKuninori Morimoto };
462a3a83d9aSKuninori Morimoto 
463f0fba2adSLiam Girdwood static int ak4642_resume(struct snd_soc_codec *codec)
464a3a83d9aSKuninori Morimoto {
465a3a83d9aSKuninori Morimoto 	ak4642_sync(codec);
466a3a83d9aSKuninori Morimoto 	return 0;
467a3a83d9aSKuninori Morimoto }
468a3a83d9aSKuninori Morimoto 
469f0fba2adSLiam Girdwood 
470f0fba2adSLiam Girdwood static int ak4642_probe(struct snd_soc_codec *codec)
471a3a83d9aSKuninori Morimoto {
472f0fba2adSLiam Girdwood 	struct ak4642_priv *ak4642 = snd_soc_codec_get_drvdata(codec);
473a3a83d9aSKuninori Morimoto 
474f0fba2adSLiam Girdwood 	dev_info(codec->dev, "AK4642 Audio Codec %s", AK4642_VERSION);
475a3a83d9aSKuninori Morimoto 
476a3a83d9aSKuninori Morimoto 	codec->hw_write		= (hw_write_t)i2c_master_send;
477f0fba2adSLiam Girdwood 	codec->control_data	= ak4642->control_data;
478a3a83d9aSKuninori Morimoto 
47973bb379fSKuninori Morimoto 	snd_soc_add_controls(codec, ak4642_snd_controls,
48073bb379fSKuninori Morimoto 			     ARRAY_SIZE(ak4642_snd_controls));
481a3a83d9aSKuninori Morimoto 
482f0fba2adSLiam Girdwood 	return 0;
483a3a83d9aSKuninori Morimoto }
484a3a83d9aSKuninori Morimoto 
485f0fba2adSLiam Girdwood static struct snd_soc_codec_driver soc_codec_dev_ak4642 = {
486f0fba2adSLiam Girdwood 	.probe			= ak4642_probe,
487f0fba2adSLiam Girdwood 	.resume			= ak4642_resume,
488f0fba2adSLiam Girdwood 	.read			= ak4642_read_reg_cache,
489f0fba2adSLiam Girdwood 	.write			= ak4642_write,
490f0fba2adSLiam Girdwood 	.reg_cache_size		= ARRAY_SIZE(ak4642_reg),
491f0fba2adSLiam Girdwood 	.reg_word_size		= sizeof(u8),
492f0fba2adSLiam Girdwood 	.reg_cache_default	= ak4642_reg,
493f0fba2adSLiam Girdwood };
494a3a83d9aSKuninori Morimoto 
495a3a83d9aSKuninori Morimoto #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
496f0fba2adSLiam Girdwood static __devinit int ak4642_i2c_probe(struct i2c_client *i2c,
497a3a83d9aSKuninori Morimoto 				      const struct i2c_device_id *id)
498a3a83d9aSKuninori Morimoto {
499a3a83d9aSKuninori Morimoto 	struct ak4642_priv *ak4642;
500a3a83d9aSKuninori Morimoto 	int ret;
501a3a83d9aSKuninori Morimoto 
502a3a83d9aSKuninori Morimoto 	ak4642 = kzalloc(sizeof(struct ak4642_priv), GFP_KERNEL);
5030ce75aa4SKuninori Morimoto 	if (!ak4642)
504a3a83d9aSKuninori Morimoto 		return -ENOMEM;
505a3a83d9aSKuninori Morimoto 
506a3a83d9aSKuninori Morimoto 	i2c_set_clientdata(i2c, ak4642);
507f0fba2adSLiam Girdwood 	ak4642->control_data = i2c;
508f0fba2adSLiam Girdwood 	ak4642->control_type = SND_SOC_I2C;
509a3a83d9aSKuninori Morimoto 
510f0fba2adSLiam Girdwood 	ret =  snd_soc_register_codec(&i2c->dev,
511f0fba2adSLiam Girdwood 			&soc_codec_dev_ak4642, &ak4642_dai, 1);
512f0fba2adSLiam Girdwood 	if (ret < 0)
5137bcaad91SAxel Lin 		kfree(ak4642);
514a3a83d9aSKuninori Morimoto 	return ret;
515a3a83d9aSKuninori Morimoto }
516a3a83d9aSKuninori Morimoto 
517f0fba2adSLiam Girdwood static __devexit int ak4642_i2c_remove(struct i2c_client *client)
518a3a83d9aSKuninori Morimoto {
519f0fba2adSLiam Girdwood 	snd_soc_unregister_codec(&client->dev);
520f0fba2adSLiam Girdwood 	kfree(i2c_get_clientdata(client));
521a3a83d9aSKuninori Morimoto 	return 0;
522a3a83d9aSKuninori Morimoto }
523a3a83d9aSKuninori Morimoto 
524a3a83d9aSKuninori Morimoto static const struct i2c_device_id ak4642_i2c_id[] = {
525a3a83d9aSKuninori Morimoto 	{ "ak4642", 0 },
526a3a83d9aSKuninori Morimoto 	{ "ak4643", 0 },
527a3a83d9aSKuninori Morimoto 	{ }
528a3a83d9aSKuninori Morimoto };
529a3a83d9aSKuninori Morimoto MODULE_DEVICE_TABLE(i2c, ak4642_i2c_id);
530a3a83d9aSKuninori Morimoto 
531a3a83d9aSKuninori Morimoto static struct i2c_driver ak4642_i2c_driver = {
532a3a83d9aSKuninori Morimoto 	.driver = {
533f0fba2adSLiam Girdwood 		.name = "ak4642-codec",
534a3a83d9aSKuninori Morimoto 		.owner = THIS_MODULE,
535a3a83d9aSKuninori Morimoto 	},
536a3a83d9aSKuninori Morimoto 	.probe		= ak4642_i2c_probe,
537f0fba2adSLiam Girdwood 	.remove		= __devexit_p(ak4642_i2c_remove),
538a3a83d9aSKuninori Morimoto 	.id_table	= ak4642_i2c_id,
539a3a83d9aSKuninori Morimoto };
540a3a83d9aSKuninori Morimoto #endif
541a3a83d9aSKuninori Morimoto 
542a3a83d9aSKuninori Morimoto static int __init ak4642_modinit(void)
543a3a83d9aSKuninori Morimoto {
5441cf86f6fSKuninori Morimoto 	int ret = 0;
545a3a83d9aSKuninori Morimoto #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
546a3a83d9aSKuninori Morimoto 	ret = i2c_add_driver(&ak4642_i2c_driver);
547a3a83d9aSKuninori Morimoto #endif
548a3a83d9aSKuninori Morimoto 	return ret;
549a3a83d9aSKuninori Morimoto 
550a3a83d9aSKuninori Morimoto }
551a3a83d9aSKuninori Morimoto module_init(ak4642_modinit);
552a3a83d9aSKuninori Morimoto 
553a3a83d9aSKuninori Morimoto static void __exit ak4642_exit(void)
554a3a83d9aSKuninori Morimoto {
555a3a83d9aSKuninori Morimoto #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
556a3a83d9aSKuninori Morimoto 	i2c_del_driver(&ak4642_i2c_driver);
557a3a83d9aSKuninori Morimoto #endif
558a3a83d9aSKuninori Morimoto 
559a3a83d9aSKuninori Morimoto }
560a3a83d9aSKuninori Morimoto module_exit(ak4642_exit);
561a3a83d9aSKuninori Morimoto 
562a3a83d9aSKuninori Morimoto MODULE_DESCRIPTION("Soc AK4642 driver");
563a3a83d9aSKuninori Morimoto MODULE_AUTHOR("Kuninori Morimoto <morimoto.kuninori@renesas.com>");
564a3a83d9aSKuninori Morimoto MODULE_LICENSE("GPL");
565