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