1 /* 2 * Matt Wu <Matt_Wu@acersoftech.com.cn> 3 * Apr 26, 2001 4 * Routines for control of ALi pci audio M5451 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 Lcodecnse as published by 14 * the Free Software Foundation; either version 2 of the Lcodecnse, 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 Lcodecnse for more details. 21 * 22 * You should have received a copy of the GNU General Public Lcodecnse 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 <linux/io.h> 29 #include <linux/delay.h> 30 #include <linux/interrupt.h> 31 #include <linux/init.h> 32 #include <linux/pci.h> 33 #include <linux/slab.h> 34 #include <linux/module.h> 35 #include <linux/dma-mapping.h> 36 #include <sound/core.h> 37 #include <sound/pcm.h> 38 #include <sound/info.h> 39 #include <sound/ac97_codec.h> 40 #include <sound/mpu401.h> 41 #include <sound/initval.h> 42 43 MODULE_AUTHOR("Matt Wu <Matt_Wu@acersoftech.com.cn>"); 44 MODULE_DESCRIPTION("ALI M5451"); 45 MODULE_LICENSE("GPL"); 46 MODULE_SUPPORTED_DEVICE("{{ALI,M5451,pci},{ALI,M5451}}"); 47 48 static int index = SNDRV_DEFAULT_IDX1; /* Index */ 49 static char *id = SNDRV_DEFAULT_STR1; /* ID for this card */ 50 static int pcm_channels = 32; 51 static bool spdif; 52 53 module_param(index, int, 0444); 54 MODULE_PARM_DESC(index, "Index value for ALI M5451 PCI Audio."); 55 module_param(id, charp, 0444); 56 MODULE_PARM_DESC(id, "ID string for ALI M5451 PCI Audio."); 57 module_param(pcm_channels, int, 0444); 58 MODULE_PARM_DESC(pcm_channels, "PCM Channels"); 59 module_param(spdif, bool, 0444); 60 MODULE_PARM_DESC(spdif, "Support SPDIF I/O"); 61 62 /* just for backward compatibility */ 63 static bool enable; 64 module_param(enable, bool, 0444); 65 66 67 /* 68 * Constants definition 69 */ 70 71 #define DEVICE_ID_ALI5451 ((PCI_VENDOR_ID_AL<<16)|PCI_DEVICE_ID_AL_M5451) 72 73 74 #define ALI_CHANNELS 32 75 76 #define ALI_PCM_IN_CHANNEL 31 77 #define ALI_SPDIF_IN_CHANNEL 19 78 #define ALI_SPDIF_OUT_CHANNEL 15 79 #define ALI_CENTER_CHANNEL 24 80 #define ALI_LEF_CHANNEL 23 81 #define ALI_SURR_LEFT_CHANNEL 26 82 #define ALI_SURR_RIGHT_CHANNEL 25 83 #define ALI_MODEM_IN_CHANNEL 21 84 #define ALI_MODEM_OUT_CHANNEL 20 85 86 #define SNDRV_ALI_VOICE_TYPE_PCM 01 87 #define SNDRV_ALI_VOICE_TYPE_OTH 02 88 89 #define ALI_5451_V02 0x02 90 91 /* 92 * Direct Registers 93 */ 94 95 #define ALI_LEGACY_DMAR0 0x00 /* ADR0 */ 96 #define ALI_LEGACY_DMAR4 0x04 /* CNT0 */ 97 #define ALI_LEGACY_DMAR11 0x0b /* MOD */ 98 #define ALI_LEGACY_DMAR15 0x0f /* MMR */ 99 #define ALI_MPUR0 0x20 100 #define ALI_MPUR1 0x21 101 #define ALI_MPUR2 0x22 102 #define ALI_MPUR3 0x23 103 104 #define ALI_AC97_WRITE 0x40 105 #define ALI_AC97_READ 0x44 106 107 #define ALI_SCTRL 0x48 108 #define ALI_SPDIF_OUT_ENABLE 0x20 109 #define ALI_SCTRL_LINE_IN2 (1 << 9) 110 #define ALI_SCTRL_GPIO_IN2 (1 << 13) 111 #define ALI_SCTRL_LINE_OUT_EN (1 << 20) 112 #define ALI_SCTRL_GPIO_OUT_EN (1 << 23) 113 #define ALI_SCTRL_CODEC1_READY (1 << 24) 114 #define ALI_SCTRL_CODEC2_READY (1 << 25) 115 #define ALI_AC97_GPIO 0x4c 116 #define ALI_AC97_GPIO_ENABLE 0x8000 117 #define ALI_AC97_GPIO_DATA_SHIFT 16 118 #define ALI_SPDIF_CS 0x70 119 #define ALI_SPDIF_CTRL 0x74 120 #define ALI_SPDIF_IN_FUNC_ENABLE 0x02 121 #define ALI_SPDIF_IN_CH_STATUS 0x40 122 #define ALI_SPDIF_OUT_CH_STATUS 0xbf 123 #define ALI_START 0x80 124 #define ALI_STOP 0x84 125 #define ALI_CSPF 0x90 126 #define ALI_AINT 0x98 127 #define ALI_GC_CIR 0xa0 128 #define ENDLP_IE 0x00001000 129 #define MIDLP_IE 0x00002000 130 #define ALI_AINTEN 0xa4 131 #define ALI_VOLUME 0xa8 132 #define ALI_SBDELTA_DELTA_R 0xac 133 #define ALI_MISCINT 0xb0 134 #define ADDRESS_IRQ 0x00000020 135 #define TARGET_REACHED 0x00008000 136 #define MIXER_OVERFLOW 0x00000800 137 #define MIXER_UNDERFLOW 0x00000400 138 #define GPIO_IRQ 0x01000000 139 #define ALI_SBBL_SBCL 0xc0 140 #define ALI_SBCTRL_SBE2R_SBDD 0xc4 141 #define ALI_STIMER 0xc8 142 #define ALI_GLOBAL_CONTROL 0xd4 143 #define ALI_SPDIF_OUT_SEL_PCM 0x00000400 /* bit 10 */ 144 #define ALI_SPDIF_IN_SUPPORT 0x00000800 /* bit 11 */ 145 #define ALI_SPDIF_OUT_CH_ENABLE 0x00008000 /* bit 15 */ 146 #define ALI_SPDIF_IN_CH_ENABLE 0x00080000 /* bit 19 */ 147 #define ALI_PCM_IN_ENABLE 0x80000000 /* bit 31 */ 148 149 #define ALI_CSO_ALPHA_FMS 0xe0 150 #define ALI_LBA 0xe4 151 #define ALI_ESO_DELTA 0xe8 152 #define ALI_GVSEL_PAN_VOC_CTRL_EC 0xf0 153 #define ALI_EBUF1 0xf4 154 #define ALI_EBUF2 0xf8 155 156 #define ALI_REG(codec, x) ((codec)->port + x) 157 158 #define MAX_CODECS 2 159 160 161 struct snd_ali; 162 struct snd_ali_voice; 163 164 struct snd_ali_channel_control { 165 /* register data */ 166 struct REGDATA { 167 unsigned int start; 168 unsigned int stop; 169 unsigned int aint; 170 unsigned int ainten; 171 } data; 172 173 /* register addresses */ 174 struct REGS { 175 unsigned int start; 176 unsigned int stop; 177 unsigned int aint; 178 unsigned int ainten; 179 unsigned int ac97read; 180 unsigned int ac97write; 181 } regs; 182 183 }; 184 185 struct snd_ali_voice { 186 unsigned int number; 187 unsigned int use :1, 188 pcm :1, 189 midi :1, 190 mode :1, 191 synth :1, 192 running :1; 193 194 /* PCM data */ 195 struct snd_ali *codec; 196 struct snd_pcm_substream *substream; 197 struct snd_ali_voice *extra; 198 199 int eso; /* final ESO value for channel */ 200 int count; /* runtime->period_size */ 201 202 /* --- */ 203 204 void *private_data; 205 void (*private_free)(void *private_data); 206 }; 207 208 209 struct snd_alidev { 210 211 struct snd_ali_voice voices[ALI_CHANNELS]; 212 213 unsigned int chcnt; /* num of opened channels */ 214 unsigned int chmap; /* bitmap for opened channels */ 215 unsigned int synthcount; 216 217 }; 218 219 220 #define ALI_GLOBAL_REGS 56 221 #define ALI_CHANNEL_REGS 8 222 struct snd_ali_image { 223 u32 regs[ALI_GLOBAL_REGS]; 224 u32 channel_regs[ALI_CHANNELS][ALI_CHANNEL_REGS]; 225 }; 226 227 228 struct snd_ali { 229 int irq; 230 unsigned long port; 231 unsigned char revision; 232 233 unsigned int hw_initialized :1; 234 unsigned int spdif_support :1; 235 236 struct pci_dev *pci; 237 struct pci_dev *pci_m1533; 238 struct pci_dev *pci_m7101; 239 240 struct snd_card *card; 241 struct snd_pcm *pcm[MAX_CODECS]; 242 struct snd_alidev synth; 243 struct snd_ali_channel_control chregs; 244 245 /* S/PDIF Mask */ 246 unsigned int spdif_mask; 247 248 unsigned int spurious_irq_count; 249 unsigned int spurious_irq_max_delta; 250 251 unsigned int num_of_codecs; 252 253 struct snd_ac97_bus *ac97_bus; 254 struct snd_ac97 *ac97[MAX_CODECS]; 255 unsigned short ac97_ext_id; 256 unsigned short ac97_ext_status; 257 258 spinlock_t reg_lock; 259 spinlock_t voice_alloc; 260 261 #ifdef CONFIG_PM_SLEEP 262 struct snd_ali_image *image; 263 #endif 264 }; 265 266 static const struct pci_device_id snd_ali_ids[] = { 267 {PCI_DEVICE(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M5451), 0, 0, 0}, 268 {0, } 269 }; 270 MODULE_DEVICE_TABLE(pci, snd_ali_ids); 271 272 static void snd_ali_clear_voices(struct snd_ali *, unsigned int, unsigned int); 273 static unsigned short snd_ali_codec_peek(struct snd_ali *, int, unsigned short); 274 static void snd_ali_codec_poke(struct snd_ali *, int, unsigned short, 275 unsigned short); 276 277 /* 278 * AC97 ACCESS 279 */ 280 281 static inline unsigned int snd_ali_5451_peek(struct snd_ali *codec, 282 unsigned int port) 283 { 284 return (unsigned int)inl(ALI_REG(codec, port)); 285 } 286 287 static inline void snd_ali_5451_poke(struct snd_ali *codec, 288 unsigned int port, 289 unsigned int val) 290 { 291 outl((unsigned int)val, ALI_REG(codec, port)); 292 } 293 294 static int snd_ali_codec_ready(struct snd_ali *codec, 295 unsigned int port) 296 { 297 unsigned long end_time; 298 unsigned int res; 299 300 end_time = jiffies + msecs_to_jiffies(250); 301 302 for (;;) { 303 res = snd_ali_5451_peek(codec,port); 304 if (!(res & 0x8000)) 305 return 0; 306 if (!time_after_eq(end_time, jiffies)) 307 break; 308 schedule_timeout_uninterruptible(1); 309 } 310 311 snd_ali_5451_poke(codec, port, res & ~0x8000); 312 dev_dbg(codec->card->dev, "ali_codec_ready: codec is not ready.\n "); 313 return -EIO; 314 } 315 316 static int snd_ali_stimer_ready(struct snd_ali *codec) 317 { 318 unsigned long end_time; 319 unsigned long dwChk1,dwChk2; 320 321 dwChk1 = snd_ali_5451_peek(codec, ALI_STIMER); 322 end_time = jiffies + msecs_to_jiffies(250); 323 324 for (;;) { 325 dwChk2 = snd_ali_5451_peek(codec, ALI_STIMER); 326 if (dwChk2 != dwChk1) 327 return 0; 328 if (!time_after_eq(end_time, jiffies)) 329 break; 330 schedule_timeout_uninterruptible(1); 331 } 332 333 dev_err(codec->card->dev, "ali_stimer_read: stimer is not ready.\n"); 334 return -EIO; 335 } 336 337 static void snd_ali_codec_poke(struct snd_ali *codec,int secondary, 338 unsigned short reg, 339 unsigned short val) 340 { 341 unsigned int dwVal; 342 unsigned int port; 343 344 if (reg >= 0x80) { 345 dev_err(codec->card->dev, 346 "ali_codec_poke: reg(%xh) invalid.\n", reg); 347 return; 348 } 349 350 port = codec->chregs.regs.ac97write; 351 352 if (snd_ali_codec_ready(codec, port) < 0) 353 return; 354 if (snd_ali_stimer_ready(codec) < 0) 355 return; 356 357 dwVal = (unsigned int) (reg & 0xff); 358 dwVal |= 0x8000 | (val << 16); 359 if (secondary) 360 dwVal |= 0x0080; 361 if (codec->revision == ALI_5451_V02) 362 dwVal |= 0x0100; 363 364 snd_ali_5451_poke(codec, port, dwVal); 365 366 return ; 367 } 368 369 static unsigned short snd_ali_codec_peek(struct snd_ali *codec, 370 int secondary, 371 unsigned short reg) 372 { 373 unsigned int dwVal; 374 unsigned int port; 375 376 if (reg >= 0x80) { 377 dev_err(codec->card->dev, 378 "ali_codec_peek: reg(%xh) invalid.\n", reg); 379 return ~0; 380 } 381 382 port = codec->chregs.regs.ac97read; 383 384 if (snd_ali_codec_ready(codec, port) < 0) 385 return ~0; 386 if (snd_ali_stimer_ready(codec) < 0) 387 return ~0; 388 389 dwVal = (unsigned int) (reg & 0xff); 390 dwVal |= 0x8000; /* bit 15*/ 391 if (secondary) 392 dwVal |= 0x0080; 393 394 snd_ali_5451_poke(codec, port, dwVal); 395 396 if (snd_ali_stimer_ready(codec) < 0) 397 return ~0; 398 if (snd_ali_codec_ready(codec, port) < 0) 399 return ~0; 400 401 return (snd_ali_5451_peek(codec, port) & 0xffff0000) >> 16; 402 } 403 404 static void snd_ali_codec_write(struct snd_ac97 *ac97, 405 unsigned short reg, 406 unsigned short val ) 407 { 408 struct snd_ali *codec = ac97->private_data; 409 410 dev_dbg(codec->card->dev, "codec_write: reg=%xh data=%xh.\n", reg, val); 411 if (reg == AC97_GPIO_STATUS) { 412 outl((val << ALI_AC97_GPIO_DATA_SHIFT) | ALI_AC97_GPIO_ENABLE, 413 ALI_REG(codec, ALI_AC97_GPIO)); 414 return; 415 } 416 snd_ali_codec_poke(codec, ac97->num, reg, val); 417 return ; 418 } 419 420 421 static unsigned short snd_ali_codec_read(struct snd_ac97 *ac97, 422 unsigned short reg) 423 { 424 struct snd_ali *codec = ac97->private_data; 425 426 dev_dbg(codec->card->dev, "codec_read reg=%xh.\n", reg); 427 return snd_ali_codec_peek(codec, ac97->num, reg); 428 } 429 430 /* 431 * AC97 Reset 432 */ 433 434 static int snd_ali_reset_5451(struct snd_ali *codec) 435 { 436 struct pci_dev *pci_dev; 437 unsigned short wCount, wReg; 438 unsigned int dwVal; 439 440 pci_dev = codec->pci_m1533; 441 if (pci_dev) { 442 pci_read_config_dword(pci_dev, 0x7c, &dwVal); 443 pci_write_config_dword(pci_dev, 0x7c, dwVal | 0x08000000); 444 mdelay(5); 445 pci_read_config_dword(pci_dev, 0x7c, &dwVal); 446 pci_write_config_dword(pci_dev, 0x7c, dwVal & 0xf7ffffff); 447 mdelay(5); 448 } 449 450 pci_dev = codec->pci; 451 pci_read_config_dword(pci_dev, 0x44, &dwVal); 452 pci_write_config_dword(pci_dev, 0x44, dwVal | 0x000c0000); 453 udelay(500); 454 pci_read_config_dword(pci_dev, 0x44, &dwVal); 455 pci_write_config_dword(pci_dev, 0x44, dwVal & 0xfffbffff); 456 mdelay(5); 457 458 wCount = 200; 459 while(wCount--) { 460 wReg = snd_ali_codec_peek(codec, 0, AC97_POWERDOWN); 461 if ((wReg & 0x000f) == 0x000f) 462 return 0; 463 mdelay(5); 464 } 465 466 /* non-fatal if you have a non PM capable codec */ 467 /* dev_warn(codec->card->dev, "ali5451: reset time out\n"); */ 468 return 0; 469 } 470 471 /* 472 * ALI 5451 Controller 473 */ 474 475 static void snd_ali_enable_special_channel(struct snd_ali *codec, 476 unsigned int channel) 477 { 478 unsigned long dwVal; 479 480 dwVal = inl(ALI_REG(codec, ALI_GLOBAL_CONTROL)); 481 dwVal |= 1 << (channel & 0x0000001f); 482 outl(dwVal, ALI_REG(codec, ALI_GLOBAL_CONTROL)); 483 } 484 485 static void snd_ali_disable_special_channel(struct snd_ali *codec, 486 unsigned int channel) 487 { 488 unsigned long dwVal; 489 490 dwVal = inl(ALI_REG(codec, ALI_GLOBAL_CONTROL)); 491 dwVal &= ~(1 << (channel & 0x0000001f)); 492 outl(dwVal, ALI_REG(codec, ALI_GLOBAL_CONTROL)); 493 } 494 495 static void snd_ali_enable_address_interrupt(struct snd_ali *codec) 496 { 497 unsigned int gc; 498 499 gc = inl(ALI_REG(codec, ALI_GC_CIR)); 500 gc |= ENDLP_IE; 501 gc |= MIDLP_IE; 502 outl( gc, ALI_REG(codec, ALI_GC_CIR)); 503 } 504 505 static void snd_ali_disable_address_interrupt(struct snd_ali *codec) 506 { 507 unsigned int gc; 508 509 gc = inl(ALI_REG(codec, ALI_GC_CIR)); 510 gc &= ~ENDLP_IE; 511 gc &= ~MIDLP_IE; 512 outl(gc, ALI_REG(codec, ALI_GC_CIR)); 513 } 514 515 static void snd_ali_disable_voice_irq(struct snd_ali *codec, 516 unsigned int channel) 517 { 518 unsigned int mask; 519 struct snd_ali_channel_control *pchregs = &(codec->chregs); 520 521 dev_dbg(codec->card->dev, "disable_voice_irq channel=%d\n", channel); 522 523 mask = 1 << (channel & 0x1f); 524 pchregs->data.ainten = inl(ALI_REG(codec, pchregs->regs.ainten)); 525 pchregs->data.ainten &= ~mask; 526 outl(pchregs->data.ainten, ALI_REG(codec, pchregs->regs.ainten)); 527 } 528 529 static int snd_ali_alloc_pcm_channel(struct snd_ali *codec, int channel) 530 { 531 unsigned int idx = channel & 0x1f; 532 533 if (codec->synth.chcnt >= ALI_CHANNELS){ 534 dev_err(codec->card->dev, 535 "ali_alloc_pcm_channel: no free channels.\n"); 536 return -1; 537 } 538 539 if (!(codec->synth.chmap & (1 << idx))) { 540 codec->synth.chmap |= 1 << idx; 541 codec->synth.chcnt++; 542 dev_dbg(codec->card->dev, "alloc_pcm_channel no. %d.\n", idx); 543 return idx; 544 } 545 return -1; 546 } 547 548 static int snd_ali_find_free_channel(struct snd_ali * codec, int rec) 549 { 550 int idx; 551 int result = -1; 552 553 dev_dbg(codec->card->dev, 554 "find_free_channel: for %s\n", rec ? "rec" : "pcm"); 555 556 /* recording */ 557 if (rec) { 558 if (codec->spdif_support && 559 (inl(ALI_REG(codec, ALI_GLOBAL_CONTROL)) & 560 ALI_SPDIF_IN_SUPPORT)) 561 idx = ALI_SPDIF_IN_CHANNEL; 562 else 563 idx = ALI_PCM_IN_CHANNEL; 564 565 result = snd_ali_alloc_pcm_channel(codec, idx); 566 if (result >= 0) 567 return result; 568 else { 569 dev_err(codec->card->dev, 570 "ali_find_free_channel: record channel is busy now.\n"); 571 return -1; 572 } 573 } 574 575 /* playback... */ 576 if (codec->spdif_support && 577 (inl(ALI_REG(codec, ALI_GLOBAL_CONTROL)) & 578 ALI_SPDIF_OUT_CH_ENABLE)) { 579 idx = ALI_SPDIF_OUT_CHANNEL; 580 result = snd_ali_alloc_pcm_channel(codec, idx); 581 if (result >= 0) 582 return result; 583 else 584 dev_err(codec->card->dev, 585 "ali_find_free_channel: S/PDIF out channel is in busy now.\n"); 586 } 587 588 for (idx = 0; idx < ALI_CHANNELS; idx++) { 589 result = snd_ali_alloc_pcm_channel(codec, idx); 590 if (result >= 0) 591 return result; 592 } 593 dev_err(codec->card->dev, "ali_find_free_channel: no free channels.\n"); 594 return -1; 595 } 596 597 static void snd_ali_free_channel_pcm(struct snd_ali *codec, int channel) 598 { 599 unsigned int idx = channel & 0x0000001f; 600 601 dev_dbg(codec->card->dev, "free_channel_pcm channel=%d\n", channel); 602 603 if (channel < 0 || channel >= ALI_CHANNELS) 604 return; 605 606 if (!(codec->synth.chmap & (1 << idx))) { 607 dev_err(codec->card->dev, 608 "ali_free_channel_pcm: channel %d is not in use.\n", 609 channel); 610 return; 611 } else { 612 codec->synth.chmap &= ~(1 << idx); 613 codec->synth.chcnt--; 614 } 615 } 616 617 static void snd_ali_stop_voice(struct snd_ali *codec, unsigned int channel) 618 { 619 unsigned int mask = 1 << (channel & 0x1f); 620 621 dev_dbg(codec->card->dev, "stop_voice: channel=%d\n", channel); 622 outl(mask, ALI_REG(codec, codec->chregs.regs.stop)); 623 } 624 625 /* 626 * S/PDIF Part 627 */ 628 629 static void snd_ali_delay(struct snd_ali *codec,int interval) 630 { 631 unsigned long begintimer,currenttimer; 632 633 begintimer = inl(ALI_REG(codec, ALI_STIMER)); 634 currenttimer = inl(ALI_REG(codec, ALI_STIMER)); 635 636 while (currenttimer < begintimer + interval) { 637 if (snd_ali_stimer_ready(codec) < 0) 638 break; 639 currenttimer = inl(ALI_REG(codec, ALI_STIMER)); 640 cpu_relax(); 641 } 642 } 643 644 static void snd_ali_detect_spdif_rate(struct snd_ali *codec) 645 { 646 u16 wval; 647 u16 count = 0; 648 u8 bval, R1 = 0, R2; 649 650 bval = inb(ALI_REG(codec, ALI_SPDIF_CTRL + 1)); 651 bval |= 0x1F; 652 outb(bval, ALI_REG(codec, ALI_SPDIF_CTRL + 1)); 653 654 while ((R1 < 0x0b || R1 > 0x0e) && R1 != 0x12 && count <= 50000) { 655 count ++; 656 snd_ali_delay(codec, 6); 657 bval = inb(ALI_REG(codec, ALI_SPDIF_CTRL + 1)); 658 R1 = bval & 0x1F; 659 } 660 661 if (count > 50000) { 662 dev_err(codec->card->dev, "ali_detect_spdif_rate: timeout!\n"); 663 return; 664 } 665 666 for (count = 0; count <= 50000; count++) { 667 snd_ali_delay(codec, 6); 668 bval = inb(ALI_REG(codec,ALI_SPDIF_CTRL + 1)); 669 R2 = bval & 0x1F; 670 if (R2 != R1) 671 R1 = R2; 672 else 673 break; 674 } 675 676 if (count > 50000) { 677 dev_err(codec->card->dev, "ali_detect_spdif_rate: timeout!\n"); 678 return; 679 } 680 681 if (R2 >= 0x0b && R2 <= 0x0e) { 682 wval = inw(ALI_REG(codec, ALI_SPDIF_CTRL + 2)); 683 wval &= 0xe0f0; 684 wval |= (0x09 << 8) | 0x05; 685 outw(wval, ALI_REG(codec, ALI_SPDIF_CTRL + 2)); 686 687 bval = inb(ALI_REG(codec, ALI_SPDIF_CS + 3)) & 0xf0; 688 outb(bval | 0x02, ALI_REG(codec, ALI_SPDIF_CS + 3)); 689 } else if (R2 == 0x12) { 690 wval = inw(ALI_REG(codec, ALI_SPDIF_CTRL + 2)); 691 wval &= 0xe0f0; 692 wval |= (0x0e << 8) | 0x08; 693 outw(wval, ALI_REG(codec, ALI_SPDIF_CTRL + 2)); 694 695 bval = inb(ALI_REG(codec,ALI_SPDIF_CS + 3)) & 0xf0; 696 outb(bval | 0x03, ALI_REG(codec, ALI_SPDIF_CS + 3)); 697 } 698 } 699 700 static unsigned int snd_ali_get_spdif_in_rate(struct snd_ali *codec) 701 { 702 u32 dwRate; 703 u8 bval; 704 705 bval = inb(ALI_REG(codec, ALI_SPDIF_CTRL)); 706 bval &= 0x7f; 707 bval |= 0x40; 708 outb(bval, ALI_REG(codec, ALI_SPDIF_CTRL)); 709 710 snd_ali_detect_spdif_rate(codec); 711 712 bval = inb(ALI_REG(codec, ALI_SPDIF_CS + 3)); 713 bval &= 0x0f; 714 715 switch (bval) { 716 case 0: dwRate = 44100; break; 717 case 1: dwRate = 48000; break; 718 case 2: dwRate = 32000; break; 719 default: dwRate = 0; break; 720 } 721 722 return dwRate; 723 } 724 725 static void snd_ali_enable_spdif_in(struct snd_ali *codec) 726 { 727 unsigned int dwVal; 728 729 dwVal = inl(ALI_REG(codec, ALI_GLOBAL_CONTROL)); 730 dwVal |= ALI_SPDIF_IN_SUPPORT; 731 outl(dwVal, ALI_REG(codec, ALI_GLOBAL_CONTROL)); 732 733 dwVal = inb(ALI_REG(codec, ALI_SPDIF_CTRL)); 734 dwVal |= 0x02; 735 outb(dwVal, ALI_REG(codec, ALI_SPDIF_CTRL)); 736 737 snd_ali_enable_special_channel(codec, ALI_SPDIF_IN_CHANNEL); 738 } 739 740 static void snd_ali_disable_spdif_in(struct snd_ali *codec) 741 { 742 unsigned int dwVal; 743 744 dwVal = inl(ALI_REG(codec, ALI_GLOBAL_CONTROL)); 745 dwVal &= ~ALI_SPDIF_IN_SUPPORT; 746 outl(dwVal, ALI_REG(codec, ALI_GLOBAL_CONTROL)); 747 748 snd_ali_disable_special_channel(codec, ALI_SPDIF_IN_CHANNEL); 749 } 750 751 752 static void snd_ali_set_spdif_out_rate(struct snd_ali *codec, unsigned int rate) 753 { 754 unsigned char bVal; 755 unsigned int dwRate; 756 757 switch (rate) { 758 case 32000: dwRate = 0x300; break; 759 case 48000: dwRate = 0x200; break; 760 default: dwRate = 0; break; 761 } 762 763 bVal = inb(ALI_REG(codec, ALI_SPDIF_CTRL)); 764 bVal &= (unsigned char)(~(1<<6)); 765 766 bVal |= 0x80; /* select right */ 767 outb(bVal, ALI_REG(codec, ALI_SPDIF_CTRL)); 768 outb(dwRate | 0x20, ALI_REG(codec, ALI_SPDIF_CS + 2)); 769 770 bVal &= ~0x80; /* select left */ 771 outb(bVal, ALI_REG(codec, ALI_SPDIF_CTRL)); 772 outw(rate | 0x10, ALI_REG(codec, ALI_SPDIF_CS + 2)); 773 } 774 775 static void snd_ali_enable_spdif_out(struct snd_ali *codec) 776 { 777 unsigned short wVal; 778 unsigned char bVal; 779 struct pci_dev *pci_dev; 780 781 pci_dev = codec->pci_m1533; 782 if (pci_dev == NULL) 783 return; 784 pci_read_config_byte(pci_dev, 0x61, &bVal); 785 bVal |= 0x40; 786 pci_write_config_byte(pci_dev, 0x61, bVal); 787 pci_read_config_byte(pci_dev, 0x7d, &bVal); 788 bVal |= 0x01; 789 pci_write_config_byte(pci_dev, 0x7d, bVal); 790 791 pci_read_config_byte(pci_dev, 0x7e, &bVal); 792 bVal &= (~0x20); 793 bVal |= 0x10; 794 pci_write_config_byte(pci_dev, 0x7e, bVal); 795 796 bVal = inb(ALI_REG(codec, ALI_SCTRL)); 797 outb(bVal | ALI_SPDIF_OUT_ENABLE, ALI_REG(codec, ALI_SCTRL)); 798 799 bVal = inb(ALI_REG(codec, ALI_SPDIF_CTRL)); 800 outb(bVal & ALI_SPDIF_OUT_CH_STATUS, ALI_REG(codec, ALI_SPDIF_CTRL)); 801 802 wVal = inw(ALI_REG(codec, ALI_GLOBAL_CONTROL)); 803 wVal |= ALI_SPDIF_OUT_SEL_PCM; 804 outw(wVal, ALI_REG(codec, ALI_GLOBAL_CONTROL)); 805 snd_ali_disable_special_channel(codec, ALI_SPDIF_OUT_CHANNEL); 806 } 807 808 static void snd_ali_enable_spdif_chnout(struct snd_ali *codec) 809 { 810 unsigned short wVal; 811 812 wVal = inw(ALI_REG(codec, ALI_GLOBAL_CONTROL)); 813 wVal &= ~ALI_SPDIF_OUT_SEL_PCM; 814 outw(wVal, ALI_REG(codec, ALI_GLOBAL_CONTROL)); 815 /* 816 wVal = inw(ALI_REG(codec, ALI_SPDIF_CS)); 817 if (flag & ALI_SPDIF_OUT_NON_PCM) 818 wVal |= 0x0002; 819 else 820 wVal &= (~0x0002); 821 outw(wVal, ALI_REG(codec, ALI_SPDIF_CS)); 822 */ 823 snd_ali_enable_special_channel(codec, ALI_SPDIF_OUT_CHANNEL); 824 } 825 826 static void snd_ali_disable_spdif_chnout(struct snd_ali *codec) 827 { 828 unsigned short wVal; 829 830 wVal = inw(ALI_REG(codec, ALI_GLOBAL_CONTROL)); 831 wVal |= ALI_SPDIF_OUT_SEL_PCM; 832 outw(wVal, ALI_REG(codec, ALI_GLOBAL_CONTROL)); 833 834 snd_ali_enable_special_channel(codec, ALI_SPDIF_OUT_CHANNEL); 835 } 836 837 static void snd_ali_disable_spdif_out(struct snd_ali *codec) 838 { 839 unsigned char bVal; 840 841 bVal = inb(ALI_REG(codec, ALI_SCTRL)); 842 outb(bVal & ~ALI_SPDIF_OUT_ENABLE, ALI_REG(codec, ALI_SCTRL)); 843 844 snd_ali_disable_spdif_chnout(codec); 845 } 846 847 static void snd_ali_update_ptr(struct snd_ali *codec, int channel) 848 { 849 struct snd_ali_voice *pvoice; 850 struct snd_ali_channel_control *pchregs; 851 unsigned int old, mask; 852 853 pchregs = &(codec->chregs); 854 855 /* check if interrupt occurred for channel */ 856 old = pchregs->data.aint; 857 mask = 1U << (channel & 0x1f); 858 859 if (!(old & mask)) 860 return; 861 862 pvoice = &codec->synth.voices[channel]; 863 864 udelay(100); 865 spin_lock(&codec->reg_lock); 866 867 if (pvoice->pcm && pvoice->substream) { 868 /* pcm interrupt */ 869 if (pvoice->running) { 870 dev_dbg(codec->card->dev, 871 "update_ptr: cso=%4.4x cspf=%d.\n", 872 inw(ALI_REG(codec, ALI_CSO_ALPHA_FMS + 2)), 873 (inl(ALI_REG(codec, ALI_CSPF)) & mask) == mask); 874 spin_unlock(&codec->reg_lock); 875 snd_pcm_period_elapsed(pvoice->substream); 876 spin_lock(&codec->reg_lock); 877 } else { 878 snd_ali_stop_voice(codec, channel); 879 snd_ali_disable_voice_irq(codec, channel); 880 } 881 } else if (codec->synth.voices[channel].synth) { 882 /* synth interrupt */ 883 } else if (codec->synth.voices[channel].midi) { 884 /* midi interrupt */ 885 } else { 886 /* unknown interrupt */ 887 snd_ali_stop_voice(codec, channel); 888 snd_ali_disable_voice_irq(codec, channel); 889 } 890 spin_unlock(&codec->reg_lock); 891 outl(mask,ALI_REG(codec,pchregs->regs.aint)); 892 pchregs->data.aint = old & (~mask); 893 } 894 895 static irqreturn_t snd_ali_card_interrupt(int irq, void *dev_id) 896 { 897 struct snd_ali *codec = dev_id; 898 int channel; 899 unsigned int audio_int; 900 struct snd_ali_channel_control *pchregs; 901 902 if (codec == NULL || !codec->hw_initialized) 903 return IRQ_NONE; 904 905 audio_int = inl(ALI_REG(codec, ALI_MISCINT)); 906 if (!audio_int) 907 return IRQ_NONE; 908 909 pchregs = &(codec->chregs); 910 if (audio_int & ADDRESS_IRQ) { 911 /* get interrupt status for all channels */ 912 pchregs->data.aint = inl(ALI_REG(codec, pchregs->regs.aint)); 913 for (channel = 0; channel < ALI_CHANNELS; channel++) 914 snd_ali_update_ptr(codec, channel); 915 } 916 outl((TARGET_REACHED | MIXER_OVERFLOW | MIXER_UNDERFLOW), 917 ALI_REG(codec, ALI_MISCINT)); 918 919 return IRQ_HANDLED; 920 } 921 922 923 static struct snd_ali_voice *snd_ali_alloc_voice(struct snd_ali * codec, 924 int type, int rec, int channel) 925 { 926 struct snd_ali_voice *pvoice; 927 int idx; 928 929 dev_dbg(codec->card->dev, "alloc_voice: type=%d rec=%d\n", type, rec); 930 931 spin_lock_irq(&codec->voice_alloc); 932 if (type == SNDRV_ALI_VOICE_TYPE_PCM) { 933 idx = channel > 0 ? snd_ali_alloc_pcm_channel(codec, channel) : 934 snd_ali_find_free_channel(codec,rec); 935 if (idx < 0) { 936 dev_err(codec->card->dev, "ali_alloc_voice: err.\n"); 937 spin_unlock_irq(&codec->voice_alloc); 938 return NULL; 939 } 940 pvoice = &(codec->synth.voices[idx]); 941 pvoice->codec = codec; 942 pvoice->use = 1; 943 pvoice->pcm = 1; 944 pvoice->mode = rec; 945 spin_unlock_irq(&codec->voice_alloc); 946 return pvoice; 947 } 948 spin_unlock_irq(&codec->voice_alloc); 949 return NULL; 950 } 951 952 953 static void snd_ali_free_voice(struct snd_ali * codec, 954 struct snd_ali_voice *pvoice) 955 { 956 void (*private_free)(void *); 957 void *private_data; 958 959 dev_dbg(codec->card->dev, "free_voice: channel=%d\n", pvoice->number); 960 if (!pvoice->use) 961 return; 962 snd_ali_clear_voices(codec, pvoice->number, pvoice->number); 963 spin_lock_irq(&codec->voice_alloc); 964 private_free = pvoice->private_free; 965 private_data = pvoice->private_data; 966 pvoice->private_free = NULL; 967 pvoice->private_data = NULL; 968 if (pvoice->pcm) 969 snd_ali_free_channel_pcm(codec, pvoice->number); 970 pvoice->use = pvoice->pcm = pvoice->synth = 0; 971 pvoice->substream = NULL; 972 spin_unlock_irq(&codec->voice_alloc); 973 if (private_free) 974 private_free(private_data); 975 } 976 977 978 static void snd_ali_clear_voices(struct snd_ali *codec, 979 unsigned int v_min, 980 unsigned int v_max) 981 { 982 unsigned int i; 983 984 for (i = v_min; i <= v_max; i++) { 985 snd_ali_stop_voice(codec, i); 986 snd_ali_disable_voice_irq(codec, i); 987 } 988 } 989 990 static void snd_ali_write_voice_regs(struct snd_ali *codec, 991 unsigned int Channel, 992 unsigned int LBA, 993 unsigned int CSO, 994 unsigned int ESO, 995 unsigned int DELTA, 996 unsigned int ALPHA_FMS, 997 unsigned int GVSEL, 998 unsigned int PAN, 999 unsigned int VOL, 1000 unsigned int CTRL, 1001 unsigned int EC) 1002 { 1003 unsigned int ctlcmds[4]; 1004 1005 outb((unsigned char)(Channel & 0x001f), ALI_REG(codec, ALI_GC_CIR)); 1006 1007 ctlcmds[0] = (CSO << 16) | (ALPHA_FMS & 0x0000ffff); 1008 ctlcmds[1] = LBA; 1009 ctlcmds[2] = (ESO << 16) | (DELTA & 0x0ffff); 1010 ctlcmds[3] = (GVSEL << 31) | 1011 ((PAN & 0x0000007f) << 24) | 1012 ((VOL & 0x000000ff) << 16) | 1013 ((CTRL & 0x0000000f) << 12) | 1014 (EC & 0x00000fff); 1015 1016 outb(Channel, ALI_REG(codec, ALI_GC_CIR)); 1017 1018 outl(ctlcmds[0], ALI_REG(codec, ALI_CSO_ALPHA_FMS)); 1019 outl(ctlcmds[1], ALI_REG(codec, ALI_LBA)); 1020 outl(ctlcmds[2], ALI_REG(codec, ALI_ESO_DELTA)); 1021 outl(ctlcmds[3], ALI_REG(codec, ALI_GVSEL_PAN_VOC_CTRL_EC)); 1022 1023 outl(0x30000000, ALI_REG(codec, ALI_EBUF1)); /* Still Mode */ 1024 outl(0x30000000, ALI_REG(codec, ALI_EBUF2)); /* Still Mode */ 1025 } 1026 1027 static unsigned int snd_ali_convert_rate(unsigned int rate, int rec) 1028 { 1029 unsigned int delta; 1030 1031 if (rate < 4000) 1032 rate = 4000; 1033 if (rate > 48000) 1034 rate = 48000; 1035 1036 if (rec) { 1037 if (rate == 44100) 1038 delta = 0x116a; 1039 else if (rate == 8000) 1040 delta = 0x6000; 1041 else if (rate == 48000) 1042 delta = 0x1000; 1043 else 1044 delta = ((48000 << 12) / rate) & 0x0000ffff; 1045 } else { 1046 if (rate == 44100) 1047 delta = 0xeb3; 1048 else if (rate == 8000) 1049 delta = 0x2ab; 1050 else if (rate == 48000) 1051 delta = 0x1000; 1052 else 1053 delta = (((rate << 12) + rate) / 48000) & 0x0000ffff; 1054 } 1055 1056 return delta; 1057 } 1058 1059 static unsigned int snd_ali_control_mode(struct snd_pcm_substream *substream) 1060 { 1061 unsigned int CTRL; 1062 struct snd_pcm_runtime *runtime = substream->runtime; 1063 1064 /* set ctrl mode 1065 CTRL default: 8-bit (unsigned) mono, loop mode enabled 1066 */ 1067 CTRL = 0x00000001; 1068 if (snd_pcm_format_width(runtime->format) == 16) 1069 CTRL |= 0x00000008; /* 16-bit data */ 1070 if (!snd_pcm_format_unsigned(runtime->format)) 1071 CTRL |= 0x00000002; /* signed data */ 1072 if (runtime->channels > 1) 1073 CTRL |= 0x00000004; /* stereo data */ 1074 return CTRL; 1075 } 1076 1077 /* 1078 * PCM part 1079 */ 1080 1081 static int snd_ali_trigger(struct snd_pcm_substream *substream, 1082 int cmd) 1083 1084 { 1085 struct snd_ali *codec = snd_pcm_substream_chip(substream); 1086 struct snd_pcm_substream *s; 1087 unsigned int what, whati, capture_flag; 1088 struct snd_ali_voice *pvoice, *evoice; 1089 unsigned int val; 1090 int do_start; 1091 1092 switch (cmd) { 1093 case SNDRV_PCM_TRIGGER_START: 1094 case SNDRV_PCM_TRIGGER_RESUME: 1095 do_start = 1; 1096 break; 1097 case SNDRV_PCM_TRIGGER_STOP: 1098 case SNDRV_PCM_TRIGGER_SUSPEND: 1099 do_start = 0; 1100 break; 1101 default: 1102 return -EINVAL; 1103 } 1104 1105 what = whati = capture_flag = 0; 1106 snd_pcm_group_for_each_entry(s, substream) { 1107 if ((struct snd_ali *) snd_pcm_substream_chip(s) == codec) { 1108 pvoice = s->runtime->private_data; 1109 evoice = pvoice->extra; 1110 what |= 1 << (pvoice->number & 0x1f); 1111 if (evoice == NULL) 1112 whati |= 1 << (pvoice->number & 0x1f); 1113 else { 1114 whati |= 1 << (evoice->number & 0x1f); 1115 what |= 1 << (evoice->number & 0x1f); 1116 } 1117 if (do_start) { 1118 pvoice->running = 1; 1119 if (evoice != NULL) 1120 evoice->running = 1; 1121 } else { 1122 pvoice->running = 0; 1123 if (evoice != NULL) 1124 evoice->running = 0; 1125 } 1126 snd_pcm_trigger_done(s, substream); 1127 if (pvoice->mode) 1128 capture_flag = 1; 1129 } 1130 } 1131 spin_lock(&codec->reg_lock); 1132 if (!do_start) 1133 outl(what, ALI_REG(codec, ALI_STOP)); 1134 val = inl(ALI_REG(codec, ALI_AINTEN)); 1135 if (do_start) 1136 val |= whati; 1137 else 1138 val &= ~whati; 1139 outl(val, ALI_REG(codec, ALI_AINTEN)); 1140 if (do_start) 1141 outl(what, ALI_REG(codec, ALI_START)); 1142 dev_dbg(codec->card->dev, "trigger: what=%xh whati=%xh\n", what, whati); 1143 spin_unlock(&codec->reg_lock); 1144 1145 return 0; 1146 } 1147 1148 static int snd_ali_playback_hw_params(struct snd_pcm_substream *substream, 1149 struct snd_pcm_hw_params *hw_params) 1150 { 1151 struct snd_ali *codec = snd_pcm_substream_chip(substream); 1152 struct snd_pcm_runtime *runtime = substream->runtime; 1153 struct snd_ali_voice *pvoice = runtime->private_data; 1154 struct snd_ali_voice *evoice = pvoice->extra; 1155 int err; 1156 1157 err = snd_pcm_lib_malloc_pages(substream, 1158 params_buffer_bytes(hw_params)); 1159 if (err < 0) 1160 return err; 1161 1162 /* voice management */ 1163 1164 if (params_buffer_size(hw_params) / 2 != 1165 params_period_size(hw_params)) { 1166 if (!evoice) { 1167 evoice = snd_ali_alloc_voice(codec, 1168 SNDRV_ALI_VOICE_TYPE_PCM, 1169 0, -1); 1170 if (!evoice) 1171 return -ENOMEM; 1172 pvoice->extra = evoice; 1173 evoice->substream = substream; 1174 } 1175 } else { 1176 if (evoice) { 1177 snd_ali_free_voice(codec, evoice); 1178 pvoice->extra = evoice = NULL; 1179 } 1180 } 1181 1182 return 0; 1183 } 1184 1185 static int snd_ali_playback_hw_free(struct snd_pcm_substream *substream) 1186 { 1187 struct snd_ali *codec = snd_pcm_substream_chip(substream); 1188 struct snd_pcm_runtime *runtime = substream->runtime; 1189 struct snd_ali_voice *pvoice = runtime->private_data; 1190 struct snd_ali_voice *evoice = pvoice ? pvoice->extra : NULL; 1191 1192 snd_pcm_lib_free_pages(substream); 1193 if (evoice) { 1194 snd_ali_free_voice(codec, evoice); 1195 pvoice->extra = NULL; 1196 } 1197 return 0; 1198 } 1199 1200 static int snd_ali_hw_params(struct snd_pcm_substream *substream, 1201 struct snd_pcm_hw_params *hw_params) 1202 { 1203 return snd_pcm_lib_malloc_pages(substream, 1204 params_buffer_bytes(hw_params)); 1205 } 1206 1207 static int snd_ali_hw_free(struct snd_pcm_substream *substream) 1208 { 1209 return snd_pcm_lib_free_pages(substream); 1210 } 1211 1212 static int snd_ali_playback_prepare(struct snd_pcm_substream *substream) 1213 { 1214 struct snd_ali *codec = snd_pcm_substream_chip(substream); 1215 struct snd_pcm_runtime *runtime = substream->runtime; 1216 struct snd_ali_voice *pvoice = runtime->private_data; 1217 struct snd_ali_voice *evoice = pvoice->extra; 1218 1219 unsigned int LBA; 1220 unsigned int Delta; 1221 unsigned int ESO; 1222 unsigned int CTRL; 1223 unsigned int GVSEL; 1224 unsigned int PAN; 1225 unsigned int VOL; 1226 unsigned int EC; 1227 1228 dev_dbg(codec->card->dev, "playback_prepare ...\n"); 1229 1230 spin_lock_irq(&codec->reg_lock); 1231 1232 /* set Delta (rate) value */ 1233 Delta = snd_ali_convert_rate(runtime->rate, 0); 1234 1235 if (pvoice->number == ALI_SPDIF_IN_CHANNEL || 1236 pvoice->number == ALI_PCM_IN_CHANNEL) 1237 snd_ali_disable_special_channel(codec, pvoice->number); 1238 else if (codec->spdif_support && 1239 (inl(ALI_REG(codec, ALI_GLOBAL_CONTROL)) & 1240 ALI_SPDIF_OUT_CH_ENABLE) 1241 && pvoice->number == ALI_SPDIF_OUT_CHANNEL) { 1242 snd_ali_set_spdif_out_rate(codec, runtime->rate); 1243 Delta = 0x1000; 1244 } 1245 1246 /* set Loop Back Address */ 1247 LBA = runtime->dma_addr; 1248 1249 /* set interrupt count size */ 1250 pvoice->count = runtime->period_size; 1251 1252 /* set target ESO for channel */ 1253 pvoice->eso = runtime->buffer_size; 1254 1255 dev_dbg(codec->card->dev, "playback_prepare: eso=%xh count=%xh\n", 1256 pvoice->eso, pvoice->count); 1257 1258 /* set ESO to capture first MIDLP interrupt */ 1259 ESO = pvoice->eso -1; 1260 /* set ctrl mode */ 1261 CTRL = snd_ali_control_mode(substream); 1262 1263 GVSEL = 1; 1264 PAN = 0; 1265 VOL = 0; 1266 EC = 0; 1267 dev_dbg(codec->card->dev, "playback_prepare:\n"); 1268 dev_dbg(codec->card->dev, 1269 "ch=%d, Rate=%d Delta=%xh,GVSEL=%xh,PAN=%xh,CTRL=%xh\n", 1270 pvoice->number,runtime->rate,Delta,GVSEL,PAN,CTRL); 1271 snd_ali_write_voice_regs(codec, 1272 pvoice->number, 1273 LBA, 1274 0, /* cso */ 1275 ESO, 1276 Delta, 1277 0, /* alpha */ 1278 GVSEL, 1279 PAN, 1280 VOL, 1281 CTRL, 1282 EC); 1283 if (evoice) { 1284 evoice->count = pvoice->count; 1285 evoice->eso = pvoice->count << 1; 1286 ESO = evoice->eso - 1; 1287 snd_ali_write_voice_regs(codec, 1288 evoice->number, 1289 LBA, 1290 0, /* cso */ 1291 ESO, 1292 Delta, 1293 0, /* alpha */ 1294 GVSEL, 1295 0x7f, 1296 0x3ff, 1297 CTRL, 1298 EC); 1299 } 1300 spin_unlock_irq(&codec->reg_lock); 1301 return 0; 1302 } 1303 1304 1305 static int snd_ali_prepare(struct snd_pcm_substream *substream) 1306 { 1307 struct snd_ali *codec = snd_pcm_substream_chip(substream); 1308 struct snd_pcm_runtime *runtime = substream->runtime; 1309 struct snd_ali_voice *pvoice = runtime->private_data; 1310 unsigned int LBA; 1311 unsigned int Delta; 1312 unsigned int ESO; 1313 unsigned int CTRL; 1314 unsigned int GVSEL; 1315 unsigned int PAN; 1316 unsigned int VOL; 1317 unsigned int EC; 1318 u8 bValue; 1319 1320 spin_lock_irq(&codec->reg_lock); 1321 1322 dev_dbg(codec->card->dev, "ali_prepare...\n"); 1323 1324 snd_ali_enable_special_channel(codec,pvoice->number); 1325 1326 Delta = (pvoice->number == ALI_MODEM_IN_CHANNEL || 1327 pvoice->number == ALI_MODEM_OUT_CHANNEL) ? 1328 0x1000 : snd_ali_convert_rate(runtime->rate, pvoice->mode); 1329 1330 /* Prepare capture intr channel */ 1331 if (pvoice->number == ALI_SPDIF_IN_CHANNEL) { 1332 1333 unsigned int rate; 1334 1335 spin_unlock_irq(&codec->reg_lock); 1336 if (codec->revision != ALI_5451_V02) 1337 return -1; 1338 1339 rate = snd_ali_get_spdif_in_rate(codec); 1340 if (rate == 0) { 1341 dev_warn(codec->card->dev, 1342 "ali_capture_prepare: spdif rate detect err!\n"); 1343 rate = 48000; 1344 } 1345 spin_lock_irq(&codec->reg_lock); 1346 bValue = inb(ALI_REG(codec,ALI_SPDIF_CTRL)); 1347 if (bValue & 0x10) { 1348 outb(bValue,ALI_REG(codec,ALI_SPDIF_CTRL)); 1349 dev_warn(codec->card->dev, 1350 "clear SPDIF parity error flag.\n"); 1351 } 1352 1353 if (rate != 48000) 1354 Delta = ((rate << 12) / runtime->rate) & 0x00ffff; 1355 } 1356 1357 /* set target ESO for channel */ 1358 pvoice->eso = runtime->buffer_size; 1359 1360 /* set interrupt count size */ 1361 pvoice->count = runtime->period_size; 1362 1363 /* set Loop Back Address */ 1364 LBA = runtime->dma_addr; 1365 1366 /* set ESO to capture first MIDLP interrupt */ 1367 ESO = pvoice->eso - 1; 1368 CTRL = snd_ali_control_mode(substream); 1369 GVSEL = 0; 1370 PAN = 0x00; 1371 VOL = 0x00; 1372 EC = 0; 1373 1374 snd_ali_write_voice_regs( codec, 1375 pvoice->number, 1376 LBA, 1377 0, /* cso */ 1378 ESO, 1379 Delta, 1380 0, /* alpha */ 1381 GVSEL, 1382 PAN, 1383 VOL, 1384 CTRL, 1385 EC); 1386 1387 spin_unlock_irq(&codec->reg_lock); 1388 1389 return 0; 1390 } 1391 1392 1393 static snd_pcm_uframes_t 1394 snd_ali_playback_pointer(struct snd_pcm_substream *substream) 1395 { 1396 struct snd_ali *codec = snd_pcm_substream_chip(substream); 1397 struct snd_pcm_runtime *runtime = substream->runtime; 1398 struct snd_ali_voice *pvoice = runtime->private_data; 1399 unsigned int cso; 1400 1401 spin_lock(&codec->reg_lock); 1402 if (!pvoice->running) { 1403 spin_unlock(&codec->reg_lock); 1404 return 0; 1405 } 1406 outb(pvoice->number, ALI_REG(codec, ALI_GC_CIR)); 1407 cso = inw(ALI_REG(codec, ALI_CSO_ALPHA_FMS + 2)); 1408 spin_unlock(&codec->reg_lock); 1409 dev_dbg(codec->card->dev, "playback pointer returned cso=%xh.\n", cso); 1410 1411 cso %= runtime->buffer_size; 1412 return cso; 1413 } 1414 1415 1416 static snd_pcm_uframes_t snd_ali_pointer(struct snd_pcm_substream *substream) 1417 { 1418 struct snd_ali *codec = snd_pcm_substream_chip(substream); 1419 struct snd_pcm_runtime *runtime = substream->runtime; 1420 struct snd_ali_voice *pvoice = runtime->private_data; 1421 unsigned int cso; 1422 1423 spin_lock(&codec->reg_lock); 1424 if (!pvoice->running) { 1425 spin_unlock(&codec->reg_lock); 1426 return 0; 1427 } 1428 outb(pvoice->number, ALI_REG(codec, ALI_GC_CIR)); 1429 cso = inw(ALI_REG(codec, ALI_CSO_ALPHA_FMS + 2)); 1430 spin_unlock(&codec->reg_lock); 1431 1432 cso %= runtime->buffer_size; 1433 return cso; 1434 } 1435 1436 static struct snd_pcm_hardware snd_ali_playback = 1437 { 1438 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | 1439 SNDRV_PCM_INFO_BLOCK_TRANSFER | 1440 SNDRV_PCM_INFO_MMAP_VALID | 1441 SNDRV_PCM_INFO_RESUME | 1442 SNDRV_PCM_INFO_SYNC_START), 1443 .formats = (SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE | 1444 SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U16_LE), 1445 .rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000, 1446 .rate_min = 4000, 1447 .rate_max = 48000, 1448 .channels_min = 1, 1449 .channels_max = 2, 1450 .buffer_bytes_max = (256*1024), 1451 .period_bytes_min = 64, 1452 .period_bytes_max = (256*1024), 1453 .periods_min = 1, 1454 .periods_max = 1024, 1455 .fifo_size = 0, 1456 }; 1457 1458 /* 1459 * Capture support device description 1460 */ 1461 1462 static struct snd_pcm_hardware snd_ali_capture = 1463 { 1464 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | 1465 SNDRV_PCM_INFO_BLOCK_TRANSFER | 1466 SNDRV_PCM_INFO_MMAP_VALID | 1467 SNDRV_PCM_INFO_RESUME | 1468 SNDRV_PCM_INFO_SYNC_START), 1469 .formats = (SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE | 1470 SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U16_LE), 1471 .rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000, 1472 .rate_min = 4000, 1473 .rate_max = 48000, 1474 .channels_min = 1, 1475 .channels_max = 2, 1476 .buffer_bytes_max = (128*1024), 1477 .period_bytes_min = 64, 1478 .period_bytes_max = (128*1024), 1479 .periods_min = 1, 1480 .periods_max = 1024, 1481 .fifo_size = 0, 1482 }; 1483 1484 static void snd_ali_pcm_free_substream(struct snd_pcm_runtime *runtime) 1485 { 1486 struct snd_ali_voice *pvoice = runtime->private_data; 1487 struct snd_ali *codec; 1488 1489 if (pvoice) { 1490 codec = pvoice->codec; 1491 snd_ali_free_voice(pvoice->codec, pvoice); 1492 } 1493 } 1494 1495 static int snd_ali_open(struct snd_pcm_substream *substream, int rec, 1496 int channel, struct snd_pcm_hardware *phw) 1497 { 1498 struct snd_ali *codec = snd_pcm_substream_chip(substream); 1499 struct snd_pcm_runtime *runtime = substream->runtime; 1500 struct snd_ali_voice *pvoice; 1501 1502 pvoice = snd_ali_alloc_voice(codec, SNDRV_ALI_VOICE_TYPE_PCM, rec, 1503 channel); 1504 if (!pvoice) 1505 return -EAGAIN; 1506 1507 pvoice->substream = substream; 1508 runtime->private_data = pvoice; 1509 runtime->private_free = snd_ali_pcm_free_substream; 1510 1511 runtime->hw = *phw; 1512 snd_pcm_set_sync(substream); 1513 snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_SIZE, 1514 0, 64*1024); 1515 return 0; 1516 } 1517 1518 static int snd_ali_playback_open(struct snd_pcm_substream *substream) 1519 { 1520 return snd_ali_open(substream, 0, -1, &snd_ali_playback); 1521 } 1522 1523 static int snd_ali_capture_open(struct snd_pcm_substream *substream) 1524 { 1525 return snd_ali_open(substream, 1, -1, &snd_ali_capture); 1526 } 1527 1528 static int snd_ali_playback_close(struct snd_pcm_substream *substream) 1529 { 1530 return 0; 1531 } 1532 1533 static int snd_ali_close(struct snd_pcm_substream *substream) 1534 { 1535 struct snd_ali *codec = snd_pcm_substream_chip(substream); 1536 struct snd_ali_voice *pvoice = substream->runtime->private_data; 1537 1538 snd_ali_disable_special_channel(codec,pvoice->number); 1539 1540 return 0; 1541 } 1542 1543 static const struct snd_pcm_ops snd_ali_playback_ops = { 1544 .open = snd_ali_playback_open, 1545 .close = snd_ali_playback_close, 1546 .ioctl = snd_pcm_lib_ioctl, 1547 .hw_params = snd_ali_playback_hw_params, 1548 .hw_free = snd_ali_playback_hw_free, 1549 .prepare = snd_ali_playback_prepare, 1550 .trigger = snd_ali_trigger, 1551 .pointer = snd_ali_playback_pointer, 1552 }; 1553 1554 static const struct snd_pcm_ops snd_ali_capture_ops = { 1555 .open = snd_ali_capture_open, 1556 .close = snd_ali_close, 1557 .ioctl = snd_pcm_lib_ioctl, 1558 .hw_params = snd_ali_hw_params, 1559 .hw_free = snd_ali_hw_free, 1560 .prepare = snd_ali_prepare, 1561 .trigger = snd_ali_trigger, 1562 .pointer = snd_ali_pointer, 1563 }; 1564 1565 /* 1566 * Modem PCM 1567 */ 1568 1569 static int snd_ali_modem_hw_params(struct snd_pcm_substream *substream, 1570 struct snd_pcm_hw_params *hw_params) 1571 { 1572 struct snd_ali *chip = snd_pcm_substream_chip(substream); 1573 unsigned int modem_num = chip->num_of_codecs - 1; 1574 snd_ac97_write(chip->ac97[modem_num], AC97_LINE1_RATE, 1575 params_rate(hw_params)); 1576 snd_ac97_write(chip->ac97[modem_num], AC97_LINE1_LEVEL, 0); 1577 return snd_ali_hw_params(substream, hw_params); 1578 } 1579 1580 static struct snd_pcm_hardware snd_ali_modem = 1581 { 1582 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | 1583 SNDRV_PCM_INFO_BLOCK_TRANSFER | 1584 SNDRV_PCM_INFO_MMAP_VALID | 1585 SNDRV_PCM_INFO_RESUME | 1586 SNDRV_PCM_INFO_SYNC_START), 1587 .formats = SNDRV_PCM_FMTBIT_S16_LE, 1588 .rates = (SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_8000 | 1589 SNDRV_PCM_RATE_16000), 1590 .rate_min = 8000, 1591 .rate_max = 16000, 1592 .channels_min = 1, 1593 .channels_max = 1, 1594 .buffer_bytes_max = (256*1024), 1595 .period_bytes_min = 64, 1596 .period_bytes_max = (256*1024), 1597 .periods_min = 1, 1598 .periods_max = 1024, 1599 .fifo_size = 0, 1600 }; 1601 1602 static int snd_ali_modem_open(struct snd_pcm_substream *substream, int rec, 1603 int channel) 1604 { 1605 static const unsigned int rates[] = {8000, 9600, 12000, 16000}; 1606 static const struct snd_pcm_hw_constraint_list hw_constraint_rates = { 1607 .count = ARRAY_SIZE(rates), 1608 .list = rates, 1609 .mask = 0, 1610 }; 1611 int err = snd_ali_open(substream, rec, channel, &snd_ali_modem); 1612 1613 if (err) 1614 return err; 1615 return snd_pcm_hw_constraint_list(substream->runtime, 0, 1616 SNDRV_PCM_HW_PARAM_RATE, &hw_constraint_rates); 1617 } 1618 1619 static int snd_ali_modem_playback_open(struct snd_pcm_substream *substream) 1620 { 1621 return snd_ali_modem_open(substream, 0, ALI_MODEM_OUT_CHANNEL); 1622 } 1623 1624 static int snd_ali_modem_capture_open(struct snd_pcm_substream *substream) 1625 { 1626 return snd_ali_modem_open(substream, 1, ALI_MODEM_IN_CHANNEL); 1627 } 1628 1629 static const struct snd_pcm_ops snd_ali_modem_playback_ops = { 1630 .open = snd_ali_modem_playback_open, 1631 .close = snd_ali_close, 1632 .ioctl = snd_pcm_lib_ioctl, 1633 .hw_params = snd_ali_modem_hw_params, 1634 .hw_free = snd_ali_hw_free, 1635 .prepare = snd_ali_prepare, 1636 .trigger = snd_ali_trigger, 1637 .pointer = snd_ali_pointer, 1638 }; 1639 1640 static const struct snd_pcm_ops snd_ali_modem_capture_ops = { 1641 .open = snd_ali_modem_capture_open, 1642 .close = snd_ali_close, 1643 .ioctl = snd_pcm_lib_ioctl, 1644 .hw_params = snd_ali_modem_hw_params, 1645 .hw_free = snd_ali_hw_free, 1646 .prepare = snd_ali_prepare, 1647 .trigger = snd_ali_trigger, 1648 .pointer = snd_ali_pointer, 1649 }; 1650 1651 1652 struct ali_pcm_description { 1653 char *name; 1654 unsigned int playback_num; 1655 unsigned int capture_num; 1656 const struct snd_pcm_ops *playback_ops; 1657 const struct snd_pcm_ops *capture_ops; 1658 unsigned short class; 1659 }; 1660 1661 1662 static void snd_ali_pcm_free(struct snd_pcm *pcm) 1663 { 1664 struct snd_ali *codec = pcm->private_data; 1665 codec->pcm[pcm->device] = NULL; 1666 } 1667 1668 1669 static int snd_ali_pcm(struct snd_ali *codec, int device, 1670 struct ali_pcm_description *desc) 1671 { 1672 struct snd_pcm *pcm; 1673 int err; 1674 1675 err = snd_pcm_new(codec->card, desc->name, device, 1676 desc->playback_num, desc->capture_num, &pcm); 1677 if (err < 0) { 1678 dev_err(codec->card->dev, 1679 "snd_ali_pcm: err called snd_pcm_new.\n"); 1680 return err; 1681 } 1682 pcm->private_data = codec; 1683 pcm->private_free = snd_ali_pcm_free; 1684 if (desc->playback_ops) 1685 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, 1686 desc->playback_ops); 1687 if (desc->capture_ops) 1688 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, 1689 desc->capture_ops); 1690 1691 snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, 1692 snd_dma_pci_data(codec->pci), 1693 64*1024, 128*1024); 1694 1695 pcm->info_flags = 0; 1696 pcm->dev_class = desc->class; 1697 pcm->dev_subclass = SNDRV_PCM_SUBCLASS_GENERIC_MIX; 1698 strcpy(pcm->name, desc->name); 1699 codec->pcm[0] = pcm; 1700 return 0; 1701 } 1702 1703 static struct ali_pcm_description ali_pcms[] = { 1704 { .name = "ALI 5451", 1705 .playback_num = ALI_CHANNELS, 1706 .capture_num = 1, 1707 .playback_ops = &snd_ali_playback_ops, 1708 .capture_ops = &snd_ali_capture_ops 1709 }, 1710 { .name = "ALI 5451 modem", 1711 .playback_num = 1, 1712 .capture_num = 1, 1713 .playback_ops = &snd_ali_modem_playback_ops, 1714 .capture_ops = &snd_ali_modem_capture_ops, 1715 .class = SNDRV_PCM_CLASS_MODEM 1716 } 1717 }; 1718 1719 static int snd_ali_build_pcms(struct snd_ali *codec) 1720 { 1721 int i, err; 1722 for (i = 0; i < codec->num_of_codecs && i < ARRAY_SIZE(ali_pcms); i++) { 1723 err = snd_ali_pcm(codec, i, &ali_pcms[i]); 1724 if (err < 0) 1725 return err; 1726 } 1727 return 0; 1728 } 1729 1730 1731 #define ALI5451_SPDIF(xname, xindex, value) \ 1732 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex,\ 1733 .info = snd_ali5451_spdif_info, .get = snd_ali5451_spdif_get, \ 1734 .put = snd_ali5451_spdif_put, .private_value = value} 1735 1736 #define snd_ali5451_spdif_info snd_ctl_boolean_mono_info 1737 1738 static int snd_ali5451_spdif_get(struct snd_kcontrol *kcontrol, 1739 struct snd_ctl_elem_value *ucontrol) 1740 { 1741 struct snd_ali *codec = kcontrol->private_data; 1742 unsigned int spdif_enable; 1743 1744 spdif_enable = ucontrol->value.integer.value[0] ? 1 : 0; 1745 1746 spin_lock_irq(&codec->reg_lock); 1747 switch (kcontrol->private_value) { 1748 case 0: 1749 spdif_enable = (codec->spdif_mask & 0x02) ? 1 : 0; 1750 break; 1751 case 1: 1752 spdif_enable = ((codec->spdif_mask & 0x02) && 1753 (codec->spdif_mask & 0x04)) ? 1 : 0; 1754 break; 1755 case 2: 1756 spdif_enable = (codec->spdif_mask & 0x01) ? 1 : 0; 1757 break; 1758 default: 1759 break; 1760 } 1761 ucontrol->value.integer.value[0] = spdif_enable; 1762 spin_unlock_irq(&codec->reg_lock); 1763 return 0; 1764 } 1765 1766 static int snd_ali5451_spdif_put(struct snd_kcontrol *kcontrol, 1767 struct snd_ctl_elem_value *ucontrol) 1768 { 1769 struct snd_ali *codec = kcontrol->private_data; 1770 unsigned int change = 0, spdif_enable = 0; 1771 1772 spdif_enable = ucontrol->value.integer.value[0] ? 1 : 0; 1773 1774 spin_lock_irq(&codec->reg_lock); 1775 switch (kcontrol->private_value) { 1776 case 0: 1777 change = (codec->spdif_mask & 0x02) ? 1 : 0; 1778 change = change ^ spdif_enable; 1779 if (change) { 1780 if (spdif_enable) { 1781 codec->spdif_mask |= 0x02; 1782 snd_ali_enable_spdif_out(codec); 1783 } else { 1784 codec->spdif_mask &= ~(0x02); 1785 codec->spdif_mask &= ~(0x04); 1786 snd_ali_disable_spdif_out(codec); 1787 } 1788 } 1789 break; 1790 case 1: 1791 change = (codec->spdif_mask & 0x04) ? 1 : 0; 1792 change = change ^ spdif_enable; 1793 if (change && (codec->spdif_mask & 0x02)) { 1794 if (spdif_enable) { 1795 codec->spdif_mask |= 0x04; 1796 snd_ali_enable_spdif_chnout(codec); 1797 } else { 1798 codec->spdif_mask &= ~(0x04); 1799 snd_ali_disable_spdif_chnout(codec); 1800 } 1801 } 1802 break; 1803 case 2: 1804 change = (codec->spdif_mask & 0x01) ? 1 : 0; 1805 change = change ^ spdif_enable; 1806 if (change) { 1807 if (spdif_enable) { 1808 codec->spdif_mask |= 0x01; 1809 snd_ali_enable_spdif_in(codec); 1810 } else { 1811 codec->spdif_mask &= ~(0x01); 1812 snd_ali_disable_spdif_in(codec); 1813 } 1814 } 1815 break; 1816 default: 1817 break; 1818 } 1819 spin_unlock_irq(&codec->reg_lock); 1820 1821 return change; 1822 } 1823 1824 static struct snd_kcontrol_new snd_ali5451_mixer_spdif[] = { 1825 /* spdif aplayback switch */ 1826 /* FIXME: "IEC958 Playback Switch" may conflict with one on ac97_codec */ 1827 ALI5451_SPDIF(SNDRV_CTL_NAME_IEC958("Output ",NONE,SWITCH), 0, 0), 1828 /* spdif out to spdif channel */ 1829 ALI5451_SPDIF(SNDRV_CTL_NAME_IEC958("Channel Output ",NONE,SWITCH), 0, 1), 1830 /* spdif in from spdif channel */ 1831 ALI5451_SPDIF(SNDRV_CTL_NAME_IEC958("",CAPTURE,SWITCH), 0, 2) 1832 }; 1833 1834 static int snd_ali_mixer(struct snd_ali *codec) 1835 { 1836 struct snd_ac97_template ac97; 1837 unsigned int idx; 1838 int i, err; 1839 static struct snd_ac97_bus_ops ops = { 1840 .write = snd_ali_codec_write, 1841 .read = snd_ali_codec_read, 1842 }; 1843 1844 err = snd_ac97_bus(codec->card, 0, &ops, codec, &codec->ac97_bus); 1845 if (err < 0) 1846 return err; 1847 1848 memset(&ac97, 0, sizeof(ac97)); 1849 ac97.private_data = codec; 1850 1851 for (i = 0; i < codec->num_of_codecs; i++) { 1852 ac97.num = i; 1853 err = snd_ac97_mixer(codec->ac97_bus, &ac97, &codec->ac97[i]); 1854 if (err < 0) { 1855 dev_err(codec->card->dev, 1856 "ali mixer %d creating error.\n", i); 1857 if (i == 0) 1858 return err; 1859 codec->num_of_codecs = 1; 1860 break; 1861 } 1862 } 1863 1864 if (codec->spdif_support) { 1865 for (idx = 0; idx < ARRAY_SIZE(snd_ali5451_mixer_spdif); idx++) { 1866 err = snd_ctl_add(codec->card, 1867 snd_ctl_new1(&snd_ali5451_mixer_spdif[idx], codec)); 1868 if (err < 0) 1869 return err; 1870 } 1871 } 1872 return 0; 1873 } 1874 1875 #ifdef CONFIG_PM_SLEEP 1876 static int ali_suspend(struct device *dev) 1877 { 1878 struct snd_card *card = dev_get_drvdata(dev); 1879 struct snd_ali *chip = card->private_data; 1880 struct snd_ali_image *im; 1881 int i, j; 1882 1883 im = chip->image; 1884 if (!im) 1885 return 0; 1886 1887 snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); 1888 for (i = 0; i < chip->num_of_codecs; i++) { 1889 snd_pcm_suspend_all(chip->pcm[i]); 1890 snd_ac97_suspend(chip->ac97[i]); 1891 } 1892 1893 spin_lock_irq(&chip->reg_lock); 1894 1895 im->regs[ALI_MISCINT >> 2] = inl(ALI_REG(chip, ALI_MISCINT)); 1896 /* im->regs[ALI_START >> 2] = inl(ALI_REG(chip, ALI_START)); */ 1897 im->regs[ALI_STOP >> 2] = inl(ALI_REG(chip, ALI_STOP)); 1898 1899 /* disable all IRQ bits */ 1900 outl(0, ALI_REG(chip, ALI_MISCINT)); 1901 1902 for (i = 0; i < ALI_GLOBAL_REGS; i++) { 1903 if ((i*4 == ALI_MISCINT) || (i*4 == ALI_STOP)) 1904 continue; 1905 im->regs[i] = inl(ALI_REG(chip, i*4)); 1906 } 1907 1908 for (i = 0; i < ALI_CHANNELS; i++) { 1909 outb(i, ALI_REG(chip, ALI_GC_CIR)); 1910 for (j = 0; j < ALI_CHANNEL_REGS; j++) 1911 im->channel_regs[i][j] = inl(ALI_REG(chip, j*4 + 0xe0)); 1912 } 1913 1914 /* stop all HW channel */ 1915 outl(0xffffffff, ALI_REG(chip, ALI_STOP)); 1916 1917 spin_unlock_irq(&chip->reg_lock); 1918 return 0; 1919 } 1920 1921 static int ali_resume(struct device *dev) 1922 { 1923 struct snd_card *card = dev_get_drvdata(dev); 1924 struct snd_ali *chip = card->private_data; 1925 struct snd_ali_image *im; 1926 int i, j; 1927 1928 im = chip->image; 1929 if (!im) 1930 return 0; 1931 1932 spin_lock_irq(&chip->reg_lock); 1933 1934 for (i = 0; i < ALI_CHANNELS; i++) { 1935 outb(i, ALI_REG(chip, ALI_GC_CIR)); 1936 for (j = 0; j < ALI_CHANNEL_REGS; j++) 1937 outl(im->channel_regs[i][j], ALI_REG(chip, j*4 + 0xe0)); 1938 } 1939 1940 for (i = 0; i < ALI_GLOBAL_REGS; i++) { 1941 if ((i*4 == ALI_MISCINT) || (i*4 == ALI_STOP) || 1942 (i*4 == ALI_START)) 1943 continue; 1944 outl(im->regs[i], ALI_REG(chip, i*4)); 1945 } 1946 1947 /* start HW channel */ 1948 outl(im->regs[ALI_START >> 2], ALI_REG(chip, ALI_START)); 1949 /* restore IRQ enable bits */ 1950 outl(im->regs[ALI_MISCINT >> 2], ALI_REG(chip, ALI_MISCINT)); 1951 1952 spin_unlock_irq(&chip->reg_lock); 1953 1954 for (i = 0 ; i < chip->num_of_codecs; i++) 1955 snd_ac97_resume(chip->ac97[i]); 1956 1957 snd_power_change_state(card, SNDRV_CTL_POWER_D0); 1958 return 0; 1959 } 1960 1961 static SIMPLE_DEV_PM_OPS(ali_pm, ali_suspend, ali_resume); 1962 #define ALI_PM_OPS &ali_pm 1963 #else 1964 #define ALI_PM_OPS NULL 1965 #endif /* CONFIG_PM_SLEEP */ 1966 1967 static int snd_ali_free(struct snd_ali * codec) 1968 { 1969 if (codec->hw_initialized) 1970 snd_ali_disable_address_interrupt(codec); 1971 if (codec->irq >= 0) 1972 free_irq(codec->irq, codec); 1973 if (codec->port) 1974 pci_release_regions(codec->pci); 1975 pci_disable_device(codec->pci); 1976 #ifdef CONFIG_PM_SLEEP 1977 kfree(codec->image); 1978 #endif 1979 pci_dev_put(codec->pci_m1533); 1980 pci_dev_put(codec->pci_m7101); 1981 kfree(codec); 1982 return 0; 1983 } 1984 1985 static int snd_ali_chip_init(struct snd_ali *codec) 1986 { 1987 unsigned int legacy; 1988 unsigned char temp; 1989 struct pci_dev *pci_dev; 1990 1991 dev_dbg(codec->card->dev, "chip initializing ...\n"); 1992 1993 if (snd_ali_reset_5451(codec)) { 1994 dev_err(codec->card->dev, "ali_chip_init: reset 5451 error.\n"); 1995 return -1; 1996 } 1997 1998 if (codec->revision == ALI_5451_V02) { 1999 pci_dev = codec->pci_m1533; 2000 pci_read_config_byte(pci_dev, 0x59, &temp); 2001 temp |= 0x80; 2002 pci_write_config_byte(pci_dev, 0x59, temp); 2003 2004 pci_dev = codec->pci_m7101; 2005 pci_read_config_byte(pci_dev, 0xb8, &temp); 2006 temp |= 0x20; 2007 pci_write_config_byte(pci_dev, 0xB8, temp); 2008 } 2009 2010 pci_read_config_dword(codec->pci, 0x44, &legacy); 2011 legacy &= 0xff00ff00; 2012 legacy |= 0x000800aa; 2013 pci_write_config_dword(codec->pci, 0x44, legacy); 2014 2015 outl(0x80000001, ALI_REG(codec, ALI_GLOBAL_CONTROL)); 2016 outl(0x00000000, ALI_REG(codec, ALI_AINTEN)); 2017 outl(0xffffffff, ALI_REG(codec, ALI_AINT)); 2018 outl(0x00000000, ALI_REG(codec, ALI_VOLUME)); 2019 outb(0x10, ALI_REG(codec, ALI_MPUR2)); 2020 2021 codec->ac97_ext_id = snd_ali_codec_peek(codec, 0, AC97_EXTENDED_ID); 2022 codec->ac97_ext_status = snd_ali_codec_peek(codec, 0, 2023 AC97_EXTENDED_STATUS); 2024 if (codec->spdif_support) { 2025 snd_ali_enable_spdif_out(codec); 2026 codec->spdif_mask = 0x00000002; 2027 } 2028 2029 codec->num_of_codecs = 1; 2030 2031 /* secondary codec - modem */ 2032 if (inl(ALI_REG(codec, ALI_SCTRL)) & ALI_SCTRL_CODEC2_READY) { 2033 codec->num_of_codecs++; 2034 outl(inl(ALI_REG(codec, ALI_SCTRL)) | 2035 (ALI_SCTRL_LINE_IN2 | ALI_SCTRL_GPIO_IN2 | 2036 ALI_SCTRL_LINE_OUT_EN), 2037 ALI_REG(codec, ALI_SCTRL)); 2038 } 2039 2040 dev_dbg(codec->card->dev, "chip initialize succeed.\n"); 2041 return 0; 2042 2043 } 2044 2045 /* proc for register dump */ 2046 static void snd_ali_proc_read(struct snd_info_entry *entry, 2047 struct snd_info_buffer *buf) 2048 { 2049 struct snd_ali *codec = entry->private_data; 2050 int i; 2051 for (i = 0; i < 256 ; i+= 4) 2052 snd_iprintf(buf, "%02x: %08x\n", i, inl(ALI_REG(codec, i))); 2053 } 2054 2055 static void snd_ali_proc_init(struct snd_ali *codec) 2056 { 2057 struct snd_info_entry *entry; 2058 if (!snd_card_proc_new(codec->card, "ali5451", &entry)) 2059 snd_info_set_text_ops(entry, codec, snd_ali_proc_read); 2060 } 2061 2062 static int snd_ali_resources(struct snd_ali *codec) 2063 { 2064 int err; 2065 2066 dev_dbg(codec->card->dev, "resources allocation ...\n"); 2067 err = pci_request_regions(codec->pci, "ALI 5451"); 2068 if (err < 0) 2069 return err; 2070 codec->port = pci_resource_start(codec->pci, 0); 2071 2072 if (request_irq(codec->pci->irq, snd_ali_card_interrupt, 2073 IRQF_SHARED, KBUILD_MODNAME, codec)) { 2074 dev_err(codec->card->dev, "Unable to request irq.\n"); 2075 return -EBUSY; 2076 } 2077 codec->irq = codec->pci->irq; 2078 dev_dbg(codec->card->dev, "resources allocated.\n"); 2079 return 0; 2080 } 2081 static int snd_ali_dev_free(struct snd_device *device) 2082 { 2083 struct snd_ali *codec = device->device_data; 2084 snd_ali_free(codec); 2085 return 0; 2086 } 2087 2088 static int snd_ali_create(struct snd_card *card, 2089 struct pci_dev *pci, 2090 int pcm_streams, 2091 int spdif_support, 2092 struct snd_ali **r_ali) 2093 { 2094 struct snd_ali *codec; 2095 int i, err; 2096 unsigned short cmdw; 2097 static struct snd_device_ops ops = { 2098 .dev_free = snd_ali_dev_free, 2099 }; 2100 2101 *r_ali = NULL; 2102 2103 dev_dbg(card->dev, "creating ...\n"); 2104 2105 /* enable PCI device */ 2106 err = pci_enable_device(pci); 2107 if (err < 0) 2108 return err; 2109 /* check, if we can restrict PCI DMA transfers to 31 bits */ 2110 if (dma_set_mask(&pci->dev, DMA_BIT_MASK(31)) < 0 || 2111 dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(31)) < 0) { 2112 dev_err(card->dev, 2113 "architecture does not support 31bit PCI busmaster DMA\n"); 2114 pci_disable_device(pci); 2115 return -ENXIO; 2116 } 2117 2118 codec = kzalloc(sizeof(*codec), GFP_KERNEL); 2119 if (!codec) { 2120 pci_disable_device(pci); 2121 return -ENOMEM; 2122 } 2123 2124 spin_lock_init(&codec->reg_lock); 2125 spin_lock_init(&codec->voice_alloc); 2126 2127 codec->card = card; 2128 codec->pci = pci; 2129 codec->irq = -1; 2130 codec->revision = pci->revision; 2131 codec->spdif_support = spdif_support; 2132 2133 if (pcm_streams < 1) 2134 pcm_streams = 1; 2135 if (pcm_streams > 32) 2136 pcm_streams = 32; 2137 2138 pci_set_master(pci); 2139 pci_read_config_word(pci, PCI_COMMAND, &cmdw); 2140 if ((cmdw & PCI_COMMAND_IO) != PCI_COMMAND_IO) { 2141 cmdw |= PCI_COMMAND_IO; 2142 pci_write_config_word(pci, PCI_COMMAND, cmdw); 2143 } 2144 pci_set_master(pci); 2145 2146 if (snd_ali_resources(codec)) { 2147 snd_ali_free(codec); 2148 return -EBUSY; 2149 } 2150 2151 synchronize_irq(pci->irq); 2152 2153 codec->synth.chmap = 0; 2154 codec->synth.chcnt = 0; 2155 codec->spdif_mask = 0; 2156 codec->synth.synthcount = 0; 2157 2158 if (codec->revision == ALI_5451_V02) 2159 codec->chregs.regs.ac97read = ALI_AC97_WRITE; 2160 else 2161 codec->chregs.regs.ac97read = ALI_AC97_READ; 2162 codec->chregs.regs.ac97write = ALI_AC97_WRITE; 2163 2164 codec->chregs.regs.start = ALI_START; 2165 codec->chregs.regs.stop = ALI_STOP; 2166 codec->chregs.regs.aint = ALI_AINT; 2167 codec->chregs.regs.ainten = ALI_AINTEN; 2168 2169 codec->chregs.data.start = 0x00; 2170 codec->chregs.data.stop = 0x00; 2171 codec->chregs.data.aint = 0x00; 2172 codec->chregs.data.ainten = 0x00; 2173 2174 /* M1533: southbridge */ 2175 codec->pci_m1533 = pci_get_device(0x10b9, 0x1533, NULL); 2176 if (!codec->pci_m1533) { 2177 dev_err(card->dev, "cannot find ALi 1533 chip.\n"); 2178 snd_ali_free(codec); 2179 return -ENODEV; 2180 } 2181 /* M7101: power management */ 2182 codec->pci_m7101 = pci_get_device(0x10b9, 0x7101, NULL); 2183 if (!codec->pci_m7101 && codec->revision == ALI_5451_V02) { 2184 dev_err(card->dev, "cannot find ALi 7101 chip.\n"); 2185 snd_ali_free(codec); 2186 return -ENODEV; 2187 } 2188 2189 dev_dbg(card->dev, "snd_device_new is called.\n"); 2190 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, codec, &ops); 2191 if (err < 0) { 2192 snd_ali_free(codec); 2193 return err; 2194 } 2195 2196 /* initialise synth voices*/ 2197 for (i = 0; i < ALI_CHANNELS; i++) 2198 codec->synth.voices[i].number = i; 2199 2200 err = snd_ali_chip_init(codec); 2201 if (err < 0) { 2202 dev_err(card->dev, "ali create: chip init error.\n"); 2203 return err; 2204 } 2205 2206 #ifdef CONFIG_PM_SLEEP 2207 codec->image = kmalloc(sizeof(*codec->image), GFP_KERNEL); 2208 if (!codec->image) 2209 dev_warn(card->dev, "can't allocate apm buffer\n"); 2210 #endif 2211 2212 snd_ali_enable_address_interrupt(codec); 2213 codec->hw_initialized = 1; 2214 2215 *r_ali = codec; 2216 dev_dbg(card->dev, "created.\n"); 2217 return 0; 2218 } 2219 2220 static int snd_ali_probe(struct pci_dev *pci, 2221 const struct pci_device_id *pci_id) 2222 { 2223 struct snd_card *card; 2224 struct snd_ali *codec; 2225 int err; 2226 2227 dev_dbg(&pci->dev, "probe ...\n"); 2228 2229 err = snd_card_new(&pci->dev, index, id, THIS_MODULE, 0, &card); 2230 if (err < 0) 2231 return err; 2232 2233 err = snd_ali_create(card, pci, pcm_channels, spdif, &codec); 2234 if (err < 0) 2235 goto error; 2236 card->private_data = codec; 2237 2238 dev_dbg(&pci->dev, "mixer building ...\n"); 2239 err = snd_ali_mixer(codec); 2240 if (err < 0) 2241 goto error; 2242 2243 dev_dbg(&pci->dev, "pcm building ...\n"); 2244 err = snd_ali_build_pcms(codec); 2245 if (err < 0) 2246 goto error; 2247 2248 snd_ali_proc_init(codec); 2249 2250 strcpy(card->driver, "ALI5451"); 2251 strcpy(card->shortname, "ALI 5451"); 2252 2253 sprintf(card->longname, "%s at 0x%lx, irq %i", 2254 card->shortname, codec->port, codec->irq); 2255 2256 dev_dbg(&pci->dev, "register card.\n"); 2257 err = snd_card_register(card); 2258 if (err < 0) 2259 goto error; 2260 2261 pci_set_drvdata(pci, card); 2262 return 0; 2263 2264 error: 2265 snd_card_free(card); 2266 return err; 2267 } 2268 2269 static void snd_ali_remove(struct pci_dev *pci) 2270 { 2271 snd_card_free(pci_get_drvdata(pci)); 2272 } 2273 2274 static struct pci_driver ali5451_driver = { 2275 .name = KBUILD_MODNAME, 2276 .id_table = snd_ali_ids, 2277 .probe = snd_ali_probe, 2278 .remove = snd_ali_remove, 2279 .driver = { 2280 .pm = ALI_PM_OPS, 2281 }, 2282 }; 2283 2284 module_pci_driver(ali5451_driver); 2285