-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Russell King
authored and
Jaroslav Kysela
committed
May 29, 2005
1 parent
6f698ed
commit 438e8d8
Showing
3 changed files
with
85 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: f7de9cfd25b6867a2854d98d734e03e1a9fc65fb | ||
refs/heads/master: 9b9a5afffd8636a82c6b32970342aef9d1f3d17d |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
/* | ||
* linux/sound/arm/devdma.c | ||
* | ||
* Copyright (C) 2003-2004 Russell King, All rights reserved. | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
* | ||
* ARM DMA shim for ALSA. | ||
*/ | ||
#include <linux/device.h> | ||
#include <linux/dma-mapping.h> | ||
|
||
#include <sound/driver.h> | ||
#include <sound/core.h> | ||
#include <sound/pcm.h> | ||
|
||
#include "devdma.h" | ||
|
||
void devdma_hw_free(struct device *dev, snd_pcm_substream_t *substream) | ||
{ | ||
snd_pcm_runtime_t *runtime = substream->runtime; | ||
struct snd_dma_buffer *buf = runtime->dma_buffer_p; | ||
|
||
if (runtime->dma_area == NULL) | ||
return; | ||
|
||
if (buf != &substream->dma_buffer) { | ||
dma_free_coherent(buf->dev.dev, buf->bytes, buf->area, buf->addr); | ||
kfree(runtime->dma_buffer_p); | ||
} | ||
|
||
snd_pcm_set_runtime_buffer(substream, NULL); | ||
} | ||
|
||
int devdma_hw_alloc(struct device *dev, snd_pcm_substream_t *substream, size_t size) | ||
{ | ||
snd_pcm_runtime_t *runtime = substream->runtime; | ||
struct snd_dma_buffer *buf = runtime->dma_buffer_p; | ||
int ret = 0; | ||
|
||
if (buf) { | ||
if (buf->bytes >= size) | ||
goto out; | ||
devdma_hw_free(dev, substream); | ||
} | ||
|
||
if (substream->dma_buffer.area != NULL && substream->dma_buffer.bytes >= size) { | ||
buf = &substream->dma_buffer; | ||
} else { | ||
buf = kmalloc(sizeof(struct snd_dma_buffer), GFP_KERNEL); | ||
if (!buf) | ||
goto nomem; | ||
|
||
buf->dev.type = SNDRV_DMA_TYPE_DEV; | ||
buf->dev.dev = dev; | ||
buf->area = dma_alloc_coherent(dev, size, &buf->addr, GFP_KERNEL); | ||
buf->bytes = size; | ||
buf->private_data = NULL; | ||
|
||
if (!buf->area) | ||
goto free; | ||
} | ||
snd_pcm_set_runtime_buffer(substream, buf); | ||
ret = 1; | ||
out: | ||
runtime->dma_bytes = size; | ||
return ret; | ||
|
||
free: | ||
kfree(buf); | ||
nomem: | ||
return -ENOMEM; | ||
} | ||
|
||
int devdma_mmap(struct device *dev, snd_pcm_substream_t *substream, struct vm_area_struct *vma) | ||
{ | ||
snd_pcm_runtime_t *runtime = substream->runtime; | ||
return dma_mmap_coherent(dev, vma, runtime->dma_area, runtime->dma_addr, runtime->dma_bytes); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
void devdma_hw_free(struct device *dev, snd_pcm_substream_t *substream); | ||
int devdma_hw_alloc(struct device *dev, snd_pcm_substream_t *substream, size_t size); | ||
int devdma_mmap(struct device *dev, snd_pcm_substream_t *substream, struct vm_area_struct *vma); |