Update of /cvsroot/alsa/alsa-kernel/core In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23362/core
Modified Files: memalloc.c pcm_memory.c sgbuf.c Log Message: - clean up the DMA code again. now only struct device pointer is handled for every BUS type. the pointer must be given via the corresponding macro snd_dma_xxx_data(). - added the hack for dma_alloc_coherent() to accept dev = NULL for ISA buffers. - added the missing include files. Index: memalloc.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/core/memalloc.c,v retrieving revision 1.26 retrieving revision 1.27 diff -u -r1.26 -r1.27 --- memalloc.c 3 Mar 2004 12:07:42 -0000 1.26 +++ memalloc.c 6 Mar 2004 16:51:28 -0000 1.27 @@ -25,11 +25,15 @@ #include <linux/module.h> #include <linux/proc_fs.h> #include <linux/init.h> +#include <linux/pci.h> #include <linux/slab.h> #include <linux/mm.h> #include <linux/dma-mapping.h> #include <asm/semaphore.h> #include <sound/memalloc.h> +#ifdef CONFIG_SBUS +#include <asm/sbus.h> +#endif MODULE_AUTHOR("Takashi Iwai <[EMAIL PROTECTED]>, Jaroslav Kysela <[EMAIL PROTECTED]>"); @@ -85,6 +89,30 @@ * Hacks */ +static void *snd_dma_alloc_coherent1(struct device *dev, size_t size, + dma_addr_t *dma_handle, int flags) +{ + if (dev) + return dma_alloc_coherent(dev, size, dma_handle, flags); + else /* FIXME: dma_alloc_coherent does't always accept dev=NULL */ + return pci_alloc_consistent(NULL, size, dma_handle); +} + +static void snd_dma_free_coherent1(struct device *dev, size_t size, void *dma_addr, + dma_addr_t dma_handle) +{ + if (dev) + return dma_free_coherent(dev, size, dma_addr, dma_handle); + else + return pci_free_consistent(NULL, size, dma_addr, dma_handle); +} + +#undef dma_alloc_coherent +#define dma_alloc_coherent snd_dma_alloc_coherent1 +#undef dma_free_coherent +#define dma_free_coherent snd_dma_free_coherent1 + + #if defined(__i386__) || defined(__ppc__) || defined(__x86_64__) /* @@ -257,9 +285,8 @@ return res; } -static inline -void *snd_malloc_dev_pages_fallback(struct device *dev, size_t size, - dma_addr_t *dma, size_t *res_size) +static void *snd_malloc_dev_pages_fallback(struct device *dev, size_t size, + dma_addr_t *dma, size_t *res_size) { void *res; @@ -274,9 +301,8 @@ return NULL; } -static inline -void snd_free_dev_pages(struct device *dev, size_t size, void *ptr, - dma_addr_t dma) +static void snd_free_dev_pages(struct device *dev, size_t size, void *ptr, + dma_addr_t dma) { int pg; @@ -287,65 +313,12 @@ dma_free_coherent(dev, PAGE_SIZE << pg, ptr, dma); } -#if defined(CONFIG_ISA) && ! defined(CONFIG_PCI) - -static inline -void *snd_malloc_isa_pages(size_t size, dma_addr_t *dma_addr) -{ - void *dma_area; - dma_area = snd_malloc_pages(size, GFP_ATOMIC|GFP_DMA); - *dma_addr = dma_area ? isa_virt_to_bus(dma_area) : 0UL; - return dma_area; -} - -static inline -void *snd_malloc_isa_pages_fallback(size_t size, - dma_addr_t *dma_addr, - size_t *res_size) -{ - void *dma_area; - dma_area = snd_malloc_pages_fallback(size, GFP_ATOMIC|GFP_DMA, res_size); - *dma_addr = dma_area ? isa_virt_to_bus(dma_area) : 0UL; - return dma_area; -} - -static inline -void snd_free_isa_pages(size_t size, void *ptr, dma_addr_t addr) -{ - return snd_free_pages(ptr, size); -} - -#endif - -#if defined(CONFIG_ISA) && defined(CONFIG_PCI) - -static inline -void *snd_malloc_isa_pages(size_t size, dma_addr_t *dma_addr) -{ - return snd_malloc_dev_pages(NULL, size, dma_addr); -} - -static inline -void *snd_malloc_isa_pages_fallback(size_t size, - dma_addr_t *dma_addr, - size_t *res_size) -{ - return snd_malloc_dev_pages_fallback(NULL, size, dma_addr, res_size); -} - -static inline -void snd_free_isa_pages(size_t size, void *ptr, dma_addr_t addr) -{ - return snd_free_dev_pages(NULL, size, ptr, addr); -} - -#endif - #ifdef CONFIG_SBUS -static void *snd_malloc_sbus_pages(struct sbus_dev *sdev, size_t size, +static void *snd_malloc_sbus_pages(struct device *dev, size_t size, dma_addr_t *dma_addr) { + struct sbus_dev *sdev = (struct sbus_dev *)dev; int pg; void *res; @@ -359,14 +332,14 @@ return res; } -static void *snd_malloc_sbus_pages_fallback(struct sbus_dev *sdev, size_t size, +static void *snd_malloc_sbus_pages_fallback(struct device *dev, size_t size, dma_addr_t *dma_addr, size_t *res_size) { void *res; snd_assert(res_size != NULL, return NULL); do { - if ((res = snd_malloc_sbus_pages(sdev, size, dma_addr)) != NULL) { + if ((res = snd_malloc_sbus_pages(dev, size, dma_addr)) != NULL) { *res_size = size; return res; } @@ -375,9 +348,10 @@ return NULL; } -static void snd_free_sbus_pages(struct sbus_dev *sdev, size_t size, +static void snd_free_sbus_pages(struct device *dev, size_t size, void *ptr, dma_addr_t dma_addr) { + struct sbus_dev *sdev = (struct sbus_dev *)dev; int pg; if (ptr == NULL) @@ -408,21 +382,7 @@ if (! allow_unused || (a->id != SNDRV_DMA_DEVICE_UNUSED && b->id != SNDRV_DMA_DEVICE_UNUSED)) return 0; } - switch (a->type) { - case SNDRV_DMA_TYPE_CONTINUOUS: -#ifdef CONFIG_ISA - case SNDRV_DMA_TYPE_ISA: -#endif - return a->dev.flags == b->dev.flags; -#ifdef CONFIG_SBUS - case SNDRV_DMA_TYPE_SBUS: - return a->dev.sbus == b->dev.sbus; -#endif - case SNDRV_DMA_TYPE_DEV: - case SNDRV_DMA_TYPE_DEV_SG: - return a->dev.dev == b->dev.dev; - } - return 0; + return a->dev == b->dev; } /** @@ -447,28 +407,17 @@ dmab->bytes = 0; switch (dev->type) { case SNDRV_DMA_TYPE_CONTINUOUS: - dmab->area = snd_malloc_pages(size, dev->dev.flags); + dmab->area = snd_malloc_pages(size, (unsigned long)dev->dev); dmab->addr = 0; break; -#ifdef CONFIG_ISA - case SNDRV_DMA_TYPE_ISA: - dmab->area = snd_malloc_isa_pages(size, &dmab->addr); - break; -#endif #ifdef CONFIG_SBUS case SNDRV_DMA_TYPE_SBUS: - dmab->area = snd_malloc_sbus_pages(dev->dev.sbus, size, &dmab->addr); - break; -#endif -#ifdef CONFIG_PCI - case SNDRV_DMA_TYPE_PCI: - dmab->area = snd_malloc_dev_pages(&dev->dev.pci->dev, size, &dmab->addr); + dmab->area = snd_malloc_sbus_pages(dev->dev, size, &dmab->addr); break; #endif case SNDRV_DMA_TYPE_DEV: - dmab->area = snd_malloc_dev_pages(dev->dev.dev, size, &dmab->addr); + dmab->area = snd_malloc_dev_pages(dev->dev, size, &dmab->addr); break; - case SNDRV_DMA_TYPE_PCI_SG: case SNDRV_DMA_TYPE_DEV_SG: snd_malloc_sgbuf_pages(dev, size, dmab, NULL); break; @@ -508,28 +457,17 @@ dmab->bytes = 0; switch (dev->type) { case SNDRV_DMA_TYPE_CONTINUOUS: - dmab->area = snd_malloc_pages_fallback(size, dev->dev.flags, &dmab->bytes); + dmab->area = snd_malloc_pages_fallback(size, (unsigned long)dev->dev, &dmab->bytes); dmab->addr = 0; break; -#ifdef CONFIG_ISA - case SNDRV_DMA_TYPE_ISA: - dmab->area = snd_malloc_isa_pages_fallback(size, &dmab->addr, &dmab->bytes); - break; -#endif #ifdef CONFIG_SBUS case SNDRV_DMA_TYPE_SBUS: - dmab->area = snd_malloc_sbus_pages_fallback(dev->dev.sbus, size, &dmab->addr, &dmab->bytes); - break; -#endif -#ifdef CONFIG_PCI - case SNDRV_DMA_TYPE_PCI: - dmab->area = snd_malloc_dev_pages_fallback(&dev->dev.pci->dev, size, &dmab->addr, &dmab->bytes); + dmab->area = snd_malloc_sbus_pages_fallback(dev->dev, size, &dmab->addr, &dmab->bytes); break; #endif case SNDRV_DMA_TYPE_DEV: - dmab->area = snd_malloc_dev_pages_fallback(dev->dev.dev, size, &dmab->addr, &dmab->bytes); + dmab->area = snd_malloc_dev_pages_fallback(dev->dev, size, &dmab->addr, &dmab->bytes); break; - case SNDRV_DMA_TYPE_PCI_SG: case SNDRV_DMA_TYPE_DEV_SG: snd_malloc_sgbuf_pages(dev, size, dmab, &dmab->bytes); break; @@ -558,26 +496,15 @@ case SNDRV_DMA_TYPE_CONTINUOUS: snd_free_pages(dmab->area, dmab->bytes); break; -#ifdef CONFIG_ISA - case SNDRV_DMA_TYPE_ISA: - snd_free_isa_pages(dmab->bytes, dmab->area, dmab->addr); - break; -#endif #ifdef CONFIG_SBUS case SNDRV_DMA_TYPE_SBUS: - snd_free_sbus_pages(dev->dev.sbus, dmab->bytes, dmab->area, dmab->addr); - break; -#endif -#ifdef CONFIG_PCI - case SNDRV_DMA_TYPE_PCI: - snd_free_dev_pages(&dev->dev.pci->dev, dmab->bytes, dmab->area, dmab->addr); + snd_free_sbus_pages(dev->dev, dmab->bytes, dmab->area, dmab->addr); break; #endif case SNDRV_DMA_TYPE_DEV: - snd_free_dev_pages(dev->dev.dev, dmab->bytes, dmab->area, dmab->addr); + snd_free_dev_pages(dev->dev, dmab->bytes, dmab->area, dmab->addr); break; case SNDRV_DMA_TYPE_DEV_SG: - case SNDRV_DMA_TYPE_PCI_SG: snd_free_sgbuf_pages(dmab); break; default: @@ -772,7 +699,7 @@ { memset(dev, 0, sizeof(*dev)); dev->type = SNDRV_DMA_TYPE_DEV; - dev->dev.dev = &pci->dev; + dev->dev = snd_dma_pci_data(pci); dev->id = id; } @@ -857,35 +784,24 @@ len += sprintf(page + len, " : type "); switch (mem->dev.type) { case SNDRV_DMA_TYPE_CONTINUOUS: - len += sprintf(page + len, "CONT [%x]", mem->dev.dev.flags); - break; -#ifdef CONFIG_ISA - case SNDRV_DMA_TYPE_ISA: - len += sprintf(page + len, "ISA [%x]", mem->dev.dev.flags); + len += sprintf(page + len, "CONT [%p]", mem->dev.dev); break; -#endif #ifdef CONFIG_SBUS case SNDRV_DMA_TYPE_SBUS: - len += sprintf(page + len, "SBUS [%x]", mem->dev.dev.sbus->slot); - break; -#endif -#ifdef CONFIG_PCI - case SNDRV_DMA_TYPE_PCI: - case SNDRV_DMA_TYPE_PCI_SG: - if (mem->dev.dev.dev) { - len += sprintf(page + len, "%s [%s]", - mem->dev.type == SNDRV_DMA_TYPE_PCI_SG ? "PCI" : "PCI-SG", - mem->dev.dev.pci->slot_name); + { + struct sbus_dev *sdev = (struct sbus_dev *)(mem->dev.dev); + len += sprintf(page + len, "SBUS [%x]", sbus->slot); } break; #endif case SNDRV_DMA_TYPE_DEV: case SNDRV_DMA_TYPE_DEV_SG: - if (mem->dev.dev.dev) { + if (mem->dev.dev) { len += sprintf(page + len, "%s [%s]", - mem->dev.type == SNDRV_DMA_TYPE_DEV_SG ? "DEV" : "DEV-SG", - mem->dev.dev.dev->bus_id); - } + mem->dev.type == SNDRV_DMA_TYPE_DEV_SG ? "DEV-SG" : "DEV", + mem->dev.dev->bus_id); + } else + len += sprintf(page + len, "ISA"); break; default: len += sprintf(page + len, "UNKNOWN"); Index: pcm_memory.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/core/pcm_memory.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -r1.24 -r1.25 --- pcm_memory.c 2 Mar 2004 15:32:36 -0000 1.24 +++ pcm_memory.c 6 Mar 2004 16:51:28 -0000 1.25 @@ -241,18 +241,11 @@ * Returns zero if successful, or a negative error code on failure. */ int snd_pcm_lib_preallocate_pages(snd_pcm_substream_t *substream, - int type, void *data, + int type, struct device *data, size_t size, size_t max) { - switch (type) { - case SNDRV_DMA_TYPE_ISA: - if ((unsigned long)data == 0) - data = snd_pcm_dma_flags(GFP_DMA|GFP_ATOMIC); - default: - substream->dma_device.type = type; - substream->dma_device.dev.data = data; - break; - } + substream->dma_device.type = type; + substream->dma_device.dev = data; setup_pcm_id(substream); return snd_pcm_lib_preallocate_pages1(substream, size, max); } Index: sgbuf.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/core/sgbuf.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- sgbuf.c 2 Mar 2004 18:06:50 -0000 1.6 +++ sgbuf.c 6 Mar 2004 16:51:28 -0000 1.7 @@ -74,10 +74,7 @@ return NULL; memset(sgbuf, 0, sizeof(*sgbuf)); sgbuf->dev = *dev; - if (dev->type == SNDRV_DMA_TYPE_PCI_SG) - sgbuf->dev.type = SNDRV_DMA_TYPE_PCI; - else - sgbuf->dev.type =SNDRV_DMA_TYPE_DEV; + sgbuf->dev.type = SNDRV_DMA_TYPE_DEV; pages = snd_sgbuf_aligned_pages(size); sgbuf->tblsize = sgbuf_align_table(pages); sgbuf->table = kmalloc(sizeof(*sgbuf->table) * sgbuf->tblsize, GFP_KERNEL); ------------------------------------------------------- This SF.Net email is sponsored by: IBM Linux Tutorials Free Linux tutorial presented by Daniel Robbins, President and CEO of GenToo technologies. Learn everything from fundamentals to system administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click _______________________________________________ Alsa-cvslog mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-cvslog