2 * mc1n2_i2c.c -- MC1N2 ALSA SoC Audio driver
4 * Copyright (C) 2010 Samsung Electronics Co.Ltd
5 * Author: Chanwoo Choi <cw00.choi@samsung.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
12 #include <linux/module.h>
13 #include <linux/moduleparam.h>
14 #include <linux/init.h>
15 #include <linux/slab.h>
16 #include <linux/delay.h>
18 #include <linux/i2c.h>
19 #include <linux/platform_device.h>
20 #include <linux/regulator/consumer.h>
21 #include <sound/core.h>
22 #include <sound/pcm.h>
23 #include <sound/pcm_params.h>
24 #include <sound/soc-dapm.h>
25 #include <sound/initval.h>
26 #include <sound/tlv.h>
28 #include <sound/mc1n2/mc1n2_priv.h>
30 #define mc1n2_i2c_read_byte_cw(c,r) i2c_smbus_read_byte_data((c), (r)<<1)
32 static int mc1n2_common_i2c(struct snd_soc_codec *codec, unsigned int reg,
33 unsigned int value, u8 *rAddr, u8 *rData)
37 rType = access_masks[reg].rType;
43 rData[0] = access_masks[reg].rAddr;
47 rAddr[0] = __MC1N2_A_BASE_ADR << 1;
48 rAddr[1] = access_masks[reg].rAddr;
50 rData[0] = __MC1N2_A_BASE_WINDOW;
54 rAddr[0] = __MC1N2_A_ANA_ADR << 1;
55 rAddr[1] = access_masks[reg].rAddr;
57 rData[0] = __MC1N2_A_ANA_WINDOW;
61 rAddr[0] = __MC1N2_A_CD_ADR << 1;
62 rAddr[1] = access_masks[reg].rAddr;
64 rData[0] = __MC1N2_A_CD_WINDOW;
68 rAddr[0] = __MC1N2_A_MIX_ADR << 1;
69 rAddr[1] = access_masks[reg].rAddr;
71 rData[0] = __MC1N2_A_MIX_WINDOW;
75 rAddr[0] = __MC1N2_A_AE_ADR << 1;
76 rAddr[1] = access_masks[reg].rAddr;
78 rData[0] = __MC1N2_A_AE_WINDOW;
82 rAddr[0] = __MC1N2_A_BDSP_ADR << 1;
83 rAddr[1] = access_masks[reg].rAddr;
85 rData[0] = __MC1N2_A_BDSP_WINDOW;
89 dev_err(codec->dev, "Failed to write the register of codec\n");
93 return i2c_master_send(codec->control_data, rAddr, 2);
96 int mc1n2_i2c_write(struct snd_soc_codec *codec, unsigned int reg,
99 u8 *reg_cache = codec->reg_cache;
104 ret = mc1n2_common_i2c(codec, reg, value, rAddr, rData);
105 if (ret < 0) goto err1;
107 rData[0] = rData[0] << 1;
108 ret = i2c_master_send(codec->control_data, rData, 2);
109 if (ret < 0) goto err1;
111 reg_cache[reg] = value;
115 dev_err(codec->dev, "Failed to write data on I2C bus: %d\n", ret);
118 EXPORT_SYMBOL(mc1n2_i2c_write);
120 #define mc1n2_i2c_read_byte(c,r) i2c_smbus_read_byte_data((c), (r)<<1)
121 static unsigned int mc1n2_i2c_read(struct snd_soc_codec *codec,
126 /* u8 *reg_cache = codec->reg_cache; */
129 ret = mc1n2_common_i2c(codec, reg, -1, rAddr, rData);
130 if (ret < 0) goto err1;
132 ret = mc1n2_i2c_read_byte(codec->control_data, rData[0]);
133 if (ret < 0) goto err1;
137 dev_err(codec->dev, "Failed to write data on I2C bus: %d\n", ret);
141 static void mc1n2_set_path(struct snd_soc_codec *codec)
146 void mc1n2_show_reg(struct snd_soc_codec *codec)
153 mc1n2_set_path(codec);
155 printk("SHOW REGISTER \n");
156 printk("MC1N2_MAX_REGISTER : %d\n", MC1N2_MAX_REGISTER);
158 for (i = 0 ; i < MC1N2_MAX_REGISTER ; i++) {
159 rType = access_masks[i].rType;
160 rAddr = access_masks[i].rAddr;
161 rData = mc1n2_i2c_read(codec, i);
165 printk("A_ADR #%d\t : 0x%x \t (%s)\n",
166 rAddr, rData, access_masks_reg[i].name);
169 printk("BASE_ADR #%d\t : 0x%x \t (%s)\n",
170 rAddr, rData, access_masks_reg[i].name);
173 printk("ANA_ADR #%d\t : 0x%x \t (%s)\n",
174 rAddr, rData, access_masks_reg[i].name);
177 printk("CD_ADR #%d\t : 0x%x \t (%s)\n",
178 rAddr, rData, access_masks_reg[i].name);
181 printk("MIX_ADR #%d\t : 0x%x \t (%s)\n",
182 rAddr, rData, access_masks_reg[i].name);
185 printk("AE_ADR #%d\t : 0x%x \t (%s)\n",
186 rAddr, rData, access_masks_reg[i].name);
189 printk("BDSP_ADR #%d\t : 0x%x \t (%s)\n",
190 rAddr, rData, access_masks_reg[i].name);
199 EXPORT_SYMBOL(mc1n2_show_reg);