1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31#include <linux/slab.h>
32#include <linux/init.h>
33#include <sound/core.h>
34#include <sound/emu10k1.h>
35#include "p16v.h"
36
37static void snd_emu10k1_proc_spdif_status(struct snd_emu10k1 * emu,
38 struct snd_info_buffer *buffer,
39 char *title,
40 int status_reg,
41 int rate_reg)
42{
43 static char *clkaccy[4] = { "1000ppm", "50ppm", "variable", "unknown" };
44 static int samplerate[16] = { 44100, 1, 48000, 32000, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
45 static char *channel[16] = { "unspec", "left", "right", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15" };
46 static char *emphasis[8] = { "none", "50/15 usec 2 channel", "2", "3", "4", "5", "6", "7" };
47 unsigned int status, rate = 0;
48
49 status = snd_emu10k1_ptr_read(emu, status_reg, 0);
50
51 snd_iprintf(buffer, "\n%s\n", title);
52
53 if (status != 0xffffffff) {
54 snd_iprintf(buffer, "Professional Mode : %s\n", (status & SPCS_PROFESSIONAL) ? "yes" : "no");
55 snd_iprintf(buffer, "Not Audio Data : %s\n", (status & SPCS_NOTAUDIODATA) ? "yes" : "no");
56 snd_iprintf(buffer, "Copyright : %s\n", (status & SPCS_COPYRIGHT) ? "yes" : "no");
57 snd_iprintf(buffer, "Emphasis : %s\n", emphasis[(status & SPCS_EMPHASISMASK) >> 3]);
58 snd_iprintf(buffer, "Mode : %i\n", (status & SPCS_MODEMASK) >> 6);
59 snd_iprintf(buffer, "Category Code : 0x%x\n", (status & SPCS_CATEGORYCODEMASK) >> 8);
60 snd_iprintf(buffer, "Generation Status : %s\n", status & SPCS_GENERATIONSTATUS ? "original" : "copy");
61 snd_iprintf(buffer, "Source Mask : %i\n", (status & SPCS_SOURCENUMMASK) >> 16);
62 snd_iprintf(buffer, "Channel Number : %s\n", channel[(status & SPCS_CHANNELNUMMASK) >> 20]);
63 snd_iprintf(buffer, "Sample Rate : %iHz\n", samplerate[(status & SPCS_SAMPLERATEMASK) >> 24]);
64 snd_iprintf(buffer, "Clock Accuracy : %s\n", clkaccy[(status & SPCS_CLKACCYMASK) >> 28]);
65
66 if (rate_reg > 0) {
67 rate = snd_emu10k1_ptr_read(emu, rate_reg, 0);
68 snd_iprintf(buffer, "S/PDIF Valid : %s\n", rate & SRCS_SPDIFVALID ? "on" : "off");
69 snd_iprintf(buffer, "S/PDIF Locked : %s\n", rate & SRCS_SPDIFLOCKED ? "on" : "off");
70 snd_iprintf(buffer, "Rate Locked : %s\n", rate & SRCS_RATELOCKED ? "on" : "off");
71
72 snd_iprintf(buffer, "Estimated Sample Rate : %d\n", ((rate & 0xFFFFF ) * 375) >> 11);
73 }
74 } else {
75 snd_iprintf(buffer, "No signal detected.\n");
76 }
77
78}
79
80static void snd_emu10k1_proc_read(struct snd_info_entry *entry,
81 struct snd_info_buffer *buffer)
82{
83
84 static char *creative_outs[32] = {
85 "AC97 Left",
86 "AC97 Right",
87 "Optical IEC958 Left",
88 "Optical IEC958 Right",
89 "Center",
90 "LFE",
91 "Headphone Left",
92 "Headphone Right",
93 "Surround Left",
94 "Surround Right",
95 "PCM Capture Left",
96 "PCM Capture Right",
97 "MIC Capture",
98 "AC97 Surround Left",
99 "AC97 Surround Right",
100 "???",
101 "???",
102 "Analog Center",
103 "Analog LFE",
104 "???",
105 "???",
106 "???",
107 "???",
108 "???",
109 "???",
110 "???",
111 "???",
112 "???",
113 "???",
114 "???",
115 "???",
116 "???"
117 };
118
119 static char *audigy_outs[64] = {
120 "Digital Front Left",
121 "Digital Front Right",
122 "Digital Center",
123 "Digital LEF",
124 "Headphone Left",
125 "Headphone Right",
126 "Digital Rear Left",
127 "Digital Rear Right",
128 "Front Left",
129 "Front Right",
130 "Center",
131 "LFE",
132 "???",
133 "???",
134 "Rear Left",
135 "Rear Right",
136 "AC97 Front Left",
137 "AC97 Front Right",
138 "ADC Caputre Left",
139 "ADC Capture Right",
140 "???",
141 "???",
142 "???",
143 "???",
144 "???",
145 "???",
146 "???",
147 "???",
148 "???",
149 "???",
150 "???",
151 "???",
152 "FXBUS2_0",
153 "FXBUS2_1",
154 "FXBUS2_2",
155 "FXBUS2_3",
156 "FXBUS2_4",
157 "FXBUS2_5",
158 "FXBUS2_6",
159 "FXBUS2_7",
160 "FXBUS2_8",
161 "FXBUS2_9",
162 "FXBUS2_10",
163 "FXBUS2_11",
164 "FXBUS2_12",
165 "FXBUS2_13",
166 "FXBUS2_14",
167 "FXBUS2_15",
168 "FXBUS2_16",
169 "FXBUS2_17",
170 "FXBUS2_18",
171 "FXBUS2_19",
172 "FXBUS2_20",
173 "FXBUS2_21",
174 "FXBUS2_22",
175 "FXBUS2_23",
176 "FXBUS2_24",
177 "FXBUS2_25",
178 "FXBUS2_26",
179 "FXBUS2_27",
180 "FXBUS2_28",
181 "FXBUS2_29",
182 "FXBUS2_30",
183 "FXBUS2_31"
184 };
185
186 struct snd_emu10k1 *emu = entry->private_data;
187 unsigned int val, val1;
188 int nefx = emu->audigy ? 64 : 32;
189 char **outputs = emu->audigy ? audigy_outs : creative_outs;
190 int idx;
191
192 snd_iprintf(buffer, "EMU10K1\n\n");
193 snd_iprintf(buffer, "Card : %s\n",
194 emu->audigy ? "Audigy" : (emu->card_capabilities->ecard ? "EMU APS" : "Creative"));
195 snd_iprintf(buffer, "Internal TRAM (words) : 0x%x\n", emu->fx8010.itram_size);
196 snd_iprintf(buffer, "External TRAM (words) : 0x%x\n", (int)emu->fx8010.etram_pages.bytes / 2);
197 snd_iprintf(buffer, "\n");
198 snd_iprintf(buffer, "Effect Send Routing :\n");
199 for (idx = 0; idx < NUM_G; idx++) {
200 val = emu->audigy ?
201 snd_emu10k1_ptr_read(emu, A_FXRT1, idx) :
202 snd_emu10k1_ptr_read(emu, FXRT, idx);
203 val1 = emu->audigy ?
204 snd_emu10k1_ptr_read(emu, A_FXRT2, idx) :
205 0;
206 if (emu->audigy) {
207 snd_iprintf(buffer, "Ch%i: A=%i, B=%i, C=%i, D=%i, ",
208 idx,
209 val & 0x3f,
210 (val >> 8) & 0x3f,
211 (val >> 16) & 0x3f,
212 (val >> 24) & 0x3f);
213 snd_iprintf(buffer, "E=%i, F=%i, G=%i, H=%i\n",
214 val1 & 0x3f,
215 (val1 >> 8) & 0x3f,
216 (val1 >> 16) & 0x3f,
217 (val1 >> 24) & 0x3f);
218 } else {
219 snd_iprintf(buffer, "Ch%i: A=%i, B=%i, C=%i, D=%i\n",
220 idx,
221 (val >> 16) & 0x0f,
222 (val >> 20) & 0x0f,
223 (val >> 24) & 0x0f,
224 (val >> 28) & 0x0f);
225 }
226 }
227 snd_iprintf(buffer, "\nCaptured FX Outputs :\n");
228 for (idx = 0; idx < nefx; idx++) {
229 if (emu->efx_voices_mask[idx/32] & (1 << (idx%32)))
230 snd_iprintf(buffer, " Output %02i [%s]\n", idx, outputs[idx]);
231 }
232 snd_iprintf(buffer, "\nAll FX Outputs :\n");
233 for (idx = 0; idx < (emu->audigy ? 64 : 32); idx++)
234 snd_iprintf(buffer, " Output %02i [%s]\n", idx, outputs[idx]);
235}
236
237static void snd_emu10k1_proc_spdif_read(struct snd_info_entry *entry,
238 struct snd_info_buffer *buffer)
239{
240 struct snd_emu10k1 *emu = entry->private_data;
241 u32 value;
242 u32 value2;
243 u32 rate;
244
245 if (emu->card_capabilities->emu_model) {
246 snd_emu1010_fpga_read(emu, 0x38, &value);
247 if ((value & 0x1) == 0) {
248 snd_emu1010_fpga_read(emu, 0x2a, &value);
249 snd_emu1010_fpga_read(emu, 0x2b, &value2);
250 rate = 0x1770000 / (((value << 5) | value2)+1);
251 snd_iprintf(buffer, "ADAT Locked : %u\n", rate);
252 } else {
253 snd_iprintf(buffer, "ADAT Unlocked\n");
254 }
255 snd_emu1010_fpga_read(emu, 0x20, &value);
256 if ((value & 0x4) == 0) {
257 snd_emu1010_fpga_read(emu, 0x28, &value);
258 snd_emu1010_fpga_read(emu, 0x29, &value2);
259 rate = 0x1770000 / (((value << 5) | value2)+1);
260 snd_iprintf(buffer, "SPDIF Locked : %d\n", rate);
261 } else {
262 snd_iprintf(buffer, "SPDIF Unlocked\n");
263 }
264 } else {
265 snd_emu10k1_proc_spdif_status(emu, buffer, "CD-ROM S/PDIF In", CDCS, CDSRCS);
266 snd_emu10k1_proc_spdif_status(emu, buffer, "Optical or Coax S/PDIF In", GPSCS, GPSRCS);
267 }
268#if 0
269 val = snd_emu10k1_ptr_read(emu, ZVSRCS, 0);
270 snd_iprintf(buffer, "\nZoomed Video\n");
271 snd_iprintf(buffer, "Rate Locked : %s\n", val & SRCS_RATELOCKED ? "on" : "off");
272 snd_iprintf(buffer, "Estimated Sample Rate : 0x%x\n", val & SRCS_ESTSAMPLERATE);
273#endif
274}
275
276static void snd_emu10k1_proc_rates_read(struct snd_info_entry *entry,
277 struct snd_info_buffer *buffer)
278{
279 static int samplerate[8] = { 44100, 48000, 96000, 192000, 4, 5, 6, 7 };
280 struct snd_emu10k1 *emu = entry->private_data;
281 unsigned int val, tmp, n;
282 val = snd_emu10k1_ptr20_read(emu, CAPTURE_RATE_STATUS, 0);
283 tmp = (val >> 16) & 0x8;
284 for (n = 0; n < 4; n++) {
285 tmp = val >> (16 + (n*4));
286 if (tmp & 0x8) snd_iprintf(buffer, "Channel %d: Rate=%d\n", n, samplerate[tmp & 0x7]);
287 else snd_iprintf(buffer, "Channel %d: No input\n", n);
288 }
289}
290
291static void snd_emu10k1_proc_acode_read(struct snd_info_entry *entry,
292 struct snd_info_buffer *buffer)
293{
294 u32 pc;
295 struct snd_emu10k1 *emu = entry->private_data;
296
297 snd_iprintf(buffer, "FX8010 Instruction List '%s'\n", emu->fx8010.name);
298 snd_iprintf(buffer, " Code dump :\n");
299 for (pc = 0; pc < (emu->audigy ? 1024 : 512); pc++) {
300 u32 low, high;
301
302 low = snd_emu10k1_efx_read(emu, pc * 2);
303 high = snd_emu10k1_efx_read(emu, pc * 2 + 1);
304 if (emu->audigy)
305 snd_iprintf(buffer, " OP(0x%02x, 0x%03x, 0x%03x, 0x%03x, 0x%03x) /* 0x%04x: 0x%08x%08x */\n",
306 (high >> 24) & 0x0f,
307 (high >> 12) & 0x7ff,
308 (high >> 0) & 0x7ff,
309 (low >> 12) & 0x7ff,
310 (low >> 0) & 0x7ff,
311 pc,
312 high, low);
313 else
314 snd_iprintf(buffer, " OP(0x%02x, 0x%03x, 0x%03x, 0x%03x, 0x%03x) /* 0x%04x: 0x%08x%08x */\n",
315 (high >> 20) & 0x0f,
316 (high >> 10) & 0x3ff,
317 (high >> 0) & 0x3ff,
318 (low >> 10) & 0x3ff,
319 (low >> 0) & 0x3ff,
320 pc,
321 high, low);
322 }
323}
324
325#define TOTAL_SIZE_GPR (0x100*4)
326#define A_TOTAL_SIZE_GPR (0x200*4)
327#define TOTAL_SIZE_TANKMEM_DATA (0xa0*4)
328#define TOTAL_SIZE_TANKMEM_ADDR (0xa0*4)
329#define A_TOTAL_SIZE_TANKMEM_DATA (0x100*4)
330#define A_TOTAL_SIZE_TANKMEM_ADDR (0x100*4)
331#define TOTAL_SIZE_CODE (0x200*8)
332#define A_TOTAL_SIZE_CODE (0x400*8)
333
334static ssize_t snd_emu10k1_fx8010_read(struct snd_info_entry *entry,
335 void *file_private_data,
336 struct file *file, char __user *buf,
337 size_t count, loff_t pos)
338{
339 struct snd_emu10k1 *emu = entry->private_data;
340 unsigned int offset;
341 int tram_addr = 0;
342 unsigned int *tmp;
343 long res;
344 unsigned int idx;
345
346 if (!strcmp(entry->name, "fx8010_tram_addr")) {
347 offset = TANKMEMADDRREGBASE;
348 tram_addr = 1;
349 } else if (!strcmp(entry->name, "fx8010_tram_data")) {
350 offset = TANKMEMDATAREGBASE;
351 } else if (!strcmp(entry->name, "fx8010_code")) {
352 offset = emu->audigy ? A_MICROCODEBASE : MICROCODEBASE;
353 } else {
354 offset = emu->audigy ? A_FXGPREGBASE : FXGPREGBASE;
355 }
356
357 tmp = kmalloc(count + 8, GFP_KERNEL);
358 if (!tmp)
359 return -ENOMEM;
360 for (idx = 0; idx < ((pos & 3) + count + 3) >> 2; idx++) {
361 unsigned int val;
362 val = snd_emu10k1_ptr_read(emu, offset + idx + (pos >> 2), 0);
363 if (tram_addr && emu->audigy) {
364 val >>= 11;
365 val |= snd_emu10k1_ptr_read(emu, 0x100 + idx + (pos >> 2), 0) << 20;
366 }
367 tmp[idx] = val;
368 }
369 if (copy_to_user(buf, ((char *)tmp) + (pos & 3), count))
370 res = -EFAULT;
371 else
372 res = count;
373 kfree(tmp);
374 return res;
375}
376
377static void snd_emu10k1_proc_voices_read(struct snd_info_entry *entry,
378 struct snd_info_buffer *buffer)
379{
380 struct snd_emu10k1 *emu = entry->private_data;
381 struct snd_emu10k1_voice *voice;
382 int idx;
383
384 snd_iprintf(buffer, "ch\tuse\tpcm\tefx\tsynth\tmidi\n");
385 for (idx = 0; idx < NUM_G; idx++) {
386 voice = &emu->voices[idx];
387 snd_iprintf(buffer, "%i\t%i\t%i\t%i\t%i\t%i\n",
388 idx,
389 voice->use,
390 voice->pcm,
391 voice->efx,
392 voice->synth,
393 voice->midi);
394 }
395}
396
397#ifdef CONFIG_SND_DEBUG
398static void snd_emu_proc_emu1010_reg_read(struct snd_info_entry *entry,
399 struct snd_info_buffer *buffer)
400{
401 struct snd_emu10k1 *emu = entry->private_data;
402 u32 value;
403 int i;
404 snd_iprintf(buffer, "EMU1010 Registers:\n\n");
405
406 for(i = 0; i < 0x40; i+=1) {
407 snd_emu1010_fpga_read(emu, i, &value);
408 snd_iprintf(buffer, "%02X: %08X, %02X\n", i, value, (value >> 8) & 0x7f);
409 }
410}
411
412static void snd_emu_proc_io_reg_read(struct snd_info_entry *entry,
413 struct snd_info_buffer *buffer)
414{
415 struct snd_emu10k1 *emu = entry->private_data;
416 unsigned long value;
417 unsigned long flags;
418 int i;
419 snd_iprintf(buffer, "IO Registers:\n\n");
420 for(i = 0; i < 0x40; i+=4) {
421 spin_lock_irqsave(&emu->emu_lock, flags);
422 value = inl(emu->port + i);
423 spin_unlock_irqrestore(&emu->emu_lock, flags);
424 snd_iprintf(buffer, "%02X: %08lX\n", i, value);
425 }
426}
427
428static void snd_emu_proc_io_reg_write(struct snd_info_entry *entry,
429 struct snd_info_buffer *buffer)
430{
431 struct snd_emu10k1 *emu = entry->private_data;
432 unsigned long flags;
433 char line[64];
434 u32 reg, val;
435 while (!snd_info_get_line(buffer, line, sizeof(line))) {
436 if (sscanf(line, "%x %x", ®, &val) != 2)
437 continue;
438 if (reg < 0x40 && val <= 0xffffffff) {
439 spin_lock_irqsave(&emu->emu_lock, flags);
440 outl(val, emu->port + (reg & 0xfffffffc));
441 spin_unlock_irqrestore(&emu->emu_lock, flags);
442 }
443 }
444}
445
446static unsigned int snd_ptr_read(struct snd_emu10k1 * emu,
447 unsigned int iobase,
448 unsigned int reg,
449 unsigned int chn)
450{
451 unsigned long flags;
452 unsigned int regptr, val;
453
454 regptr = (reg << 16) | chn;
455
456 spin_lock_irqsave(&emu->emu_lock, flags);
457 outl(regptr, emu->port + iobase + PTR);
458 val = inl(emu->port + iobase + DATA);
459 spin_unlock_irqrestore(&emu->emu_lock, flags);
460 return val;
461}
462
463static void snd_ptr_write(struct snd_emu10k1 *emu,
464 unsigned int iobase,
465 unsigned int reg,
466 unsigned int chn,
467 unsigned int data)
468{
469 unsigned int regptr;
470 unsigned long flags;
471
472 regptr = (reg << 16) | chn;
473
474 spin_lock_irqsave(&emu->emu_lock, flags);
475 outl(regptr, emu->port + iobase + PTR);
476 outl(data, emu->port + iobase + DATA);
477 spin_unlock_irqrestore(&emu->emu_lock, flags);
478}
479
480
481static void snd_emu_proc_ptr_reg_read(struct snd_info_entry *entry,
482 struct snd_info_buffer *buffer, int iobase, int offset, int length, int voices)
483{
484 struct snd_emu10k1 *emu = entry->private_data;
485 unsigned long value;
486 int i,j;
487 if (offset+length > 0xa0) {
488 snd_iprintf(buffer, "Input values out of range\n");
489 return;
490 }
491 snd_iprintf(buffer, "Registers 0x%x\n", iobase);
492 for(i = offset; i < offset+length; i++) {
493 snd_iprintf(buffer, "%02X: ",i);
494 for (j = 0; j < voices; j++) {
495 if(iobase == 0)
496 value = snd_ptr_read(emu, 0, i, j);
497 else
498 value = snd_ptr_read(emu, 0x20, i, j);
499 snd_iprintf(buffer, "%08lX ", value);
500 }
501 snd_iprintf(buffer, "\n");
502 }
503}
504
505static void snd_emu_proc_ptr_reg_write(struct snd_info_entry *entry,
506 struct snd_info_buffer *buffer, int iobase)
507{
508 struct snd_emu10k1 *emu = entry->private_data;
509 char line[64];
510 unsigned int reg, channel_id , val;
511 while (!snd_info_get_line(buffer, line, sizeof(line))) {
512 if (sscanf(line, "%x %x %x", ®, &channel_id, &val) != 3)
513 continue;
514 if (reg < 0xa0 && val <= 0xffffffff && channel_id <= 3)
515 snd_ptr_write(emu, iobase, reg, channel_id, val);
516 }
517}
518
519static void snd_emu_proc_ptr_reg_write00(struct snd_info_entry *entry,
520 struct snd_info_buffer *buffer)
521{
522 snd_emu_proc_ptr_reg_write(entry, buffer, 0);
523}
524
525static void snd_emu_proc_ptr_reg_write20(struct snd_info_entry *entry,
526 struct snd_info_buffer *buffer)
527{
528 snd_emu_proc_ptr_reg_write(entry, buffer, 0x20);
529}
530
531
532static void snd_emu_proc_ptr_reg_read00a(struct snd_info_entry *entry,
533 struct snd_info_buffer *buffer)
534{
535 snd_emu_proc_ptr_reg_read(entry, buffer, 0, 0, 0x40, 64);
536}
537
538static void snd_emu_proc_ptr_reg_read00b(struct snd_info_entry *entry,
539 struct snd_info_buffer *buffer)
540{
541 snd_emu_proc_ptr_reg_read(entry, buffer, 0, 0x40, 0x40, 64);
542}
543
544static void snd_emu_proc_ptr_reg_read20a(struct snd_info_entry *entry,
545 struct snd_info_buffer *buffer)
546{
547 snd_emu_proc_ptr_reg_read(entry, buffer, 0x20, 0, 0x40, 4);
548}
549
550static void snd_emu_proc_ptr_reg_read20b(struct snd_info_entry *entry,
551 struct snd_info_buffer *buffer)
552{
553 snd_emu_proc_ptr_reg_read(entry, buffer, 0x20, 0x40, 0x40, 4);
554}
555
556static void snd_emu_proc_ptr_reg_read20c(struct snd_info_entry *entry,
557 struct snd_info_buffer * buffer)
558{
559 snd_emu_proc_ptr_reg_read(entry, buffer, 0x20, 0x80, 0x20, 4);
560}
561#endif
562
563static struct snd_info_entry_ops snd_emu10k1_proc_ops_fx8010 = {
564 .read = snd_emu10k1_fx8010_read,
565};
566
567int snd_emu10k1_proc_init(struct snd_emu10k1 *emu)
568{
569 struct snd_info_entry *entry;
570#ifdef CONFIG_SND_DEBUG
571 if (emu->card_capabilities->emu_model) {
572 if (! snd_card_proc_new(emu->card, "emu1010_regs", &entry))
573 snd_info_set_text_ops(entry, emu, snd_emu_proc_emu1010_reg_read);
574 }
575 if (! snd_card_proc_new(emu->card, "io_regs", &entry)) {
576 snd_info_set_text_ops(entry, emu, snd_emu_proc_io_reg_read);
577 entry->c.text.write = snd_emu_proc_io_reg_write;
578 entry->mode |= S_IWUSR;
579 }
580 if (! snd_card_proc_new(emu->card, "ptr_regs00a", &entry)) {
581 snd_info_set_text_ops(entry, emu, snd_emu_proc_ptr_reg_read00a);
582 entry->c.text.write = snd_emu_proc_ptr_reg_write00;
583 entry->mode |= S_IWUSR;
584 }
585 if (! snd_card_proc_new(emu->card, "ptr_regs00b", &entry)) {
586 snd_info_set_text_ops(entry, emu, snd_emu_proc_ptr_reg_read00b);
587 entry->c.text.write = snd_emu_proc_ptr_reg_write00;
588 entry->mode |= S_IWUSR;
589 }
590 if (! snd_card_proc_new(emu->card, "ptr_regs20a", &entry)) {
591 snd_info_set_text_ops(entry, emu, snd_emu_proc_ptr_reg_read20a);
592 entry->c.text.write = snd_emu_proc_ptr_reg_write20;
593 entry->mode |= S_IWUSR;
594 }
595 if (! snd_card_proc_new(emu->card, "ptr_regs20b", &entry)) {
596 snd_info_set_text_ops(entry, emu, snd_emu_proc_ptr_reg_read20b);
597 entry->c.text.write = snd_emu_proc_ptr_reg_write20;
598 entry->mode |= S_IWUSR;
599 }
600 if (! snd_card_proc_new(emu->card, "ptr_regs20c", &entry)) {
601 snd_info_set_text_ops(entry, emu, snd_emu_proc_ptr_reg_read20c);
602 entry->c.text.write = snd_emu_proc_ptr_reg_write20;
603 entry->mode |= S_IWUSR;
604 }
605#endif
606
607 if (! snd_card_proc_new(emu->card, "emu10k1", &entry))
608 snd_info_set_text_ops(entry, emu, snd_emu10k1_proc_read);
609
610 if (emu->card_capabilities->emu10k2_chip) {
611 if (! snd_card_proc_new(emu->card, "spdif-in", &entry))
612 snd_info_set_text_ops(entry, emu, snd_emu10k1_proc_spdif_read);
613 }
614 if (emu->card_capabilities->ca0151_chip) {
615 if (! snd_card_proc_new(emu->card, "capture-rates", &entry))
616 snd_info_set_text_ops(entry, emu, snd_emu10k1_proc_rates_read);
617 }
618
619 if (! snd_card_proc_new(emu->card, "voices", &entry))
620 snd_info_set_text_ops(entry, emu, snd_emu10k1_proc_voices_read);
621
622 if (! snd_card_proc_new(emu->card, "fx8010_gpr", &entry)) {
623 entry->content = SNDRV_INFO_CONTENT_DATA;
624 entry->private_data = emu;
625 entry->mode = S_IFREG | S_IRUGO ;
626 entry->size = emu->audigy ? A_TOTAL_SIZE_GPR : TOTAL_SIZE_GPR;
627 entry->c.ops = &snd_emu10k1_proc_ops_fx8010;
628 }
629 if (! snd_card_proc_new(emu->card, "fx8010_tram_data", &entry)) {
630 entry->content = SNDRV_INFO_CONTENT_DATA;
631 entry->private_data = emu;
632 entry->mode = S_IFREG | S_IRUGO ;
633 entry->size = emu->audigy ? A_TOTAL_SIZE_TANKMEM_DATA : TOTAL_SIZE_TANKMEM_DATA ;
634 entry->c.ops = &snd_emu10k1_proc_ops_fx8010;
635 }
636 if (! snd_card_proc_new(emu->card, "fx8010_tram_addr", &entry)) {
637 entry->content = SNDRV_INFO_CONTENT_DATA;
638 entry->private_data = emu;
639 entry->mode = S_IFREG | S_IRUGO ;
640 entry->size = emu->audigy ? A_TOTAL_SIZE_TANKMEM_ADDR : TOTAL_SIZE_TANKMEM_ADDR ;
641 entry->c.ops = &snd_emu10k1_proc_ops_fx8010;
642 }
643 if (! snd_card_proc_new(emu->card, "fx8010_code", &entry)) {
644 entry->content = SNDRV_INFO_CONTENT_DATA;
645 entry->private_data = emu;
646 entry->mode = S_IFREG | S_IRUGO ;
647 entry->size = emu->audigy ? A_TOTAL_SIZE_CODE : TOTAL_SIZE_CODE;
648 entry->c.ops = &snd_emu10k1_proc_ops_fx8010;
649 }
650 if (! snd_card_proc_new(emu->card, "fx8010_acode", &entry)) {
651 entry->content = SNDRV_INFO_CONTENT_TEXT;
652 entry->private_data = emu;
653 entry->mode = S_IFREG | S_IRUGO ;
654 entry->c.text.read = snd_emu10k1_proc_acode_read;
655 }
656 return 0;
657}
658