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