Lines Matching +full:chip +full:- +full:to +full:- +full:chip

2  * C-Media CMI8788 driver - main driver module
16 * along with this driver; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
36 MODULE_DESCRIPTION("C-Media CMI8788 helper library");
41 static inline int oxygen_uart_input_ready(struct oxygen *chip) in oxygen_uart_input_ready() argument
43 return !(oxygen_read8(chip, OXYGEN_MPU401 + 1) & MPU401_RX_EMPTY); in oxygen_uart_input_ready()
46 static void oxygen_read_uart(struct oxygen *chip) in oxygen_read_uart() argument
48 if (unlikely(!oxygen_uart_input_ready(chip))) { in oxygen_read_uart()
49 /* no data, but read it anyway to clear the interrupt */ in oxygen_read_uart()
50 oxygen_read8(chip, OXYGEN_MPU401); in oxygen_read_uart()
54 u8 data = oxygen_read8(chip, OXYGEN_MPU401); in oxygen_read_uart()
57 if (chip->uart_input_count >= ARRAY_SIZE(chip->uart_input)) in oxygen_read_uart()
58 chip->uart_input_count = 0; in oxygen_read_uart()
59 chip->uart_input[chip->uart_input_count++] = data; in oxygen_read_uart()
60 } while (oxygen_uart_input_ready(chip)); in oxygen_read_uart()
61 if (chip->model.uart_input) in oxygen_read_uart()
62 chip->model.uart_input(chip); in oxygen_read_uart()
67 struct oxygen *chip = dev_id; in oxygen_interrupt() local
70 status = oxygen_read16(chip, OXYGEN_INTERRUPT_STATUS); in oxygen_interrupt()
74 spin_lock(&chip->reg_lock); in oxygen_interrupt()
87 chip->interrupt_mask &= ~OXYGEN_INT_SPDIF_IN_DETECT; in oxygen_interrupt()
88 oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, in oxygen_interrupt()
89 chip->interrupt_mask & ~clear); in oxygen_interrupt()
90 oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, in oxygen_interrupt()
91 chip->interrupt_mask); in oxygen_interrupt()
94 elapsed_streams = status & chip->pcm_running; in oxygen_interrupt()
96 spin_unlock(&chip->reg_lock); in oxygen_interrupt()
99 if ((elapsed_streams & (1 << i)) && chip->streams[i]) in oxygen_interrupt()
100 snd_pcm_period_elapsed(chip->streams[i]); in oxygen_interrupt()
103 spin_lock(&chip->reg_lock); in oxygen_interrupt()
104 i = oxygen_read32(chip, OXYGEN_SPDIF_CONTROL); in oxygen_interrupt()
107 /* write the interrupt bit(s) to clear */ in oxygen_interrupt()
108 oxygen_write32(chip, OXYGEN_SPDIF_CONTROL, i); in oxygen_interrupt()
109 schedule_work(&chip->spdif_input_bits_work); in oxygen_interrupt()
111 spin_unlock(&chip->reg_lock); in oxygen_interrupt()
115 schedule_work(&chip->gpio_work); in oxygen_interrupt()
118 if (chip->midi) in oxygen_interrupt()
119 snd_mpu401_uart_interrupt(0, chip->midi->private_data); in oxygen_interrupt()
121 oxygen_read_uart(chip); in oxygen_interrupt()
125 wake_up(&chip->ac97_waitqueue); in oxygen_interrupt()
132 struct oxygen *chip = container_of(work, struct oxygen, in oxygen_spdif_input_bits_changed() local
142 spin_lock_irq(&chip->reg_lock); in oxygen_spdif_input_bits_changed()
143 reg = oxygen_read32(chip, OXYGEN_SPDIF_CONTROL); in oxygen_spdif_input_bits_changed()
148 * If we detect activity on the SPDIF input but cannot lock to in oxygen_spdif_input_bits_changed()
149 * a signal, the clock bit is likely to be wrong. in oxygen_spdif_input_bits_changed()
152 oxygen_write32(chip, OXYGEN_SPDIF_CONTROL, reg); in oxygen_spdif_input_bits_changed()
153 spin_unlock_irq(&chip->reg_lock); in oxygen_spdif_input_bits_changed()
155 spin_lock_irq(&chip->reg_lock); in oxygen_spdif_input_bits_changed()
156 reg = oxygen_read32(chip, OXYGEN_SPDIF_CONTROL); in oxygen_spdif_input_bits_changed()
164 * Reset clock to <= 96 kHz because this is in oxygen_spdif_input_bits_changed()
165 * more likely to be received next time. in oxygen_spdif_input_bits_changed()
169 oxygen_write32(chip, OXYGEN_SPDIF_CONTROL, reg); in oxygen_spdif_input_bits_changed()
173 spin_unlock_irq(&chip->reg_lock); in oxygen_spdif_input_bits_changed()
175 if (chip->controls[CONTROL_SPDIF_INPUT_BITS]) { in oxygen_spdif_input_bits_changed()
176 spin_lock_irq(&chip->reg_lock); in oxygen_spdif_input_bits_changed()
177 chip->interrupt_mask |= OXYGEN_INT_SPDIF_IN_DETECT; in oxygen_spdif_input_bits_changed()
178 oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, in oxygen_spdif_input_bits_changed()
179 chip->interrupt_mask); in oxygen_spdif_input_bits_changed()
180 spin_unlock_irq(&chip->reg_lock); in oxygen_spdif_input_bits_changed()
184 * changed, but let's send a notification just to be sure. in oxygen_spdif_input_bits_changed()
186 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, in oxygen_spdif_input_bits_changed()
187 &chip->controls[CONTROL_SPDIF_INPUT_BITS]->id); in oxygen_spdif_input_bits_changed()
193 struct oxygen *chip = container_of(work, struct oxygen, gpio_work); in oxygen_gpio_changed() local
195 if (chip->model.gpio_changed) in oxygen_gpio_changed()
196 chip->model.gpio_changed(chip); in oxygen_gpio_changed()
203 struct oxygen *chip = entry->private_data; in oxygen_proc_read() local
206 switch (oxygen_read8(chip, OXYGEN_REVISION) & OXYGEN_PACKAGE_ID_MASK) { in oxygen_proc_read()
216 snd_iprintf(buffer, " %02x", oxygen_read8(chip, i + j)); in oxygen_proc_read()
219 if (mutex_lock_interruptible(&chip->mutex) < 0) in oxygen_proc_read()
221 if (chip->has_ac97_0) { in oxygen_proc_read()
227 oxygen_read_ac97(chip, 0, i + j)); in oxygen_proc_read()
231 if (chip->has_ac97_1) { in oxygen_proc_read()
237 oxygen_read_ac97(chip, 1, i + j)); in oxygen_proc_read()
241 mutex_unlock(&chip->mutex); in oxygen_proc_read()
242 if (chip->model.dump_registers) in oxygen_proc_read()
243 chip->model.dump_registers(chip, buffer); in oxygen_proc_read()
246 static void oxygen_proc_init(struct oxygen *chip) in oxygen_proc_init() argument
250 if (!snd_card_proc_new(chip->card, "oxygen", &entry)) in oxygen_proc_init()
251 snd_info_set_text_ops(entry, chip, oxygen_proc_read); in oxygen_proc_init()
254 #define oxygen_proc_init(chip) argument
258 oxygen_search_pci_id(struct oxygen *chip, const struct pci_device_id ids[]) in oxygen_search_pci_id() argument
266 oxygen_clear_bits8(chip, OXYGEN_FUNCTION, in oxygen_search_pci_id()
270 * chip didn't if the first EEPROM word was overwritten. in oxygen_search_pci_id()
272 subdevice = oxygen_read_eeprom(chip, 2); in oxygen_search_pci_id()
274 if (subdevice == 0xffff && oxygen_read_eeprom(chip, 1) == 0xffff) in oxygen_search_pci_id()
281 for (; ids->vendor; ++ids) in oxygen_search_pci_id()
282 if (ids->subdevice == subdevice && in oxygen_search_pci_id()
283 ids->driver_data != BROKEN_EEPROM_DRIVER_DATA) in oxygen_search_pci_id()
288 static void oxygen_restore_eeprom(struct oxygen *chip, in oxygen_restore_eeprom() argument
293 eeprom_id = oxygen_read_eeprom(chip, 0); in oxygen_restore_eeprom()
295 (eeprom_id != 0xffff || id->subdevice != 0x8788)) { in oxygen_restore_eeprom()
300 * been able to deduce the correct subsystem vendor ID, and in oxygen_restore_eeprom()
301 * this is enough information to restore the original EEPROM in oxygen_restore_eeprom()
304 oxygen_write_eeprom(chip, 1, id->subvendor); in oxygen_restore_eeprom()
305 oxygen_write_eeprom(chip, 0, OXYGEN_EEPROM_ID); in oxygen_restore_eeprom()
307 oxygen_set_bits8(chip, OXYGEN_MISC, in oxygen_restore_eeprom()
309 pci_write_config_word(chip->pci, PCI_SUBSYSTEM_VENDOR_ID, in oxygen_restore_eeprom()
310 id->subvendor); in oxygen_restore_eeprom()
311 pci_write_config_word(chip->pci, PCI_SUBSYSTEM_ID, in oxygen_restore_eeprom()
312 id->subdevice); in oxygen_restore_eeprom()
313 oxygen_clear_bits8(chip, OXYGEN_MISC, in oxygen_restore_eeprom()
333 if (!pci->bus || !pci->bus->self) in configure_pcie_bridge()
335 bridge = pci->bus->self; in configure_pcie_bridge()
341 switch (id->driver_data) { in configure_pcie_bridge()
351 tmp |= 2 << 27; /* set prefetch size to 128 bytes */ in configure_pcie_bridge()
357 tmp |= 1; /* park the PCI arbiter to the sound chip */ in configure_pcie_bridge()
363 static void oxygen_init(struct oxygen *chip) in oxygen_init() argument
367 chip->dac_routing = 1; in oxygen_init()
369 chip->dac_volume[i] = chip->model.dac_volume_min; in oxygen_init()
370 chip->dac_mute = 1; in oxygen_init()
371 chip->spdif_playback_enable = 1; in oxygen_init()
372 chip->spdif_bits = OXYGEN_SPDIF_C | OXYGEN_SPDIF_ORIGINAL | in oxygen_init()
374 chip->spdif_pcm_bits = chip->spdif_bits; in oxygen_init()
376 if (!(oxygen_read8(chip, OXYGEN_REVISION) & OXYGEN_REVISION_2)) in oxygen_init()
377 oxygen_set_bits8(chip, OXYGEN_MISC, in oxygen_init()
380 i = oxygen_read16(chip, OXYGEN_AC97_CONTROL); in oxygen_init()
381 chip->has_ac97_0 = (i & OXYGEN_AC97_CODEC_0) != 0; in oxygen_init()
382 chip->has_ac97_1 = (i & OXYGEN_AC97_CODEC_1) != 0; in oxygen_init()
384 oxygen_write8_masked(chip, OXYGEN_FUNCTION, in oxygen_init()
386 chip->model.function_flags, in oxygen_init()
390 oxygen_write8(chip, OXYGEN_DMA_STATUS, 0); in oxygen_init()
391 oxygen_write8(chip, OXYGEN_DMA_PAUSE, 0); in oxygen_init()
392 oxygen_write8(chip, OXYGEN_PLAY_CHANNELS, in oxygen_init()
396 oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, 0); in oxygen_init()
397 oxygen_write8_masked(chip, OXYGEN_MISC, in oxygen_init()
398 chip->model.misc_flags, in oxygen_init()
404 oxygen_write8(chip, OXYGEN_REC_FORMAT, in oxygen_init()
408 oxygen_write8(chip, OXYGEN_PLAY_FORMAT, in oxygen_init()
411 oxygen_write8(chip, OXYGEN_REC_CHANNELS, OXYGEN_REC_CHANNELS_2_2_2); in oxygen_init()
412 oxygen_write16(chip, OXYGEN_I2S_MULTICH_FORMAT, in oxygen_init()
414 chip->model.dac_i2s_format | in oxygen_init()
415 OXYGEN_I2S_MCLK(chip->model.dac_mclks) | in oxygen_init()
419 if (chip->model.device_config & CAPTURE_0_FROM_I2S_1) in oxygen_init()
420 oxygen_write16(chip, OXYGEN_I2S_A_FORMAT, in oxygen_init()
422 chip->model.adc_i2s_format | in oxygen_init()
423 OXYGEN_I2S_MCLK(chip->model.adc_mclks) | in oxygen_init()
428 oxygen_write16(chip, OXYGEN_I2S_A_FORMAT, in oxygen_init()
431 if (chip->model.device_config & (CAPTURE_0_FROM_I2S_2 | in oxygen_init()
433 oxygen_write16(chip, OXYGEN_I2S_B_FORMAT, in oxygen_init()
435 chip->model.adc_i2s_format | in oxygen_init()
436 OXYGEN_I2S_MCLK(chip->model.adc_mclks) | in oxygen_init()
441 oxygen_write16(chip, OXYGEN_I2S_B_FORMAT, in oxygen_init()
444 oxygen_write16(chip, OXYGEN_I2S_C_FORMAT, in oxygen_init()
447 oxygen_clear_bits32(chip, OXYGEN_SPDIF_CONTROL, in oxygen_init()
450 if (chip->model.device_config & CAPTURE_1_FROM_SPDIF) in oxygen_init()
451 oxygen_write32_masked(chip, OXYGEN_SPDIF_CONTROL, in oxygen_init()
464 oxygen_clear_bits32(chip, OXYGEN_SPDIF_CONTROL, in oxygen_init()
468 oxygen_write32(chip, OXYGEN_SPDIF_OUTPUT_BITS, chip->spdif_bits); in oxygen_init()
469 oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS, in oxygen_init()
473 oxygen_clear_bits8(chip, OXYGEN_MPU401_CONTROL, OXYGEN_MPU401_LOOPBACK); in oxygen_init()
474 oxygen_write8(chip, OXYGEN_GPI_INTERRUPT_MASK, 0); in oxygen_init()
475 oxygen_write16(chip, OXYGEN_GPIO_INTERRUPT_MASK, 0); in oxygen_init()
476 oxygen_write16(chip, OXYGEN_PLAY_ROUTING, in oxygen_init()
483 oxygen_write8(chip, OXYGEN_REC_ROUTING, in oxygen_init()
487 oxygen_write8(chip, OXYGEN_ADC_MONITOR, 0); in oxygen_init()
488 oxygen_write8(chip, OXYGEN_A_MONITOR_ROUTING, in oxygen_init()
494 if (chip->has_ac97_0 | chip->has_ac97_1) in oxygen_init()
495 oxygen_write8(chip, OXYGEN_AC97_INTERRUPT_MASK, in oxygen_init()
499 oxygen_write8(chip, OXYGEN_AC97_INTERRUPT_MASK, 0); in oxygen_init()
500 oxygen_write32(chip, OXYGEN_AC97_OUT_CONFIG, 0); in oxygen_init()
501 oxygen_write32(chip, OXYGEN_AC97_IN_CONFIG, 0); in oxygen_init()
502 if (!(chip->has_ac97_0 | chip->has_ac97_1)) in oxygen_init()
503 oxygen_set_bits16(chip, OXYGEN_AC97_CONTROL, in oxygen_init()
505 if (!chip->has_ac97_0) { in oxygen_init()
506 oxygen_set_bits16(chip, OXYGEN_AC97_CONTROL, in oxygen_init()
509 oxygen_write_ac97(chip, 0, AC97_RESET, 0); in oxygen_init()
511 oxygen_ac97_set_bits(chip, 0, CM9780_GPIO_SETUP, in oxygen_init()
513 oxygen_ac97_set_bits(chip, 0, CM9780_MIXER, in oxygen_init()
516 oxygen_ac97_set_bits(chip, 0, CM9780_JACK, in oxygen_init()
520 oxygen_write_ac97(chip, 0, AC97_MASTER, 0x0000); in oxygen_init()
521 oxygen_write_ac97(chip, 0, AC97_PC_BEEP, 0x8000); in oxygen_init()
522 oxygen_write_ac97(chip, 0, AC97_MIC, 0x8808); in oxygen_init()
523 oxygen_write_ac97(chip, 0, AC97_LINE, 0x0808); in oxygen_init()
524 oxygen_write_ac97(chip, 0, AC97_CD, 0x8808); in oxygen_init()
525 oxygen_write_ac97(chip, 0, AC97_VIDEO, 0x8808); in oxygen_init()
526 oxygen_write_ac97(chip, 0, AC97_AUX, 0x8808); in oxygen_init()
527 oxygen_write_ac97(chip, 0, AC97_REC_GAIN, 0x8000); in oxygen_init()
528 oxygen_write_ac97(chip, 0, AC97_CENTER_LFE_MASTER, 0x8080); in oxygen_init()
529 oxygen_write_ac97(chip, 0, AC97_SURROUND_MASTER, 0x8080); in oxygen_init()
530 oxygen_ac97_clear_bits(chip, 0, CM9780_GPIO_STATUS, in oxygen_init()
533 oxygen_ac97_set_bits(chip, 0, AC97_POWERDOWN, in oxygen_init()
535 oxygen_ac97_set_bits(chip, 0, AC97_EXTENDED_STATUS, in oxygen_init()
538 if (chip->has_ac97_1) { in oxygen_init()
539 oxygen_set_bits32(chip, OXYGEN_AC97_OUT_CONFIG, in oxygen_init()
542 oxygen_write_ac97(chip, 1, AC97_RESET, 0); in oxygen_init()
544 oxygen_write_ac97(chip, 1, AC97_MASTER, 0x0000); in oxygen_init()
545 oxygen_write_ac97(chip, 1, AC97_HEADPHONE, 0x8000); in oxygen_init()
546 oxygen_write_ac97(chip, 1, AC97_PC_BEEP, 0x8000); in oxygen_init()
547 oxygen_write_ac97(chip, 1, AC97_MIC, 0x8808); in oxygen_init()
548 oxygen_write_ac97(chip, 1, AC97_LINE, 0x8808); in oxygen_init()
549 oxygen_write_ac97(chip, 1, AC97_CD, 0x8808); in oxygen_init()
550 oxygen_write_ac97(chip, 1, AC97_VIDEO, 0x8808); in oxygen_init()
551 oxygen_write_ac97(chip, 1, AC97_AUX, 0x8808); in oxygen_init()
552 oxygen_write_ac97(chip, 1, AC97_PCM, 0x0808); in oxygen_init()
553 oxygen_write_ac97(chip, 1, AC97_REC_SEL, 0x0000); in oxygen_init()
554 oxygen_write_ac97(chip, 1, AC97_REC_GAIN, 0x0000); in oxygen_init()
555 oxygen_ac97_set_bits(chip, 1, 0x6a, 0x0040); in oxygen_init()
559 static void oxygen_shutdown(struct oxygen *chip) in oxygen_shutdown() argument
561 spin_lock_irq(&chip->reg_lock); in oxygen_shutdown()
562 chip->interrupt_mask = 0; in oxygen_shutdown()
563 chip->pcm_running = 0; in oxygen_shutdown()
564 oxygen_write16(chip, OXYGEN_DMA_STATUS, 0); in oxygen_shutdown()
565 oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, 0); in oxygen_shutdown()
566 spin_unlock_irq(&chip->reg_lock); in oxygen_shutdown()
571 struct oxygen *chip = card->private_data; in oxygen_card_free() local
573 oxygen_shutdown(chip); in oxygen_card_free()
574 if (chip->irq >= 0) in oxygen_card_free()
575 free_irq(chip->irq, chip); in oxygen_card_free()
576 flush_work_sync(&chip->spdif_input_bits_work); in oxygen_card_free()
577 flush_work_sync(&chip->gpio_work); in oxygen_card_free()
578 chip->model.cleanup(chip); in oxygen_card_free()
579 kfree(chip->model_data); in oxygen_card_free()
580 mutex_destroy(&chip->mutex); in oxygen_card_free()
581 pci_release_regions(chip->pci); in oxygen_card_free()
582 pci_disable_device(chip->pci); in oxygen_card_free()
588 int (*get_model)(struct oxygen *chip, in oxygen_pci_probe() argument
594 struct oxygen *chip; in oxygen_pci_probe() local
598 err = snd_card_create(index, id, owner, sizeof(*chip), &card); in oxygen_pci_probe()
602 chip = card->private_data; in oxygen_pci_probe()
603 chip->card = card; in oxygen_pci_probe()
604 chip->pci = pci; in oxygen_pci_probe()
605 chip->irq = -1; in oxygen_pci_probe()
606 spin_lock_init(&chip->reg_lock); in oxygen_pci_probe()
607 mutex_init(&chip->mutex); in oxygen_pci_probe()
608 INIT_WORK(&chip->spdif_input_bits_work, in oxygen_pci_probe()
610 INIT_WORK(&chip->gpio_work, oxygen_gpio_changed); in oxygen_pci_probe()
611 init_waitqueue_head(&chip->ac97_waitqueue); in oxygen_pci_probe()
626 err = -ENXIO; in oxygen_pci_probe()
629 chip->addr = pci_resource_start(pci, 0); in oxygen_pci_probe()
631 pci_id = oxygen_search_pci_id(chip, ids); in oxygen_pci_probe()
633 err = -ENODEV; in oxygen_pci_probe()
636 oxygen_restore_eeprom(chip, pci_id); in oxygen_pci_probe()
637 err = get_model(chip, pci_id); in oxygen_pci_probe()
641 if (chip->model.model_data_size) { in oxygen_pci_probe()
642 chip->model_data = kzalloc(chip->model.model_data_size, in oxygen_pci_probe()
644 if (!chip->model_data) { in oxygen_pci_probe()
645 err = -ENOMEM; in oxygen_pci_probe()
651 snd_card_set_dev(card, &pci->dev); in oxygen_pci_probe()
652 card->private_free = oxygen_card_free; in oxygen_pci_probe()
655 oxygen_init(chip); in oxygen_pci_probe()
656 chip->model.init(chip); in oxygen_pci_probe()
658 err = request_irq(pci->irq, oxygen_interrupt, IRQF_SHARED, in oxygen_pci_probe()
659 KBUILD_MODNAME, chip); in oxygen_pci_probe()
661 snd_printk(KERN_ERR "cannot grab interrupt %d\n", pci->irq); in oxygen_pci_probe()
664 chip->irq = pci->irq; in oxygen_pci_probe()
666 strcpy(card->driver, chip->model.chip); in oxygen_pci_probe()
667 strcpy(card->shortname, chip->model.shortname); in oxygen_pci_probe()
668 sprintf(card->longname, "%s at %#lx, irq %i", in oxygen_pci_probe()
669 chip->model.longname, chip->addr, chip->irq); in oxygen_pci_probe()
670 strcpy(card->mixername, chip->model.chip); in oxygen_pci_probe()
671 snd_component_add(card, chip->model.chip); in oxygen_pci_probe()
673 err = oxygen_pcm_init(chip); in oxygen_pci_probe()
677 err = oxygen_mixer_init(chip); in oxygen_pci_probe()
681 if (chip->model.device_config & (MIDI_OUTPUT | MIDI_INPUT)) { in oxygen_pci_probe()
684 if (chip->model.device_config & MIDI_OUTPUT) in oxygen_pci_probe()
686 if (chip->model.device_config & MIDI_INPUT) in oxygen_pci_probe()
689 chip->addr + OXYGEN_MPU401, in oxygen_pci_probe()
690 info_flags, -1, &chip->midi); in oxygen_pci_probe()
695 oxygen_proc_init(chip); in oxygen_pci_probe()
697 spin_lock_irq(&chip->reg_lock); in oxygen_pci_probe()
698 if (chip->model.device_config & CAPTURE_1_FROM_SPDIF) in oxygen_pci_probe()
699 chip->interrupt_mask |= OXYGEN_INT_SPDIF_IN_DETECT; in oxygen_pci_probe()
700 if (chip->has_ac97_0 | chip->has_ac97_1) in oxygen_pci_probe()
701 chip->interrupt_mask |= OXYGEN_INT_AC97; in oxygen_pci_probe()
702 oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, chip->interrupt_mask); in oxygen_pci_probe()
703 spin_unlock_irq(&chip->reg_lock); in oxygen_pci_probe()
733 struct oxygen *chip = card->private_data; in oxygen_pci_suspend() local
739 if (chip->streams[i]) in oxygen_pci_suspend()
740 snd_pcm_suspend(chip->streams[i]); in oxygen_pci_suspend()
742 if (chip->model.suspend) in oxygen_pci_suspend()
743 chip->model.suspend(chip); in oxygen_pci_suspend()
745 spin_lock_irq(&chip->reg_lock); in oxygen_pci_suspend()
746 saved_interrupt_mask = chip->interrupt_mask; in oxygen_pci_suspend()
747 chip->interrupt_mask = 0; in oxygen_pci_suspend()
748 oxygen_write16(chip, OXYGEN_DMA_STATUS, 0); in oxygen_pci_suspend()
749 oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, 0); in oxygen_pci_suspend()
750 spin_unlock_irq(&chip->reg_lock); in oxygen_pci_suspend()
752 synchronize_irq(chip->irq); in oxygen_pci_suspend()
753 flush_work_sync(&chip->spdif_input_bits_work); in oxygen_pci_suspend()
754 flush_work_sync(&chip->gpio_work); in oxygen_pci_suspend()
755 chip->interrupt_mask = saved_interrupt_mask; in oxygen_pci_suspend()
778 static void oxygen_restore_ac97(struct oxygen *chip, unsigned int codec) in oxygen_restore_ac97() argument
782 oxygen_write_ac97(chip, codec, AC97_RESET, 0); in oxygen_restore_ac97()
786 oxygen_write_ac97(chip, codec, i * 2, in oxygen_restore_ac97()
787 chip->saved_ac97_registers[codec][i]); in oxygen_restore_ac97()
793 struct oxygen *chip = card->private_data; in oxygen_pci_resume() local
801 return -EIO; in oxygen_pci_resume()
805 oxygen_write16(chip, OXYGEN_DMA_STATUS, 0); in oxygen_pci_resume()
806 oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, 0); in oxygen_pci_resume()
809 oxygen_write8(chip, i, chip->saved_registers._8[i]); in oxygen_pci_resume()
810 if (chip->has_ac97_0) in oxygen_pci_resume()
811 oxygen_restore_ac97(chip, 0); in oxygen_pci_resume()
812 if (chip->has_ac97_1) in oxygen_pci_resume()
813 oxygen_restore_ac97(chip, 1); in oxygen_pci_resume()
815 if (chip->model.resume) in oxygen_pci_resume()
816 chip->model.resume(chip); in oxygen_pci_resume()
818 oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, chip->interrupt_mask); in oxygen_pci_resume()
829 struct oxygen *chip = card->private_data; in oxygen_pci_shutdown() local
831 oxygen_shutdown(chip); in oxygen_pci_shutdown()
832 chip->model.cleanup(chip); in oxygen_pci_shutdown()