diff options
Diffstat (limited to 'arch/mips/au1000/common/dma.c')
-rw-r--r-- | arch/mips/au1000/common/dma.c | 56 |
1 files changed, 28 insertions, 28 deletions
diff --git a/arch/mips/au1000/common/dma.c b/arch/mips/au1000/common/dma.c index 95f69ea146e9..d6fbda232e6a 100644 --- a/arch/mips/au1000/common/dma.c +++ b/arch/mips/au1000/common/dma.c | |||
@@ -1,12 +1,11 @@ | |||
1 | /* | 1 | /* |
2 | * | 2 | * |
3 | * BRIEF MODULE DESCRIPTION | 3 | * BRIEF MODULE DESCRIPTION |
4 | * A DMA channel allocator for Au1000. API is modeled loosely off of | 4 | * A DMA channel allocator for Au1x00. API is modeled loosely off of |
5 | * linux/kernel/dma.c. | 5 | * linux/kernel/dma.c. |
6 | * | 6 | * |
7 | * Copyright 2000 MontaVista Software Inc. | 7 | * Copyright 2000, 2008 MontaVista Software Inc. |
8 | * Author: MontaVista Software, Inc. | 8 | * Author: MontaVista Software, Inc. <source@mvista.com> |
9 | * stevel@mvista.com or source@mvista.com | ||
10 | * Copyright (C) 2005 Ralf Baechle (ralf@linux-mips.org) | 9 | * Copyright (C) 2005 Ralf Baechle (ralf@linux-mips.org) |
11 | * | 10 | * |
12 | * This program is free software; you can redistribute it and/or modify it | 11 | * This program is free software; you can redistribute it and/or modify it |
@@ -39,7 +38,8 @@ | |||
39 | #include <asm/mach-au1x00/au1000.h> | 38 | #include <asm/mach-au1x00/au1000.h> |
40 | #include <asm/mach-au1x00/au1000_dma.h> | 39 | #include <asm/mach-au1x00/au1000_dma.h> |
41 | 40 | ||
42 | #if defined(CONFIG_SOC_AU1000) || defined(CONFIG_SOC_AU1500) || defined(CONFIG_SOC_AU1100) | 41 | #if defined(CONFIG_SOC_AU1000) || defined(CONFIG_SOC_AU1500) || \ |
42 | defined(CONFIG_SOC_AU1100) | ||
43 | /* | 43 | /* |
44 | * A note on resource allocation: | 44 | * A note on resource allocation: |
45 | * | 45 | * |
@@ -56,7 +56,6 @@ | |||
56 | * returned from request_dma. | 56 | * returned from request_dma. |
57 | */ | 57 | */ |
58 | 58 | ||
59 | |||
60 | DEFINE_SPINLOCK(au1000_dma_spin_lock); | 59 | DEFINE_SPINLOCK(au1000_dma_spin_lock); |
61 | 60 | ||
62 | struct dma_chan au1000_dma_table[NUM_AU1000_DMA_CHANNELS] = { | 61 | struct dma_chan au1000_dma_table[NUM_AU1000_DMA_CHANNELS] = { |
@@ -71,7 +70,7 @@ struct dma_chan au1000_dma_table[NUM_AU1000_DMA_CHANNELS] = { | |||
71 | }; | 70 | }; |
72 | EXPORT_SYMBOL(au1000_dma_table); | 71 | EXPORT_SYMBOL(au1000_dma_table); |
73 | 72 | ||
74 | // Device FIFO addresses and default DMA modes | 73 | /* Device FIFO addresses and default DMA modes */ |
75 | static const struct dma_dev { | 74 | static const struct dma_dev { |
76 | unsigned int fifo_addr; | 75 | unsigned int fifo_addr; |
77 | unsigned int dma_mode; | 76 | unsigned int dma_mode; |
@@ -80,8 +79,8 @@ static const struct dma_dev { | |||
80 | {UART0_ADDR + UART_RX, 0}, | 79 | {UART0_ADDR + UART_RX, 0}, |
81 | {0, 0}, | 80 | {0, 0}, |
82 | {0, 0}, | 81 | {0, 0}, |
83 | {AC97C_DATA, DMA_DW16 }, // coherent | 82 | {AC97C_DATA, DMA_DW16 }, /* coherent */ |
84 | {AC97C_DATA, DMA_DR | DMA_DW16 }, // coherent | 83 | {AC97C_DATA, DMA_DR | DMA_DW16 }, /* coherent */ |
85 | {UART3_ADDR + UART_TX, DMA_DW8 | DMA_NC}, | 84 | {UART3_ADDR + UART_TX, DMA_DW8 | DMA_NC}, |
86 | {UART3_ADDR + UART_RX, DMA_DR | DMA_DW8 | DMA_NC}, | 85 | {UART3_ADDR + UART_RX, DMA_DR | DMA_DW8 | DMA_NC}, |
87 | {USBD_EP0RD, DMA_DR | DMA_DW8 | DMA_NC}, | 86 | {USBD_EP0RD, DMA_DR | DMA_DW8 | DMA_NC}, |
@@ -101,10 +100,10 @@ int au1000_dma_read_proc(char *buf, char **start, off_t fpos, | |||
101 | struct dma_chan *chan; | 100 | struct dma_chan *chan; |
102 | 101 | ||
103 | for (i = 0; i < NUM_AU1000_DMA_CHANNELS; i++) { | 102 | for (i = 0; i < NUM_AU1000_DMA_CHANNELS; i++) { |
104 | if ((chan = get_dma_chan(i)) != NULL) { | 103 | chan = get_dma_chan(i); |
104 | if (chan != NULL) | ||
105 | len += sprintf(buf + len, "%2d: %s\n", | 105 | len += sprintf(buf + len, "%2d: %s\n", |
106 | i, chan->dev_str); | 106 | i, chan->dev_str); |
107 | } | ||
108 | } | 107 | } |
109 | 108 | ||
110 | if (fpos >= len) { | 109 | if (fpos >= len) { |
@@ -113,18 +112,19 @@ int au1000_dma_read_proc(char *buf, char **start, off_t fpos, | |||
113 | return 0; | 112 | return 0; |
114 | } | 113 | } |
115 | *start = buf + fpos; | 114 | *start = buf + fpos; |
116 | if ((len -= fpos) > length) | 115 | len -= fpos; |
116 | if (len > length) | ||
117 | return length; | 117 | return length; |
118 | *eof = 1; | 118 | *eof = 1; |
119 | return len; | 119 | return len; |
120 | } | 120 | } |
121 | 121 | ||
122 | // Device FIFO addresses and default DMA modes - 2nd bank | 122 | /* Device FIFO addresses and default DMA modes - 2nd bank */ |
123 | static const struct dma_dev dma_dev_table_bank2[DMA_NUM_DEV_BANK2] = { | 123 | static const struct dma_dev dma_dev_table_bank2[DMA_NUM_DEV_BANK2] = { |
124 | {SD0_XMIT_FIFO, DMA_DS | DMA_DW8}, // coherent | 124 | { SD0_XMIT_FIFO, DMA_DS | DMA_DW8 }, /* coherent */ |
125 | {SD0_RECV_FIFO, DMA_DS | DMA_DR | DMA_DW8}, // coherent | 125 | { SD0_RECV_FIFO, DMA_DS | DMA_DR | DMA_DW8 }, /* coherent */ |
126 | {SD1_XMIT_FIFO, DMA_DS | DMA_DW8}, // coherent | 126 | { SD1_XMIT_FIFO, DMA_DS | DMA_DW8 }, /* coherent */ |
127 | {SD1_RECV_FIFO, DMA_DS | DMA_DR | DMA_DW8} // coherent | 127 | { SD1_RECV_FIFO, DMA_DS | DMA_DR | DMA_DW8 } /* coherent */ |
128 | }; | 128 | }; |
129 | 129 | ||
130 | void dump_au1000_dma_channel(unsigned int dmanr) | 130 | void dump_au1000_dma_channel(unsigned int dmanr) |
@@ -150,7 +150,6 @@ void dump_au1000_dma_channel(unsigned int dmanr) | |||
150 | au_readl(chan->io + DMA_BUFFER1_COUNT)); | 150 | au_readl(chan->io + DMA_BUFFER1_COUNT)); |
151 | } | 151 | } |
152 | 152 | ||
153 | |||
154 | /* | 153 | /* |
155 | * Finds a free channel, and binds the requested device to it. | 154 | * Finds a free channel, and binds the requested device to it. |
156 | * Returns the allocated channel number, or negative on error. | 155 | * Returns the allocated channel number, or negative on error. |
@@ -169,14 +168,14 @@ int request_au1000_dma(int dev_id, const char *dev_str, | |||
169 | if (dev_id < 0 || dev_id >= (DMA_NUM_DEV + DMA_NUM_DEV_BANK2)) | 168 | if (dev_id < 0 || dev_id >= (DMA_NUM_DEV + DMA_NUM_DEV_BANK2)) |
170 | return -EINVAL; | 169 | return -EINVAL; |
171 | #else | 170 | #else |
172 | if (dev_id < 0 || dev_id >= DMA_NUM_DEV) | 171 | if (dev_id < 0 || dev_id >= DMA_NUM_DEV) |
173 | return -EINVAL; | 172 | return -EINVAL; |
174 | #endif | 173 | #endif |
175 | 174 | ||
176 | for (i = 0; i < NUM_AU1000_DMA_CHANNELS; i++) { | 175 | for (i = 0; i < NUM_AU1000_DMA_CHANNELS; i++) |
177 | if (au1000_dma_table[i].dev_id < 0) | 176 | if (au1000_dma_table[i].dev_id < 0) |
178 | break; | 177 | break; |
179 | } | 178 | |
180 | if (i == NUM_AU1000_DMA_CHANNELS) | 179 | if (i == NUM_AU1000_DMA_CHANNELS) |
181 | return -ENODEV; | 180 | return -ENODEV; |
182 | 181 | ||
@@ -185,15 +184,15 @@ int request_au1000_dma(int dev_id, const char *dev_str, | |||
185 | if (dev_id >= DMA_NUM_DEV) { | 184 | if (dev_id >= DMA_NUM_DEV) { |
186 | dev_id -= DMA_NUM_DEV; | 185 | dev_id -= DMA_NUM_DEV; |
187 | dev = &dma_dev_table_bank2[dev_id]; | 186 | dev = &dma_dev_table_bank2[dev_id]; |
188 | } else { | 187 | } else |
189 | dev = &dma_dev_table[dev_id]; | 188 | dev = &dma_dev_table[dev_id]; |
190 | } | ||
191 | 189 | ||
192 | if (irqhandler) { | 190 | if (irqhandler) { |
193 | chan->irq = AU1000_DMA_INT_BASE + i; | 191 | chan->irq = AU1000_DMA_INT_BASE + i; |
194 | chan->irq_dev = irq_dev_id; | 192 | chan->irq_dev = irq_dev_id; |
195 | if ((ret = request_irq(chan->irq, irqhandler, irqflags, | 193 | ret = request_irq(chan->irq, irqhandler, irqflags, dev_str, |
196 | dev_str, chan->irq_dev))) { | 194 | chan->irq_dev); |
195 | if (ret) { | ||
197 | chan->irq = 0; | 196 | chan->irq = 0; |
198 | chan->irq_dev = NULL; | 197 | chan->irq_dev = NULL; |
199 | return ret; | 198 | return ret; |
@@ -203,7 +202,7 @@ int request_au1000_dma(int dev_id, const char *dev_str, | |||
203 | chan->irq_dev = NULL; | 202 | chan->irq_dev = NULL; |
204 | } | 203 | } |
205 | 204 | ||
206 | // fill it in | 205 | /* fill it in */ |
207 | chan->io = DMA_CHANNEL_BASE + i * DMA_CHANNEL_LEN; | 206 | chan->io = DMA_CHANNEL_BASE + i * DMA_CHANNEL_LEN; |
208 | chan->dev_id = dev_id; | 207 | chan->dev_id = dev_id; |
209 | chan->dev_str = dev_str; | 208 | chan->dev_str = dev_str; |
@@ -220,8 +219,9 @@ EXPORT_SYMBOL(request_au1000_dma); | |||
220 | void free_au1000_dma(unsigned int dmanr) | 219 | void free_au1000_dma(unsigned int dmanr) |
221 | { | 220 | { |
222 | struct dma_chan *chan = get_dma_chan(dmanr); | 221 | struct dma_chan *chan = get_dma_chan(dmanr); |
222 | |||
223 | if (!chan) { | 223 | if (!chan) { |
224 | printk("Trying to free DMA%d\n", dmanr); | 224 | printk(KERN_ERR "Error trying to free DMA%d\n", dmanr); |
225 | return; | 225 | return; |
226 | } | 226 | } |
227 | 227 | ||
@@ -235,4 +235,4 @@ void free_au1000_dma(unsigned int dmanr) | |||
235 | } | 235 | } |
236 | EXPORT_SYMBOL(free_au1000_dma); | 236 | EXPORT_SYMBOL(free_au1000_dma); |
237 | 237 | ||
238 | #endif // AU1000 AU1500 AU1100 | 238 | #endif /* AU1000 AU1500 AU1100 */ |