Beispiel #1
0
/* common trigger callback
 * calling the lowlevel callbacks in it
 */
static int snd_atiixp_pcm_trigger(snd_pcm_substream_t *substream, int cmd)
{
    atiixp_t *chip = snd_pcm_substream_chip(substream);
    atiixp_dma_t *dma = (atiixp_dma_t *)substream->runtime->private_data;
    int err = 0;

    snd_assert(dma->ops->enable_transfer && dma->ops->flush_dma, return -EINVAL);

    spin_lock(&chip->reg_lock);
    switch (cmd) {
    case SNDRV_PCM_TRIGGER_START:
        dma->ops->enable_transfer(chip, 1);
        dma->running = 1;
        break;
    case SNDRV_PCM_TRIGGER_STOP:
        dma->ops->enable_transfer(chip, 0);
        dma->running = 0;
        break;
    default:
        err = -EINVAL;
        break;
    }
    if (! err) {
        snd_atiixp_check_bus_busy(chip);
        if (cmd == SNDRV_PCM_TRIGGER_STOP) {
            dma->ops->flush_dma(chip);
            snd_atiixp_check_bus_busy(chip);
        }
    }
    spin_unlock(&chip->reg_lock);
    return err;
}
static int snd_atiixp_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
{
	struct atiixp_modem *chip = snd_pcm_substream_chip(substream);
	struct atiixp_dma *dma = substream->runtime->private_data;
	int err = 0;

	if (snd_BUG_ON(!dma->ops->enable_transfer ||
		       !dma->ops->flush_dma))
		return -EINVAL;

	spin_lock(&chip->reg_lock);
	switch(cmd) {
	case SNDRV_PCM_TRIGGER_START:
		dma->ops->enable_transfer(chip, 1);
		dma->running = 1;
		break;
	case SNDRV_PCM_TRIGGER_STOP:
		dma->ops->enable_transfer(chip, 0);
		dma->running = 0;
		break;
	default:
		err = -EINVAL;
		break;
	}
	if (! err) {
	snd_atiixp_check_bus_busy(chip);
	if (cmd == SNDRV_PCM_TRIGGER_STOP) {
		dma->ops->flush_dma(chip);
		snd_atiixp_check_bus_busy(chip);
	}
	}
	spin_unlock(&chip->reg_lock);
	return err;
}