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