H A D | hal2.c | 40 #include "hal2.h" 116 static u32 hal2_i_read32(struct snd_hal2 *hal2, u16 addr) hal2_i_read32() argument 119 struct hal2_ctl_regs *regs = hal2->ctl_regs; hal2_i_read32() 130 static void hal2_i_write16(struct snd_hal2 *hal2, u16 addr, u16 val) hal2_i_write16() argument 132 struct hal2_ctl_regs *regs = hal2->ctl_regs; hal2_i_write16() 142 static void hal2_i_write32(struct snd_hal2 *hal2, u16 addr, u32 val) hal2_i_write32() argument 144 struct hal2_ctl_regs *regs = hal2->ctl_regs; hal2_i_write32() 154 static void hal2_i_setbit16(struct snd_hal2 *hal2, u16 addr, u16 bit) hal2_i_setbit16() argument 156 struct hal2_ctl_regs *regs = hal2->ctl_regs; hal2_i_setbit16() 168 static void hal2_i_clearbit16(struct snd_hal2 *hal2, u16 addr, u16 bit) hal2_i_clearbit16() argument 170 struct hal2_ctl_regs *regs = hal2->ctl_regs; hal2_i_clearbit16() 202 struct snd_hal2 *hal2 = snd_kcontrol_chip(kcontrol); hal2_gain_get() local 208 tmp = hal2_i_read32(hal2, H2I_DAC_C2); hal2_gain_get() 218 tmp = hal2_i_read32(hal2, H2I_ADC_C2); hal2_gain_get() 232 struct snd_hal2 *hal2 = snd_kcontrol_chip(kcontrol); hal2_gain_put() local 241 old = hal2_i_read32(hal2, H2I_DAC_C2); hal2_gain_put() 250 hal2_i_write32(hal2, H2I_DAC_C2, new); hal2_gain_put() 253 old = hal2_i_read32(hal2, H2I_ADC_C2); hal2_gain_put() 257 hal2_i_write32(hal2, H2I_ADC_C2, new); hal2_gain_put() 283 static int hal2_mixer_create(struct snd_hal2 *hal2) hal2_mixer_create() argument 288 hal2_i_write32(hal2, H2I_DAC_C2, hal2_mixer_create() 291 hal2_i_write32(hal2, H2I_ADC_C2, 0); hal2_mixer_create() 293 err = snd_ctl_add(hal2->card, hal2_mixer_create() 294 snd_ctl_new1(&hal2_ctrl_headphone, hal2)); hal2_mixer_create() 298 err = snd_ctl_add(hal2->card, hal2_mixer_create() 299 snd_ctl_new1(&hal2_ctrl_mic, hal2)); hal2_mixer_create() 308 struct snd_hal2 *hal2 = dev_id; hal2_interrupt() local 312 if (hal2->dac.pbus.pbus->pbdma_ctrl & HPC3_PDMACTRL_INT) { hal2_interrupt() 313 snd_pcm_period_elapsed(hal2->dac.substream); hal2_interrupt() 316 if (hal2->adc.pbus.pbus->pbdma_ctrl & HPC3_PDMACTRL_INT) { hal2_interrupt() 317 snd_pcm_period_elapsed(hal2->adc.substream); hal2_interrupt() 342 static void hal2_set_dac_rate(struct snd_hal2 *hal2) hal2_set_dac_rate() argument 344 unsigned int master = hal2->dac.master; hal2_set_dac_rate() 345 int inc = hal2->dac.inc; hal2_set_dac_rate() 346 int mod = hal2->dac.mod; hal2_set_dac_rate() 348 hal2_i_write16(hal2, H2I_BRES1_C1, (master == 44100) ? 1 : 0); hal2_set_dac_rate() 349 hal2_i_write32(hal2, H2I_BRES1_C2, hal2_set_dac_rate() 353 static void hal2_set_adc_rate(struct snd_hal2 *hal2) hal2_set_adc_rate() argument 355 unsigned int master = hal2->adc.master; hal2_set_adc_rate() 356 int inc = hal2->adc.inc; hal2_set_adc_rate() 357 int mod = hal2->adc.mod; hal2_set_adc_rate() 359 hal2_i_write16(hal2, H2I_BRES2_C1, (master == 44100) ? 1 : 0); hal2_set_adc_rate() 360 hal2_i_write32(hal2, H2I_BRES2_C2, hal2_set_adc_rate() 364 static void hal2_setup_dac(struct snd_hal2 *hal2) hal2_setup_dac() argument 367 struct hal2_pbus *pbus = &hal2->dac.pbus; hal2_setup_dac() 374 sample_size = 2 * hal2->dac.voices; hal2_setup_dac() 384 hal2_i_clearbit16(hal2, H2I_DMA_PORT_EN, H2I_DMA_PORT_EN_CODECTX); hal2_setup_dac() 386 hal2_set_dac_rate(hal2); hal2_setup_dac() 388 hal2_i_clearbit16(hal2, H2I_DMA_END, H2I_DMA_END_CODECTX); hal2_setup_dac() 390 hal2_i_setbit16(hal2, H2I_DMA_DRV, (1 << pbus->pbusnr)); hal2_setup_dac() 392 hal2_i_write16(hal2, H2I_DAC_C1, (pbus->pbusnr << H2I_C1_DMA_SHIFT) hal2_setup_dac() 394 | (hal2->dac.voices << H2I_C1_DATAT_SHIFT)); hal2_setup_dac() 397 static void hal2_setup_adc(struct snd_hal2 *hal2) hal2_setup_adc() argument 400 struct hal2_pbus *pbus = &hal2->adc.pbus; hal2_setup_adc() 402 sample_size = 2 * hal2->adc.voices; hal2_setup_adc() 409 hal2_i_clearbit16(hal2, H2I_DMA_PORT_EN, H2I_DMA_PORT_EN_CODECR); hal2_setup_adc() 411 hal2_set_adc_rate(hal2); hal2_setup_adc() 413 hal2_i_clearbit16(hal2, H2I_DMA_END, H2I_DMA_END_CODECR); hal2_setup_adc() 415 hal2_i_setbit16(hal2, H2I_DMA_DRV, (1 << pbus->pbusnr)); hal2_setup_adc() 417 hal2_i_write16(hal2, H2I_ADC_C1, (pbus->pbusnr << H2I_C1_DMA_SHIFT) hal2_setup_adc() 419 | (hal2->adc.voices << H2I_C1_DATAT_SHIFT)); hal2_setup_adc() 422 static void hal2_start_dac(struct snd_hal2 *hal2) hal2_start_dac() argument 424 struct hal2_pbus *pbus = &hal2->dac.pbus; hal2_start_dac() 426 pbus->pbus->pbdma_dptr = hal2->dac.desc_dma; hal2_start_dac() 429 hal2_i_setbit16(hal2, H2I_DMA_PORT_EN, H2I_DMA_PORT_EN_CODECTX); hal2_start_dac() 432 static void hal2_start_adc(struct snd_hal2 *hal2) hal2_start_adc() argument 434 struct hal2_pbus *pbus = &hal2->adc.pbus; hal2_start_adc() 436 pbus->pbus->pbdma_dptr = hal2->adc.desc_dma; hal2_start_adc() 439 hal2_i_setbit16(hal2, H2I_DMA_PORT_EN, H2I_DMA_PORT_EN_CODECR); hal2_start_adc() 442 static inline void hal2_stop_dac(struct snd_hal2 *hal2) hal2_stop_dac() argument 444 hal2->dac.pbus.pbus->pbdma_ctrl = HPC3_PDMACTRL_LD; hal2_stop_dac() 448 static inline void hal2_stop_adc(struct snd_hal2 *hal2) hal2_stop_adc() argument 450 hal2->adc.pbus.pbus->pbdma_ctrl = HPC3_PDMACTRL_LD; hal2_stop_adc() 533 struct snd_hal2 *hal2 = snd_pcm_substream_chip(substream); hal2_playback_open() local 538 err = hal2_alloc_dmabuf(&hal2->dac); hal2_playback_open() 546 struct snd_hal2 *hal2 = snd_pcm_substream_chip(substream); hal2_playback_close() local 548 hal2_free_dmabuf(&hal2->dac); hal2_playback_close() 554 struct snd_hal2 *hal2 = snd_pcm_substream_chip(substream); hal2_playback_prepare() local 556 struct hal2_codec *dac = &hal2->dac; hal2_playback_prepare() 564 hal2_setup_dac(hal2); hal2_playback_prepare() 570 struct snd_hal2 *hal2 = snd_pcm_substream_chip(substream); hal2_playback_trigger() local 574 hal2->dac.pcm_indirect.hw_io = hal2->dac.buffer_dma; hal2_playback_trigger() 575 hal2->dac.pcm_indirect.hw_data = 0; hal2_playback_trigger() 577 hal2_start_dac(hal2); hal2_playback_trigger() 580 hal2_stop_dac(hal2); hal2_playback_trigger() 591 struct snd_hal2 *hal2 = snd_pcm_substream_chip(substream); hal2_playback_pointer() local 592 struct hal2_codec *dac = &hal2->dac; hal2_playback_pointer() 601 struct snd_hal2 *hal2 = snd_pcm_substream_chip(substream); hal2_playback_transfer() local 602 unsigned char *buf = hal2->dac.buffer + rec->hw_data; hal2_playback_transfer() 611 struct snd_hal2 *hal2 = snd_pcm_substream_chip(substream); hal2_playback_ack() local 612 struct hal2_codec *dac = &hal2->dac; hal2_playback_ack() 624 struct snd_hal2 *hal2 = snd_pcm_substream_chip(substream); hal2_capture_open() local 625 struct hal2_codec *adc = &hal2->adc; hal2_capture_open() 638 struct snd_hal2 *hal2 = snd_pcm_substream_chip(substream); hal2_capture_close() local 640 hal2_free_dmabuf(&hal2->adc); hal2_capture_close() 646 struct snd_hal2 *hal2 = snd_pcm_substream_chip(substream); hal2_capture_prepare() local 648 struct hal2_codec *adc = &hal2->adc; hal2_capture_prepare() 657 hal2_setup_adc(hal2); hal2_capture_prepare() 663 struct snd_hal2 *hal2 = snd_pcm_substream_chip(substream); hal2_capture_trigger() local 667 hal2->adc.pcm_indirect.hw_io = hal2->adc.buffer_dma; hal2_capture_trigger() 668 hal2->adc.pcm_indirect.hw_data = 0; hal2_capture_trigger() 669 printk(KERN_DEBUG "buffer_dma %x\n", hal2->adc.buffer_dma); hal2_capture_trigger() 670 hal2_start_adc(hal2); hal2_capture_trigger() 673 hal2_stop_adc(hal2); hal2_capture_trigger() 684 struct snd_hal2 *hal2 = snd_pcm_substream_chip(substream); hal2_capture_pointer() local 685 struct hal2_codec *adc = &hal2->adc; hal2_capture_pointer() 694 struct snd_hal2 *hal2 = snd_pcm_substream_chip(substream); hal2_capture_transfer() local 695 unsigned char *buf = hal2->adc.buffer + rec->hw_data; hal2_capture_transfer() 703 struct snd_hal2 *hal2 = snd_pcm_substream_chip(substream); hal2_capture_ack() local 704 struct hal2_codec *adc = &hal2->adc; hal2_capture_ack() 736 static int hal2_pcm_create(struct snd_hal2 *hal2) hal2_pcm_create() argument 742 err = snd_pcm_new(hal2->card, "SGI HAL2 Audio", 0, 1, 1, &pcm); hal2_pcm_create() 746 pcm->private_data = hal2; hal2_pcm_create() 763 struct snd_hal2 *hal2 = device->device_data; hal2_dev_free() local 765 free_irq(SGI_HPCDMA_IRQ, hal2); hal2_dev_free() 766 kfree(hal2); hal2_dev_free() 781 static int hal2_detect(struct snd_hal2 *hal2) hal2_detect() argument 787 hal2_write(0, &hal2->ctl_regs->isr); hal2_detect() 791 &hal2->ctl_regs->isr); hal2_detect() 794 hal2_i_write16(hal2, H2I_RELAY_C, H2I_RELAY_C_STATE); hal2_detect() 795 rev = hal2_read(&hal2->ctl_regs->rev); hal2_detect() 811 struct snd_hal2 *hal2; hal2_create() local 815 hal2 = kzalloc(sizeof(struct snd_hal2), GFP_KERNEL); hal2_create() 816 if (!hal2) hal2_create() 819 hal2->card = card; hal2_create() 822 "SGI HAL2", hal2)) { hal2_create() 824 kfree(hal2); hal2_create() 828 hal2->ctl_regs = (struct hal2_ctl_regs *)hpc3->pbus_extregs[0]; hal2_create() 829 hal2->aes_regs = (struct hal2_aes_regs *)hpc3->pbus_extregs[1]; hal2_create() 830 hal2->vol_regs = (struct hal2_vol_regs *)hpc3->pbus_extregs[2]; hal2_create() 831 hal2->syn_regs = (struct hal2_syn_regs *)hpc3->pbus_extregs[3]; hal2_create() 833 if (hal2_detect(hal2) < 0) { hal2_create() 834 kfree(hal2); hal2_create() 838 hal2_init_codec(&hal2->dac, hpc3, 0); hal2_create() 839 hal2_init_codec(&hal2->adc, hpc3, 1); hal2_create() 864 hpc3->pbus_dmacfg[hal2->dac.pbus.pbusnr][0] = 0x8208844; hal2_create() 865 hpc3->pbus_dmacfg[hal2->adc.pbus.pbusnr][0] = 0x8208844; hal2_create() 867 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, hal2, &hal2_ops); hal2_create() 869 free_irq(SGI_HPCDMA_IRQ, hal2); hal2_create() 870 kfree(hal2); hal2_create() 873 *rchip = hal2; hal2_create()
|