Пример #1
0
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;
}
Пример #2
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;
}
Пример #3
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 */
Пример #4
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
	/*
	 * Needed for MPU IRQ on AZT1605, but AZT2316 loses WSS again
	 */
	err = dsp_reset(galaxy->port);
	if (err < 0)
		return err;
#endif

	return 0;
}
Пример #5
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;
}
Пример #6
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;
}