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