コード例 #1
0
ファイル: dma.c プロジェクト: 454053205/linux
static void au1000_dma_start(struct audio_stream *stream)
{
	if (!stream->buffer)
		return;

	init_dma(stream->dma);
	if (get_dma_active_buffer(stream->dma) == 0) {
		clear_dma_done0(stream->dma);
		set_dma_addr0(stream->dma, stream->buffer->start);
		set_dma_count0(stream->dma, stream->period_size >> 1);
		set_dma_addr1(stream->dma, stream->buffer->next->start);
		set_dma_count1(stream->dma, stream->period_size >> 1);
	} else {
コード例 #2
0
static void
au1000_dma_start(audio_stream_t *stream)
{
	snd_pcm_substream_t *substream = stream->substream;
	snd_pcm_runtime_t *runtime = substream->runtime;

	unsigned long flags, dma_start;
	int i;
	au1000_period_t * pointer;

	if (stream->buffer == NULL) {
		dma_start = virt_to_phys(runtime->dma_area);

		stream->period_size = frames_to_bytes(runtime,
			runtime->period_size);
		stream->buffer = kmalloc(sizeof(au1000_period_t), GFP_KERNEL);
		pointer = stream->buffer;
		for (i = 0 ; i < runtime->periods ; i++) {
			pointer->start = (u32)(dma_start +
				(i * stream->period_size));
			pointer->relative_end = (u32)
				(((i+1) * stream->period_size) - 0x1);
			if ( i < runtime->periods - 1) {
				pointer->next = kmalloc(sizeof(au1000_period_t)
					, GFP_KERNEL);
				pointer = pointer->next;
			}
		}
		pointer->next = stream->buffer;

		spin_lock_irqsave(&stream->dma_lock, flags);
		init_dma(stream->dma);
		if (get_dma_active_buffer(stream->dma) == 0) {
			clear_dma_done0(stream->dma);
			set_dma_addr0(stream->dma, stream->buffer->start);
			set_dma_count0(stream->dma, stream->period_size >> 1);
			set_dma_addr1(stream->dma, stream->buffer->next->start);
			set_dma_count1(stream->dma, stream->period_size >> 1);
		} else {