Example #1
0
static irqreturn_t
snd_nm256_interrupt(int irq, void *dev_id)
{
	struct nm256 *chip = dev_id;
	u16 status;
	u8 cbyte;

	status = snd_nm256_readw(chip, NM_INT_REG);

	/* Not ours. */
	if (status == 0)
		return snd_nm256_intr_check(chip);

	chip->badintrcount = 0;

	/* Rather boring; check for individual interrupts and process them. */

	spin_lock(&chip->reg_lock);
	if (status & NM_PLAYBACK_INT) {
		status &= ~NM_PLAYBACK_INT;
		NM_ACK_INT(chip, NM_PLAYBACK_INT);
		snd_nm256_playback_update(chip);
	}

	if (status & NM_RECORD_INT) {
		status &= ~NM_RECORD_INT;
		NM_ACK_INT(chip, NM_RECORD_INT);
		snd_nm256_capture_update(chip);
	}

	if (status & NM_MISC_INT_1) {
		status &= ~NM_MISC_INT_1;
		NM_ACK_INT(chip, NM_MISC_INT_1);
		snd_printd("NM256: Got misc interrupt #1\n");
		snd_nm256_writew(chip, NM_INT_REG, 0x8000);
		cbyte = snd_nm256_readb(chip, 0x400);
		snd_nm256_writeb(chip, 0x400, cbyte | 2);
	}

	if (status & NM_MISC_INT_2) {
		status &= ~NM_MISC_INT_2;
		NM_ACK_INT(chip, NM_MISC_INT_2);
		snd_printd("NM256: Got misc interrupt #2\n");
		cbyte = snd_nm256_readb(chip, 0x400);
		snd_nm256_writeb(chip, 0x400, cbyte & ~2);
	}

	/* Unknown interrupt. */
	if (status) {
		snd_printd("NM256: Fire in the hole! Unknown status 0x%x\n",
			   status);
		/* Pray. */
		NM_ACK_INT(chip, status);
	}

	spin_unlock(&chip->reg_lock);
	return IRQ_HANDLED;
}
Example #2
0
/* Stop the play engine. */
static void
snd_nm256_playback_stop(struct nm256 *chip)
{
	/* Shut off sound from both channels. */
	snd_nm256_writew(chip, NM_AUDIO_MUTE_REG,
			 NM_AUDIO_MUTE_LEFT | NM_AUDIO_MUTE_RIGHT);
	/* Disable play engine. */
	snd_nm256_writeb(chip, NM_PLAYBACK_ENABLE_REG, 0);
}
static void
snd_nm256_playback_stop(struct nm256 *chip)
{
	
	snd_nm256_writew(chip, NM_AUDIO_MUTE_REG,
			 NM_AUDIO_MUTE_LEFT | NM_AUDIO_MUTE_RIGHT);
	
	snd_nm256_writeb(chip, NM_PLAYBACK_ENABLE_REG, 0);
}
Example #4
0
/* 
 * Initialize the hardware. 
 */
static void
snd_nm256_init_chip(struct nm256 *chip)
{
	/* Reset everything. */
	snd_nm256_writeb(chip, 0x0, 0x11);
	snd_nm256_writew(chip, 0x214, 0);
	/* stop sounds.. */
	//snd_nm256_playback_stop(chip);
	//snd_nm256_capture_stop(chip);
}
static void
snd_nm256_init_chip(struct nm256 *chip)
{
	
	snd_nm256_writeb(chip, 0x0, 0x11);
	snd_nm256_writew(chip, 0x214, 0);
	
	
	
}
Example #6
0
/*
 * Initialize the hardware.
 */
static void
snd_nm256_init_chip(nm256_t *chip)
{
    spin_lock_irq(&chip->reg_lock);
    /* Reset everything. */
    snd_nm256_writeb(chip, 0x0, 0x11);
    snd_nm256_writew(chip, 0x214, 0);
    /* stop sounds.. */
    //snd_nm256_playback_stop(chip);
    //snd_nm256_capture_stop(chip);
    spin_unlock_irq(&chip->reg_lock);
}
Example #7
0
static void
snd_nm256_playback_start(nm256_t *chip, nm256_stream_t *s, snd_pcm_substream_t *substream)
{
    /* program buffer pointers */
    snd_nm256_writel(chip, NM_PBUFFER_START, s->buf);
    snd_nm256_writel(chip, NM_PBUFFER_END, s->buf + s->dma_size - (1 << s->shift));
    snd_nm256_writel(chip, NM_PBUFFER_CURRP, s->buf);
    snd_nm256_playback_mark(chip, s);

    /* Enable playback engine and interrupts. */
    snd_nm256_writeb(chip, NM_PLAYBACK_ENABLE_REG,
                     NM_PLAYBACK_ENABLE_FLAG | NM_PLAYBACK_FREERUN);
    /* Enable both channels. */
    snd_nm256_writew(chip, NM_AUDIO_MUTE_REG, 0x0);
}
static void
snd_nm256_playback_start(struct nm256 *chip, struct nm256_stream *s,
			 struct snd_pcm_substream *substream)
{
	
	snd_nm256_writel(chip, NM_PBUFFER_START, s->buf);
	snd_nm256_writel(chip, NM_PBUFFER_END, s->buf + s->dma_size - (1 << s->shift));
	snd_nm256_writel(chip, NM_PBUFFER_CURRP, s->buf);
	snd_nm256_playback_mark(chip, s);

	
	snd_nm256_writeb(chip, NM_PLAYBACK_ENABLE_REG,
			 NM_PLAYBACK_ENABLE_FLAG | NM_PLAYBACK_FREERUN);
	
	snd_nm256_writew(chip, NM_AUDIO_MUTE_REG, 0x0);
}
Example #9
0
static void
snd_nm256_ac97_write(ac97_t *ac97,
                     unsigned short reg, unsigned short val)
{
    nm256_t *chip = ac97->private_data;
    int tries = 2;
    u32 base;

    base = chip->mixer_base;

    snd_nm256_ac97_ready(chip);

    /* Wait for the write to take, too. */
    while (tries-- > 0) {
        snd_nm256_writew(chip, base + reg, val);
        msleep(1);  /* a little delay here seems better.. */
        if (snd_nm256_ac97_ready(chip))
            return;
    }
    snd_printd("nm256: ac97 codec not ready..\n");
}