1 /* 2 * PMac DBDMA lowlevel functions 3 * 4 * Copyright (c) by Takashi Iwai <tiwai@suse.de> 5 * code based on dmasound.c. 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 */ 21 22 23 #include <sound/driver.h> 24 #include <asm/io.h> 25 #include <asm/irq.h> 26 #include <linux/init.h> 27 #include <linux/delay.h> 28 #include <linux/slab.h> 29 #include <linux/interrupt.h> 30 #include <linux/pci.h> 31 #include <linux/dma-mapping.h> 32 #include <sound/core.h> 33 #include "pmac.h" 34 #include <sound/pcm_params.h> 35 #include <asm/pmac_feature.h> 36 #include <asm/pci-bridge.h> 37 38 39 #ifdef CONFIG_PM 40 static int snd_pmac_register_sleep_notifier(pmac_t *chip); 41 static int snd_pmac_unregister_sleep_notifier(pmac_t *chip); 42 static int snd_pmac_suspend(snd_card_t *card, pm_message_t state); 43 static int snd_pmac_resume(snd_card_t *card); 44 #endif 45 46 47 /* fixed frequency table for awacs, screamer, burgundy, DACA (44100 max) */ 48 static int awacs_freqs[8] = { 49 44100, 29400, 22050, 17640, 14700, 11025, 8820, 7350 50 }; 51 /* fixed frequency table for tumbler */ 52 static int tumbler_freqs[1] = { 53 44100 54 }; 55 56 /* 57 * allocate DBDMA command arrays 58 */ 59 static int snd_pmac_dbdma_alloc(pmac_t *chip, pmac_dbdma_t *rec, int size) 60 { 61 unsigned int rsize = sizeof(struct dbdma_cmd) * (size + 1); 62 63 rec->space = dma_alloc_coherent(&chip->pdev->dev, rsize, 64 &rec->dma_base, GFP_KERNEL); 65 if (rec->space == NULL) 66 return -ENOMEM; 67 rec->size = size; 68 memset(rec->space, 0, rsize); 69 rec->cmds = (void __iomem *)DBDMA_ALIGN(rec->space); 70 rec->addr = rec->dma_base + (unsigned long)((char *)rec->cmds - (char *)rec->space); 71 72 return 0; 73 } 74 75 static void snd_pmac_dbdma_free(pmac_t *chip, pmac_dbdma_t *rec) 76 { 77 if (rec) { 78 unsigned int rsize = sizeof(struct dbdma_cmd) * (rec->size + 1); 79 80 dma_free_coherent(&chip->pdev->dev, rsize, rec->space, rec->dma_base); 81 } 82 } 83 84 85 /* 86 * pcm stuff 87 */ 88 89 /* 90 * look up frequency table 91 */ 92 93 unsigned int snd_pmac_rate_index(pmac_t *chip, pmac_stream_t *rec, unsigned int rate) 94 { 95 int i, ok, found; 96 97 ok = rec->cur_freqs; 98 if (rate > chip->freq_table[0]) 99 return 0; 100 found = 0; 101 for (i = 0; i < chip->num_freqs; i++, ok >>= 1) { 102 if (! (ok & 1)) continue; 103 found = i; 104 if (rate >= chip->freq_table[i]) 105 break; 106 } 107 return found; 108 } 109 110 /* 111 * check whether another stream is active 112 */ 113 static inline int another_stream(int stream) 114 { 115 return (stream == SNDRV_PCM_STREAM_PLAYBACK) ? 116 SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK; 117 } 118 119 /* 120 * allocate buffers 121 */ 122 static int snd_pmac_pcm_hw_params(snd_pcm_substream_t *subs, 123 snd_pcm_hw_params_t *hw_params) 124 { 125 return snd_pcm_lib_malloc_pages(subs, params_buffer_bytes(hw_params)); 126 } 127 128 /* 129 * release buffers 130 */ 131 static int snd_pmac_pcm_hw_free(snd_pcm_substream_t *subs) 132 { 133 snd_pcm_lib_free_pages(subs); 134 return 0; 135 } 136 137 /* 138 * get a stream of the opposite direction 139 */ 140 static pmac_stream_t *snd_pmac_get_stream(pmac_t *chip, int stream) 141 { 142 switch (stream) { 143 case SNDRV_PCM_STREAM_PLAYBACK: 144 return &chip->playback; 145 case SNDRV_PCM_STREAM_CAPTURE: 146 return &chip->capture; 147 default: 148 snd_BUG(); 149 return NULL; 150 } 151 } 152 153 /* 154 * wait while run status is on 155 */ 156 static inline void 157 snd_pmac_wait_ack(pmac_stream_t *rec) 158 { 159 int timeout = 50000; 160 while ((in_le32(&rec->dma->status) & RUN) && timeout-- > 0) 161 udelay(1); 162 } 163 164 /* 165 * set the format and rate to the chip. 166 * call the lowlevel function if defined (e.g. for AWACS). 167 */ 168 static void snd_pmac_pcm_set_format(pmac_t *chip) 169 { 170 /* set up frequency and format */ 171 out_le32(&chip->awacs->control, chip->control_mask | (chip->rate_index << 8)); 172 out_le32(&chip->awacs->byteswap, chip->format == SNDRV_PCM_FORMAT_S16_LE ? 1 : 0); 173 if (chip->set_format) 174 chip->set_format(chip); 175 } 176 177 /* 178 * stop the DMA transfer 179 */ 180 static inline void snd_pmac_dma_stop(pmac_stream_t *rec) 181 { 182 out_le32(&rec->dma->control, (RUN|WAKE|FLUSH|PAUSE) << 16); 183 snd_pmac_wait_ack(rec); 184 } 185 186 /* 187 * set the command pointer address 188 */ 189 static inline void snd_pmac_dma_set_command(pmac_stream_t *rec, pmac_dbdma_t *cmd) 190 { 191 out_le32(&rec->dma->cmdptr, cmd->addr); 192 } 193 194 /* 195 * start the DMA 196 */ 197 static inline void snd_pmac_dma_run(pmac_stream_t *rec, int status) 198 { 199 out_le32(&rec->dma->control, status | (status << 16)); 200 } 201 202 203 /* 204 * prepare playback/capture stream 205 */ 206 static int snd_pmac_pcm_prepare(pmac_t *chip, pmac_stream_t *rec, snd_pcm_substream_t *subs) 207 { 208 int i; 209 volatile struct dbdma_cmd __iomem *cp; 210 snd_pcm_runtime_t *runtime = subs->runtime; 211 int rate_index; 212 long offset; 213 pmac_stream_t *astr; 214 215 rec->dma_size = snd_pcm_lib_buffer_bytes(subs); 216 rec->period_size = snd_pcm_lib_period_bytes(subs); 217 rec->nperiods = rec->dma_size / rec->period_size; 218 rec->cur_period = 0; 219 rate_index = snd_pmac_rate_index(chip, rec, runtime->rate); 220 221 /* set up constraints */ 222 astr = snd_pmac_get_stream(chip, another_stream(rec->stream)); 223 snd_runtime_check(astr, return -EINVAL); 224 astr->cur_freqs = 1 << rate_index; 225 astr->cur_formats = 1 << runtime->format; 226 chip->rate_index = rate_index; 227 chip->format = runtime->format; 228 229 /* We really want to execute a DMA stop command, after the AWACS 230 * is initialized. 231 * For reasons I don't understand, it stops the hissing noise 232 * common to many PowerBook G3 systems and random noise otherwise 233 * captured on iBook2's about every third time. -ReneR 234 */ 235 spin_lock_irq(&chip->reg_lock); 236 snd_pmac_dma_stop(rec); 237 st_le16(&chip->extra_dma.cmds->command, DBDMA_STOP); 238 snd_pmac_dma_set_command(rec, &chip->extra_dma); 239 snd_pmac_dma_run(rec, RUN); 240 spin_unlock_irq(&chip->reg_lock); 241 mdelay(5); 242 spin_lock_irq(&chip->reg_lock); 243 /* continuous DMA memory type doesn't provide the physical address, 244 * so we need to resolve the address here... 245 */ 246 offset = runtime->dma_addr; 247 for (i = 0, cp = rec->cmd.cmds; i < rec->nperiods; i++, cp++) { 248 st_le32(&cp->phy_addr, offset); 249 st_le16(&cp->req_count, rec->period_size); 250 /*st_le16(&cp->res_count, 0);*/ 251 st_le16(&cp->xfer_status, 0); 252 offset += rec->period_size; 253 } 254 /* make loop */ 255 st_le16(&cp->command, DBDMA_NOP + BR_ALWAYS); 256 st_le32(&cp->cmd_dep, rec->cmd.addr); 257 258 snd_pmac_dma_stop(rec); 259 snd_pmac_dma_set_command(rec, &rec->cmd); 260 spin_unlock_irq(&chip->reg_lock); 261 262 return 0; 263 } 264 265 266 /* 267 * PCM trigger/stop 268 */ 269 static int snd_pmac_pcm_trigger(pmac_t *chip, pmac_stream_t *rec, 270 snd_pcm_substream_t *subs, int cmd) 271 { 272 volatile struct dbdma_cmd __iomem *cp; 273 int i, command; 274 275 switch (cmd) { 276 case SNDRV_PCM_TRIGGER_START: 277 case SNDRV_PCM_TRIGGER_RESUME: 278 if (rec->running) 279 return -EBUSY; 280 command = (subs->stream == SNDRV_PCM_STREAM_PLAYBACK ? 281 OUTPUT_MORE : INPUT_MORE) + INTR_ALWAYS; 282 spin_lock(&chip->reg_lock); 283 snd_pmac_beep_stop(chip); 284 snd_pmac_pcm_set_format(chip); 285 for (i = 0, cp = rec->cmd.cmds; i < rec->nperiods; i++, cp++) 286 out_le16(&cp->command, command); 287 snd_pmac_dma_set_command(rec, &rec->cmd); 288 (void)in_le32(&rec->dma->status); 289 snd_pmac_dma_run(rec, RUN|WAKE); 290 rec->running = 1; 291 spin_unlock(&chip->reg_lock); 292 break; 293 294 case SNDRV_PCM_TRIGGER_STOP: 295 case SNDRV_PCM_TRIGGER_SUSPEND: 296 spin_lock(&chip->reg_lock); 297 rec->running = 0; 298 /*printk("stopped!!\n");*/ 299 snd_pmac_dma_stop(rec); 300 for (i = 0, cp = rec->cmd.cmds; i < rec->nperiods; i++, cp++) 301 out_le16(&cp->command, DBDMA_STOP); 302 spin_unlock(&chip->reg_lock); 303 break; 304 305 default: 306 return -EINVAL; 307 } 308 309 return 0; 310 } 311 312 /* 313 * return the current pointer 314 */ 315 inline 316 static snd_pcm_uframes_t snd_pmac_pcm_pointer(pmac_t *chip, pmac_stream_t *rec, 317 snd_pcm_substream_t *subs) 318 { 319 int count = 0; 320 321 #if 1 /* hmm.. how can we get the current dma pointer?? */ 322 int stat; 323 volatile struct dbdma_cmd __iomem *cp = &rec->cmd.cmds[rec->cur_period]; 324 stat = ld_le16(&cp->xfer_status); 325 if (stat & (ACTIVE|DEAD)) { 326 count = in_le16(&cp->res_count); 327 if (count) 328 count = rec->period_size - count; 329 } 330 #endif 331 count += rec->cur_period * rec->period_size; 332 /*printk("pointer=%d\n", count);*/ 333 return bytes_to_frames(subs->runtime, count); 334 } 335 336 /* 337 * playback 338 */ 339 340 static int snd_pmac_playback_prepare(snd_pcm_substream_t *subs) 341 { 342 pmac_t *chip = snd_pcm_substream_chip(subs); 343 return snd_pmac_pcm_prepare(chip, &chip->playback, subs); 344 } 345 346 static int snd_pmac_playback_trigger(snd_pcm_substream_t *subs, 347 int cmd) 348 { 349 pmac_t *chip = snd_pcm_substream_chip(subs); 350 return snd_pmac_pcm_trigger(chip, &chip->playback, subs, cmd); 351 } 352 353 static snd_pcm_uframes_t snd_pmac_playback_pointer(snd_pcm_substream_t *subs) 354 { 355 pmac_t *chip = snd_pcm_substream_chip(subs); 356 return snd_pmac_pcm_pointer(chip, &chip->playback, subs); 357 } 358 359 360 /* 361 * capture 362 */ 363 364 static int snd_pmac_capture_prepare(snd_pcm_substream_t *subs) 365 { 366 pmac_t *chip = snd_pcm_substream_chip(subs); 367 return snd_pmac_pcm_prepare(chip, &chip->capture, subs); 368 } 369 370 static int snd_pmac_capture_trigger(snd_pcm_substream_t *subs, 371 int cmd) 372 { 373 pmac_t *chip = snd_pcm_substream_chip(subs); 374 return snd_pmac_pcm_trigger(chip, &chip->capture, subs, cmd); 375 } 376 377 static snd_pcm_uframes_t snd_pmac_capture_pointer(snd_pcm_substream_t *subs) 378 { 379 pmac_t *chip = snd_pcm_substream_chip(subs); 380 return snd_pmac_pcm_pointer(chip, &chip->capture, subs); 381 } 382 383 384 /* 385 * update playback/capture pointer from interrupts 386 */ 387 static void snd_pmac_pcm_update(pmac_t *chip, pmac_stream_t *rec) 388 { 389 volatile struct dbdma_cmd __iomem *cp; 390 int c; 391 int stat; 392 393 spin_lock(&chip->reg_lock); 394 if (rec->running) { 395 cp = &rec->cmd.cmds[rec->cur_period]; 396 for (c = 0; c < rec->nperiods; c++) { /* at most all fragments */ 397 stat = ld_le16(&cp->xfer_status); 398 if (! (stat & ACTIVE)) 399 break; 400 /*printk("update frag %d\n", rec->cur_period);*/ 401 st_le16(&cp->xfer_status, 0); 402 st_le16(&cp->req_count, rec->period_size); 403 /*st_le16(&cp->res_count, 0);*/ 404 rec->cur_period++; 405 if (rec->cur_period >= rec->nperiods) { 406 rec->cur_period = 0; 407 cp = rec->cmd.cmds; 408 } else 409 cp++; 410 spin_unlock(&chip->reg_lock); 411 snd_pcm_period_elapsed(rec->substream); 412 spin_lock(&chip->reg_lock); 413 } 414 } 415 spin_unlock(&chip->reg_lock); 416 } 417 418 419 /* 420 * hw info 421 */ 422 423 static snd_pcm_hardware_t snd_pmac_playback = 424 { 425 .info = (SNDRV_PCM_INFO_INTERLEAVED | 426 SNDRV_PCM_INFO_MMAP | 427 SNDRV_PCM_INFO_MMAP_VALID | 428 SNDRV_PCM_INFO_RESUME), 429 .formats = SNDRV_PCM_FMTBIT_S16_BE | SNDRV_PCM_FMTBIT_S16_LE, 430 .rates = SNDRV_PCM_RATE_8000_44100, 431 .rate_min = 7350, 432 .rate_max = 44100, 433 .channels_min = 2, 434 .channels_max = 2, 435 .buffer_bytes_max = 131072, 436 .period_bytes_min = 256, 437 .period_bytes_max = 16384, 438 .periods_min = 3, 439 .periods_max = PMAC_MAX_FRAGS, 440 }; 441 442 static snd_pcm_hardware_t snd_pmac_capture = 443 { 444 .info = (SNDRV_PCM_INFO_INTERLEAVED | 445 SNDRV_PCM_INFO_MMAP | 446 SNDRV_PCM_INFO_MMAP_VALID | 447 SNDRV_PCM_INFO_RESUME), 448 .formats = SNDRV_PCM_FMTBIT_S16_BE | SNDRV_PCM_FMTBIT_S16_LE, 449 .rates = SNDRV_PCM_RATE_8000_44100, 450 .rate_min = 7350, 451 .rate_max = 44100, 452 .channels_min = 2, 453 .channels_max = 2, 454 .buffer_bytes_max = 131072, 455 .period_bytes_min = 256, 456 .period_bytes_max = 16384, 457 .periods_min = 3, 458 .periods_max = PMAC_MAX_FRAGS, 459 }; 460 461 462 #if 0 // NYI 463 static int snd_pmac_hw_rule_rate(snd_pcm_hw_params_t *params, 464 snd_pcm_hw_rule_t *rule) 465 { 466 pmac_t *chip = rule->private; 467 pmac_stream_t *rec = snd_pmac_get_stream(chip, rule->deps[0]); 468 int i, freq_table[8], num_freqs; 469 470 snd_runtime_check(rec, return -EINVAL); 471 num_freqs = 0; 472 for (i = chip->num_freqs - 1; i >= 0; i--) { 473 if (rec->cur_freqs & (1 << i)) 474 freq_table[num_freqs++] = chip->freq_table[i]; 475 } 476 477 return snd_interval_list(hw_param_interval(params, rule->var), 478 num_freqs, freq_table, 0); 479 } 480 481 static int snd_pmac_hw_rule_format(snd_pcm_hw_params_t *params, 482 snd_pcm_hw_rule_t *rule) 483 { 484 pmac_t *chip = rule->private; 485 pmac_stream_t *rec = snd_pmac_get_stream(chip, rule->deps[0]); 486 487 snd_runtime_check(rec, return -EINVAL); 488 return snd_mask_refine_set(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT), 489 rec->cur_formats); 490 } 491 #endif // NYI 492 493 static int snd_pmac_pcm_open(pmac_t *chip, pmac_stream_t *rec, snd_pcm_substream_t *subs) 494 { 495 snd_pcm_runtime_t *runtime = subs->runtime; 496 int i, j, fflags; 497 static int typical_freqs[] = { 498 44100, 499 22050, 500 11025, 501 0, 502 }; 503 static int typical_freq_flags[] = { 504 SNDRV_PCM_RATE_44100, 505 SNDRV_PCM_RATE_22050, 506 SNDRV_PCM_RATE_11025, 507 0, 508 }; 509 510 /* look up frequency table and fill bit mask */ 511 runtime->hw.rates = 0; 512 fflags = chip->freqs_ok; 513 for (i = 0; typical_freqs[i]; i++) { 514 for (j = 0; j < chip->num_freqs; j++) { 515 if ((chip->freqs_ok & (1 << j)) && 516 chip->freq_table[j] == typical_freqs[i]) { 517 runtime->hw.rates |= typical_freq_flags[i]; 518 fflags &= ~(1 << j); 519 break; 520 } 521 } 522 } 523 if (fflags) /* rest */ 524 runtime->hw.rates |= SNDRV_PCM_RATE_KNOT; 525 526 /* check for minimum and maximum rates */ 527 for (i = 0; i < chip->num_freqs; i++) { 528 if (chip->freqs_ok & (1 << i)) { 529 runtime->hw.rate_max = chip->freq_table[i]; 530 break; 531 } 532 } 533 for (i = chip->num_freqs - 1; i >= 0; i--) { 534 if (chip->freqs_ok & (1 << i)) { 535 runtime->hw.rate_min = chip->freq_table[i]; 536 break; 537 } 538 } 539 runtime->hw.formats = chip->formats_ok; 540 if (chip->can_capture) { 541 if (! chip->can_duplex) 542 runtime->hw.info |= SNDRV_PCM_INFO_HALF_DUPLEX; 543 runtime->hw.info |= SNDRV_PCM_INFO_JOINT_DUPLEX; 544 } 545 runtime->private_data = rec; 546 rec->substream = subs; 547 548 #if 0 /* FIXME: still under development.. */ 549 snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, 550 snd_pmac_hw_rule_rate, chip, rec->stream, -1); 551 snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_FORMAT, 552 snd_pmac_hw_rule_format, chip, rec->stream, -1); 553 #endif 554 555 runtime->hw.periods_max = rec->cmd.size - 1; 556 557 if (chip->can_duplex) 558 snd_pcm_set_sync(subs); 559 560 /* constraints to fix choppy sound */ 561 snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); 562 return 0; 563 } 564 565 static int snd_pmac_pcm_close(pmac_t *chip, pmac_stream_t *rec, snd_pcm_substream_t *subs) 566 { 567 pmac_stream_t *astr; 568 569 snd_pmac_dma_stop(rec); 570 571 astr = snd_pmac_get_stream(chip, another_stream(rec->stream)); 572 snd_runtime_check(astr, return -EINVAL); 573 574 /* reset constraints */ 575 astr->cur_freqs = chip->freqs_ok; 576 astr->cur_formats = chip->formats_ok; 577 578 return 0; 579 } 580 581 static int snd_pmac_playback_open(snd_pcm_substream_t *subs) 582 { 583 pmac_t *chip = snd_pcm_substream_chip(subs); 584 585 subs->runtime->hw = snd_pmac_playback; 586 return snd_pmac_pcm_open(chip, &chip->playback, subs); 587 } 588 589 static int snd_pmac_capture_open(snd_pcm_substream_t *subs) 590 { 591 pmac_t *chip = snd_pcm_substream_chip(subs); 592 593 subs->runtime->hw = snd_pmac_capture; 594 return snd_pmac_pcm_open(chip, &chip->capture, subs); 595 } 596 597 static int snd_pmac_playback_close(snd_pcm_substream_t *subs) 598 { 599 pmac_t *chip = snd_pcm_substream_chip(subs); 600 601 return snd_pmac_pcm_close(chip, &chip->playback, subs); 602 } 603 604 static int snd_pmac_capture_close(snd_pcm_substream_t *subs) 605 { 606 pmac_t *chip = snd_pcm_substream_chip(subs); 607 608 return snd_pmac_pcm_close(chip, &chip->capture, subs); 609 } 610 611 /* 612 */ 613 614 static snd_pcm_ops_t snd_pmac_playback_ops = { 615 .open = snd_pmac_playback_open, 616 .close = snd_pmac_playback_close, 617 .ioctl = snd_pcm_lib_ioctl, 618 .hw_params = snd_pmac_pcm_hw_params, 619 .hw_free = snd_pmac_pcm_hw_free, 620 .prepare = snd_pmac_playback_prepare, 621 .trigger = snd_pmac_playback_trigger, 622 .pointer = snd_pmac_playback_pointer, 623 }; 624 625 static snd_pcm_ops_t snd_pmac_capture_ops = { 626 .open = snd_pmac_capture_open, 627 .close = snd_pmac_capture_close, 628 .ioctl = snd_pcm_lib_ioctl, 629 .hw_params = snd_pmac_pcm_hw_params, 630 .hw_free = snd_pmac_pcm_hw_free, 631 .prepare = snd_pmac_capture_prepare, 632 .trigger = snd_pmac_capture_trigger, 633 .pointer = snd_pmac_capture_pointer, 634 }; 635 636 static void pmac_pcm_free(snd_pcm_t *pcm) 637 { 638 snd_pcm_lib_preallocate_free_for_all(pcm); 639 } 640 641 int __init snd_pmac_pcm_new(pmac_t *chip) 642 { 643 snd_pcm_t *pcm; 644 int err; 645 int num_captures = 1; 646 647 if (! chip->can_capture) 648 num_captures = 0; 649 err = snd_pcm_new(chip->card, chip->card->driver, 0, 1, num_captures, &pcm); 650 if (err < 0) 651 return err; 652 653 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_pmac_playback_ops); 654 if (chip->can_capture) 655 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_pmac_capture_ops); 656 657 pcm->private_data = chip; 658 pcm->private_free = pmac_pcm_free; 659 pcm->info_flags = SNDRV_PCM_INFO_JOINT_DUPLEX; 660 strcpy(pcm->name, chip->card->shortname); 661 chip->pcm = pcm; 662 663 chip->formats_ok = SNDRV_PCM_FMTBIT_S16_BE; 664 if (chip->can_byte_swap) 665 chip->formats_ok |= SNDRV_PCM_FMTBIT_S16_LE; 666 667 chip->playback.cur_formats = chip->formats_ok; 668 chip->capture.cur_formats = chip->formats_ok; 669 chip->playback.cur_freqs = chip->freqs_ok; 670 chip->capture.cur_freqs = chip->freqs_ok; 671 672 /* preallocate 64k buffer */ 673 snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, 674 &chip->pdev->dev, 675 64 * 1024, 64 * 1024); 676 677 return 0; 678 } 679 680 681 static void snd_pmac_dbdma_reset(pmac_t *chip) 682 { 683 out_le32(&chip->playback.dma->control, (RUN|PAUSE|FLUSH|WAKE|DEAD) << 16); 684 snd_pmac_wait_ack(&chip->playback); 685 out_le32(&chip->capture.dma->control, (RUN|PAUSE|FLUSH|WAKE|DEAD) << 16); 686 snd_pmac_wait_ack(&chip->capture); 687 } 688 689 690 /* 691 * handling beep 692 */ 693 void snd_pmac_beep_dma_start(pmac_t *chip, int bytes, unsigned long addr, int speed) 694 { 695 pmac_stream_t *rec = &chip->playback; 696 697 snd_pmac_dma_stop(rec); 698 st_le16(&chip->extra_dma.cmds->req_count, bytes); 699 st_le16(&chip->extra_dma.cmds->xfer_status, 0); 700 st_le32(&chip->extra_dma.cmds->cmd_dep, chip->extra_dma.addr); 701 st_le32(&chip->extra_dma.cmds->phy_addr, addr); 702 st_le16(&chip->extra_dma.cmds->command, OUTPUT_MORE + BR_ALWAYS); 703 out_le32(&chip->awacs->control, 704 (in_le32(&chip->awacs->control) & ~0x1f00) 705 | (speed << 8)); 706 out_le32(&chip->awacs->byteswap, 0); 707 snd_pmac_dma_set_command(rec, &chip->extra_dma); 708 snd_pmac_dma_run(rec, RUN); 709 } 710 711 void snd_pmac_beep_dma_stop(pmac_t *chip) 712 { 713 snd_pmac_dma_stop(&chip->playback); 714 st_le16(&chip->extra_dma.cmds->command, DBDMA_STOP); 715 snd_pmac_pcm_set_format(chip); /* reset format */ 716 } 717 718 719 /* 720 * interrupt handlers 721 */ 722 static irqreturn_t 723 snd_pmac_tx_intr(int irq, void *devid, struct pt_regs *regs) 724 { 725 pmac_t *chip = devid; 726 snd_pmac_pcm_update(chip, &chip->playback); 727 return IRQ_HANDLED; 728 } 729 730 731 static irqreturn_t 732 snd_pmac_rx_intr(int irq, void *devid, struct pt_regs *regs) 733 { 734 pmac_t *chip = devid; 735 snd_pmac_pcm_update(chip, &chip->capture); 736 return IRQ_HANDLED; 737 } 738 739 740 static irqreturn_t 741 snd_pmac_ctrl_intr(int irq, void *devid, struct pt_regs *regs) 742 { 743 pmac_t *chip = devid; 744 int ctrl = in_le32(&chip->awacs->control); 745 746 /*printk("pmac: control interrupt.. 0x%x\n", ctrl);*/ 747 if (ctrl & MASK_PORTCHG) { 748 /* do something when headphone is plugged/unplugged? */ 749 if (chip->update_automute) 750 chip->update_automute(chip, 1); 751 } 752 if (ctrl & MASK_CNTLERR) { 753 int err = (in_le32(&chip->awacs->codec_stat) & MASK_ERRCODE) >> 16; 754 if (err && chip->model <= PMAC_SCREAMER) 755 snd_printk(KERN_DEBUG "error %x\n", err); 756 } 757 /* Writing 1s to the CNTLERR and PORTCHG bits clears them... */ 758 out_le32(&chip->awacs->control, ctrl); 759 return IRQ_HANDLED; 760 } 761 762 763 /* 764 * a wrapper to feature call for compatibility 765 */ 766 static void snd_pmac_sound_feature(pmac_t *chip, int enable) 767 { 768 if (ppc_md.feature_call) 769 ppc_md.feature_call(PMAC_FTR_SOUND_CHIP_ENABLE, chip->node, 0, enable); 770 } 771 772 /* 773 * release resources 774 */ 775 776 static int snd_pmac_free(pmac_t *chip) 777 { 778 /* stop sounds */ 779 if (chip->initialized) { 780 snd_pmac_dbdma_reset(chip); 781 /* disable interrupts from awacs interface */ 782 out_le32(&chip->awacs->control, in_le32(&chip->awacs->control) & 0xfff); 783 } 784 785 snd_pmac_sound_feature(chip, 0); 786 #ifdef CONFIG_PM 787 snd_pmac_unregister_sleep_notifier(chip); 788 #endif 789 790 /* clean up mixer if any */ 791 if (chip->mixer_free) 792 chip->mixer_free(chip); 793 794 snd_pmac_detach_beep(chip); 795 796 /* release resources */ 797 if (chip->irq >= 0) 798 free_irq(chip->irq, (void*)chip); 799 if (chip->tx_irq >= 0) 800 free_irq(chip->tx_irq, (void*)chip); 801 if (chip->rx_irq >= 0) 802 free_irq(chip->rx_irq, (void*)chip); 803 snd_pmac_dbdma_free(chip, &chip->playback.cmd); 804 snd_pmac_dbdma_free(chip, &chip->capture.cmd); 805 snd_pmac_dbdma_free(chip, &chip->extra_dma); 806 if (chip->macio_base) 807 iounmap(chip->macio_base); 808 if (chip->latch_base) 809 iounmap(chip->latch_base); 810 if (chip->awacs) 811 iounmap(chip->awacs); 812 if (chip->playback.dma) 813 iounmap(chip->playback.dma); 814 if (chip->capture.dma) 815 iounmap(chip->capture.dma); 816 #ifndef CONFIG_PPC64 817 if (chip->node) { 818 int i; 819 820 for (i = 0; i < 3; i++) { 821 if (chip->of_requested & (1 << i)) { 822 if (chip->is_k2) 823 release_OF_resource(chip->node->parent, 824 i); 825 else 826 release_OF_resource(chip->node, i); 827 } 828 } 829 } 830 #endif /* CONFIG_PPC64 */ 831 if (chip->pdev) 832 pci_dev_put(chip->pdev); 833 kfree(chip); 834 return 0; 835 } 836 837 838 /* 839 * free the device 840 */ 841 static int snd_pmac_dev_free(snd_device_t *device) 842 { 843 pmac_t *chip = device->device_data; 844 return snd_pmac_free(chip); 845 } 846 847 848 /* 849 * check the machine support byteswap (little-endian) 850 */ 851 852 static void __init detect_byte_swap(pmac_t *chip) 853 { 854 struct device_node *mio; 855 856 /* if seems that Keylargo can't byte-swap */ 857 for (mio = chip->node->parent; mio; mio = mio->parent) { 858 if (strcmp(mio->name, "mac-io") == 0) { 859 if (device_is_compatible(mio, "Keylargo")) 860 chip->can_byte_swap = 0; 861 break; 862 } 863 } 864 865 /* it seems the Pismo & iBook can't byte-swap in hardware. */ 866 if (machine_is_compatible("PowerBook3,1") || 867 machine_is_compatible("PowerBook2,1")) 868 chip->can_byte_swap = 0 ; 869 870 if (machine_is_compatible("PowerBook2,1")) 871 chip->can_duplex = 0; 872 } 873 874 875 /* 876 * detect a sound chip 877 */ 878 static int __init snd_pmac_detect(pmac_t *chip) 879 { 880 struct device_node *sound = NULL; 881 unsigned int *prop, l; 882 struct macio_chip* macio; 883 884 u32 layout_id = 0; 885 886 if (_machine != _MACH_Pmac) 887 return -ENODEV; 888 889 chip->subframe = 0; 890 chip->revision = 0; 891 chip->freqs_ok = 0xff; /* all ok */ 892 chip->model = PMAC_AWACS; 893 chip->can_byte_swap = 1; 894 chip->can_duplex = 1; 895 chip->can_capture = 1; 896 chip->num_freqs = ARRAY_SIZE(awacs_freqs); 897 chip->freq_table = awacs_freqs; 898 899 chip->control_mask = MASK_IEPC | MASK_IEE | 0x11; /* default */ 900 901 /* check machine type */ 902 if (machine_is_compatible("AAPL,3400/2400") 903 || machine_is_compatible("AAPL,3500")) 904 chip->is_pbook_3400 = 1; 905 else if (machine_is_compatible("PowerBook1,1") 906 || machine_is_compatible("AAPL,PowerBook1998")) 907 chip->is_pbook_G3 = 1; 908 chip->node = find_devices("awacs"); 909 if (chip->node) 910 sound = chip->node; 911 912 /* 913 * powermac G3 models have a node called "davbus" 914 * with a child called "sound". 915 */ 916 if (!chip->node) 917 chip->node = find_devices("davbus"); 918 /* 919 * if we didn't find a davbus device, try 'i2s-a' since 920 * this seems to be what iBooks have 921 */ 922 if (! chip->node) { 923 chip->node = find_devices("i2s-a"); 924 if (chip->node && chip->node->parent && 925 chip->node->parent->parent) { 926 if (device_is_compatible(chip->node->parent->parent, 927 "K2-Keylargo")) 928 chip->is_k2 = 1; 929 } 930 } 931 if (! chip->node) 932 return -ENODEV; 933 934 if (!sound) { 935 sound = find_devices("sound"); 936 while (sound && sound->parent != chip->node) 937 sound = sound->next; 938 } 939 if (! sound) 940 return -ENODEV; 941 prop = (unsigned int *) get_property(sound, "sub-frame", NULL); 942 if (prop && *prop < 16) 943 chip->subframe = *prop; 944 prop = (unsigned int *) get_property(sound, "layout-id", NULL); 945 if (prop) 946 layout_id = *prop; 947 /* This should be verified on older screamers */ 948 if (device_is_compatible(sound, "screamer")) { 949 chip->model = PMAC_SCREAMER; 950 // chip->can_byte_swap = 0; /* FIXME: check this */ 951 } 952 if (device_is_compatible(sound, "burgundy")) { 953 chip->model = PMAC_BURGUNDY; 954 chip->control_mask = MASK_IEPC | 0x11; /* disable IEE */ 955 } 956 if (device_is_compatible(sound, "daca")) { 957 chip->model = PMAC_DACA; 958 chip->can_capture = 0; /* no capture */ 959 chip->can_duplex = 0; 960 // chip->can_byte_swap = 0; /* FIXME: check this */ 961 chip->control_mask = MASK_IEPC | 0x11; /* disable IEE */ 962 } 963 if (device_is_compatible(sound, "tumbler")) { 964 chip->model = PMAC_TUMBLER; 965 chip->can_capture = 0; /* no capture */ 966 chip->can_duplex = 0; 967 // chip->can_byte_swap = 0; /* FIXME: check this */ 968 chip->num_freqs = ARRAY_SIZE(tumbler_freqs); 969 chip->freq_table = tumbler_freqs; 970 chip->control_mask = MASK_IEPC | 0x11; /* disable IEE */ 971 } 972 if (device_is_compatible(sound, "snapper")) { 973 chip->model = PMAC_SNAPPER; 974 // chip->can_byte_swap = 0; /* FIXME: check this */ 975 chip->num_freqs = ARRAY_SIZE(tumbler_freqs); 976 chip->freq_table = tumbler_freqs; 977 chip->control_mask = MASK_IEPC | 0x11; /* disable IEE */ 978 } 979 if (device_is_compatible(sound, "AOAKeylargo") || 980 device_is_compatible(sound, "AOAbase") || 981 device_is_compatible(sound, "AOAK2")) { 982 /* For now, only support very basic TAS3004 based machines with 983 * single frequency until proper i2s control is implemented 984 */ 985 switch(layout_id) { 986 case 0x48: 987 case 0x46: 988 case 0x33: 989 case 0x29: 990 case 0x24: 991 case 0x50: 992 case 0x5c: 993 chip->num_freqs = ARRAY_SIZE(tumbler_freqs); 994 chip->model = PMAC_SNAPPER; 995 chip->can_byte_swap = 0; /* FIXME: check this */ 996 chip->control_mask = MASK_IEPC | 0x11;/* disable IEE */ 997 break; 998 case 0x3a: 999 chip->num_freqs = ARRAY_SIZE(tumbler_freqs); 1000 chip->model = PMAC_TOONIE; 1001 chip->can_byte_swap = 0; /* FIXME: check this */ 1002 chip->control_mask = MASK_IEPC | 0x11;/* disable IEE */ 1003 break; 1004 } 1005 } 1006 prop = (unsigned int *)get_property(sound, "device-id", NULL); 1007 if (prop) 1008 chip->device_id = *prop; 1009 chip->has_iic = (find_devices("perch") != NULL); 1010 1011 /* We need the PCI device for DMA allocations, let's use a crude method 1012 * for now ... 1013 */ 1014 macio = macio_find(chip->node, macio_unknown); 1015 if (macio == NULL) 1016 printk(KERN_WARNING "snd-powermac: can't locate macio !\n"); 1017 else { 1018 struct pci_dev *pdev = NULL; 1019 1020 for_each_pci_dev(pdev) { 1021 struct device_node *np = pci_device_to_OF_node(pdev); 1022 if (np && np == macio->of_node) { 1023 chip->pdev = pdev; 1024 break; 1025 } 1026 } 1027 } 1028 if (chip->pdev == NULL) 1029 printk(KERN_WARNING "snd-powermac: can't locate macio PCI" 1030 " device !\n"); 1031 1032 detect_byte_swap(chip); 1033 1034 /* look for a property saying what sample rates 1035 are available */ 1036 prop = (unsigned int *) get_property(sound, "sample-rates", &l); 1037 if (! prop) 1038 prop = (unsigned int *) get_property(sound, 1039 "output-frame-rates", &l); 1040 if (prop) { 1041 int i; 1042 chip->freqs_ok = 0; 1043 for (l /= sizeof(int); l > 0; --l) { 1044 unsigned int r = *prop++; 1045 /* Apple 'Fixed' format */ 1046 if (r >= 0x10000) 1047 r >>= 16; 1048 for (i = 0; i < chip->num_freqs; ++i) { 1049 if (r == chip->freq_table[i]) { 1050 chip->freqs_ok |= (1 << i); 1051 break; 1052 } 1053 } 1054 } 1055 } else { 1056 /* assume only 44.1khz */ 1057 chip->freqs_ok = 1; 1058 } 1059 1060 return 0; 1061 } 1062 1063 /* 1064 * exported - boolean info callbacks for ease of programming 1065 */ 1066 int snd_pmac_boolean_stereo_info(snd_kcontrol_t *kcontrol, 1067 snd_ctl_elem_info_t *uinfo) 1068 { 1069 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; 1070 uinfo->count = 2; 1071 uinfo->value.integer.min = 0; 1072 uinfo->value.integer.max = 1; 1073 return 0; 1074 } 1075 1076 int snd_pmac_boolean_mono_info(snd_kcontrol_t *kcontrol, 1077 snd_ctl_elem_info_t *uinfo) 1078 { 1079 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; 1080 uinfo->count = 1; 1081 uinfo->value.integer.min = 0; 1082 uinfo->value.integer.max = 1; 1083 return 0; 1084 } 1085 1086 #ifdef PMAC_SUPPORT_AUTOMUTE 1087 /* 1088 * auto-mute 1089 */ 1090 static int pmac_auto_mute_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) 1091 { 1092 pmac_t *chip = snd_kcontrol_chip(kcontrol); 1093 ucontrol->value.integer.value[0] = chip->auto_mute; 1094 return 0; 1095 } 1096 1097 static int pmac_auto_mute_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) 1098 { 1099 pmac_t *chip = snd_kcontrol_chip(kcontrol); 1100 if (ucontrol->value.integer.value[0] != chip->auto_mute) { 1101 chip->auto_mute = ucontrol->value.integer.value[0]; 1102 if (chip->update_automute) 1103 chip->update_automute(chip, 1); 1104 return 1; 1105 } 1106 return 0; 1107 } 1108 1109 static int pmac_hp_detect_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) 1110 { 1111 pmac_t *chip = snd_kcontrol_chip(kcontrol); 1112 if (chip->detect_headphone) 1113 ucontrol->value.integer.value[0] = chip->detect_headphone(chip); 1114 else 1115 ucontrol->value.integer.value[0] = 0; 1116 return 0; 1117 } 1118 1119 static snd_kcontrol_new_t auto_mute_controls[] __initdata = { 1120 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1121 .name = "Auto Mute Switch", 1122 .info = snd_pmac_boolean_mono_info, 1123 .get = pmac_auto_mute_get, 1124 .put = pmac_auto_mute_put, 1125 }, 1126 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1127 .name = "Headphone Detection", 1128 .access = SNDRV_CTL_ELEM_ACCESS_READ, 1129 .info = snd_pmac_boolean_mono_info, 1130 .get = pmac_hp_detect_get, 1131 }, 1132 }; 1133 1134 int __init snd_pmac_add_automute(pmac_t *chip) 1135 { 1136 int err; 1137 chip->auto_mute = 1; 1138 err = snd_ctl_add(chip->card, snd_ctl_new1(&auto_mute_controls[0], chip)); 1139 if (err < 0) { 1140 printk(KERN_ERR "snd-powermac: Failed to add automute control\n"); 1141 return err; 1142 } 1143 chip->hp_detect_ctl = snd_ctl_new1(&auto_mute_controls[1], chip); 1144 return snd_ctl_add(chip->card, chip->hp_detect_ctl); 1145 } 1146 #endif /* PMAC_SUPPORT_AUTOMUTE */ 1147 1148 /* 1149 * create and detect a pmac chip record 1150 */ 1151 int __init snd_pmac_new(snd_card_t *card, pmac_t **chip_return) 1152 { 1153 pmac_t *chip; 1154 struct device_node *np; 1155 int i, err; 1156 unsigned long ctrl_addr, txdma_addr, rxdma_addr; 1157 static snd_device_ops_t ops = { 1158 .dev_free = snd_pmac_dev_free, 1159 }; 1160 1161 snd_runtime_check(chip_return, return -EINVAL); 1162 *chip_return = NULL; 1163 1164 chip = kzalloc(sizeof(*chip), GFP_KERNEL); 1165 if (chip == NULL) 1166 return -ENOMEM; 1167 chip->card = card; 1168 1169 spin_lock_init(&chip->reg_lock); 1170 chip->irq = chip->tx_irq = chip->rx_irq = -1; 1171 1172 chip->playback.stream = SNDRV_PCM_STREAM_PLAYBACK; 1173 chip->capture.stream = SNDRV_PCM_STREAM_CAPTURE; 1174 1175 if ((err = snd_pmac_detect(chip)) < 0) 1176 goto __error; 1177 1178 if (snd_pmac_dbdma_alloc(chip, &chip->playback.cmd, PMAC_MAX_FRAGS + 1) < 0 || 1179 snd_pmac_dbdma_alloc(chip, &chip->capture.cmd, PMAC_MAX_FRAGS + 1) < 0 || 1180 snd_pmac_dbdma_alloc(chip, &chip->extra_dma, 2) < 0) { 1181 err = -ENOMEM; 1182 goto __error; 1183 } 1184 1185 np = chip->node; 1186 if (chip->is_k2) { 1187 if (np->parent->n_addrs < 2 || np->n_intrs < 3) { 1188 err = -ENODEV; 1189 goto __error; 1190 } 1191 for (i = 0; i < 2; i++) { 1192 #ifndef CONFIG_PPC64 1193 static char *name[2] = { "- Control", "- DMA" }; 1194 if (! request_OF_resource(np->parent, i, name[i])) { 1195 snd_printk(KERN_ERR "pmac: can't request resource %d!\n", i); 1196 err = -ENODEV; 1197 goto __error; 1198 } 1199 chip->of_requested |= (1 << i); 1200 #endif /* CONFIG_PPC64 */ 1201 ctrl_addr = np->parent->addrs[0].address; 1202 txdma_addr = np->parent->addrs[1].address; 1203 rxdma_addr = txdma_addr + 0x100; 1204 } 1205 1206 } else { 1207 if (np->n_addrs < 3 || np->n_intrs < 3) { 1208 err = -ENODEV; 1209 goto __error; 1210 } 1211 1212 for (i = 0; i < 3; i++) { 1213 #ifndef CONFIG_PPC64 1214 static char *name[3] = { "- Control", "- Tx DMA", "- Rx DMA" }; 1215 if (! request_OF_resource(np, i, name[i])) { 1216 snd_printk(KERN_ERR "pmac: can't request resource %d!\n", i); 1217 err = -ENODEV; 1218 goto __error; 1219 } 1220 chip->of_requested |= (1 << i); 1221 #endif /* CONFIG_PPC64 */ 1222 ctrl_addr = np->addrs[0].address; 1223 txdma_addr = np->addrs[1].address; 1224 rxdma_addr = np->addrs[2].address; 1225 } 1226 } 1227 1228 chip->awacs = ioremap(ctrl_addr, 0x1000); 1229 chip->playback.dma = ioremap(txdma_addr, 0x100); 1230 chip->capture.dma = ioremap(rxdma_addr, 0x100); 1231 if (chip->model <= PMAC_BURGUNDY) { 1232 if (request_irq(np->intrs[0].line, snd_pmac_ctrl_intr, 0, 1233 "PMac", (void*)chip)) { 1234 snd_printk(KERN_ERR "pmac: unable to grab IRQ %d\n", np->intrs[0].line); 1235 err = -EBUSY; 1236 goto __error; 1237 } 1238 chip->irq = np->intrs[0].line; 1239 } 1240 if (request_irq(np->intrs[1].line, snd_pmac_tx_intr, 0, 1241 "PMac Output", (void*)chip)) { 1242 snd_printk(KERN_ERR "pmac: unable to grab IRQ %d\n", np->intrs[1].line); 1243 err = -EBUSY; 1244 goto __error; 1245 } 1246 chip->tx_irq = np->intrs[1].line; 1247 if (request_irq(np->intrs[2].line, snd_pmac_rx_intr, 0, 1248 "PMac Input", (void*)chip)) { 1249 snd_printk(KERN_ERR "pmac: unable to grab IRQ %d\n", np->intrs[2].line); 1250 err = -EBUSY; 1251 goto __error; 1252 } 1253 chip->rx_irq = np->intrs[2].line; 1254 1255 snd_pmac_sound_feature(chip, 1); 1256 1257 /* reset */ 1258 if (chip->model == PMAC_AWACS) 1259 out_le32(&chip->awacs->control, 0x11); 1260 1261 /* Powerbooks have odd ways of enabling inputs such as 1262 an expansion-bay CD or sound from an internal modem 1263 or a PC-card modem. */ 1264 if (chip->is_pbook_3400) { 1265 /* Enable CD and PC-card sound inputs. */ 1266 /* This is done by reading from address 1267 * f301a000, + 0x10 to enable the expansion-bay 1268 * CD sound input, + 0x80 to enable the PC-card 1269 * sound input. The 0x100 enables the SCSI bus 1270 * terminator power. 1271 */ 1272 chip->latch_base = ioremap (0xf301a000, 0x1000); 1273 in_8(chip->latch_base + 0x190); 1274 } else if (chip->is_pbook_G3) { 1275 struct device_node* mio; 1276 for (mio = chip->node->parent; mio; mio = mio->parent) { 1277 if (strcmp(mio->name, "mac-io") == 0 1278 && mio->n_addrs > 0) { 1279 chip->macio_base = ioremap(mio->addrs[0].address, 0x40); 1280 break; 1281 } 1282 } 1283 /* Enable CD sound input. */ 1284 /* The relevant bits for writing to this byte are 0x8f. 1285 * I haven't found out what the 0x80 bit does. 1286 * For the 0xf bits, writing 3 or 7 enables the CD 1287 * input, any other value disables it. Values 1288 * 1, 3, 5, 7 enable the microphone. Values 0, 2, 1289 * 4, 6, 8 - f enable the input from the modem. 1290 */ 1291 if (chip->macio_base) 1292 out_8(chip->macio_base + 0x37, 3); 1293 } 1294 1295 /* Reset dbdma channels */ 1296 snd_pmac_dbdma_reset(chip); 1297 1298 #ifdef CONFIG_PM 1299 /* add sleep notifier */ 1300 if (! snd_pmac_register_sleep_notifier(chip)) 1301 snd_card_set_pm_callback(chip->card, snd_pmac_suspend, snd_pmac_resume, chip); 1302 #endif 1303 1304 if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) 1305 goto __error; 1306 1307 *chip_return = chip; 1308 return 0; 1309 1310 __error: 1311 if (chip->pdev) 1312 pci_dev_put(chip->pdev); 1313 snd_pmac_free(chip); 1314 return err; 1315 } 1316 1317 1318 /* 1319 * sleep notify for powerbook 1320 */ 1321 1322 #ifdef CONFIG_PM 1323 1324 /* 1325 * Save state when going to sleep, restore it afterwards. 1326 */ 1327 1328 static int snd_pmac_suspend(snd_card_t *card, pm_message_t state) 1329 { 1330 pmac_t *chip = card->pm_private_data; 1331 unsigned long flags; 1332 1333 if (chip->suspend) 1334 chip->suspend(chip); 1335 snd_pcm_suspend_all(chip->pcm); 1336 spin_lock_irqsave(&chip->reg_lock, flags); 1337 snd_pmac_beep_stop(chip); 1338 spin_unlock_irqrestore(&chip->reg_lock, flags); 1339 if (chip->irq >= 0) 1340 disable_irq(chip->irq); 1341 if (chip->tx_irq >= 0) 1342 disable_irq(chip->tx_irq); 1343 if (chip->rx_irq >= 0) 1344 disable_irq(chip->rx_irq); 1345 snd_pmac_sound_feature(chip, 0); 1346 return 0; 1347 } 1348 1349 static int snd_pmac_resume(snd_card_t *card) 1350 { 1351 pmac_t *chip = card->pm_private_data; 1352 1353 snd_pmac_sound_feature(chip, 1); 1354 if (chip->resume) 1355 chip->resume(chip); 1356 /* enable CD sound input */ 1357 if (chip->macio_base && chip->is_pbook_G3) { 1358 out_8(chip->macio_base + 0x37, 3); 1359 } else if (chip->is_pbook_3400) { 1360 in_8(chip->latch_base + 0x190); 1361 } 1362 1363 snd_pmac_pcm_set_format(chip); 1364 1365 if (chip->irq >= 0) 1366 enable_irq(chip->irq); 1367 if (chip->tx_irq >= 0) 1368 enable_irq(chip->tx_irq); 1369 if (chip->rx_irq >= 0) 1370 enable_irq(chip->rx_irq); 1371 1372 return 0; 1373 } 1374 1375 /* the chip is stored statically by snd_pmac_register_sleep_notifier 1376 * because we can't have any private data for notify callback. 1377 */ 1378 static pmac_t *sleeping_pmac = NULL; 1379 1380 static int snd_pmac_sleep_notify(struct pmu_sleep_notifier *self, int when) 1381 { 1382 pmac_t *chip; 1383 1384 chip = sleeping_pmac; 1385 snd_runtime_check(chip, return 0); 1386 1387 switch (when) { 1388 case PBOOK_SLEEP_NOW: 1389 snd_pmac_suspend(chip->card, PMSG_SUSPEND); 1390 break; 1391 case PBOOK_WAKE: 1392 snd_pmac_resume(chip->card); 1393 break; 1394 } 1395 return PBOOK_SLEEP_OK; 1396 } 1397 1398 static struct pmu_sleep_notifier snd_pmac_sleep_notifier = { 1399 snd_pmac_sleep_notify, SLEEP_LEVEL_SOUND, 1400 }; 1401 1402 static int __init snd_pmac_register_sleep_notifier(pmac_t *chip) 1403 { 1404 /* should be protected here.. */ 1405 snd_assert(! sleeping_pmac, return -EBUSY); 1406 sleeping_pmac = chip; 1407 pmu_register_sleep_notifier(&snd_pmac_sleep_notifier); 1408 return 0; 1409 } 1410 1411 static int snd_pmac_unregister_sleep_notifier(pmac_t *chip) 1412 { 1413 /* should be protected here.. */ 1414 snd_assert(sleeping_pmac == chip, return -ENODEV); 1415 pmu_unregister_sleep_notifier(&snd_pmac_sleep_notifier); 1416 sleeping_pmac = NULL; 1417 return 0; 1418 } 1419 1420 #endif /* CONFIG_PM */ 1421 1422