static int __devinit galaxy_init(struct snd_galaxy *galaxy, u8 *type) { u8 major; u8 minor; int err; err = dsp_reset(galaxy->port); if (err < 0) return err; err = dsp_get_version(galaxy->port, &major, &minor); if (err < 0) return err; if (major != GALAXY_DSP_MAJOR || minor != GALAXY_DSP_MINOR) return -ENODEV; err = dsp_command(galaxy->port, DSP_COMMAND_GALAXY_8); if (err < 0) return err; err = dsp_command(galaxy->port, GALAXY_COMMAND_GET_TYPE); if (err < 0) return err; err = dsp_get_byte(galaxy->port, type); if (err < 0) return err; return 0; }
static int __devinit galaxy_set_mode(struct snd_galaxy *galaxy, u8 mode) { int err; err = dsp_command(galaxy->port, DSP_COMMAND_GALAXY_9); if (err < 0) return err; err = dsp_command(galaxy->port, mode); if (err < 0) return err; #ifdef AZT1605 err = dsp_reset(galaxy->port); if (err < 0) return err; #endif return 0; }
PUBLIC int drv_start(int channel, int DmaMode) { Dprint(("drv_start():\n")); drv_reset(); dsp_dma_setup(DmaPhys, DspFragmentSize * sub_dev[channel].NrOfDmaFragments, DmaMode); dsp_set_speed(DspSpeed); /* Put the speaker on */ if(DmaMode == DEV_WRITE_S) { dsp_command (DSP_CMD_SPKON); /* put speaker on */ /* Program DSP with dma mode */ dsp_command((DspBits == 8 ? DSP_CMD_8BITAUTO_OUT : DSP_CMD_16BITAUTO_OUT)); } else { dsp_command (DSP_CMD_SPKOFF); /* put speaker off */ /* Program DSP with dma mode */ dsp_command((DspBits == 8 ? DSP_CMD_8BITAUTO_IN : DSP_CMD_16BITAUTO_IN)); } /* Program DSP with transfer mode */ if (!DspSign) { dsp_command((DspStereo == 1 ? DSP_MODE_STEREO_US : DSP_MODE_MONO_US)); } else { dsp_command((DspStereo == 1 ? DSP_MODE_STEREO_S : DSP_MODE_MONO_S)); } /* Give length of fragment to DSP */ if (DspBits == 8) { /* 8 bit transfer */ /* #bytes - 1 */ dsp_command((DspFragmentSize - 1) >> 0); dsp_command((DspFragmentSize - 1) >> 8); } else { /* 16 bit transfer */
static int __devinit galaxy_set_mode(struct snd_galaxy *galaxy, u8 mode) { int err; err = dsp_command(galaxy->port, DSP_COMMAND_GALAXY_9); if (err < 0) return err; err = dsp_command(galaxy->port, mode); if (err < 0) return err; #ifdef AZT1605 /* * Needed for MPU IRQ on AZT1605, but AZT2316 loses WSS again */ err = dsp_reset(galaxy->port); if (err < 0) return err; #endif return 0; }
static int __devinit dsp_get_version(void __iomem *port, u8 *major, u8 *minor) { int err; err = dsp_command(port, DSP_COMMAND_GET_VERSION); if (err < 0) return err; err = dsp_get_byte(port, major); if (err < 0) return err; err = dsp_get_byte(port, minor); if (err < 0) return err; return 0; }
PUBLIC int drv_init_hw(void) { int i; int DspVersion[2]; Dprint(("drv_init_hw():\n")); if(drv_reset () != OK) { Dprint(("sb16: No SoundBlaster card detected\n")); return -1; } DspVersion[0] = DspVersion[1] = 0; dsp_command(DSP_GET_VERSION); /* Get DSP version bytes */ for(i = 1000; i; i--) { if(sb16_inb(DSP_DATA_AVL) & 0x80) { if(DspVersion[0] == 0) { DspVersion[0] = sb16_inb(DSP_READ); } else { DspVersion[1] = sb16_inb(DSP_READ); break; } } } if(DspVersion[0] < 4) { Dprint(("sb16: No SoundBlaster 16 compatible card detected\n")); return -1; } Dprint(("sb16: SoundBlaster DSP version %d.%d detected!\n", DspVersion[0], DspVersion[1])); /* set SB to use our IRQ and DMA channels */ mixer_set(MIXER_SET_IRQ, (1 << (SB_IRQ / 2 - 1))); mixer_set(MIXER_SET_DMA, (1 << SB_DMA_8 | 1 << SB_DMA_16)); DspFragmentSize = sub_dev[AUDIO].DmaSize / sub_dev[AUDIO].NrOfDmaFragments; return OK; }