Commit 35b968d1b1c096e5eb16c15736055bd661e0ba25
1 parent
067c0565d5
Exists in
master
and in
2 other branches
= Debug 코드 추가
Showing
1 changed file
with
277 additions
and
0 deletions
Show diff stats
kernel/linux-imx6_3.14.28/sound/soc/codecs/sgtl5000.c
... | ... | @@ -31,6 +31,16 @@ |
31 | 31 | |
32 | 32 | #include "sgtl5000.h" |
33 | 33 | |
34 | +#define DEBUG_PROC 0 | |
35 | +#define DEBUG 0 | |
36 | + | |
37 | +#if DEBUG_PROC | |
38 | +#include <linux/proc_fs.h> | |
39 | +#include <linux/seq_file.h> | |
40 | +static struct proc_dir_entry *debug_proc_entry; | |
41 | +struct snd_soc_codec *debug_codec = NULL; | |
42 | +#endif | |
43 | + | |
34 | 44 | #define SGTL5000_DAP_REG_OFFSET 0x0100 |
35 | 45 | #define SGTL5000_MAX_REG_OFFSET 0x013A |
36 | 46 | |
... | ... | @@ -76,6 +86,220 @@ static const struct reg_default sgtl5000_reg_defaults[] = { |
76 | 86 | { SGTL5000_DAP_AVC_DECAY, 0x0050 }, |
77 | 87 | }; |
78 | 88 | |
89 | +#if DEBUG_PROC | |
90 | +char *uintToBinary(unsigned int i) { | |
91 | + static char s[16 + 1] = { '0', }; | |
92 | + int count = 16; | |
93 | + | |
94 | + do { | |
95 | + s[--count] = '0' + (char) (i & 1); | |
96 | + i = i >> 1; | |
97 | + } while (count); | |
98 | + | |
99 | + return s; | |
100 | +} | |
101 | + | |
102 | +static int dump_list[] = { | |
103 | + SGTL5000_CHIP_ID, | |
104 | + SGTL5000_CHIP_DIG_POWER, | |
105 | + SGTL5000_CHIP_CLK_CTRL, | |
106 | + SGTL5000_CHIP_I2S_CTRL, | |
107 | + SGTL5000_CHIP_SSS_CTRL, | |
108 | + SGTL5000_CHIP_ADCDAC_CTRL, | |
109 | + SGTL5000_CHIP_DAC_VOL, | |
110 | + SGTL5000_CHIP_PAD_STRENGTH, | |
111 | + SGTL5000_CHIP_ANA_ADC_CTRL, | |
112 | + SGTL5000_CHIP_ANA_HP_CTRL, | |
113 | + SGTL5000_CHIP_ANA_CTRL, | |
114 | + SGTL5000_CHIP_LINREG_CTRL, | |
115 | + SGTL5000_CHIP_REF_CTRL, | |
116 | + SGTL5000_CHIP_MIC_CTRL, | |
117 | + SGTL5000_CHIP_LINE_OUT_CTRL, | |
118 | + SGTL5000_CHIP_LINE_OUT_VOL, | |
119 | + SGTL5000_CHIP_ANA_POWER, | |
120 | + SGTL5000_CHIP_PLL_CTRL, | |
121 | + SGTL5000_CHIP_CLK_TOP_CTRL, | |
122 | + SGTL5000_CHIP_ANA_STATUS, | |
123 | + SGTL5000_CHIP_SHORT_CTRL, | |
124 | + SGTL5000_CHIP_ANA_TEST2, | |
125 | + SGTL5000_DAP_CTRL, | |
126 | + SGTL5000_DAP_PEQ, | |
127 | + SGTL5000_DAP_BASS_ENHANCE, | |
128 | + SGTL5000_DAP_BASS_ENHANCE_CTRL, | |
129 | + SGTL5000_DAP_AUDIO_EQ, | |
130 | + SGTL5000_DAP_SURROUND, | |
131 | + SGTL5000_DAP_FLT_COEF_ACCESS, | |
132 | + SGTL5000_DAP_COEF_WR_B0_MSB, | |
133 | + SGTL5000_DAP_COEF_WR_B0_LSB, | |
134 | + SGTL5000_DAP_EQ_BASS_BAND0, | |
135 | + SGTL5000_DAP_EQ_BASS_BAND1, | |
136 | + SGTL5000_DAP_EQ_BASS_BAND2, | |
137 | + SGTL5000_DAP_EQ_BASS_BAND3, | |
138 | + SGTL5000_DAP_EQ_BASS_BAND4, | |
139 | + SGTL5000_DAP_MAIN_CHAN, | |
140 | + SGTL5000_DAP_MIX_CHAN, | |
141 | + SGTL5000_DAP_AVC_CTRL, | |
142 | + SGTL5000_DAP_AVC_THRESHOLD, | |
143 | + SGTL5000_DAP_AVC_ATTACK, | |
144 | + SGTL5000_DAP_AVC_DECAY, | |
145 | + SGTL5000_DAP_COEF_WR_B1_MSB, | |
146 | + SGTL5000_DAP_COEF_WR_B1_LSB, | |
147 | + SGTL5000_DAP_COEF_WR_B2_MSB, | |
148 | + SGTL5000_DAP_COEF_WR_B2_LSB, | |
149 | + SGTL5000_DAP_COEF_WR_A1_MSB, | |
150 | + SGTL5000_DAP_COEF_WR_A1_LSB, | |
151 | + SGTL5000_DAP_COEF_WR_A2_MSB, | |
152 | + SGTL5000_DAP_COEF_WR_A2_LSB, | |
153 | +}; | |
154 | + | |
155 | +static char *dump_reg_name[] = { | |
156 | + "SGTL5000_CHIP_ID ", | |
157 | + "SGTL5000_CHIP_DIG_POWER ", | |
158 | + "SGTL5000_CHIP_CLK_CTRL ", | |
159 | + "SGTL5000_CHIP_I2S_CTRL ", | |
160 | + "SGTL5000_CHIP_SSS_CTRL ", | |
161 | + "SGTL5000_CHIP_ADCDAC_CTRL ", | |
162 | + "SGTL5000_CHIP_DAC_VOL ", | |
163 | + "SGTL5000_CHIP_PAD_STRENGTH ", | |
164 | + "SGTL5000_CHIP_ANA_ADC_CTRL ", | |
165 | + "SGTL5000_CHIP_ANA_HP_CTRL ", | |
166 | + "SGTL5000_CHIP_ANA_CTRL ", | |
167 | + "SGTL5000_CHIP_LINREG_CTRL ", | |
168 | + "SGTL5000_CHIP_REF_CTRL ", | |
169 | + "SGTL5000_CHIP_MIC_CTRL ", | |
170 | + "SGTL5000_CHIP_LINE_OUT_CTRL ", | |
171 | + "SGTL5000_CHIP_LINE_OUT_VOL ", | |
172 | + "SGTL5000_CHIP_ANA_POWER ", | |
173 | + "SGTL5000_CHIP_PLL_CTRL ", | |
174 | + "SGTL5000_CHIP_CLK_TOP_CTRL ", | |
175 | + "SGTL5000_CHIP_ANA_STATUS ", | |
176 | + "SGTL5000_CHIP_SHORT_CTRL ", | |
177 | + "SGTL5000_CHIP_ANA_TEST2 ", | |
178 | + "SGTL5000_DAP_CTRL ", | |
179 | + "SGTL5000_DAP_PEQ ", | |
180 | + "SGTL5000_DAP_BASS_ENHANCE ", | |
181 | + "SGTL5000_DAP_BASS_ENHANCE_CTRL", | |
182 | + "SGTL5000_DAP_AUDIO_EQ ", | |
183 | + "SGTL5000_DAP_SURROUND ", | |
184 | + "SGTL5000_DAP_FLT_COEF_ACCESS ", | |
185 | + "SGTL5000_DAP_COEF_WR_B0_MSB ", | |
186 | + "SGTL5000_DAP_COEF_WR_B0_LSB ", | |
187 | + "SGTL5000_DAP_EQ_BASS_BAND0 ", | |
188 | + "SGTL5000_DAP_EQ_BASS_BAND1 ", | |
189 | + "SGTL5000_DAP_EQ_BASS_BAND2 ", | |
190 | + "SGTL5000_DAP_EQ_BASS_BAND3 ", | |
191 | + "SGTL5000_DAP_EQ_BASS_BAND4 ", | |
192 | + "SGTL5000_DAP_MAIN_CHAN ", | |
193 | + "SGTL5000_DAP_MIX_CHAN ", | |
194 | + "SGTL5000_DAP_AVC_CTRL ", | |
195 | + "SGTL5000_DAP_AVC_THRESHOLD ", | |
196 | + "SGTL5000_DAP_AVC_ATTACK ", | |
197 | + "SGTL5000_DAP_AVC_DECAY ", | |
198 | + "SGTL5000_DAP_COEF_WR_B1_MSB ", | |
199 | + "SGTL5000_DAP_COEF_WR_B1_LSB ", | |
200 | + "SGTL5000_DAP_COEF_WR_B2_MSB ", | |
201 | + "SGTL5000_DAP_COEF_WR_B2_LSB ", | |
202 | + "SGTL5000_DAP_COEF_WR_A1_MSB ", | |
203 | + "SGTL5000_DAP_COEF_WR_A1_LSB ", | |
204 | + "SGTL5000_DAP_COEF_WR_A2_MSB ", | |
205 | + "SGTL5000_DAP_COEF_WR_A2_LSB ", | |
206 | +}; | |
207 | + | |
208 | +#endif | |
209 | + | |
210 | +#if DEBUG | |
211 | +static void dump_reg(struct snd_soc_codec *codec) | |
212 | +{ | |
213 | + unsigned int i, reg; | |
214 | + char *bin=NULL; | |
215 | + | |
216 | + printk("========================= Dump Register =========================\n"); | |
217 | + printk("======[ Address] : ( Value ) [ Binary ] [ Register Name ]\n"); | |
218 | + for (i = 0; i < ARRAY_SIZE(dump_list); i++) { | |
219 | + reg = snd_soc_read(codec, dump_list[i]); | |
220 | + bin = uintToBinary(reg); | |
221 | +// printk("Dump: [ 0x%04X ] : ( 0x%04X ) - [ %s ]\n", dump_list[i], reg, dump_reg_name[i]); | |
222 | + printk("Dump: [ 0x%04X ] : ( 0x%04X ) - [ %s ] [ %s ]\n", dump_list[i], reg, bin, dump_reg_name[i]); | |
223 | +// printk(KERN_DEBUG "d r %04x, v %04x\n", dump_list[i], reg); | |
224 | + } | |
225 | + printk("========================= Dump Register =========================\n"); | |
226 | +} | |
227 | + | |
228 | +static void simple_dump_reg(struct snd_soc_codec *codec) | |
229 | +{ | |
230 | + int i; | |
231 | + int arrval[60]; | |
232 | + | |
233 | + arrval[0] = snd_soc_read(codec, SGTL5000_CHIP_ID ); | |
234 | + arrval[1] = snd_soc_read(codec, SGTL5000_CHIP_DIG_POWER ); | |
235 | + arrval[2] = snd_soc_read(codec, SGTL5000_CHIP_CLK_CTRL ); | |
236 | + arrval[3] = snd_soc_read(codec, SGTL5000_CHIP_I2S_CTRL ); | |
237 | + arrval[4] = snd_soc_read(codec, SGTL5000_CHIP_SSS_CTRL ); | |
238 | + arrval[5] = snd_soc_read(codec, SGTL5000_CHIP_ADCDAC_CTRL ); | |
239 | + arrval[6] = snd_soc_read(codec, SGTL5000_CHIP_DAC_VOL ); | |
240 | + arrval[7] = snd_soc_read(codec, SGTL5000_CHIP_PAD_STRENGTH ); | |
241 | + arrval[8] = snd_soc_read(codec, SGTL5000_CHIP_ANA_ADC_CTRL ); | |
242 | + arrval[9] = snd_soc_read(codec, SGTL5000_CHIP_ANA_HP_CTRL ); | |
243 | + arrval[10] = snd_soc_read(codec, SGTL5000_CHIP_ANA_CTRL ); | |
244 | + arrval[11] = snd_soc_read(codec, SGTL5000_CHIP_LINREG_CTRL ); | |
245 | + arrval[12] = snd_soc_read(codec, SGTL5000_CHIP_REF_CTRL ); | |
246 | + arrval[13] = snd_soc_read(codec, SGTL5000_CHIP_MIC_CTRL ); | |
247 | + arrval[14] = snd_soc_read(codec, SGTL5000_CHIP_LINE_OUT_CTRL ); | |
248 | + arrval[15] = snd_soc_read(codec, SGTL5000_CHIP_LINE_OUT_VOL ); | |
249 | + arrval[16] = snd_soc_read(codec, SGTL5000_CHIP_ANA_POWER ); | |
250 | + arrval[17] = snd_soc_read(codec, SGTL5000_CHIP_PLL_CTRL ); | |
251 | + arrval[18] = snd_soc_read(codec, SGTL5000_CHIP_CLK_TOP_CTRL ); | |
252 | + arrval[19] = snd_soc_read(codec, SGTL5000_CHIP_ANA_STATUS ); | |
253 | + arrval[20] = snd_soc_read(codec, SGTL5000_CHIP_SHORT_CTRL ); | |
254 | + arrval[21] = snd_soc_read(codec, SGTL5000_CHIP_ANA_TEST2 ); | |
255 | + arrval[22] = snd_soc_read(codec, SGTL5000_DAP_CTRL ); | |
256 | + arrval[23] = snd_soc_read(codec, SGTL5000_DAP_PEQ ); | |
257 | + arrval[24] = snd_soc_read(codec, SGTL5000_DAP_BASS_ENHANCE ); | |
258 | + arrval[25] = snd_soc_read(codec, SGTL5000_DAP_BASS_ENHANCE_CTRL); | |
259 | + arrval[26] = snd_soc_read(codec, SGTL5000_DAP_AUDIO_EQ ); | |
260 | + arrval[27] = snd_soc_read(codec, SGTL5000_DAP_SURROUND ); | |
261 | + arrval[28] = snd_soc_read(codec, SGTL5000_DAP_FLT_COEF_ACCESS); | |
262 | + arrval[29] = snd_soc_read(codec, SGTL5000_DAP_COEF_WR_B0_MSB ); | |
263 | + arrval[30] = snd_soc_read(codec, SGTL5000_DAP_COEF_WR_B0_LSB ); | |
264 | + arrval[31] = snd_soc_read(codec, SGTL5000_DAP_EQ_BASS_BAND0 ); | |
265 | + arrval[32] = snd_soc_read(codec, SGTL5000_DAP_EQ_BASS_BAND1 ); | |
266 | + arrval[33] = snd_soc_read(codec, SGTL5000_DAP_EQ_BASS_BAND2 ); | |
267 | + arrval[34] = snd_soc_read(codec, SGTL5000_DAP_EQ_BASS_BAND3 ); | |
268 | + arrval[35] = snd_soc_read(codec, SGTL5000_DAP_EQ_BASS_BAND4 ); | |
269 | + arrval[36] = snd_soc_read(codec, SGTL5000_DAP_MAIN_CHAN ); | |
270 | + arrval[37] = snd_soc_read(codec, SGTL5000_DAP_MIX_CHAN ); | |
271 | + arrval[38] = snd_soc_read(codec, SGTL5000_DAP_AVC_CTRL ); | |
272 | + arrval[39] = snd_soc_read(codec, SGTL5000_DAP_AVC_THRESHOLD ); | |
273 | + arrval[40] = snd_soc_read(codec, SGTL5000_DAP_AVC_ATTACK ); | |
274 | + arrval[41] = snd_soc_read(codec, SGTL5000_DAP_AVC_DECAY ); | |
275 | + arrval[42] = snd_soc_read(codec, SGTL5000_DAP_COEF_WR_B1_MSB ); | |
276 | + arrval[43] = snd_soc_read(codec, SGTL5000_DAP_COEF_WR_B1_LSB ); | |
277 | + arrval[44] = snd_soc_read(codec, SGTL5000_DAP_COEF_WR_B2_MSB ); | |
278 | + arrval[45] = snd_soc_read(codec, SGTL5000_DAP_COEF_WR_B2_LSB ); | |
279 | + arrval[46] = snd_soc_read(codec, SGTL5000_DAP_COEF_WR_A1_MSB ); | |
280 | + arrval[47] = snd_soc_read(codec, SGTL5000_DAP_COEF_WR_A1_LSB ); | |
281 | + arrval[48] = snd_soc_read(codec, SGTL5000_DAP_COEF_WR_A2_MSB ); | |
282 | + arrval[49] = snd_soc_read(codec, SGTL5000_DAP_COEF_WR_A2_LSB ); | |
283 | + | |
284 | + for(i=0; i<50; i++) | |
285 | + { | |
286 | + if(i%8 == 0) | |
287 | + printk("\n"); | |
288 | + printk("%04X ",arrval[i]); | |
289 | + } | |
290 | + printk("\n"); | |
291 | +} | |
292 | + | |
293 | +#else | |
294 | +static void dump_reg(struct snd_soc_codec *codec) | |
295 | +{ | |
296 | +} | |
297 | + | |
298 | +static void simple_dump_reg(struct snd_soc_codec *codec) | |
299 | +{ | |
300 | +} | |
301 | +#endif | |
302 | + | |
79 | 303 | /* regulator supplies for sgtl5000, VDDD is an optional external supply */ |
80 | 304 | enum sgtl5000_regulator_supplies { |
81 | 305 | VDDA, |
... | ... | @@ -1334,11 +1558,60 @@ err_ldo_remove: |
1334 | 1558 | |
1335 | 1559 | } |
1336 | 1560 | |
1561 | +#if DEBUG_PROC | |
1562 | +static ssize_t debug_proc_write(struct file *file, const char __user *buf, | |
1563 | + size_t count, loff_t *ppos) | |
1564 | +{ | |
1565 | + int i, len; | |
1566 | + char buffer[256]; | |
1567 | + | |
1568 | + for(i=0;i<count-1;i++) | |
1569 | + buffer[i] = buf[i]; | |
1570 | + | |
1571 | + buffer[i] = '\0'; | |
1572 | + | |
1573 | + // TODO: Debug Code | |
1574 | + if( buffer[0] == 'd' ) | |
1575 | + { | |
1576 | + dump_reg(debug_codec); | |
1577 | + } | |
1578 | + else if( buffer[0] == 's' ) | |
1579 | + { | |
1580 | + simple_dump_reg(debug_codec); | |
1581 | + } | |
1582 | + | |
1583 | + len = count; | |
1584 | + return len; | |
1585 | +} | |
1586 | + | |
1587 | +static int debug_proc_show(struct seq_file *m, void *v) | |
1588 | +{ | |
1589 | + return 0; | |
1590 | +} | |
1591 | + | |
1592 | +static int debug_proc_open(struct inode *inode, struct file *file) | |
1593 | +{ | |
1594 | + return single_open(file, debug_proc_show, NULL); | |
1595 | +} | |
1596 | + | |
1597 | +static struct file_operations debug_proc_ops = { | |
1598 | + .owner = THIS_MODULE, | |
1599 | + .open = debug_proc_open, | |
1600 | + .read = seq_read, | |
1601 | + .write = debug_proc_write, | |
1602 | +}; | |
1603 | +#endif | |
1604 | + | |
1337 | 1605 | static int sgtl5000_probe(struct snd_soc_codec *codec) |
1338 | 1606 | { |
1339 | 1607 | int ret; |
1340 | 1608 | struct sgtl5000_priv *sgtl5000 = snd_soc_codec_get_drvdata(codec); |
1341 | 1609 | |
1610 | +#if DEBUG_PROC | |
1611 | + printk("LINE[%04d]: func(%s)\n",__LINE__,__func__); | |
1612 | + debug_proc_entry = proc_create("debug_snd_proc", S_IRUGO | S_IFREG, NULL, &debug_proc_ops); | |
1613 | +#endif | |
1614 | + | |
1342 | 1615 | /* setup i2c data ops */ |
1343 | 1616 | codec->control_data = sgtl5000->regmap; |
1344 | 1617 | ret = snd_soc_codec_set_cache_io(codec, 16, 16, SND_SOC_REGMAP); |
... | ... | @@ -1347,6 +1620,10 @@ static int sgtl5000_probe(struct snd_soc_codec *codec) |
1347 | 1620 | return ret; |
1348 | 1621 | } |
1349 | 1622 | |
1623 | +#if DEBUG_PROC | |
1624 | + debug_codec = codec; | |
1625 | +#endif | |
1626 | + | |
1350 | 1627 | ret = sgtl5000_enable_regulators(codec); |
1351 | 1628 | if (ret) |
1352 | 1629 | return ret; | ... | ... |