Lines Matching refs:emu

50 void snd_emu10k1_voice_init(struct snd_emu10k1 *emu, int ch)  in snd_emu10k1_voice_init()  argument
52 snd_emu10k1_ptr_write_multiple(emu, ch, in snd_emu10k1_voice_init()
85 if (emu->audigy) { in snd_emu10k1_voice_init()
86 snd_emu10k1_ptr_write_multiple(emu, ch, in snd_emu10k1_voice_init()
138 static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir) in snd_emu10k1_init() argument
146 HCFG_MUTEBUTTONENABLE, emu->port + HCFG); in snd_emu10k1_init()
148 outl(0, emu->port + INTE); in snd_emu10k1_init()
150 snd_emu10k1_ptr_write_multiple(emu, 0, in snd_emu10k1_init()
169 if (emu->audigy) { in snd_emu10k1_init()
171 snd_emu10k1_ptr_write(emu, SPBYPASS, 0, SPBYPASS_FORMAT); in snd_emu10k1_init()
173 snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_REAR_RIGHT | in snd_emu10k1_init()
179 snd_emu10k1_voice_init(emu, ch); in snd_emu10k1_init()
181 snd_emu10k1_ptr_write_multiple(emu, 0, in snd_emu10k1_init()
182 SPCS0, emu->spdif_bits[0], in snd_emu10k1_init()
183 SPCS1, emu->spdif_bits[1], in snd_emu10k1_init()
184 SPCS2, emu->spdif_bits[2], in snd_emu10k1_init()
187 if (emu->card_capabilities->emu_model) { in snd_emu10k1_init()
188 } else if (emu->card_capabilities->ca0151_chip) { /* audigy2 */ in snd_emu10k1_init()
191 snd_emu10k1_ptr_write(emu, A_I2S_CAPTURE_RATE, 0, A_I2S_CAPTURE_96000); in snd_emu10k1_init()
194 snd_emu10k1_ptr20_write(emu, SRCSel, 0, 0x14); in snd_emu10k1_init()
197 snd_emu10k1_ptr20_write(emu, SRCMULTI_ENABLE, 0, 0xFFFFFFFF); in snd_emu10k1_init()
200 outl(0x0201, emu->port + HCFG2); in snd_emu10k1_init()
202 snd_emu10k1_ptr20_write(emu, CAPTURE_P16V_SOURCE, 0, 0x78e4); in snd_emu10k1_init()
203 } else if (emu->card_capabilities->ca0108_chip) { /* audigy2 Value */ in snd_emu10k1_init()
205 dev_info(emu->card->dev, "Audigy2 value: Special config.\n"); in snd_emu10k1_init()
207 snd_emu10k1_ptr_write(emu, A_I2S_CAPTURE_RATE, 0, A_I2S_CAPTURE_96000); in snd_emu10k1_init()
210 snd_emu10k1_ptr20_write(emu, P17V_SRCSel, 0, 0x14); in snd_emu10k1_init()
213 snd_emu10k1_ptr20_write(emu, P17V_MIXER_I2S_ENABLE, 0, 0xFF000000); in snd_emu10k1_init()
219 snd_emu10k1_ptr20_write(emu, P17V_MIXER_SPDIF_ENABLE, 0, 0xFF000000); in snd_emu10k1_init()
221 tmp = inw(emu->port + A_IOCFG) & ~0x8; /* Clear bit 3 */ in snd_emu10k1_init()
222 outw(tmp, emu->port + A_IOCFG); in snd_emu10k1_init()
224 if (emu->card_capabilities->spi_dac) { /* Audigy 2 ZS Notebook with DAC Wolfson WM8768/WM8568 */ in snd_emu10k1_init()
229 snd_emu10k1_spi_write(emu, spi_dac_init[n]); in snd_emu10k1_init()
231 snd_emu10k1_ptr20_write(emu, 0x60, 0, 0x10); in snd_emu10k1_init()
242 outw(0x76, emu->port + A_IOCFG); /* Windows uses 0x3f76 */ in snd_emu10k1_init()
244 if (emu->card_capabilities->i2c_adc) { /* Audigy 2 ZS Notebook with ADC Wolfson WM8775 */ in snd_emu10k1_init()
247 snd_emu10k1_ptr20_write(emu, P17V_I2S_SRC_SEL, 0, 0x2020205f); in snd_emu10k1_init()
248 tmp = inw(emu->port + A_IOCFG); in snd_emu10k1_init()
249 outw(tmp | 0x4, emu->port + A_IOCFG); /* Set bit 2 for mic input */ in snd_emu10k1_init()
250 tmp = inw(emu->port + A_IOCFG); in snd_emu10k1_init()
253 snd_emu10k1_i2c_write(emu, i2c_adc_init[n][0], i2c_adc_init[n][1]); in snd_emu10k1_init()
255 emu->i2c_capture_volume[n][0] = 0xcf; in snd_emu10k1_init()
256 emu->i2c_capture_volume[n][1] = 0xcf; in snd_emu10k1_init()
261 snd_emu10k1_ptr_write(emu, PTB, 0, emu->ptb_pages.addr); in snd_emu10k1_init()
262 snd_emu10k1_ptr_write(emu, TCB, 0, 0); /* taken from original driver */ in snd_emu10k1_init()
263 snd_emu10k1_ptr_write(emu, TCBS, 0, TCBS_BUFFSIZE_256K); /* taken from original driver */ in snd_emu10k1_init()
265 …silent_page = (emu->silent_page.addr << emu->address_mode) | (emu->address_mode ? MAP_PTI_MASK1 : … in snd_emu10k1_init()
267 snd_emu10k1_ptr_write(emu, MAPA, ch, silent_page); in snd_emu10k1_init()
268 snd_emu10k1_ptr_write(emu, MAPB, ch, silent_page); in snd_emu10k1_init()
271 if (emu->card_capabilities->emu_model) { in snd_emu10k1_init()
274 HCFG_AUDIOENABLE, emu->port + HCFG); in snd_emu10k1_init()
282 } else if (emu->audigy) { in snd_emu10k1_init()
283 if (emu->revision == 4) /* audigy2 */ in snd_emu10k1_init()
287 HCFG_AUTOMUTE | HCFG_JOYENABLE, emu->port + HCFG); in snd_emu10k1_init()
289 outl(HCFG_AUTOMUTE | HCFG_JOYENABLE, emu->port + HCFG); in snd_emu10k1_init()
292 } else if (emu->model == 0x20 || in snd_emu10k1_init()
293 emu->model == 0xc400 || in snd_emu10k1_init()
294 (emu->model == 0x21 && emu->revision < 6)) in snd_emu10k1_init()
295 outl(HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE, emu->port + HCFG); in snd_emu10k1_init()
298 outl(HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE | HCFG_JOYENABLE, emu->port + HCFG); in snd_emu10k1_init()
301 if (emu->card_capabilities->emu_model) { in snd_emu10k1_init()
303 } else if (emu->card_capabilities->i2c_adc) { in snd_emu10k1_init()
305 } else if (emu->audigy) { in snd_emu10k1_init()
306 u16 reg = inw(emu->port + A_IOCFG); in snd_emu10k1_init()
307 outw(reg | A_IOCFG_GPOUT2, emu->port + A_IOCFG); in snd_emu10k1_init()
309 outw(reg | A_IOCFG_GPOUT1 | A_IOCFG_GPOUT2, emu->port + A_IOCFG); in snd_emu10k1_init()
311 outw(reg, emu->port + A_IOCFG); in snd_emu10k1_init()
313 unsigned int reg = inl(emu->port + HCFG); in snd_emu10k1_init()
314 outl(reg | HCFG_GPOUT2, emu->port + HCFG); in snd_emu10k1_init()
316 outl(reg | HCFG_GPOUT1 | HCFG_GPOUT2, emu->port + HCFG); in snd_emu10k1_init()
318 outl(reg, emu->port + HCFG); in snd_emu10k1_init()
322 if (emu->card_capabilities->emu_model) { in snd_emu10k1_init()
324 } else if (emu->card_capabilities->i2c_adc) { in snd_emu10k1_init()
326 } else if (emu->audigy) { /* enable analog output */ in snd_emu10k1_init()
327 u16 reg = inw(emu->port + A_IOCFG); in snd_emu10k1_init()
328 outw(reg | A_IOCFG_GPOUT0, emu->port + A_IOCFG); in snd_emu10k1_init()
331 if (emu->address_mode == 0) { in snd_emu10k1_init()
333 outl(inl(emu->port + HCFG) | HCFG_EXPANDED_MEM, emu->port + HCFG); in snd_emu10k1_init()
339 static void snd_emu10k1_audio_enable(struct snd_emu10k1 *emu) in snd_emu10k1_audio_enable() argument
344 outl(inl(emu->port + HCFG) | HCFG_AUDIOENABLE, emu->port + HCFG); in snd_emu10k1_audio_enable()
347 if (emu->card_capabilities->emu_model) { in snd_emu10k1_audio_enable()
349 } else if (emu->card_capabilities->i2c_adc) { in snd_emu10k1_audio_enable()
351 } else if (emu->audigy) { in snd_emu10k1_audio_enable()
352 outw(inw(emu->port + A_IOCFG) & ~0x44, emu->port + A_IOCFG); in snd_emu10k1_audio_enable()
354 if (emu->card_capabilities->ca0151_chip) { /* audigy2 */ in snd_emu10k1_audio_enable()
358 outw(inw(emu->port + A_IOCFG) | 0x0040, emu->port + A_IOCFG); in snd_emu10k1_audio_enable()
359 } else if (emu->card_capabilities->ca0108_chip) { /* audigy2 value */ in snd_emu10k1_audio_enable()
361 outw(inw(emu->port + A_IOCFG) | 0x0060, emu->port + A_IOCFG); in snd_emu10k1_audio_enable()
364 outw(inw(emu->port + A_IOCFG) | 0x0080, emu->port + A_IOCFG); in snd_emu10k1_audio_enable()
373 emu->tos_link = 0; in snd_emu10k1_audio_enable()
374 tmp = inl(emu->port + HCFG); in snd_emu10k1_audio_enable()
376 outl(tmp|0x800, emu->port + HCFG); in snd_emu10k1_audio_enable()
378 if (tmp != (inl(emu->port + HCFG) & ~0x800)) { in snd_emu10k1_audio_enable()
379 emu->tos_link = 1; in snd_emu10k1_audio_enable()
380 outl(tmp, emu->port + HCFG); in snd_emu10k1_audio_enable()
386 if (emu->card_capabilities->emu_model) in snd_emu10k1_audio_enable()
387 snd_emu10k1_intr_enable(emu, INTE_PCIERRORENABLE | INTE_A_GPIOENABLE); in snd_emu10k1_audio_enable()
389 snd_emu10k1_intr_enable(emu, INTE_PCIERRORENABLE); in snd_emu10k1_audio_enable()
392 int snd_emu10k1_done(struct snd_emu10k1 *emu) in snd_emu10k1_done() argument
396 outl(0, emu->port + INTE); in snd_emu10k1_done()
402 snd_emu10k1_ptr_write_multiple(emu, ch, in snd_emu10k1_done()
412 if (emu->audigy) in snd_emu10k1_done()
413 snd_emu10k1_ptr_write(emu, A_DBG, 0, A_DBG_SINGLE_STEP); in snd_emu10k1_done()
415 snd_emu10k1_ptr_write(emu, DBG, 0, EMU10K1_DBG_SINGLE_STEP); in snd_emu10k1_done()
417 snd_emu10k1_ptr_write_multiple(emu, 0, in snd_emu10k1_done()
440 outl(HCFG_LOCKSOUNDCACHE | HCFG_LOCKTANKCACHE_MASK | HCFG_MUTEBUTTONENABLE, emu->port + HCFG); in snd_emu10k1_done()
522 static void snd_emu10k1_ecard_write(struct snd_emu10k1 *emu, unsigned int value) in snd_emu10k1_ecard_write() argument
529 hc_port = emu->port + HCFG; in snd_emu10k1_ecard_write()
560 static void snd_emu10k1_ecard_setadcgain(struct snd_emu10k1 *emu, in snd_emu10k1_ecard_setadcgain() argument
566 snd_emu10k1_ecard_write(emu, emu->ecard_ctrl & ~EC_TRIM_CSN); in snd_emu10k1_ecard_setadcgain()
569 snd_emu10k1_ecard_write(emu, emu->ecard_ctrl & ~EC_TRIM_CSN); in snd_emu10k1_ecard_setadcgain()
574 value = emu->ecard_ctrl & ~(EC_TRIM_CSN | EC_TRIM_SDATA); in snd_emu10k1_ecard_setadcgain()
580 snd_emu10k1_ecard_write(emu, value); in snd_emu10k1_ecard_setadcgain()
581 snd_emu10k1_ecard_write(emu, value | EC_TRIM_SCLK); in snd_emu10k1_ecard_setadcgain()
582 snd_emu10k1_ecard_write(emu, value); in snd_emu10k1_ecard_setadcgain()
585 snd_emu10k1_ecard_write(emu, emu->ecard_ctrl); in snd_emu10k1_ecard_setadcgain()
588 static int snd_emu10k1_ecard_init(struct snd_emu10k1 *emu) in snd_emu10k1_ecard_init() argument
593 emu->ecard_ctrl = EC_RAW_RUN_MODE | in snd_emu10k1_ecard_init()
599 hc_value = inl(emu->port + HCFG); in snd_emu10k1_ecard_init()
600 outl(hc_value | HCFG_AUDIOENABLE | HCFG_CODECFORMAT_I2S, emu->port + HCFG); in snd_emu10k1_ecard_init()
601 inl(emu->port + HCFG); in snd_emu10k1_ecard_init()
604 snd_emu10k1_ecard_write(emu, EC_ADCCAL | EC_LEDN | EC_TRIM_CSN); in snd_emu10k1_ecard_init()
607 snd_emu10k1_ecard_write(emu, EC_DACCAL | EC_LEDN | EC_TRIM_CSN); in snd_emu10k1_ecard_init()
612 snd_emu10k1_wait(emu, 48000); in snd_emu10k1_ecard_init()
617 snd_emu10k1_ecard_write(emu, EC_ADCCAL | EC_LEDN | EC_TRIM_CSN); in snd_emu10k1_ecard_init()
620 snd_emu10k1_ecard_write(emu, emu->ecard_ctrl); in snd_emu10k1_ecard_init()
623 snd_emu10k1_ecard_setadcgain(emu, EC_DEFAULT_ADC_GAIN); in snd_emu10k1_ecard_init()
628 static int snd_emu10k1_cardbus_init(struct snd_emu10k1 *emu) in snd_emu10k1_cardbus_init() argument
636 special_port = emu->port + 0x38; in snd_emu10k1_cardbus_init()
649 snd_emu10k1_ptr20_write(emu, TINA2_VOLUME, 0, 0xfefefefe); /* Defaults to 0x30303030 */ in snd_emu10k1_cardbus_init()
671 static int snd_emu1010_load_firmware(struct snd_emu10k1 *emu, int dock, in snd_emu1010_load_firmware() argument
678 filename = firmware_names[emu->card_capabilities->emu_model][dock]; in snd_emu1010_load_firmware()
681 err = request_firmware(fw, filename, &emu->pci->dev); in snd_emu1010_load_firmware()
686 snd_emu1010_load_firmware_entry(emu, dock, *fw); in snd_emu1010_load_firmware()
690 static void snd_emu1010_load_dock_firmware(struct snd_emu10k1 *emu) in snd_emu1010_load_dock_firmware() argument
701 dev_info(emu->card->dev, "emu1010: Loading Audio Dock Firmware\n"); in snd_emu1010_load_dock_firmware()
702 err = snd_emu1010_load_firmware(emu, 1, &emu->dock_fw); in snd_emu1010_load_dock_firmware()
705 snd_emu1010_fpga_write(emu, EMU_HANA_FPGA_CONFIG, 0); in snd_emu1010_load_dock_firmware()
707 snd_emu1010_fpga_read(emu, EMU_HANA_ID, &tmp); in snd_emu1010_load_dock_firmware()
708 dev_dbg(emu->card->dev, "emu1010: EMU_HANA+DOCK_ID = 0x%x\n", tmp); in snd_emu1010_load_dock_firmware()
711 dev_err(emu->card->dev, in snd_emu1010_load_dock_firmware()
716 dev_info(emu->card->dev, "emu1010: Audio Dock Firmware loaded\n"); in snd_emu1010_load_dock_firmware()
718 snd_emu1010_fpga_read(emu, EMU_DOCK_MAJOR_REV, &tmp); in snd_emu1010_load_dock_firmware()
719 snd_emu1010_fpga_read(emu, EMU_DOCK_MINOR_REV, &tmp2); in snd_emu1010_load_dock_firmware()
720 dev_info(emu->card->dev, "Audio Dock ver: %u.%u\n", tmp, tmp2); in snd_emu1010_load_dock_firmware()
726 static void emu1010_dock_event(struct snd_emu10k1 *emu) in emu1010_dock_event() argument
730 …snd_emu1010_fpga_read(emu, EMU_HANA_OPTION_CARDS, &reg); /* OPTIONS: Which cards are attached to t… in emu1010_dock_event()
733 snd_emu1010_load_dock_firmware(emu); in emu1010_dock_event()
735 snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE); in emu1010_dock_event()
738 dev_info(emu->card->dev, "emu1010: Audio Dock detached\n"); in emu1010_dock_event()
740 snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE); in emu1010_dock_event()
744 static void emu1010_clock_event(struct snd_emu10k1 *emu) in emu1010_clock_event() argument
748 spin_lock_irq(&emu->reg_lock); in emu1010_clock_event()
750 emu->emu1010.clock_source = emu->emu1010.clock_fallback; in emu1010_clock_event()
751 emu->emu1010.wclock = 1 - emu->emu1010.clock_source; in emu1010_clock_event()
752 snd_emu1010_update_clock(emu); in emu1010_clock_event()
753 spin_unlock_irq(&emu->reg_lock); in emu1010_clock_event()
754 snd_ctl_build_ioff(&id, emu->ctl_clock_source, 0); in emu1010_clock_event()
755 snd_ctl_notify(emu->card, SNDRV_CTL_EVENT_MASK_VALUE, &id); in emu1010_clock_event()
760 struct snd_emu10k1 *emu; in emu1010_work() local
763 emu = container_of(work, struct snd_emu10k1, emu1010.work); in emu1010_work()
764 if (emu->card->shutdown) in emu1010_work()
767 if (emu->suspend) in emu1010_work()
771 snd_emu1010_fpga_lock(emu); in emu1010_work()
773 snd_emu1010_fpga_read(emu, EMU_HANA_IRQ_STATUS, &sts); in emu1010_work()
778 emu1010_dock_event(emu); in emu1010_work()
781 emu1010_clock_event(emu); in emu1010_work()
783 snd_emu1010_fpga_unlock(emu); in emu1010_work()
786 static void emu1010_interrupt(struct snd_emu10k1 *emu) in emu1010_interrupt() argument
790 u16 sts = inw(emu->port + A_GPIO); in emu1010_interrupt()
791 u16 bit = emu->card_capabilities->ca0108_chip ? 0x2000 : 0x8000; in emu1010_interrupt()
795 schedule_work(&emu->emu1010.work); in emu1010_interrupt()
806 static int snd_emu10k1_emu1010_init(struct snd_emu10k1 *emu) in snd_emu10k1_emu1010_init() argument
811 dev_info(emu->card->dev, "emu1010: Special config.\n"); in snd_emu10k1_emu1010_init()
815 outl(HCFG_LOCKSOUNDCACHE | HCFG_LOCKTANKCACHE_MASK, emu->port + HCFG); in snd_emu10k1_emu1010_init()
817 snd_emu1010_fpga_lock(emu); in snd_emu10k1_emu1010_init()
819 dev_info(emu->card->dev, "emu1010: Loading Hana Firmware\n"); in snd_emu10k1_emu1010_init()
820 err = snd_emu1010_load_firmware(emu, 0, &emu->firmware); in snd_emu10k1_emu1010_init()
822 dev_info(emu->card->dev, "emu1010: Loading Firmware failed\n"); in snd_emu10k1_emu1010_init()
827 snd_emu1010_fpga_read(emu, EMU_HANA_ID, &reg); in snd_emu10k1_emu1010_init()
830 dev_info(emu->card->dev, in snd_emu10k1_emu1010_init()
837 dev_info(emu->card->dev, "emu1010: Hana Firmware loaded\n"); in snd_emu10k1_emu1010_init()
838 snd_emu1010_fpga_read(emu, EMU_HANA_MAJOR_REV, &tmp); in snd_emu10k1_emu1010_init()
839 snd_emu1010_fpga_read(emu, EMU_HANA_MINOR_REV, &tmp2); in snd_emu10k1_emu1010_init()
840 dev_info(emu->card->dev, "emu1010: Hana version: %u.%u\n", tmp, tmp2); in snd_emu10k1_emu1010_init()
842 snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_PWR, EMU_HANA_DOCK_PWR_ON); in snd_emu10k1_emu1010_init()
844 snd_emu1010_fpga_read(emu, EMU_HANA_OPTION_CARDS, &reg); in snd_emu10k1_emu1010_init()
845 dev_info(emu->card->dev, "emu1010: Card options = 0x%x\n", reg); in snd_emu10k1_emu1010_init()
847 snd_emu1010_load_dock_firmware(emu); in snd_emu10k1_emu1010_init()
848 if (emu->card_capabilities->no_adat) { in snd_emu10k1_emu1010_init()
849 emu->emu1010.optical_in = 0; /* IN_SPDIF */ in snd_emu10k1_emu1010_init()
850 emu->emu1010.optical_out = 0; /* OUT_SPDIF */ in snd_emu10k1_emu1010_init()
853 emu->emu1010.optical_in = 1; /* IN_ADAT */ in snd_emu10k1_emu1010_init()
854 emu->emu1010.optical_out = 1; /* OUT_ADAT */ in snd_emu10k1_emu1010_init()
856 tmp = (emu->emu1010.optical_in ? EMU_HANA_OPTICAL_IN_ADAT : EMU_HANA_OPTICAL_IN_SPDIF) | in snd_emu10k1_emu1010_init()
857 (emu->emu1010.optical_out ? EMU_HANA_OPTICAL_OUT_ADAT : EMU_HANA_OPTICAL_OUT_SPDIF); in snd_emu10k1_emu1010_init()
858 snd_emu1010_fpga_write(emu, EMU_HANA_OPTICAL_TYPE, tmp); in snd_emu10k1_emu1010_init()
860 emu->emu1010.adc_pads = 0x00; in snd_emu10k1_emu1010_init()
861 snd_emu1010_fpga_write(emu, EMU_HANA_ADC_PADS, emu->emu1010.adc_pads); in snd_emu10k1_emu1010_init()
863 snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_MISC, EMU_HANA_DOCK_PHONES_192_DAC4); in snd_emu10k1_emu1010_init()
865 emu->emu1010.dac_pads = EMU_HANA_DOCK_DAC_PAD1 | EMU_HANA_DOCK_DAC_PAD2 | in snd_emu10k1_emu1010_init()
867 snd_emu1010_fpga_write(emu, EMU_HANA_DAC_PADS, emu->emu1010.dac_pads); in snd_emu10k1_emu1010_init()
869 snd_emu1010_fpga_write(emu, EMU_HANA_SPDIF_MODE, EMU_HANA_SPDIF_MODE_RX_INVALID); in snd_emu10k1_emu1010_init()
871 …snd_emu1010_fpga_write(emu, EMU_HANA_MIDI_IN, EMU_HANA_MIDI_INA_FROM_HAMOA | EMU_HANA_MIDI_INB_FRO… in snd_emu10k1_emu1010_init()
872 snd_emu1010_fpga_write(emu, EMU_HANA_MIDI_OUT, EMU_HANA_MIDI_OUT_DOCK2 | EMU_HANA_MIDI_OUT_SYNC2); in snd_emu10k1_emu1010_init()
874 emu->gpio_interrupt = emu1010_interrupt; in snd_emu10k1_emu1010_init()
876 snd_emu1010_fpga_write(emu, EMU_HANA_IRQ_ENABLE, in snd_emu10k1_emu1010_init()
878 snd_emu1010_fpga_read(emu, EMU_HANA_IRQ_STATUS, &reg); // Clear pending IRQs in snd_emu10k1_emu1010_init()
880 emu->emu1010.clock_source = 1; /* 48000 */ in snd_emu10k1_emu1010_init()
881 emu->emu1010.clock_fallback = 1; /* 48000 */ in snd_emu10k1_emu1010_init()
883 snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_48K); in snd_emu10k1_emu1010_init()
885 emu->emu1010.wclock = EMU_HANA_WCLOCK_INT_48K; in snd_emu10k1_emu1010_init()
886 snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK, EMU_HANA_WCLOCK_INT_48K); in snd_emu10k1_emu1010_init()
888 snd_emu1010_update_clock(emu); in snd_emu10k1_emu1010_init()
892 snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE); in snd_emu10k1_emu1010_init()
895 snd_emu1010_fpga_unlock(emu); in snd_emu10k1_emu1010_init()
903 static int alloc_pm_buffer(struct snd_emu10k1 *emu);
904 static void free_pm_buffer(struct snd_emu10k1 *emu);
909 struct snd_emu10k1 *emu = card->private_data; in snd_emu10k1_free() local
911 if (emu->port) { /* avoid access to already used hardware */ in snd_emu10k1_free()
912 snd_emu10k1_fx8010_tram_setup(emu, 0); in snd_emu10k1_free()
913 snd_emu10k1_done(emu); in snd_emu10k1_free()
914 snd_emu10k1_free_efx(emu); in snd_emu10k1_free()
916 if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1010) { in snd_emu10k1_free()
918 snd_emu1010_fpga_write_lock(emu, EMU_HANA_DOCK_PWR, 0); in snd_emu10k1_free()
920 cancel_work_sync(&emu->emu1010.work); in snd_emu10k1_free()
921 mutex_destroy(&emu->emu1010.lock); in snd_emu10k1_free()
922 release_firmware(emu->firmware); in snd_emu10k1_free()
923 release_firmware(emu->dock_fw); in snd_emu10k1_free()
924 snd_util_memhdr_free(emu->memhdr); in snd_emu10k1_free()
925 if (emu->silent_page.area) in snd_emu10k1_free()
926 snd_dma_free_pages(&emu->silent_page); in snd_emu10k1_free()
927 if (emu->ptb_pages.area) in snd_emu10k1_free()
928 snd_dma_free_pages(&emu->ptb_pages); in snd_emu10k1_free()
929 vfree(emu->page_ptr_table); in snd_emu10k1_free()
930 vfree(emu->page_addr_table); in snd_emu10k1_free()
932 free_pm_buffer(emu); in snd_emu10k1_free()
1448 static void snd_emu10k1_detect_iommu(struct snd_emu10k1 *emu) in snd_emu10k1_detect_iommu() argument
1452 emu->iommu_workaround = false; in snd_emu10k1_detect_iommu()
1454 domain = iommu_get_domain_for_dev(emu->card->dev); in snd_emu10k1_detect_iommu()
1458 dev_notice(emu->card->dev, in snd_emu10k1_detect_iommu()
1460 emu->iommu_workaround = true; in snd_emu10k1_detect_iommu()
1471 struct snd_emu10k1 *emu = card->private_data; in snd_emu10k1_create() local
1485 emu->card = card; in snd_emu10k1_create()
1486 spin_lock_init(&emu->reg_lock); in snd_emu10k1_create()
1487 spin_lock_init(&emu->emu_lock); in snd_emu10k1_create()
1488 spin_lock_init(&emu->spi_lock); in snd_emu10k1_create()
1489 spin_lock_init(&emu->i2c_lock); in snd_emu10k1_create()
1490 spin_lock_init(&emu->voice_lock); in snd_emu10k1_create()
1491 spin_lock_init(&emu->synth_lock); in snd_emu10k1_create()
1492 spin_lock_init(&emu->memblk_lock); in snd_emu10k1_create()
1493 mutex_init(&emu->fx8010.lock); in snd_emu10k1_create()
1494 INIT_LIST_HEAD(&emu->mapped_link_head); in snd_emu10k1_create()
1495 INIT_LIST_HEAD(&emu->mapped_order_link_head); in snd_emu10k1_create()
1496 emu->pci = pci; in snd_emu10k1_create()
1497 emu->irq = -1; in snd_emu10k1_create()
1498 emu->synth = NULL; in snd_emu10k1_create()
1499 emu->get_synth_voice = NULL; in snd_emu10k1_create()
1500 INIT_WORK(&emu->emu1010.work, emu1010_work); in snd_emu10k1_create()
1501 mutex_init(&emu->emu1010.lock); in snd_emu10k1_create()
1503 emu->revision = pci->revision; in snd_emu10k1_create()
1504 pci_read_config_dword(pci, PCI_SUBSYSTEM_VENDOR_ID, &emu->serial); in snd_emu10k1_create()
1505 pci_read_config_word(pci, PCI_SUBSYSTEM_ID, &emu->model); in snd_emu10k1_create()
1508 pci->vendor, pci->device, emu->serial, emu->model); in snd_emu10k1_create()
1518 if (c->subsystem && (c->subsystem != emu->serial)) in snd_emu10k1_create()
1520 if (c->revision && c->revision != emu->revision) in snd_emu10k1_create()
1530 emu->card_capabilities = c; in snd_emu10k1_create()
1537 pci->vendor, pci->device, emu->serial, c->subsystem); in snd_emu10k1_create()
1542 emu->serial); in snd_emu10k1_create()
1547 is_audigy = emu->audigy = c->emu10k2_chip; in snd_emu10k1_create()
1549 snd_emu10k1_detect_iommu(emu); in snd_emu10k1_create()
1552 emu->address_mode = is_audigy ? 0 : 1; in snd_emu10k1_create()
1554 emu->dma_mask = emu->address_mode ? EMU10K1_DMA_MASK : AUDIGY_DMA_MASK; in snd_emu10k1_create()
1555 if (dma_set_mask_and_coherent(&pci->dev, emu->dma_mask) < 0) { in snd_emu10k1_create()
1558 emu->dma_mask); in snd_emu10k1_create()
1562 emu->gpr_base = A_FXGPREGBASE; in snd_emu10k1_create()
1564 emu->gpr_base = FXGPREGBASE; in snd_emu10k1_create()
1569 emu->port = pci_resource_start(pci, 0); in snd_emu10k1_create()
1571 emu->max_cache_pages = max_cache_bytes >> PAGE_SHIFT; in snd_emu10k1_create()
1573 page_table_size = sizeof(u32) * (emu->address_mode ? MAXPAGES1 : in snd_emu10k1_create()
1575 if (snd_emu10k1_alloc_pages_maybe_wider(emu, page_table_size, in snd_emu10k1_create()
1576 &emu->ptb_pages) < 0) in snd_emu10k1_create()
1579 (unsigned long)emu->ptb_pages.addr, in snd_emu10k1_create()
1580 (unsigned long)(emu->ptb_pages.addr + emu->ptb_pages.bytes)); in snd_emu10k1_create()
1582 emu->page_ptr_table = vmalloc(array_size(sizeof(void *), in snd_emu10k1_create()
1583 emu->max_cache_pages)); in snd_emu10k1_create()
1584 emu->page_addr_table = vmalloc(array_size(sizeof(unsigned long), in snd_emu10k1_create()
1585 emu->max_cache_pages)); in snd_emu10k1_create()
1586 if (!emu->page_ptr_table || !emu->page_addr_table) in snd_emu10k1_create()
1589 if (snd_emu10k1_alloc_pages_maybe_wider(emu, EMUPAGESIZE, in snd_emu10k1_create()
1590 &emu->silent_page) < 0) in snd_emu10k1_create()
1593 (unsigned long)emu->silent_page.addr, in snd_emu10k1_create()
1594 (unsigned long)(emu->silent_page.addr + in snd_emu10k1_create()
1595 emu->silent_page.bytes)); in snd_emu10k1_create()
1597 emu->memhdr = snd_util_memhdr_new(emu->max_cache_pages * PAGE_SIZE); in snd_emu10k1_create()
1598 if (!emu->memhdr) in snd_emu10k1_create()
1600 emu->memhdr->block_extra_size = sizeof(struct snd_emu10k1_memblk) - in snd_emu10k1_create()
1611 emu->fx8010.extin_mask = extin_mask; in snd_emu10k1_create()
1612 emu->fx8010.extout_mask = extout_mask; in snd_emu10k1_create()
1613 emu->enable_ir = enable_ir; in snd_emu10k1_create()
1615 if (emu->card_capabilities->ca_cardbus_chip) { in snd_emu10k1_create()
1616 err = snd_emu10k1_cardbus_init(emu); in snd_emu10k1_create()
1620 if (emu->card_capabilities->ecard) { in snd_emu10k1_create()
1621 err = snd_emu10k1_ecard_init(emu); in snd_emu10k1_create()
1624 } else if (emu->card_capabilities->emu_model) { in snd_emu10k1_create()
1625 err = snd_emu10k1_emu1010_init(emu); in snd_emu10k1_create()
1631 snd_emu10k1_ptr_write(emu, AC97SLOT, 0, in snd_emu10k1_create()
1636 emu->fx8010.itram_size = (16 * 1024)/2; in snd_emu10k1_create()
1637 emu->fx8010.etram_pages.area = NULL; in snd_emu10k1_create()
1638 emu->fx8010.etram_pages.bytes = 0; in snd_emu10k1_create()
1642 IRQF_SHARED, KBUILD_MODNAME, emu)) in snd_emu10k1_create()
1644 emu->irq = pci->irq; in snd_emu10k1_create()
1645 card->sync_irq = emu->irq; in snd_emu10k1_create()
1661 emu->spdif_bits[0] = emu->spdif_bits[1] = in snd_emu10k1_create()
1662 emu->spdif_bits[2] = SPCS_CLKACCY_1000PPM | SPCS_SAMPLERATE_48 | in snd_emu10k1_create()
1668 memset(emu->silent_page.area, 0, emu->silent_page.bytes); in snd_emu10k1_create()
1669 silent_page = emu->silent_page.addr << emu->address_mode; in snd_emu10k1_create()
1670 pgtbl = (__le32 *)emu->ptb_pages.area; in snd_emu10k1_create()
1671 for (idx = 0; idx < (emu->address_mode ? MAXPAGES1 : MAXPAGES0); idx++) in snd_emu10k1_create()
1676 emu->voices[idx].number = idx; in snd_emu10k1_create()
1678 err = snd_emu10k1_init(emu, enable_ir); in snd_emu10k1_create()
1682 err = alloc_pm_buffer(emu); in snd_emu10k1_create()
1688 err = snd_emu10k1_init_efx(emu); in snd_emu10k1_create()
1691 snd_emu10k1_audio_enable(emu); in snd_emu10k1_create()
1694 snd_emu10k1_proc_init(emu); in snd_emu10k1_create()
1715 static int alloc_pm_buffer(struct snd_emu10k1 *emu) in alloc_pm_buffer() argument
1720 if (emu->audigy) in alloc_pm_buffer()
1722 emu->saved_ptr = vmalloc(array3_size(4, NUM_G, size)); in alloc_pm_buffer()
1723 if (!emu->saved_ptr) in alloc_pm_buffer()
1725 if (snd_emu10k1_efx_alloc_pm_buffer(emu) < 0) in alloc_pm_buffer()
1727 if (emu->card_capabilities->ca0151_chip && in alloc_pm_buffer()
1728 snd_p16v_alloc_pm_buffer(emu) < 0) in alloc_pm_buffer()
1733 static void free_pm_buffer(struct snd_emu10k1 *emu) in free_pm_buffer() argument
1735 vfree(emu->saved_ptr); in free_pm_buffer()
1736 snd_emu10k1_efx_free_pm_buffer(emu); in free_pm_buffer()
1737 if (emu->card_capabilities->ca0151_chip) in free_pm_buffer()
1738 snd_p16v_free_pm_buffer(emu); in free_pm_buffer()
1741 void snd_emu10k1_suspend_regs(struct snd_emu10k1 *emu) in snd_emu10k1_suspend_regs() argument
1747 val = emu->saved_ptr; in snd_emu10k1_suspend_regs()
1750 *val = snd_emu10k1_ptr_read(emu, *reg, i); in snd_emu10k1_suspend_regs()
1751 if (emu->audigy) { in snd_emu10k1_suspend_regs()
1754 *val = snd_emu10k1_ptr_read(emu, *reg, i); in snd_emu10k1_suspend_regs()
1756 if (emu->audigy) in snd_emu10k1_suspend_regs()
1757 emu->saved_a_iocfg = inw(emu->port + A_IOCFG); in snd_emu10k1_suspend_regs()
1758 emu->saved_hcfg = inl(emu->port + HCFG); in snd_emu10k1_suspend_regs()
1761 void snd_emu10k1_resume_init(struct snd_emu10k1 *emu) in snd_emu10k1_resume_init() argument
1763 if (emu->card_capabilities->ca_cardbus_chip) in snd_emu10k1_resume_init()
1764 snd_emu10k1_cardbus_init(emu); in snd_emu10k1_resume_init()
1765 if (emu->card_capabilities->ecard) in snd_emu10k1_resume_init()
1766 snd_emu10k1_ecard_init(emu); in snd_emu10k1_resume_init()
1767 else if (emu->card_capabilities->emu_model) in snd_emu10k1_resume_init()
1768 snd_emu10k1_emu1010_init(emu); in snd_emu10k1_resume_init()
1770 snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_CNTR|AC97SLOT_LFE); in snd_emu10k1_resume_init()
1771 snd_emu10k1_init(emu, emu->enable_ir); in snd_emu10k1_resume_init()
1774 void snd_emu10k1_resume_regs(struct snd_emu10k1 *emu) in snd_emu10k1_resume_regs() argument
1780 snd_emu10k1_audio_enable(emu); in snd_emu10k1_resume_regs()
1783 if (emu->audigy) in snd_emu10k1_resume_regs()
1784 outw(emu->saved_a_iocfg, emu->port + A_IOCFG); in snd_emu10k1_resume_regs()
1785 outl(emu->saved_hcfg, emu->port + HCFG); in snd_emu10k1_resume_regs()
1787 val = emu->saved_ptr; in snd_emu10k1_resume_regs()
1790 snd_emu10k1_ptr_write(emu, *reg, i, *val); in snd_emu10k1_resume_regs()
1791 if (emu->audigy) { in snd_emu10k1_resume_regs()
1794 snd_emu10k1_ptr_write(emu, *reg, i, *val); in snd_emu10k1_resume_regs()