--- pcm_native.c 2003-05-30 14:57:55.000000000 +0200 +++ pcm_native.c 2003-05-30 15:00:01.000000000 +0200 @@ -1,3 +1,4 @@ +#define __NO_VERSION__ /* * Digital Audio (PCM) abstract layer * Copyright (c) by Jaroslav Kysela @@ -2602,6 +2603,9 @@ snd_pcm_runtime_t *runtime; snd_pcm_sframes_t result; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 0) + up(&file->f_dentry->d_inode->i_sem); +#endif pcm_file = snd_magic_cast(snd_pcm_file_t, file->private_data, result = -ENXIO; goto end); substream = pcm_file->substream; snd_assert(substream != NULL, result = -ENXIO; goto end); @@ -2619,9 +2623,13 @@ if (result > 0) result = frames_to_bytes(runtime, result); end: +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 0) + down(&file->f_dentry->d_inode->i_sem); +#endif return result; } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 3, 44) static ssize_t snd_pcm_readv(struct file *file, const struct iovec *_vector, unsigned long count, loff_t * offset) @@ -2668,6 +2676,9 @@ void **bufs; snd_pcm_uframes_t frames; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 0) + up(&file->f_dentry->d_inode->i_sem); +#endif pcm_file = snd_magic_cast(snd_pcm_file_t, file->private_data, result = -ENXIO; goto end); substream = pcm_file->substream; snd_assert(substream != NULL, result = -ENXIO; goto end); @@ -2692,8 +2703,12 @@ result = frames_to_bytes(runtime, result); kfree(bufs); end: +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 0) + down(&file->f_dentry->d_inode->i_sem); +#endif return result; } +#endif unsigned int snd_pcm_playback_poll(struct file *file, poll_table * wait) { @@ -2775,7 +2790,22 @@ return mask; } +#ifndef VM_RESERVED +#ifndef LINUX_2_2 +static int snd_pcm_mmap_swapout(struct page * page, struct file * file) +#else +static int snd_pcm_mmap_swapout(struct vm_area_struct * area, struct page * page) +#endif +{ + return 0; +} +#endif + +#ifndef LINUX_2_2 static struct page * snd_pcm_mmap_status_nopage(struct vm_area_struct *area, unsigned long address, int no_share) +#else +static unsigned long snd_pcm_mmap_status_nopage(struct vm_area_struct *area, unsigned long address, int no_share) +#endif { snd_pcm_substream_t *substream = (snd_pcm_substream_t *)area->vm_private_data; snd_pcm_runtime_t *runtime; @@ -2786,12 +2816,19 @@ runtime = substream->runtime; page = virt_to_page(runtime->status); get_page(page); +#ifndef LINUX_2_2 return page; +#else + return page_address(page); +#endif } static struct vm_operations_struct snd_pcm_vm_ops_status = { .nopage = snd_pcm_mmap_status_nopage, +#ifndef VM_RESERVED + .swapout = snd_pcm_mmap_swapout, +#endif }; int snd_pcm_mmap_status(snd_pcm_substream_t *substream, struct file *file, @@ -2807,12 +2844,22 @@ if (size != PAGE_ALIGN(sizeof(snd_pcm_mmap_status_t))) return -EINVAL; area->vm_ops = &snd_pcm_vm_ops_status; +#ifndef LINUX_2_2 area->vm_private_data = substream; +#else + area->vm_private_data = (long)substream; +#endif +#ifdef VM_RESERVED area->vm_flags |= VM_RESERVED; +#endif return 0; } +#ifndef LINUX_2_2 static struct page * snd_pcm_mmap_control_nopage(struct vm_area_struct *area, unsigned long address, int no_share) +#else +static unsigned long snd_pcm_mmap_control_nopage(struct vm_area_struct *area, unsigned long address, int no_share) +#endif { snd_pcm_substream_t *substream = (snd_pcm_substream_t *)area->vm_private_data; snd_pcm_runtime_t *runtime; @@ -2823,12 +2870,19 @@ runtime = substream->runtime; page = virt_to_page(runtime->control); get_page(page); +#ifndef LINUX_2_2 return page; +#else + return page_address(page); +#endif } static struct vm_operations_struct snd_pcm_vm_ops_control = { .nopage = snd_pcm_mmap_control_nopage, +#ifndef VM_RESERVED + .swapout = snd_pcm_mmap_swapout, +#endif }; static int snd_pcm_mmap_control(snd_pcm_substream_t *substream, struct file *file, @@ -2844,8 +2898,14 @@ if (size != PAGE_ALIGN(sizeof(snd_pcm_mmap_control_t))) return -EINVAL; area->vm_ops = &snd_pcm_vm_ops_control; +#ifndef LINUX_2_2 area->vm_private_data = substream; +#else + area->vm_private_data = (long)substream; +#endif +#ifdef VM_RESERVED area->vm_flags |= VM_RESERVED; +#endif return 0; } @@ -2861,7 +2921,11 @@ atomic_dec(&substream->runtime->mmap_count); } +#ifndef LINUX_2_2 static struct page * snd_pcm_mmap_data_nopage(struct vm_area_struct *area, unsigned long address, int no_share) +#else +static unsigned long snd_pcm_mmap_data_nopage(struct vm_area_struct *area, unsigned long address, int no_share) +#endif { snd_pcm_substream_t *substream = (snd_pcm_substream_t *)area->vm_private_data; snd_pcm_runtime_t *runtime; @@ -2873,7 +2937,11 @@ if (substream == NULL) return NOPAGE_OOM; runtime = substream->runtime; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 3, 25) offset = area->vm_pgoff << PAGE_SHIFT; +#else + offset = area->vm_offset; +#endif offset += address - area->vm_start; snd_assert((offset % PAGE_SIZE) == 0, return NOPAGE_OOM); dma_bytes = PAGE_ALIGN(runtime->dma_bytes); @@ -2888,7 +2956,11 @@ page = virt_to_page(vaddr); } get_page(page); +#ifndef LINUX_2_2 return page; +#else + return page_address(page); +#endif } static struct vm_operations_struct snd_pcm_vm_ops_data = @@ -2896,6 +2968,9 @@ .open = snd_pcm_mmap_data_open, .close = snd_pcm_mmap_data_close, .nopage = snd_pcm_mmap_data_nopage, +#ifndef VM_RESERVED + .swapout = snd_pcm_mmap_swapout, +#endif }; int snd_pcm_mmap_data(snd_pcm_substream_t *substream, struct file *file, @@ -2923,7 +2998,11 @@ runtime->access == SNDRV_PCM_ACCESS_RW_NONINTERLEAVED) return -EINVAL; size = area->vm_end - area->vm_start; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 3, 25) offset = area->vm_pgoff << PAGE_SHIFT; +#else + offset = area->vm_offset; +#endif dma_bytes = PAGE_ALIGN(runtime->dma_bytes); if ((size_t)size > dma_bytes) return -EINVAL; @@ -2931,8 +3010,14 @@ return -EINVAL; area->vm_ops = &snd_pcm_vm_ops_data; +#ifndef LINUX_2_2 area->vm_private_data = substream; +#else + area->vm_private_data = (long)substream; +#endif +#ifdef VM_RESERVED area->vm_flags |= VM_RESERVED; +#endif atomic_inc(&runtime->mmap_count); return 0; } @@ -2947,7 +3032,11 @@ substream = pcm_file->substream; snd_assert(substream != NULL, return -ENXIO); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 3, 25) offset = area->vm_pgoff << PAGE_SHIFT; +#else + offset = area->vm_offset; +#endif switch (offset) { case SNDRV_PCM_MMAP_OFFSET_STATUS: return snd_pcm_mmap_status(substream, file, area); @@ -3055,9 +3144,13 @@ */ static struct file_operations snd_pcm_f_ops_playback = { +#ifndef LINUX_2_2 .owner = THIS_MODULE, +#endif .write = snd_pcm_write, +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 3, 44) .writev = snd_pcm_writev, +#endif .open = snd_pcm_open, .release = snd_pcm_release, .poll = snd_pcm_playback_poll, @@ -3067,9 +3160,13 @@ }; static struct file_operations snd_pcm_f_ops_capture = { +#ifndef LINUX_2_2 .owner = THIS_MODULE, +#endif .read = snd_pcm_read, +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 3, 44) .readv = snd_pcm_readv, +#endif .open = snd_pcm_open, .release = snd_pcm_release, .poll = snd_pcm_capture_poll,