diff options
Diffstat (limited to 'sound/pci/asihpi/hpios.c')
-rw-r--r-- | sound/pci/asihpi/hpios.c | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/sound/pci/asihpi/hpios.c b/sound/pci/asihpi/hpios.c new file mode 100644 index 000000000000..de615cfdb950 --- /dev/null +++ b/sound/pci/asihpi/hpios.c | |||
@@ -0,0 +1,114 @@ | |||
1 | /****************************************************************************** | ||
2 | |||
3 | AudioScience HPI driver | ||
4 | Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com> | ||
5 | |||
6 | This program is free software; you can redistribute it and/or modify | ||
7 | it under the terms of version 2 of the GNU General Public License as | ||
8 | published by the Free Software Foundation; | ||
9 | |||
10 | This program is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | GNU General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU General Public License | ||
16 | along with this program; if not, write to the Free Software | ||
17 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
18 | |||
19 | HPI Operating System function implementation for Linux | ||
20 | |||
21 | (C) Copyright AudioScience Inc. 1997-2003 | ||
22 | ******************************************************************************/ | ||
23 | #define SOURCEFILE_NAME "hpios.c" | ||
24 | #include "hpi_internal.h" | ||
25 | #include "hpidebug.h" | ||
26 | #include <linux/delay.h> | ||
27 | #include <linux/sched.h> | ||
28 | |||
29 | void hpios_delay_micro_seconds(u32 num_micro_sec) | ||
30 | { | ||
31 | if ((usecs_to_jiffies(num_micro_sec) > 1) && !in_interrupt()) { | ||
32 | /* MUST NOT SCHEDULE IN INTERRUPT CONTEXT! */ | ||
33 | schedule_timeout_uninterruptible(usecs_to_jiffies | ||
34 | (num_micro_sec)); | ||
35 | } else if (num_micro_sec <= 2000) | ||
36 | udelay(num_micro_sec); | ||
37 | else | ||
38 | mdelay(num_micro_sec / 1000); | ||
39 | |||
40 | } | ||
41 | |||
42 | void hpios_locked_mem_init(void) | ||
43 | { | ||
44 | } | ||
45 | |||
46 | /** Allocated an area of locked memory for bus master DMA operations. | ||
47 | |||
48 | On error, return -ENOMEM, and *pMemArea.size = 0 | ||
49 | */ | ||
50 | u16 hpios_locked_mem_alloc(struct consistent_dma_area *p_mem_area, u32 size, | ||
51 | struct pci_dev *pdev) | ||
52 | { | ||
53 | /*?? any benefit in using managed dmam_alloc_coherent? */ | ||
54 | p_mem_area->vaddr = | ||
55 | dma_alloc_coherent(&pdev->dev, size, &p_mem_area->dma_handle, | ||
56 | GFP_DMA32 | GFP_KERNEL); | ||
57 | |||
58 | if (p_mem_area->vaddr) { | ||
59 | HPI_DEBUG_LOG(DEBUG, "allocated %d bytes, dma 0x%x vma %p\n", | ||
60 | size, (unsigned int)p_mem_area->dma_handle, | ||
61 | p_mem_area->vaddr); | ||
62 | p_mem_area->pdev = &pdev->dev; | ||
63 | p_mem_area->size = size; | ||
64 | return 0; | ||
65 | } else { | ||
66 | HPI_DEBUG_LOG(WARNING, | ||
67 | "failed to allocate %d bytes locked memory\n", size); | ||
68 | p_mem_area->size = 0; | ||
69 | return -ENOMEM; | ||
70 | } | ||
71 | } | ||
72 | |||
73 | u16 hpios_locked_mem_free(struct consistent_dma_area *p_mem_area) | ||
74 | { | ||
75 | if (p_mem_area->size) { | ||
76 | dma_free_coherent(p_mem_area->pdev, p_mem_area->size, | ||
77 | p_mem_area->vaddr, p_mem_area->dma_handle); | ||
78 | HPI_DEBUG_LOG(DEBUG, "freed %lu bytes, dma 0x%x vma %p\n", | ||
79 | (unsigned long)p_mem_area->size, | ||
80 | (unsigned int)p_mem_area->dma_handle, | ||
81 | p_mem_area->vaddr); | ||
82 | p_mem_area->size = 0; | ||
83 | return 0; | ||
84 | } else { | ||
85 | return 1; | ||
86 | } | ||
87 | } | ||
88 | |||
89 | void hpios_locked_mem_free_all(void) | ||
90 | { | ||
91 | } | ||
92 | |||
93 | void __iomem *hpios_map_io(struct pci_dev *pci_dev, int idx, | ||
94 | unsigned int length) | ||
95 | { | ||
96 | HPI_DEBUG_LOG(DEBUG, "mapping %d %s %08llx-%08llx %04llx len 0x%x\n", | ||
97 | idx, pci_dev->resource[idx].name, | ||
98 | (unsigned long long)pci_resource_start(pci_dev, idx), | ||
99 | (unsigned long long)pci_resource_end(pci_dev, idx), | ||
100 | (unsigned long long)pci_resource_flags(pci_dev, idx), length); | ||
101 | |||
102 | if (!(pci_resource_flags(pci_dev, idx) & IORESOURCE_MEM)) { | ||
103 | HPI_DEBUG_LOG(ERROR, "not an io memory resource\n"); | ||
104 | return NULL; | ||
105 | } | ||
106 | |||
107 | if (length > pci_resource_len(pci_dev, idx)) { | ||
108 | HPI_DEBUG_LOG(ERROR, "resource too small for requested %d \n", | ||
109 | length); | ||
110 | return NULL; | ||
111 | } | ||
112 | |||
113 | return ioremap(pci_resource_start(pci_dev, idx), length); | ||
114 | } | ||