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