diff options
-rw-r--r-- | arch/m68k/include/asm/cacheflush_no.h | 11 | ||||
-rw-r--r-- | arch/m68k/include/asm/dma-mapping_no.h | 4 | ||||
-rw-r--r-- | arch/m68k/include/asm/system_no.h | 2 | ||||
-rw-r--r-- | arch/m68knommu/Kconfig | 27 | ||||
-rw-r--r-- | arch/m68knommu/Makefile | 1 | ||||
-rw-r--r-- | arch/m68knommu/kernel/Makefile | 1 | ||||
-rw-r--r-- | arch/m68knommu/kernel/comempci.c | 980 | ||||
-rw-r--r-- | arch/m68knommu/kernel/signal.c | 15 | ||||
-rw-r--r-- | arch/m68knommu/kernel/syscalltable.S | 2 | ||||
-rw-r--r-- | arch/m68knommu/platform/5307/config.c | 2 | ||||
-rw-r--r-- | arch/m68knommu/platform/532x/config.c | 8 | ||||
-rw-r--r-- | arch/m68knommu/platform/coldfire/entry.S | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_irq.c | 161 | ||||
-rw-r--r-- | drivers/net/Kconfig | 2 | ||||
-rw-r--r-- | drivers/net/fec.c | 2 | ||||
-rw-r--r-- | drivers/serial/mcf.c | 11 | ||||
-rw-r--r-- | include/drm/drm.h | 2 | ||||
-rw-r--r-- | include/drm/drmP.h | 9 | ||||
-rw-r--r-- | include/linux/dmi.h | 2 | ||||
-rw-r--r-- | mm/nommu.c | 4 | ||||
-rw-r--r-- | security/smack/smackfs.c | 2 |
21 files changed, 79 insertions, 1184 deletions
diff --git a/arch/m68k/include/asm/cacheflush_no.h b/arch/m68k/include/asm/cacheflush_no.h index 87e5dc0413b4..c65f00a94553 100644 --- a/arch/m68k/include/asm/cacheflush_no.h +++ b/arch/m68k/include/asm/cacheflush_no.h | |||
@@ -51,13 +51,20 @@ static inline void __flush_cache_all(void) | |||
51 | "movec %%d0,%%CACR\n\t" | 51 | "movec %%d0,%%CACR\n\t" |
52 | : : : "d0", "a0" ); | 52 | : : : "d0", "a0" ); |
53 | #endif /* CONFIG_M5407 */ | 53 | #endif /* CONFIG_M5407 */ |
54 | #if defined(CONFIG_M527x) || defined(CONFIG_M528x) | 54 | #if defined(CONFIG_M523x) || defined(CONFIG_M527x) |
55 | __asm__ __volatile__ ( | ||
56 | "movel #0x81400100, %%d0\n\t" | ||
57 | "movec %%d0, %%CACR\n\t" | ||
58 | "nop\n\t" | ||
59 | : : : "d0" ); | ||
60 | #endif /* CONFIG_M523x || CONFIG_M527x */ | ||
61 | #if defined(CONFIG_M528x) | ||
55 | __asm__ __volatile__ ( | 62 | __asm__ __volatile__ ( |
56 | "movel #0x81000200, %%d0\n\t" | 63 | "movel #0x81000200, %%d0\n\t" |
57 | "movec %%d0, %%CACR\n\t" | 64 | "movec %%d0, %%CACR\n\t" |
58 | "nop\n\t" | 65 | "nop\n\t" |
59 | : : : "d0" ); | 66 | : : : "d0" ); |
60 | #endif /* CONFIG_M527x || CONFIG_M528x */ | 67 | #endif /* CONFIG_M528x */ |
61 | #if defined(CONFIG_M5206) || defined(CONFIG_M5206e) || defined(CONFIG_M5272) | 68 | #if defined(CONFIG_M5206) || defined(CONFIG_M5206e) || defined(CONFIG_M5272) |
62 | __asm__ __volatile__ ( | 69 | __asm__ __volatile__ ( |
63 | "movel #0x81000100, %%d0\n\t" | 70 | "movel #0x81000100, %%d0\n\t" |
diff --git a/arch/m68k/include/asm/dma-mapping_no.h b/arch/m68k/include/asm/dma-mapping_no.h index 6aeab18e58bd..1748f2bca940 100644 --- a/arch/m68k/include/asm/dma-mapping_no.h +++ b/arch/m68k/include/asm/dma-mapping_no.h | |||
@@ -1,10 +1,6 @@ | |||
1 | #ifndef _M68KNOMMU_DMA_MAPPING_H | 1 | #ifndef _M68KNOMMU_DMA_MAPPING_H |
2 | #define _M68KNOMMU_DMA_MAPPING_H | 2 | #define _M68KNOMMU_DMA_MAPPING_H |
3 | 3 | ||
4 | #ifdef CONFIG_PCI | ||
5 | #include <asm-generic/dma-mapping.h> | ||
6 | #else | ||
7 | #include <asm-generic/dma-mapping-broken.h> | 4 | #include <asm-generic/dma-mapping-broken.h> |
8 | #endif | ||
9 | 5 | ||
10 | #endif /* _M68KNOMMU_DMA_MAPPING_H */ | 6 | #endif /* _M68KNOMMU_DMA_MAPPING_H */ |
diff --git a/arch/m68k/include/asm/system_no.h b/arch/m68k/include/asm/system_no.h index 40f49de69821..4496c0aa8379 100644 --- a/arch/m68k/include/asm/system_no.h +++ b/arch/m68k/include/asm/system_no.h | |||
@@ -230,7 +230,7 @@ static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int siz | |||
230 | jmp 0xf0000400; \ | 230 | jmp 0xf0000400; \ |
231 | "); \ | 231 | "); \ |
232 | }) | 232 | }) |
233 | #elif defined(CONFIG_NETtel) || defined(CONFIG_eLIA) || \ | 233 | #elif defined(CONFIG_NETtel) || \ |
234 | defined(CONFIG_SECUREEDGEMP3) || defined(CONFIG_CLEOPATRA) | 234 | defined(CONFIG_SECUREEDGEMP3) || defined(CONFIG_CLEOPATRA) |
235 | #define HARD_RESET_NOW() ({ \ | 235 | #define HARD_RESET_NOW() ({ \ |
236 | asm(" \ | 236 | asm(" \ |
diff --git a/arch/m68knommu/Kconfig b/arch/m68knommu/Kconfig index 76b66feb74df..4beb59dfc6ec 100644 --- a/arch/m68knommu/Kconfig +++ b/arch/m68knommu/Kconfig | |||
@@ -14,6 +14,10 @@ config MMU | |||
14 | bool | 14 | bool |
15 | default n | 15 | default n |
16 | 16 | ||
17 | config NO_DMA | ||
18 | bool | ||
19 | default y | ||
20 | |||
17 | config FPU | 21 | config FPU |
18 | bool | 22 | bool |
19 | default n | 23 | default n |
@@ -398,12 +402,6 @@ config M5307C3 | |||
398 | help | 402 | help |
399 | Support for the Motorola M5307C3 board. | 403 | Support for the Motorola M5307C3 board. |
400 | 404 | ||
401 | config eLIA | ||
402 | bool "Moreton Bay eLIA board support" | ||
403 | depends on M5307 | ||
404 | help | ||
405 | Support for the Moreton Bay eLIA board. | ||
406 | |||
407 | config SECUREEDGEMP3 | 405 | config SECUREEDGEMP3 |
408 | bool "SnapGear SecureEdge/MP3 platform support" | 406 | bool "SnapGear SecureEdge/MP3 platform support" |
409 | depends on M5307 | 407 | depends on M5307 |
@@ -697,25 +695,8 @@ config ISA_DMA_API | |||
697 | depends on !M5272 | 695 | depends on !M5272 |
698 | default y | 696 | default y |
699 | 697 | ||
700 | menu "Bus options (PCI, PCMCIA, EISA, MCA, ISA)" | ||
701 | |||
702 | config PCI | ||
703 | bool "PCI support" | ||
704 | help | ||
705 | Support for PCI bus. | ||
706 | |||
707 | config COMEMPCI | ||
708 | bool "CO-MEM lite PCI controller support" | ||
709 | depends on (M5307 || M5407) | ||
710 | |||
711 | source "drivers/pci/Kconfig" | ||
712 | |||
713 | source "drivers/pcmcia/Kconfig" | 698 | source "drivers/pcmcia/Kconfig" |
714 | 699 | ||
715 | source "drivers/pci/hotplug/Kconfig" | ||
716 | |||
717 | endmenu | ||
718 | |||
719 | menu "Executable file formats" | 700 | menu "Executable file formats" |
720 | 701 | ||
721 | source "fs/Kconfig.binfmt" | 702 | source "fs/Kconfig.binfmt" |
diff --git a/arch/m68knommu/Makefile b/arch/m68knommu/Makefile index b63bbcf874ff..fd0fb303d885 100644 --- a/arch/m68knommu/Makefile +++ b/arch/m68knommu/Makefile | |||
@@ -41,7 +41,6 @@ board-$(CONFIG_M5271EVB) := M5271EVB | |||
41 | board-$(CONFIG_M5275EVB) := M5275EVB | 41 | board-$(CONFIG_M5275EVB) := M5275EVB |
42 | board-$(CONFIG_M5282EVB) := M5282EVB | 42 | board-$(CONFIG_M5282EVB) := M5282EVB |
43 | board-$(CONFIG_ELITE) := eLITE | 43 | board-$(CONFIG_ELITE) := eLITE |
44 | board-$(CONFIG_eLIA) := eLIA | ||
45 | board-$(CONFIG_NETtel) := NETtel | 44 | board-$(CONFIG_NETtel) := NETtel |
46 | board-$(CONFIG_SECUREEDGEMP3) := MP3 | 45 | board-$(CONFIG_SECUREEDGEMP3) := MP3 |
47 | board-$(CONFIG_CLEOPATRA) := CLEOPATRA | 46 | board-$(CONFIG_CLEOPATRA) := CLEOPATRA |
diff --git a/arch/m68knommu/kernel/Makefile b/arch/m68knommu/kernel/Makefile index f0eab3dedb5a..37c3fc074c0a 100644 --- a/arch/m68knommu/kernel/Makefile +++ b/arch/m68knommu/kernel/Makefile | |||
@@ -8,4 +8,3 @@ obj-y += dma.o entry.o init_task.o irq.o m68k_ksyms.o process.o ptrace.o \ | |||
8 | setup.o signal.o syscalltable.o sys_m68k.o time.o traps.o | 8 | setup.o signal.o syscalltable.o sys_m68k.o time.o traps.o |
9 | 9 | ||
10 | obj-$(CONFIG_MODULES) += module.o | 10 | obj-$(CONFIG_MODULES) += module.o |
11 | obj-$(CONFIG_COMEMPCI) += comempci.o | ||
diff --git a/arch/m68knommu/kernel/comempci.c b/arch/m68knommu/kernel/comempci.c deleted file mode 100644 index 0a68b5a85f86..000000000000 --- a/arch/m68knommu/kernel/comempci.c +++ /dev/null | |||
@@ -1,980 +0,0 @@ | |||
1 | /*****************************************************************************/ | ||
2 | |||
3 | /* | ||
4 | * comemlite.c -- PCI access code for embedded CO-MEM Lite PCI controller. | ||
5 | * | ||
6 | * (C) Copyright 1999-2003, Greg Ungerer (gerg@snapgear.com). | ||
7 | * (C) Copyright 2000, Lineo (www.lineo.com) | ||
8 | */ | ||
9 | |||
10 | /*****************************************************************************/ | ||
11 | |||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/types.h> | ||
14 | #include <linux/pci.h> | ||
15 | #include <linux/ptrace.h> | ||
16 | #include <linux/spinlock.h> | ||
17 | #include <linux/interrupt.h> | ||
18 | #include <linux/sched.h> | ||
19 | #include <asm/coldfire.h> | ||
20 | #include <asm/mcfsim.h> | ||
21 | #include <asm/irq.h> | ||
22 | #include <asm/anchor.h> | ||
23 | |||
24 | #ifdef CONFIG_eLIA | ||
25 | #include <asm/elia.h> | ||
26 | #endif | ||
27 | |||
28 | /*****************************************************************************/ | ||
29 | |||
30 | /* | ||
31 | * Debug configuration defines. DEBUGRES sets debugging output for | ||
32 | * the resource allocation phase. DEBUGPCI traces on pcibios_ function | ||
33 | * calls, and DEBUGIO traces all accesses to devices on the PCI bus. | ||
34 | */ | ||
35 | /*#define DEBUGRES 1*/ | ||
36 | /*#define DEBUGPCI 1*/ | ||
37 | /*#define DEBUGIO 1*/ | ||
38 | |||
39 | /*****************************************************************************/ | ||
40 | |||
41 | /* | ||
42 | * PCI markers for bus present and active slots. | ||
43 | */ | ||
44 | int pci_bus_is_present = 0; | ||
45 | unsigned long pci_slotmask = 0; | ||
46 | |||
47 | /* | ||
48 | * We may or may not need to swap the bytes of PCI bus tranfers. | ||
49 | * The endianess is re-roder automatically by the CO-MEM, but it | ||
50 | * will get the wrong byte order for a pure data stream. | ||
51 | */ | ||
52 | #define pci_byteswap 0 | ||
53 | |||
54 | |||
55 | /* | ||
56 | * Resource tracking. The CO-MEM part creates a virtual address | ||
57 | * space that all the PCI devices live in - it is not in any way | ||
58 | * directly mapped into the ColdFire address space. So we can | ||
59 | * really assign any resources we like to devices, as long as | ||
60 | * they do not clash with other PCI devices. | ||
61 | */ | ||
62 | unsigned int pci_iobase = PCIBIOS_MIN_IO; /* Arbitrary start address */ | ||
63 | unsigned int pci_membase = PCIBIOS_MIN_MEM; /* Arbitrary start address */ | ||
64 | |||
65 | #define PCI_MINIO 0x100 /* 256 byte minimum I/O */ | ||
66 | #define PCI_MINMEM 0x00010000 /* 64k minimum chunk */ | ||
67 | |||
68 | /* | ||
69 | * The CO-MEM's shared memory segment is visible inside the PCI | ||
70 | * memory address space. We need to keep track of the address that | ||
71 | * this is mapped at, to setup the bus masters pointers. | ||
72 | */ | ||
73 | unsigned int pci_shmemaddr; | ||
74 | |||
75 | /*****************************************************************************/ | ||
76 | |||
77 | void pci_interrupt(int irq, void *id, struct pt_regs *fp); | ||
78 | |||
79 | /*****************************************************************************/ | ||
80 | |||
81 | /* | ||
82 | * Some platforms have custom ways of reseting the PCI bus. | ||
83 | */ | ||
84 | |||
85 | void pci_resetbus(void) | ||
86 | { | ||
87 | #ifdef CONFIG_eLIA | ||
88 | int i; | ||
89 | |||
90 | #ifdef DEBUGPCI | ||
91 | printk(KERN_DEBUG "pci_resetbus()\n"); | ||
92 | #endif | ||
93 | |||
94 | *((volatile unsigned short *) (MCF_MBAR+MCFSIM_PADDR)) |= eLIA_PCIRESET; | ||
95 | for (i = 0; (i < 1000); i++) { | ||
96 | *((volatile unsigned short *) (MCF_MBAR + MCFSIM_PADAT)) = | ||
97 | (ppdata | eLIA_PCIRESET); | ||
98 | } | ||
99 | |||
100 | |||
101 | *((volatile unsigned short *) (MCF_MBAR + MCFSIM_PADAT)) = ppdata; | ||
102 | #endif | ||
103 | } | ||
104 | |||
105 | /*****************************************************************************/ | ||
106 | |||
107 | int pcibios_assign_resource_slot(int slot) | ||
108 | { | ||
109 | volatile unsigned long *rp; | ||
110 | volatile unsigned char *ip; | ||
111 | unsigned int idsel, addr, val, align, i; | ||
112 | int bar; | ||
113 | |||
114 | #ifdef DEBUGPCI | ||
115 | printk(KERN_INFO "pcibios_assign_resource_slot(slot=%x)\n", slot); | ||
116 | #endif | ||
117 | |||
118 | rp = (volatile unsigned long *) COMEM_BASE; | ||
119 | idsel = COMEM_DA_ADDR(0x1 << (slot + 16)); | ||
120 | |||
121 | /* Try to assign resource to each BAR */ | ||
122 | for (bar = 0; (bar < 6); bar++) { | ||
123 | addr = COMEM_PCIBUS + PCI_BASE_ADDRESS_0 + (bar * 4); | ||
124 | rp[LREG(COMEM_DAHBASE)] = COMEM_DA_CFGRD | idsel; | ||
125 | val = rp[LREG(addr)]; | ||
126 | #ifdef DEBUGRES | ||
127 | printk(KERN_DEBUG "-----------------------------------" | ||
128 | "-------------------------------------\n"); | ||
129 | printk(KERN_DEBUG "BAR[%d]: read=%08x ", bar, val); | ||
130 | #endif | ||
131 | |||
132 | rp[LREG(COMEM_DAHBASE)] = COMEM_DA_CFGWR | idsel; | ||
133 | rp[LREG(addr)] = 0xffffffff; | ||
134 | |||
135 | rp[LREG(COMEM_DAHBASE)] = COMEM_DA_CFGRD | idsel; | ||
136 | val = rp[LREG(addr)]; | ||
137 | #ifdef DEBUGRES | ||
138 | printk(KERN_DEBUG "write=%08x ", val); | ||
139 | #endif | ||
140 | if (val == 0) { | ||
141 | #ifdef DEBUGRES | ||
142 | printk(KERN_DEBUG "\n"); | ||
143 | #endif | ||
144 | continue; | ||
145 | } | ||
146 | |||
147 | /* Determine space required by BAR */ | ||
148 | /* FIXME: this should go backwords from 0x80000000... */ | ||
149 | for (i = 0; (i < 32); i++) { | ||
150 | if ((0x1 << i) & (val & 0xfffffffc)) | ||
151 | break; | ||
152 | } | ||
153 | |||
154 | #ifdef DEBUGRES | ||
155 | printk(KERN_DEBUG "size=%08x(%d)\n", (0x1 << i), i); | ||
156 | #endif | ||
157 | i = 0x1 << i; | ||
158 | |||
159 | /* Assign a resource */ | ||
160 | if (val & PCI_BASE_ADDRESS_SPACE_IO) { | ||
161 | if (i < PCI_MINIO) | ||
162 | i = PCI_MINIO; | ||
163 | #ifdef DEBUGRES | ||
164 | printk(KERN_DEBUG "BAR[%d]: IO size=%08x iobase=%08x\n", | ||
165 | bar, i, pci_iobase); | ||
166 | #endif | ||
167 | if (i > 0xffff) { | ||
168 | /* Invalid size?? */ | ||
169 | val = 0 | PCI_BASE_ADDRESS_SPACE_IO; | ||
170 | #ifdef DEBUGRES | ||
171 | printk(KERN_DEBUG "BAR[%d]: too big for IO??\n", bar); | ||
172 | #endif | ||
173 | } else { | ||
174 | /* Check for un-alignment */ | ||
175 | if ((align = pci_iobase % i)) | ||
176 | pci_iobase += (i - align); | ||
177 | val = pci_iobase | PCI_BASE_ADDRESS_SPACE_IO; | ||
178 | pci_iobase += i; | ||
179 | } | ||
180 | } else { | ||
181 | if (i < PCI_MINMEM) | ||
182 | i = PCI_MINMEM; | ||
183 | #ifdef DEBUGRES | ||
184 | printk(KERN_DEBUG "BAR[%d]: MEMORY size=%08x membase=%08x\n", | ||
185 | bar, i, pci_membase); | ||
186 | #endif | ||
187 | /* Check for un-alignment */ | ||
188 | if ((align = pci_membase % i)) | ||
189 | pci_membase += (i - align); | ||
190 | val = pci_membase | PCI_BASE_ADDRESS_SPACE_MEMORY; | ||
191 | pci_membase += i; | ||
192 | } | ||
193 | |||
194 | /* Write resource back into BAR register */ | ||
195 | rp[LREG(COMEM_DAHBASE)] = COMEM_DA_CFGWR | idsel; | ||
196 | rp[LREG(addr)] = val; | ||
197 | #ifdef DEBUGRES | ||
198 | printk(KERN_DEBUG "BAR[%d]: assigned bar=%08x\n", bar, val); | ||
199 | #endif | ||
200 | } | ||
201 | |||
202 | #ifdef DEBUGRES | ||
203 | printk(KERN_DEBUG "-----------------------------------" | ||
204 | "-------------------------------------\n"); | ||
205 | #endif | ||
206 | |||
207 | /* Assign IRQ if one is wanted... */ | ||
208 | ip = (volatile unsigned char *) (COMEM_BASE + COMEM_PCIBUS); | ||
209 | rp[LREG(COMEM_DAHBASE)] = COMEM_DA_CFGRD | idsel; | ||
210 | |||
211 | addr = (PCI_INTERRUPT_PIN & 0xfc) + (~PCI_INTERRUPT_PIN & 0x03); | ||
212 | if (ip[addr]) { | ||
213 | rp[LREG(COMEM_DAHBASE)] = COMEM_DA_CFGWR | idsel; | ||
214 | addr = (PCI_INTERRUPT_LINE & 0xfc)+(~PCI_INTERRUPT_LINE & 0x03); | ||
215 | ip[addr] = 25; | ||
216 | #ifdef DEBUGRES | ||
217 | printk(KERN_DEBUG "IRQ LINE=25\n"); | ||
218 | #endif | ||
219 | } | ||
220 | |||
221 | return(0); | ||
222 | } | ||
223 | |||
224 | /*****************************************************************************/ | ||
225 | |||
226 | int pcibios_enable_slot(int slot) | ||
227 | { | ||
228 | volatile unsigned long *rp; | ||
229 | volatile unsigned short *wp; | ||
230 | unsigned int idsel, addr; | ||
231 | unsigned short cmd; | ||
232 | |||
233 | #ifdef DEBUGPCI | ||
234 | printk(KERN_DEBUG "pcibios_enbale_slot(slot=%x)\n", slot); | ||
235 | #endif | ||
236 | |||
237 | rp = (volatile unsigned long *) COMEM_BASE; | ||
238 | wp = (volatile unsigned short *) COMEM_BASE; | ||
239 | idsel = COMEM_DA_ADDR(0x1 << (slot + 16)); | ||
240 | |||
241 | /* Get current command settings */ | ||
242 | addr = COMEM_PCIBUS + PCI_COMMAND; | ||
243 | addr = (addr & ~0x3) + (~addr & 0x02); | ||
244 | rp[LREG(COMEM_DAHBASE)] = COMEM_DA_CFGRD | idsel; | ||
245 | cmd = wp[WREG(addr)]; | ||
246 | /*val = ((val & 0xff) << 8) | ((val >> 8) & 0xff);*/ | ||
247 | |||
248 | /* Enable I/O and memory accesses to this device */ | ||
249 | rp[LREG(COMEM_DAHBASE)] = COMEM_DA_CFGWR | idsel; | ||
250 | cmd |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER; | ||
251 | wp[WREG(addr)] = cmd; | ||
252 | |||
253 | return(0); | ||
254 | } | ||
255 | |||
256 | /*****************************************************************************/ | ||
257 | |||
258 | void pcibios_assign_resources(void) | ||
259 | { | ||
260 | volatile unsigned long *rp; | ||
261 | unsigned long sel, id; | ||
262 | int slot; | ||
263 | |||
264 | rp = (volatile unsigned long *) COMEM_BASE; | ||
265 | |||
266 | /* | ||
267 | * Do a quick scan of the PCI bus and see what is here. | ||
268 | */ | ||
269 | for (slot = COMEM_MINDEV; (slot <= COMEM_MAXDEV); slot++) { | ||
270 | sel = COMEM_DA_CFGRD | COMEM_DA_ADDR(0x1 << (slot + 16)); | ||
271 | rp[LREG(COMEM_DAHBASE)] = sel; | ||
272 | rp[LREG(COMEM_PCIBUS)] = 0; /* Clear bus */ | ||
273 | id = rp[LREG(COMEM_PCIBUS)]; | ||
274 | if ((id != 0) && ((id & 0xffff0000) != (sel & 0xffff0000))) { | ||
275 | printk(KERN_INFO "PCI: slot=%d id=%08x\n", slot, (int) id); | ||
276 | pci_slotmask |= 0x1 << slot; | ||
277 | pcibios_assign_resource_slot(slot); | ||
278 | pcibios_enable_slot(slot); | ||
279 | } | ||
280 | } | ||
281 | } | ||
282 | |||
283 | /*****************************************************************************/ | ||
284 | |||
285 | int pcibios_init(void) | ||
286 | { | ||
287 | volatile unsigned long *rp; | ||
288 | unsigned long sel, id; | ||
289 | int slot; | ||
290 | |||
291 | #ifdef DEBUGPCI | ||
292 | printk(KERN_DEBUG "pcibios_init()\n"); | ||
293 | #endif | ||
294 | |||
295 | pci_resetbus(); | ||
296 | |||
297 | /* | ||
298 | * Do some sort of basic check to see if the CO-MEM part | ||
299 | * is present... This works ok, but I think we really need | ||
300 | * something better... | ||
301 | */ | ||
302 | rp = (volatile unsigned long *) COMEM_BASE; | ||
303 | if ((rp[LREG(COMEM_LBUSCFG)] & 0xff) != 0x50) { | ||
304 | printk(KERN_INFO "PCI: no PCI bus present\n"); | ||
305 | return(0); | ||
306 | } | ||
307 | |||
308 | #ifdef COMEM_BRIDGEDEV | ||
309 | /* | ||
310 | * Setup the PCI bridge device first. It needs resources too, | ||
311 | * so that bus masters can get to its shared memory. | ||
312 | */ | ||
313 | slot = COMEM_BRIDGEDEV; | ||
314 | sel = COMEM_DA_CFGRD | COMEM_DA_ADDR(0x1 << (slot + 16)); | ||
315 | rp[LREG(COMEM_DAHBASE)] = sel; | ||
316 | rp[LREG(COMEM_PCIBUS)] = 0; /* Clear bus */ | ||
317 | id = rp[LREG(COMEM_PCIBUS)]; | ||
318 | if ((id == 0) || ((id & 0xffff0000) == (sel & 0xffff0000))) { | ||
319 | printk(KERN_INFO "PCI: no PCI bus bridge present\n"); | ||
320 | return(0); | ||
321 | } | ||
322 | |||
323 | printk(KERN_INFO "PCI: bridge device at slot=%d id=%08x\n", slot, (int) id); | ||
324 | pci_slotmask |= 0x1 << slot; | ||
325 | pci_shmemaddr = pci_membase; | ||
326 | pcibios_assign_resource_slot(slot); | ||
327 | pcibios_enable_slot(slot); | ||
328 | #endif | ||
329 | |||
330 | pci_bus_is_present = 1; | ||
331 | |||
332 | /* Get PCI irq for local vectoring */ | ||
333 | if (request_irq(COMEM_IRQ, pci_interrupt, 0, "PCI bridge", NULL)) { | ||
334 | printk(KERN_WARNING "PCI: failed to acquire interrupt %d\n", COMEM_IRQ); | ||
335 | } else { | ||
336 | mcf_autovector(COMEM_IRQ); | ||
337 | } | ||
338 | |||
339 | pcibios_assign_resources(); | ||
340 | |||
341 | return(0); | ||
342 | } | ||
343 | |||
344 | /*****************************************************************************/ | ||
345 | |||
346 | char *pcibios_setup(char *option) | ||
347 | { | ||
348 | /* Nothing for us to handle. */ | ||
349 | return(option); | ||
350 | } | ||
351 | /*****************************************************************************/ | ||
352 | |||
353 | void pcibios_fixup_bus(struct pci_bus *b) | ||
354 | { | ||
355 | } | ||
356 | |||
357 | /*****************************************************************************/ | ||
358 | |||
359 | void pcibios_align_resource(void *data, struct resource *res, | ||
360 | resource_size_t size, resource_size_t align) | ||
361 | { | ||
362 | } | ||
363 | |||
364 | /*****************************************************************************/ | ||
365 | |||
366 | int pcibios_enable_device(struct pci_dev *dev, int mask) | ||
367 | { | ||
368 | int slot; | ||
369 | |||
370 | slot = PCI_SLOT(dev->devfn); | ||
371 | if ((dev->bus == 0) && (pci_slotmask & (1 << slot))) | ||
372 | pcibios_enable_slot(slot); | ||
373 | return(0); | ||
374 | } | ||
375 | |||
376 | /*****************************************************************************/ | ||
377 | |||
378 | /* | ||
379 | * Local routines to interrcept the standard I/O and vector handling | ||
380 | * code. Don't include this 'till now - initialization code above needs | ||
381 | * access to the real code too. | ||
382 | */ | ||
383 | #include <asm/mcfpci.h> | ||
384 | |||
385 | /*****************************************************************************/ | ||
386 | |||
387 | void pci_outb(unsigned char val, unsigned int addr) | ||
388 | { | ||
389 | volatile unsigned long *rp; | ||
390 | volatile unsigned char *bp; | ||
391 | |||
392 | #ifdef DEBUGIO | ||
393 | printk(KERN_DEBUG "pci_outb(val=%02x,addr=%x)\n", val, addr); | ||
394 | #endif | ||
395 | |||
396 | rp = (volatile unsigned long *) COMEM_BASE; | ||
397 | bp = (volatile unsigned char *) COMEM_BASE; | ||
398 | rp[LREG(COMEM_DAHBASE)] = COMEM_DA_IOWR | COMEM_DA_ADDR(addr); | ||
399 | addr = (addr & ~0x3) + (~addr & 0x03); | ||
400 | bp[(COMEM_PCIBUS + COMEM_DA_OFFSET(addr))] = val; | ||
401 | } | ||
402 | |||
403 | /*****************************************************************************/ | ||
404 | |||
405 | void pci_outw(unsigned short val, unsigned int addr) | ||
406 | { | ||
407 | volatile unsigned long *rp; | ||
408 | volatile unsigned short *sp; | ||
409 | |||
410 | #ifdef DEBUGIO | ||
411 | printk(KERN_DEBUG "pci_outw(val=%04x,addr=%x)\n", val, addr); | ||
412 | #endif | ||
413 | |||
414 | rp = (volatile unsigned long *) COMEM_BASE; | ||
415 | sp = (volatile unsigned short *) COMEM_BASE; | ||
416 | rp[LREG(COMEM_DAHBASE)] = COMEM_DA_IOWR | COMEM_DA_ADDR(addr); | ||
417 | addr = (addr & ~0x3) + (~addr & 0x02); | ||
418 | if (pci_byteswap) | ||
419 | val = ((val & 0xff) << 8) | ((val >> 8) & 0xff); | ||
420 | sp[WREG(COMEM_PCIBUS + COMEM_DA_OFFSET(addr))] = val; | ||
421 | } | ||
422 | |||
423 | /*****************************************************************************/ | ||
424 | |||
425 | void pci_outl(unsigned int val, unsigned int addr) | ||
426 | { | ||
427 | volatile unsigned long *rp; | ||
428 | volatile unsigned int *lp; | ||
429 | |||
430 | #ifdef DEBUGIO | ||
431 | printk(KERN_DEBUG "pci_outl(val=%08x,addr=%x)\n", val, addr); | ||
432 | #endif | ||
433 | |||
434 | rp = (volatile unsigned long *) COMEM_BASE; | ||
435 | lp = (volatile unsigned int *) COMEM_BASE; | ||
436 | rp[LREG(COMEM_DAHBASE)] = COMEM_DA_IOWR | COMEM_DA_ADDR(addr); | ||
437 | |||
438 | if (pci_byteswap) | ||
439 | val = (val << 24) | ((val & 0x0000ff00) << 8) | | ||
440 | ((val & 0x00ff0000) >> 8) | (val >> 24); | ||
441 | |||
442 | lp[LREG(COMEM_PCIBUS + COMEM_DA_OFFSET(addr))] = val; | ||
443 | } | ||
444 | |||
445 | /*****************************************************************************/ | ||
446 | |||
447 | unsigned long pci_blmask[] = { | ||
448 | 0x000000e0, | ||
449 | 0x000000d0, | ||
450 | 0x000000b0, | ||
451 | 0x00000070 | ||
452 | }; | ||
453 | |||
454 | unsigned char pci_inb(unsigned int addr) | ||
455 | { | ||
456 | volatile unsigned long *rp; | ||
457 | volatile unsigned char *bp; | ||
458 | unsigned long r; | ||
459 | unsigned char val; | ||
460 | |||
461 | #ifdef DEBUGIO | ||
462 | printk(KERN_DEBUG "pci_inb(addr=%x)\n", addr); | ||
463 | #endif | ||
464 | |||
465 | rp = (volatile unsigned long *) COMEM_BASE; | ||
466 | bp = (volatile unsigned char *) COMEM_BASE; | ||
467 | |||
468 | r = COMEM_DA_IORD | COMEM_DA_ADDR(addr) | pci_blmask[(addr & 0x3)]; | ||
469 | rp[LREG(COMEM_DAHBASE)] = r; | ||
470 | |||
471 | addr = (addr & ~0x3) + (~addr & 0x3); | ||
472 | val = bp[(COMEM_PCIBUS + COMEM_DA_OFFSET(addr))]; | ||
473 | return(val); | ||
474 | } | ||
475 | |||
476 | /*****************************************************************************/ | ||
477 | |||
478 | unsigned long pci_bwmask[] = { | ||
479 | 0x000000c0, | ||
480 | 0x000000c0, | ||
481 | 0x00000030, | ||
482 | 0x00000030 | ||
483 | }; | ||
484 | |||
485 | unsigned short pci_inw(unsigned int addr) | ||
486 | { | ||
487 | volatile unsigned long *rp; | ||
488 | volatile unsigned short *sp; | ||
489 | unsigned long r; | ||
490 | unsigned short val; | ||
491 | |||
492 | #ifdef DEBUGIO | ||
493 | printk(KERN_DEBUG "pci_inw(addr=%x)", addr); | ||
494 | #endif | ||
495 | |||
496 | rp = (volatile unsigned long *) COMEM_BASE; | ||
497 | r = COMEM_DA_IORD | COMEM_DA_ADDR(addr) | pci_bwmask[(addr & 0x3)]; | ||
498 | rp[LREG(COMEM_DAHBASE)] = r; | ||
499 | |||
500 | sp = (volatile unsigned short *) COMEM_BASE; | ||
501 | addr = (addr & ~0x3) + (~addr & 0x02); | ||
502 | val = sp[WREG(COMEM_PCIBUS + COMEM_DA_OFFSET(addr))]; | ||
503 | if (pci_byteswap) | ||
504 | val = ((val & 0xff) << 8) | ((val >> 8) & 0xff); | ||
505 | #ifdef DEBUGIO | ||
506 | printk(KERN_DEBUG "=%04x\n", val); | ||
507 | #endif | ||
508 | return(val); | ||
509 | } | ||
510 | |||
511 | /*****************************************************************************/ | ||
512 | |||
513 | unsigned int pci_inl(unsigned int addr) | ||
514 | { | ||
515 | volatile unsigned long *rp; | ||
516 | volatile unsigned int *lp; | ||
517 | unsigned int val; | ||
518 | |||
519 | #ifdef DEBUGIO | ||
520 | printk(KERN_DEBUG "pci_inl(addr=%x)", addr); | ||
521 | #endif | ||
522 | |||
523 | rp = (volatile unsigned long *) COMEM_BASE; | ||
524 | lp = (volatile unsigned int *) COMEM_BASE; | ||
525 | rp[LREG(COMEM_DAHBASE)] = COMEM_DA_IORD | COMEM_DA_ADDR(addr); | ||
526 | val = lp[LREG(COMEM_PCIBUS + COMEM_DA_OFFSET(addr))]; | ||
527 | |||
528 | if (pci_byteswap) | ||
529 | val = (val << 24) | ((val & 0x0000ff00) << 8) | | ||
530 | ((val & 0x00ff0000) >> 8) | (val >> 24); | ||
531 | |||
532 | #ifdef DEBUGIO | ||
533 | printk(KERN_DEBUG "=%08x\n", val); | ||
534 | #endif | ||
535 | return(val); | ||
536 | } | ||
537 | |||
538 | /*****************************************************************************/ | ||
539 | |||
540 | void pci_outsb(void *addr, void *buf, int len) | ||
541 | { | ||
542 | volatile unsigned long *rp; | ||
543 | volatile unsigned char *bp; | ||
544 | unsigned char *dp = (unsigned char *) buf; | ||
545 | unsigned int a = (unsigned int) addr; | ||
546 | |||
547 | #ifdef DEBUGIO | ||
548 | printk(KERN_DEBUG "pci_outsb(addr=%x,buf=%x,len=%d)\n", (int)addr, (int)buf, len); | ||
549 | #endif | ||
550 | |||
551 | rp = (volatile unsigned long *) COMEM_BASE; | ||
552 | rp[LREG(COMEM_DAHBASE)] = COMEM_DA_IOWR | COMEM_DA_ADDR(a); | ||
553 | |||
554 | a = (a & ~0x3) + (~a & 0x03); | ||
555 | bp = (volatile unsigned char *) | ||
556 | (COMEM_BASE + COMEM_PCIBUS + COMEM_DA_OFFSET(a)); | ||
557 | |||
558 | while (len--) | ||
559 | *bp = *dp++; | ||
560 | } | ||
561 | |||
562 | /*****************************************************************************/ | ||
563 | |||
564 | void pci_outsw(void *addr, void *buf, int len) | ||
565 | { | ||
566 | volatile unsigned long *rp; | ||
567 | volatile unsigned short *wp; | ||
568 | unsigned short w, *dp = (unsigned short *) buf; | ||
569 | unsigned int a = (unsigned int) addr; | ||
570 | |||
571 | #ifdef DEBUGIO | ||
572 | printk(KERN_DEBUG "pci_outsw(addr=%x,buf=%x,len=%d)\n", (int)addr, (int)buf, len); | ||
573 | #endif | ||
574 | |||
575 | rp = (volatile unsigned long *) COMEM_BASE; | ||
576 | rp[LREG(COMEM_DAHBASE)] = COMEM_DA_IOWR | COMEM_DA_ADDR(a); | ||
577 | |||
578 | a = (a & ~0x3) + (~a & 0x2); | ||
579 | wp = (volatile unsigned short *) | ||
580 | (COMEM_BASE + COMEM_PCIBUS + COMEM_DA_OFFSET(a)); | ||
581 | |||
582 | while (len--) { | ||
583 | w = *dp++; | ||
584 | if (pci_byteswap) | ||
585 | w = ((w & 0xff) << 8) | ((w >> 8) & 0xff); | ||
586 | *wp = w; | ||
587 | } | ||
588 | } | ||
589 | |||
590 | /*****************************************************************************/ | ||
591 | |||
592 | void pci_outsl(void *addr, void *buf, int len) | ||
593 | { | ||
594 | volatile unsigned long *rp; | ||
595 | volatile unsigned long *lp; | ||
596 | unsigned long l, *dp = (unsigned long *) buf; | ||
597 | unsigned int a = (unsigned int) addr; | ||
598 | |||
599 | #ifdef DEBUGIO | ||
600 | printk(KERN_DEBUG "pci_outsl(addr=%x,buf=%x,len=%d)\n", (int)addr, (int)buf, len); | ||
601 | #endif | ||
602 | |||
603 | rp = (volatile unsigned long *) COMEM_BASE; | ||
604 | rp[LREG(COMEM_DAHBASE)] = COMEM_DA_IOWR | COMEM_DA_ADDR(a); | ||
605 | |||
606 | lp = (volatile unsigned long *) | ||
607 | (COMEM_BASE + COMEM_PCIBUS + COMEM_DA_OFFSET(a)); | ||
608 | |||
609 | while (len--) { | ||
610 | l = *dp++; | ||
611 | if (pci_byteswap) | ||
612 | l = (l << 24) | ((l & 0x0000ff00) << 8) | | ||
613 | ((l & 0x00ff0000) >> 8) | (l >> 24); | ||
614 | *lp = l; | ||
615 | } | ||
616 | } | ||
617 | |||
618 | /*****************************************************************************/ | ||
619 | |||
620 | void pci_insb(void *addr, void *buf, int len) | ||
621 | { | ||
622 | volatile unsigned long *rp; | ||
623 | volatile unsigned char *bp; | ||
624 | unsigned char *dp = (unsigned char *) buf; | ||
625 | unsigned int a = (unsigned int) addr; | ||
626 | |||
627 | #ifdef DEBUGIO | ||
628 | printk(KERN_DEBUG "pci_insb(addr=%x,buf=%x,len=%d)\n", (int)addr, (int)buf, len); | ||
629 | #endif | ||
630 | |||
631 | rp = (volatile unsigned long *) COMEM_BASE; | ||
632 | rp[LREG(COMEM_DAHBASE)] = COMEM_DA_IORD | COMEM_DA_ADDR(a); | ||
633 | |||
634 | a = (a & ~0x3) + (~a & 0x03); | ||
635 | bp = (volatile unsigned char *) | ||
636 | (COMEM_BASE + COMEM_PCIBUS + COMEM_DA_OFFSET(a)); | ||
637 | |||
638 | while (len--) | ||
639 | *dp++ = *bp; | ||
640 | } | ||
641 | |||
642 | /*****************************************************************************/ | ||
643 | |||
644 | void pci_insw(void *addr, void *buf, int len) | ||
645 | { | ||
646 | volatile unsigned long *rp; | ||
647 | volatile unsigned short *wp; | ||
648 | unsigned short w, *dp = (unsigned short *) buf; | ||
649 | unsigned int a = (unsigned int) addr; | ||
650 | |||
651 | #ifdef DEBUGIO | ||
652 | printk(KERN_DEBUG "pci_insw(addr=%x,buf=%x,len=%d)\n", (int)addr, (int)buf, len); | ||
653 | #endif | ||
654 | |||
655 | rp = (volatile unsigned long *) COMEM_BASE; | ||
656 | rp[LREG(COMEM_DAHBASE)] = COMEM_DA_IORD | COMEM_DA_ADDR(a); | ||
657 | |||
658 | a = (a & ~0x3) + (~a & 0x2); | ||
659 | wp = (volatile unsigned short *) | ||
660 | (COMEM_BASE + COMEM_PCIBUS + COMEM_DA_OFFSET(a)); | ||
661 | |||
662 | while (len--) { | ||
663 | w = *wp; | ||
664 | if (pci_byteswap) | ||
665 | w = ((w & 0xff) << 8) | ((w >> 8) & 0xff); | ||
666 | *dp++ = w; | ||
667 | } | ||
668 | } | ||
669 | |||
670 | /*****************************************************************************/ | ||
671 | |||
672 | void pci_insl(void *addr, void *buf, int len) | ||
673 | { | ||
674 | volatile unsigned long *rp; | ||
675 | volatile unsigned long *lp; | ||
676 | unsigned long l, *dp = (unsigned long *) buf; | ||
677 | unsigned int a = (unsigned int) addr; | ||
678 | |||
679 | #ifdef DEBUGIO | ||
680 | printk(KERN_DEBUG "pci_insl(addr=%x,buf=%x,len=%d)\n", (int)addr, (int)buf, len); | ||
681 | #endif | ||
682 | |||
683 | rp = (volatile unsigned long *) COMEM_BASE; | ||
684 | rp[LREG(COMEM_DAHBASE)] = COMEM_DA_IORD | COMEM_DA_ADDR(a); | ||
685 | |||
686 | lp = (volatile unsigned long *) | ||
687 | (COMEM_BASE + COMEM_PCIBUS + COMEM_DA_OFFSET(a)); | ||
688 | |||
689 | while (len--) { | ||
690 | l = *lp; | ||
691 | if (pci_byteswap) | ||
692 | l = (l << 24) | ((l & 0x0000ff00) << 8) | | ||
693 | ((l & 0x00ff0000) >> 8) | (l >> 24); | ||
694 | *dp++ = l; | ||
695 | } | ||
696 | } | ||
697 | |||
698 | /*****************************************************************************/ | ||
699 | |||
700 | struct pci_localirqlist { | ||
701 | void (*handler)(int, void *, struct pt_regs *); | ||
702 | const char *device; | ||
703 | void *dev_id; | ||
704 | }; | ||
705 | |||
706 | struct pci_localirqlist pci_irqlist[COMEM_MAXPCI]; | ||
707 | |||
708 | /*****************************************************************************/ | ||
709 | |||
710 | int pci_request_irq(unsigned int irq, | ||
711 | void (*handler)(int, void *, struct pt_regs *), | ||
712 | unsigned long flags, const char *device, void *dev_id) | ||
713 | { | ||
714 | int i; | ||
715 | |||
716 | #ifdef DEBUGIO | ||
717 | printk(KERN_DEBUG "pci_request_irq(irq=%d,handler=%x,flags=%x,device=%s," | ||
718 | "dev_id=%x)\n", irq, (int) handler, (int) flags, device, | ||
719 | (int) dev_id); | ||
720 | #endif | ||
721 | |||
722 | /* Check if this interrupt handler is already lodged */ | ||
723 | for (i = 0; (i < COMEM_MAXPCI); i++) { | ||
724 | if (pci_irqlist[i].handler == handler) | ||
725 | return(0); | ||
726 | } | ||
727 | |||
728 | /* Find a free spot to put this handler */ | ||
729 | for (i = 0; (i < COMEM_MAXPCI); i++) { | ||
730 | if (pci_irqlist[i].handler == 0) { | ||
731 | pci_irqlist[i].handler = handler; | ||
732 | pci_irqlist[i].device = device; | ||
733 | pci_irqlist[i].dev_id = dev_id; | ||
734 | return(0); | ||
735 | } | ||
736 | } | ||
737 | |||
738 | /* Couldn't fit?? */ | ||
739 | return(1); | ||
740 | } | ||
741 | |||
742 | /*****************************************************************************/ | ||
743 | |||
744 | void pci_free_irq(unsigned int irq, void *dev_id) | ||
745 | { | ||
746 | int i; | ||
747 | |||
748 | #ifdef DEBUGIO | ||
749 | printk(KERN_DEBUG "pci_free_irq(irq=%d,dev_id=%x)\n", irq, (int) dev_id); | ||
750 | #endif | ||
751 | |||
752 | if (dev_id == (void *) NULL) | ||
753 | return; | ||
754 | |||
755 | /* Check if this interrupt handler is lodged */ | ||
756 | for (i = 0; (i < COMEM_MAXPCI); i++) { | ||
757 | if (pci_irqlist[i].dev_id == dev_id) { | ||
758 | pci_irqlist[i].handler = NULL; | ||
759 | pci_irqlist[i].device = NULL; | ||
760 | pci_irqlist[i].dev_id = NULL; | ||
761 | break; | ||
762 | } | ||
763 | } | ||
764 | } | ||
765 | |||
766 | /*****************************************************************************/ | ||
767 | |||
768 | void pci_interrupt(int irq, void *id, struct pt_regs *fp) | ||
769 | { | ||
770 | int i; | ||
771 | |||
772 | #ifdef DEBUGIO | ||
773 | printk(KERN_DEBUG "pci_interrupt(irq=%d,id=%x,fp=%x)\n", irq, (int) id, (int) fp); | ||
774 | #endif | ||
775 | |||
776 | for (i = 0; (i < COMEM_MAXPCI); i++) { | ||
777 | if (pci_irqlist[i].handler) | ||
778 | (*pci_irqlist[i].handler)(irq,pci_irqlist[i].dev_id,fp); | ||
779 | } | ||
780 | } | ||
781 | |||
782 | /*****************************************************************************/ | ||
783 | |||
784 | /* | ||
785 | * The shared memory region is broken up into contiguous 512 byte | ||
786 | * regions for easy allocation... This is not an optimal solution | ||
787 | * but it makes allocation and freeing regions really easy. | ||
788 | */ | ||
789 | |||
790 | #define PCI_MEMSLOTSIZE 512 | ||
791 | #define PCI_MEMSLOTS (COMEM_SHMEMSIZE / PCI_MEMSLOTSIZE) | ||
792 | |||
793 | char pci_shmemmap[PCI_MEMSLOTS]; | ||
794 | |||
795 | |||
796 | void *pci_bmalloc(int size) | ||
797 | { | ||
798 | int i, j, nrslots; | ||
799 | |||
800 | #ifdef DEBUGIO | ||
801 | printk(KERN_DEBUG "pci_bmalloc(size=%d)\n", size); | ||
802 | #endif | ||
803 | |||
804 | if (size <= 0) | ||
805 | return((void *) NULL); | ||
806 | |||
807 | nrslots = (size - 1) / PCI_MEMSLOTSIZE; | ||
808 | |||
809 | for (i = 0; (i < (PCI_MEMSLOTS-nrslots)); i++) { | ||
810 | if (pci_shmemmap[i] == 0) { | ||
811 | for (j = i+1; (j < (i+nrslots)); j++) { | ||
812 | if (pci_shmemmap[j]) | ||
813 | goto restart; | ||
814 | } | ||
815 | |||
816 | for (j = i; (j <= i+nrslots); j++) | ||
817 | pci_shmemmap[j] = 1; | ||
818 | break; | ||
819 | } | ||
820 | restart: | ||
821 | } | ||
822 | |||
823 | return((void *) (COMEM_BASE + COMEM_SHMEM + (i * PCI_MEMSLOTSIZE))); | ||
824 | } | ||
825 | |||
826 | /*****************************************************************************/ | ||
827 | |||
828 | void pci_bmfree(void *mp, int size) | ||
829 | { | ||
830 | int i, j, nrslots; | ||
831 | |||
832 | #ifdef DEBUGIO | ||
833 | printk(KERN_DEBUG "pci_bmfree(mp=%x,size=%d)\n", (int) mp, size); | ||
834 | #endif | ||
835 | |||
836 | nrslots = size / PCI_MEMSLOTSIZE; | ||
837 | i = (((unsigned long) mp) - (COMEM_BASE + COMEM_SHMEM)) / | ||
838 | PCI_MEMSLOTSIZE; | ||
839 | |||
840 | for (j = i; (j < (i+nrslots)); j++) | ||
841 | pci_shmemmap[j] = 0; | ||
842 | } | ||
843 | |||
844 | /*****************************************************************************/ | ||
845 | |||
846 | unsigned long pci_virt_to_bus(volatile void *address) | ||
847 | { | ||
848 | unsigned long l; | ||
849 | |||
850 | #ifdef DEBUGIO | ||
851 | printk(KERN_DEBUG "pci_virt_to_bus(address=%x)", (int) address); | ||
852 | #endif | ||
853 | |||
854 | l = ((unsigned long) address) - COMEM_BASE; | ||
855 | #ifdef DEBUGIO | ||
856 | printk(KERN_DEBUG "=%x\n", (int) (l+pci_shmemaddr)); | ||
857 | #endif | ||
858 | return(l + pci_shmemaddr); | ||
859 | } | ||
860 | |||
861 | /*****************************************************************************/ | ||
862 | |||
863 | void *pci_bus_to_virt(unsigned long address) | ||
864 | { | ||
865 | unsigned long l; | ||
866 | |||
867 | #ifdef DEBUGIO | ||
868 | printk(KERN_DEBUG "pci_bus_to_virt(address=%x)", (int) address); | ||
869 | #endif | ||
870 | |||
871 | l = address - pci_shmemaddr; | ||
872 | #ifdef DEBUGIO | ||
873 | printk(KERN_DEBUG "=%x\n", (int) (address + COMEM_BASE)); | ||
874 | #endif | ||
875 | return((void *) (address + COMEM_BASE)); | ||
876 | } | ||
877 | |||
878 | /*****************************************************************************/ | ||
879 | |||
880 | void pci_bmcpyto(void *dst, void *src, int len) | ||
881 | { | ||
882 | unsigned long *dp, *sp, val; | ||
883 | unsigned char *dcp, *scp; | ||
884 | int i, j; | ||
885 | |||
886 | #ifdef DEBUGIO | ||
887 | printk(KERN_DEBUG "pci_bmcpyto(dst=%x,src=%x,len=%d)\n", (int)dst, (int)src, len); | ||
888 | #endif | ||
889 | |||
890 | dp = (unsigned long *) dst; | ||
891 | sp = (unsigned long *) src; | ||
892 | i = len >> 2; | ||
893 | |||
894 | #if 0 | ||
895 | printk(KERN_INFO "DATA:"); | ||
896 | scp = (unsigned char *) sp; | ||
897 | for (i = 0; (i < len); i++) { | ||
898 | if ((i % 16) == 0) printk(KERN_INFO "\n%04x: ", i); | ||
899 | printk(KERN_INFO "%02x ", *scp++); | ||
900 | } | ||
901 | printk(KERN_INFO "\n"); | ||
902 | #endif | ||
903 | |||
904 | for (j = 0; (i >= 0); i--, j++) { | ||
905 | val = *sp++; | ||
906 | val = (val << 24) | ((val & 0x0000ff00) << 8) | | ||
907 | ((val & 0x00ff0000) >> 8) | (val >> 24); | ||
908 | *dp++ = val; | ||
909 | } | ||
910 | |||
911 | if (len & 0x3) { | ||
912 | dcp = (unsigned char *) dp; | ||
913 | scp = ((unsigned char *) sp) + 3; | ||
914 | for (i = 0; (i < (len & 0x3)); i++) | ||
915 | *dcp++ = *scp--; | ||
916 | } | ||
917 | } | ||
918 | |||
919 | /*****************************************************************************/ | ||
920 | |||
921 | void pci_bmcpyfrom(void *dst, void *src, int len) | ||
922 | { | ||
923 | unsigned long *dp, *sp, val; | ||
924 | unsigned char *dcp, *scp; | ||
925 | int i; | ||
926 | |||
927 | #ifdef DEBUGIO | ||
928 | printk(KERN_DEBUG "pci_bmcpyfrom(dst=%x,src=%x,len=%d)\n",(int)dst,(int)src,len); | ||
929 | #endif | ||
930 | |||
931 | dp = (unsigned long *) dst; | ||
932 | sp = (unsigned long *) src; | ||
933 | i = len >> 2; | ||
934 | |||
935 | for (; (i >= 0); i--) { | ||
936 | val = *sp++; | ||
937 | val = (val << 24) | ((val & 0x0000ff00) << 8) | | ||
938 | ((val & 0x00ff0000) >> 8) | (val >> 24); | ||
939 | *dp++ = val; | ||
940 | } | ||
941 | |||
942 | if (len & 0x3) { | ||
943 | dcp = ((unsigned char *) dp) + 3; | ||
944 | scp = (unsigned char *) sp; | ||
945 | for (i = 0; (i < (len & 0x3)); i++) | ||
946 | *dcp++ = *scp--; | ||
947 | } | ||
948 | |||
949 | #if 0 | ||
950 | printk(KERN_INFO "DATA:"); | ||
951 | dcp = (unsigned char *) dst; | ||
952 | for (i = 0; (i < len); i++) { | ||
953 | if ((i % 16) == 0) printk(KERN_INFO "\n%04x: ", i); | ||
954 | printk(KERN_INFO "%02x ", *dcp++); | ||
955 | } | ||
956 | printk(KERN_INFO "\n"); | ||
957 | #endif | ||
958 | } | ||
959 | |||
960 | /*****************************************************************************/ | ||
961 | |||
962 | void *pci_alloc_consistent(struct pci_dev *dev, size_t size, dma_addr_t *dma_addr) | ||
963 | { | ||
964 | void *mp; | ||
965 | if ((mp = pci_bmalloc(size)) != NULL) { | ||
966 | dma_addr = mp - (COMEM_BASE + COMEM_SHMEM); | ||
967 | return(mp); | ||
968 | } | ||
969 | *dma_addr = (dma_addr_t) NULL; | ||
970 | return(NULL); | ||
971 | } | ||
972 | |||
973 | /*****************************************************************************/ | ||
974 | |||
975 | void pci_free_consistent(struct pci_dev *dev, size_t size, void *cpu_addr, dma_addr_t dma_addr) | ||
976 | { | ||
977 | pci_bmfree(cpu_addr, size); | ||
978 | } | ||
979 | |||
980 | /*****************************************************************************/ | ||
diff --git a/arch/m68knommu/kernel/signal.c b/arch/m68knommu/kernel/signal.c index bbfcae9e52b4..5ab6a04af14e 100644 --- a/arch/m68knommu/kernel/signal.c +++ b/arch/m68knommu/kernel/signal.c | |||
@@ -279,6 +279,9 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext *usc, void *fp, | |||
279 | struct sigcontext context; | 279 | struct sigcontext context; |
280 | int err = 0; | 280 | int err = 0; |
281 | 281 | ||
282 | /* Always make any pending restarted system calls return -EINTR */ | ||
283 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | ||
284 | |||
282 | /* get previous context */ | 285 | /* get previous context */ |
283 | if (copy_from_user(&context, usc, sizeof(context))) | 286 | if (copy_from_user(&context, usc, sizeof(context))) |
284 | goto badframe; | 287 | goto badframe; |
@@ -316,6 +319,9 @@ rt_restore_ucontext(struct pt_regs *regs, struct switch_stack *sw, | |||
316 | unsigned long usp; | 319 | unsigned long usp; |
317 | int err; | 320 | int err; |
318 | 321 | ||
322 | /* Always make any pending restarted system calls return -EINTR */ | ||
323 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | ||
324 | |||
319 | err = __get_user(temp, &uc->uc_mcontext.version); | 325 | err = __get_user(temp, &uc->uc_mcontext.version); |
320 | if (temp != MCONTEXT_VERSION) | 326 | if (temp != MCONTEXT_VERSION) |
321 | goto badframe; | 327 | goto badframe; |
@@ -692,6 +698,15 @@ handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler) | |||
692 | regs->d0 = -EINTR; | 698 | regs->d0 = -EINTR; |
693 | break; | 699 | break; |
694 | 700 | ||
701 | case -ERESTART_RESTARTBLOCK: | ||
702 | if (!has_handler) { | ||
703 | regs->d0 = __NR_restart_syscall; | ||
704 | regs->pc -= 2; | ||
705 | break; | ||
706 | } | ||
707 | regs->d0 = -EINTR; | ||
708 | break; | ||
709 | |||
695 | case -ERESTARTSYS: | 710 | case -ERESTARTSYS: |
696 | if (has_handler && !(ka->sa.sa_flags & SA_RESTART)) { | 711 | if (has_handler && !(ka->sa.sa_flags & SA_RESTART)) { |
697 | regs->d0 = -EINTR; | 712 | regs->d0 = -EINTR; |
diff --git a/arch/m68knommu/kernel/syscalltable.S b/arch/m68knommu/kernel/syscalltable.S index 5c3e3f62194a..1017e76f3711 100644 --- a/arch/m68knommu/kernel/syscalltable.S +++ b/arch/m68knommu/kernel/syscalltable.S | |||
@@ -18,7 +18,7 @@ | |||
18 | .text | 18 | .text |
19 | ALIGN | 19 | ALIGN |
20 | ENTRY(sys_call_table) | 20 | ENTRY(sys_call_table) |
21 | .long sys_ni_syscall /* 0 - old "setup()" system call*/ | 21 | .long sys_restart_syscall /* 0 - old "setup()" system call */ |
22 | .long sys_exit | 22 | .long sys_exit |
23 | .long sys_fork | 23 | .long sys_fork |
24 | .long sys_read | 24 | .long sys_read |
diff --git a/arch/m68knommu/platform/5307/config.c b/arch/m68knommu/platform/5307/config.c index 11cff6625dcc..724faf05852a 100644 --- a/arch/m68knommu/platform/5307/config.c +++ b/arch/m68knommu/platform/5307/config.c | |||
@@ -123,7 +123,7 @@ void __init config_BSP(char *commandp, int size) | |||
123 | { | 123 | { |
124 | mcf_setimr(MCFSIM_IMR_MASKALL); | 124 | mcf_setimr(MCFSIM_IMR_MASKALL); |
125 | 125 | ||
126 | #if defined(CONFIG_NETtel) || defined(CONFIG_eLIA) || \ | 126 | #if defined(CONFIG_NETtel) || \ |
127 | defined(CONFIG_SECUREEDGEMP3) || defined(CONFIG_CLEOPATRA) | 127 | defined(CONFIG_SECUREEDGEMP3) || defined(CONFIG_CLEOPATRA) |
128 | /* Copy command line from FLASH to local buffer... */ | 128 | /* Copy command line from FLASH to local buffer... */ |
129 | memcpy(commandp, (char *) 0xf0004000, size); | 129 | memcpy(commandp, (char *) 0xf0004000, size); |
diff --git a/arch/m68knommu/platform/532x/config.c b/arch/m68knommu/platform/532x/config.c index 4f44b632045b..a347623d6ee6 100644 --- a/arch/m68knommu/platform/532x/config.c +++ b/arch/m68knommu/platform/532x/config.c | |||
@@ -41,15 +41,15 @@ extern unsigned int mcf_timerlevel; | |||
41 | 41 | ||
42 | static struct mcf_platform_uart m532x_uart_platform[] = { | 42 | static struct mcf_platform_uart m532x_uart_platform[] = { |
43 | { | 43 | { |
44 | .mapbase = MCF_MBAR + MCFUART_BASE1, | 44 | .mapbase = MCFUART_BASE1, |
45 | .irq = MCFINT_VECBASE + MCFINT_UART0, | 45 | .irq = MCFINT_VECBASE + MCFINT_UART0, |
46 | }, | 46 | }, |
47 | { | 47 | { |
48 | .mapbase = MCF_MBAR + MCFUART_BASE2, | 48 | .mapbase = MCFUART_BASE2, |
49 | .irq = MCFINT_VECBASE + MCFINT_UART1, | 49 | .irq = MCFINT_VECBASE + MCFINT_UART1, |
50 | }, | 50 | }, |
51 | { | 51 | { |
52 | .mapbase = MCF_MBAR + MCFUART_BASE3, | 52 | .mapbase = MCFUART_BASE3, |
53 | .irq = MCFINT_VECBASE + MCFINT_UART2, | 53 | .irq = MCFINT_VECBASE + MCFINT_UART2, |
54 | }, | 54 | }, |
55 | { }, | 55 | { }, |
@@ -108,7 +108,7 @@ void mcf_settimericr(unsigned int timer, unsigned int level) | |||
108 | default: irq = 32; icr = MCFSIM_ICR_TIMER1; break; | 108 | default: irq = 32; icr = MCFSIM_ICR_TIMER1; break; |
109 | } | 109 | } |
110 | 110 | ||
111 | icrp = (volatile unsigned char *) (MCF_MBAR + icr); | 111 | icrp = (volatile unsigned char *) (icr); |
112 | *icrp = level; | 112 | *icrp = level; |
113 | mcf_enable_irq0(irq); | 113 | mcf_enable_irq0(irq); |
114 | } | 114 | } |
diff --git a/arch/m68knommu/platform/coldfire/entry.S b/arch/m68knommu/platform/coldfire/entry.S index 1e3c0dcbd7ac..3b471c0da24a 100644 --- a/arch/m68knommu/platform/coldfire/entry.S +++ b/arch/m68knommu/platform/coldfire/entry.S | |||
@@ -215,19 +215,8 @@ ENTRY(fasthandler) | |||
215 | RESTORE_LOCAL | 215 | RESTORE_LOCAL |
216 | 216 | ||
217 | ENTRY(ret_from_interrupt) | 217 | ENTRY(ret_from_interrupt) |
218 | moveb %sp@(PT_SR),%d0 | 218 | /* the fasthandler is confusing me, haven't seen any user */ |
219 | andl #0x7,%d0 | 219 | jmp ret_from_exception |
220 | jeq 1f | ||
221 | |||
222 | RESTORE_ALL | ||
223 | |||
224 | 1: | ||
225 | /* check if we need to do software interrupts */ | ||
226 | movel irq_stat+CPUSTAT_SOFTIRQ_PENDING,%d0 | ||
227 | jeq ret_from_exception | ||
228 | |||
229 | pea ret_from_exception | ||
230 | jmp do_softirq | ||
231 | 220 | ||
232 | /* | 221 | /* |
233 | * Beware - when entering resume, prev (the current task) is | 222 | * Beware - when entering resume, prev (the current task) is |
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index 477caa1b1e4b..69aa0ab28403 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c | |||
@@ -106,8 +106,6 @@ void drm_vblank_cleanup(struct drm_device *dev) | |||
106 | 106 | ||
107 | drm_free(dev->vbl_queue, sizeof(*dev->vbl_queue) * dev->num_crtcs, | 107 | drm_free(dev->vbl_queue, sizeof(*dev->vbl_queue) * dev->num_crtcs, |
108 | DRM_MEM_DRIVER); | 108 | DRM_MEM_DRIVER); |
109 | drm_free(dev->vbl_sigs, sizeof(*dev->vbl_sigs) * dev->num_crtcs, | ||
110 | DRM_MEM_DRIVER); | ||
111 | drm_free(dev->_vblank_count, sizeof(*dev->_vblank_count) * | 109 | drm_free(dev->_vblank_count, sizeof(*dev->_vblank_count) * |
112 | dev->num_crtcs, DRM_MEM_DRIVER); | 110 | dev->num_crtcs, DRM_MEM_DRIVER); |
113 | drm_free(dev->vblank_refcount, sizeof(*dev->vblank_refcount) * | 111 | drm_free(dev->vblank_refcount, sizeof(*dev->vblank_refcount) * |
@@ -132,7 +130,6 @@ int drm_vblank_init(struct drm_device *dev, int num_crtcs) | |||
132 | setup_timer(&dev->vblank_disable_timer, vblank_disable_fn, | 130 | setup_timer(&dev->vblank_disable_timer, vblank_disable_fn, |
133 | (unsigned long)dev); | 131 | (unsigned long)dev); |
134 | spin_lock_init(&dev->vbl_lock); | 132 | spin_lock_init(&dev->vbl_lock); |
135 | atomic_set(&dev->vbl_signal_pending, 0); | ||
136 | dev->num_crtcs = num_crtcs; | 133 | dev->num_crtcs = num_crtcs; |
137 | 134 | ||
138 | dev->vbl_queue = drm_alloc(sizeof(wait_queue_head_t) * num_crtcs, | 135 | dev->vbl_queue = drm_alloc(sizeof(wait_queue_head_t) * num_crtcs, |
@@ -140,11 +137,6 @@ int drm_vblank_init(struct drm_device *dev, int num_crtcs) | |||
140 | if (!dev->vbl_queue) | 137 | if (!dev->vbl_queue) |
141 | goto err; | 138 | goto err; |
142 | 139 | ||
143 | dev->vbl_sigs = drm_alloc(sizeof(struct list_head) * num_crtcs, | ||
144 | DRM_MEM_DRIVER); | ||
145 | if (!dev->vbl_sigs) | ||
146 | goto err; | ||
147 | |||
148 | dev->_vblank_count = drm_alloc(sizeof(atomic_t) * num_crtcs, | 140 | dev->_vblank_count = drm_alloc(sizeof(atomic_t) * num_crtcs, |
149 | DRM_MEM_DRIVER); | 141 | DRM_MEM_DRIVER); |
150 | if (!dev->_vblank_count) | 142 | if (!dev->_vblank_count) |
@@ -177,7 +169,6 @@ int drm_vblank_init(struct drm_device *dev, int num_crtcs) | |||
177 | /* Zero per-crtc vblank stuff */ | 169 | /* Zero per-crtc vblank stuff */ |
178 | for (i = 0; i < num_crtcs; i++) { | 170 | for (i = 0; i < num_crtcs; i++) { |
179 | init_waitqueue_head(&dev->vbl_queue[i]); | 171 | init_waitqueue_head(&dev->vbl_queue[i]); |
180 | INIT_LIST_HEAD(&dev->vbl_sigs[i]); | ||
181 | atomic_set(&dev->_vblank_count[i], 0); | 172 | atomic_set(&dev->_vblank_count[i], 0); |
182 | atomic_set(&dev->vblank_refcount[i], 0); | 173 | atomic_set(&dev->vblank_refcount[i], 0); |
183 | } | 174 | } |
@@ -540,15 +531,10 @@ out: | |||
540 | * \param data user argument, pointing to a drm_wait_vblank structure. | 531 | * \param data user argument, pointing to a drm_wait_vblank structure. |
541 | * \return zero on success or a negative number on failure. | 532 | * \return zero on success or a negative number on failure. |
542 | * | 533 | * |
543 | * Verifies the IRQ is installed. | 534 | * This function enables the vblank interrupt on the pipe requested, then |
544 | * | 535 | * sleeps waiting for the requested sequence number to occur, and drops |
545 | * If a signal is requested checks if this task has already scheduled the same signal | 536 | * the vblank interrupt refcount afterwards. (vblank irq disable follows that |
546 | * for the same vblank sequence number - nothing to be done in | 537 | * after a timeout with no further vblank waits scheduled). |
547 | * that case. If the number of tasks waiting for the interrupt exceeds 100 the | ||
548 | * function fails. Otherwise adds a new entry to drm_device::vbl_sigs for this | ||
549 | * task. | ||
550 | * | ||
551 | * If a signal is not requested, then calls vblank_wait(). | ||
552 | */ | 538 | */ |
553 | int drm_wait_vblank(struct drm_device *dev, void *data, | 539 | int drm_wait_vblank(struct drm_device *dev, void *data, |
554 | struct drm_file *file_priv) | 540 | struct drm_file *file_priv) |
@@ -560,6 +546,9 @@ int drm_wait_vblank(struct drm_device *dev, void *data, | |||
560 | if ((!dev->pdev->irq) || (!dev->irq_enabled)) | 546 | if ((!dev->pdev->irq) || (!dev->irq_enabled)) |
561 | return -EINVAL; | 547 | return -EINVAL; |
562 | 548 | ||
549 | if (vblwait->request.type & _DRM_VBLANK_SIGNAL) | ||
550 | return -EINVAL; | ||
551 | |||
563 | if (vblwait->request.type & | 552 | if (vblwait->request.type & |
564 | ~(_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK)) { | 553 | ~(_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK)) { |
565 | DRM_ERROR("Unsupported type value 0x%x, supported mask 0x%x\n", | 554 | DRM_ERROR("Unsupported type value 0x%x, supported mask 0x%x\n", |
@@ -597,89 +586,26 @@ int drm_wait_vblank(struct drm_device *dev, void *data, | |||
597 | vblwait->request.sequence = seq + 1; | 586 | vblwait->request.sequence = seq + 1; |
598 | } | 587 | } |
599 | 588 | ||
600 | if (flags & _DRM_VBLANK_SIGNAL) { | 589 | DRM_DEBUG("waiting on vblank count %d, crtc %d\n", |
601 | unsigned long irqflags; | 590 | vblwait->request.sequence, crtc); |
602 | struct list_head *vbl_sigs = &dev->vbl_sigs[crtc]; | 591 | dev->last_vblank_wait[crtc] = vblwait->request.sequence; |
603 | struct drm_vbl_sig *vbl_sig; | 592 | DRM_WAIT_ON(ret, dev->vbl_queue[crtc], 3 * DRM_HZ, |
604 | 593 | (((drm_vblank_count(dev, crtc) - | |
605 | spin_lock_irqsave(&dev->vbl_lock, irqflags); | 594 | vblwait->request.sequence) <= (1 << 23)) || |
606 | 595 | !dev->irq_enabled)); | |
607 | /* Check if this task has already scheduled the same signal | ||
608 | * for the same vblank sequence number; nothing to be done in | ||
609 | * that case | ||
610 | */ | ||
611 | list_for_each_entry(vbl_sig, vbl_sigs, head) { | ||
612 | if (vbl_sig->sequence == vblwait->request.sequence | ||
613 | && vbl_sig->info.si_signo == | ||
614 | vblwait->request.signal | ||
615 | && vbl_sig->task == current) { | ||
616 | spin_unlock_irqrestore(&dev->vbl_lock, | ||
617 | irqflags); | ||
618 | vblwait->reply.sequence = seq; | ||
619 | goto done; | ||
620 | } | ||
621 | } | ||
622 | |||
623 | if (atomic_read(&dev->vbl_signal_pending) >= 100) { | ||
624 | spin_unlock_irqrestore(&dev->vbl_lock, irqflags); | ||
625 | ret = -EBUSY; | ||
626 | goto done; | ||
627 | } | ||
628 | |||
629 | spin_unlock_irqrestore(&dev->vbl_lock, irqflags); | ||
630 | |||
631 | vbl_sig = drm_calloc(1, sizeof(struct drm_vbl_sig), | ||
632 | DRM_MEM_DRIVER); | ||
633 | if (!vbl_sig) { | ||
634 | ret = -ENOMEM; | ||
635 | goto done; | ||
636 | } | ||
637 | |||
638 | /* Get a refcount on the vblank, which will be released by | ||
639 | * drm_vbl_send_signals(). | ||
640 | */ | ||
641 | ret = drm_vblank_get(dev, crtc); | ||
642 | if (ret) { | ||
643 | drm_free(vbl_sig, sizeof(struct drm_vbl_sig), | ||
644 | DRM_MEM_DRIVER); | ||
645 | goto done; | ||
646 | } | ||
647 | |||
648 | atomic_inc(&dev->vbl_signal_pending); | ||
649 | |||
650 | vbl_sig->sequence = vblwait->request.sequence; | ||
651 | vbl_sig->info.si_signo = vblwait->request.signal; | ||
652 | vbl_sig->task = current; | ||
653 | 596 | ||
654 | spin_lock_irqsave(&dev->vbl_lock, irqflags); | 597 | if (ret != -EINTR) { |
655 | 598 | struct timeval now; | |
656 | list_add_tail(&vbl_sig->head, vbl_sigs); | ||
657 | 599 | ||
658 | spin_unlock_irqrestore(&dev->vbl_lock, irqflags); | 600 | do_gettimeofday(&now); |
659 | 601 | ||
660 | vblwait->reply.sequence = seq; | 602 | vblwait->reply.tval_sec = now.tv_sec; |
603 | vblwait->reply.tval_usec = now.tv_usec; | ||
604 | vblwait->reply.sequence = drm_vblank_count(dev, crtc); | ||
605 | DRM_DEBUG("returning %d to client\n", | ||
606 | vblwait->reply.sequence); | ||
661 | } else { | 607 | } else { |
662 | DRM_DEBUG("waiting on vblank count %d, crtc %d\n", | 608 | DRM_DEBUG("vblank wait interrupted by signal\n"); |
663 | vblwait->request.sequence, crtc); | ||
664 | dev->last_vblank_wait[crtc] = vblwait->request.sequence; | ||
665 | DRM_WAIT_ON(ret, dev->vbl_queue[crtc], 3 * DRM_HZ, | ||
666 | (((drm_vblank_count(dev, crtc) - | ||
667 | vblwait->request.sequence) <= (1 << 23)) || | ||
668 | !dev->irq_enabled)); | ||
669 | |||
670 | if (ret != -EINTR) { | ||
671 | struct timeval now; | ||
672 | |||
673 | do_gettimeofday(&now); | ||
674 | |||
675 | vblwait->reply.tval_sec = now.tv_sec; | ||
676 | vblwait->reply.tval_usec = now.tv_usec; | ||
677 | vblwait->reply.sequence = drm_vblank_count(dev, crtc); | ||
678 | DRM_DEBUG("returning %d to client\n", | ||
679 | vblwait->reply.sequence); | ||
680 | } else { | ||
681 | DRM_DEBUG("vblank wait interrupted by signal\n"); | ||
682 | } | ||
683 | } | 609 | } |
684 | 610 | ||
685 | done: | 611 | done: |
@@ -688,46 +614,6 @@ done: | |||
688 | } | 614 | } |
689 | 615 | ||
690 | /** | 616 | /** |
691 | * Send the VBLANK signals. | ||
692 | * | ||
693 | * \param dev DRM device. | ||
694 | * \param crtc CRTC where the vblank event occurred | ||
695 | * | ||
696 | * Sends a signal for each task in drm_device::vbl_sigs and empties the list. | ||
697 | * | ||
698 | * If a signal is not requested, then calls vblank_wait(). | ||
699 | */ | ||
700 | static void drm_vbl_send_signals(struct drm_device *dev, int crtc) | ||
701 | { | ||
702 | struct drm_vbl_sig *vbl_sig, *tmp; | ||
703 | struct list_head *vbl_sigs; | ||
704 | unsigned int vbl_seq; | ||
705 | unsigned long flags; | ||
706 | |||
707 | spin_lock_irqsave(&dev->vbl_lock, flags); | ||
708 | |||
709 | vbl_sigs = &dev->vbl_sigs[crtc]; | ||
710 | vbl_seq = drm_vblank_count(dev, crtc); | ||
711 | |||
712 | list_for_each_entry_safe(vbl_sig, tmp, vbl_sigs, head) { | ||
713 | if ((vbl_seq - vbl_sig->sequence) <= (1 << 23)) { | ||
714 | vbl_sig->info.si_code = vbl_seq; | ||
715 | send_sig_info(vbl_sig->info.si_signo, | ||
716 | &vbl_sig->info, vbl_sig->task); | ||
717 | |||
718 | list_del(&vbl_sig->head); | ||
719 | |||
720 | drm_free(vbl_sig, sizeof(*vbl_sig), | ||
721 | DRM_MEM_DRIVER); | ||
722 | atomic_dec(&dev->vbl_signal_pending); | ||
723 | drm_vblank_put(dev, crtc); | ||
724 | } | ||
725 | } | ||
726 | |||
727 | spin_unlock_irqrestore(&dev->vbl_lock, flags); | ||
728 | } | ||
729 | |||
730 | /** | ||
731 | * drm_handle_vblank - handle a vblank event | 617 | * drm_handle_vblank - handle a vblank event |
732 | * @dev: DRM device | 618 | * @dev: DRM device |
733 | * @crtc: where this event occurred | 619 | * @crtc: where this event occurred |
@@ -739,6 +625,5 @@ void drm_handle_vblank(struct drm_device *dev, int crtc) | |||
739 | { | 625 | { |
740 | atomic_inc(&dev->_vblank_count[crtc]); | 626 | atomic_inc(&dev->_vblank_count[crtc]); |
741 | DRM_WAKEUP(&dev->vbl_queue[crtc]); | 627 | DRM_WAKEUP(&dev->vbl_queue[crtc]); |
742 | drm_vbl_send_signals(dev, crtc); | ||
743 | } | 628 | } |
744 | EXPORT_SYMBOL(drm_handle_vblank); | 629 | EXPORT_SYMBOL(drm_handle_vblank); |
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 9fe8cb7d43ac..6bdfd47d679d 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
@@ -1829,7 +1829,7 @@ config 68360_ENET | |||
1829 | 1829 | ||
1830 | config FEC | 1830 | config FEC |
1831 | bool "FEC ethernet controller (of ColdFire CPUs)" | 1831 | bool "FEC ethernet controller (of ColdFire CPUs)" |
1832 | depends on M523x || M527x || M5272 || M528x || M520x | 1832 | depends on M523x || M527x || M5272 || M528x || M520x || M532x |
1833 | help | 1833 | help |
1834 | Say Y here if you want to use the built-in 10/100 Fast ethernet | 1834 | Say Y here if you want to use the built-in 10/100 Fast ethernet |
1835 | controller on some Motorola ColdFire processors. | 1835 | controller on some Motorola ColdFire processors. |
diff --git a/drivers/net/fec.c b/drivers/net/fec.c index 7e33c129d51c..2769083bfe83 100644 --- a/drivers/net/fec.c +++ b/drivers/net/fec.c | |||
@@ -1698,7 +1698,7 @@ static void __inline__ fec_set_mii(struct net_device *dev, struct fec_enet_priva | |||
1698 | /* | 1698 | /* |
1699 | * Set MII speed to 2.5 MHz | 1699 | * Set MII speed to 2.5 MHz |
1700 | */ | 1700 | */ |
1701 | fep->phy_speed = ((((MCF_CLK / 2) / (2500000 / 10)) + 5) / 10) * 2; | 1701 | fep->phy_speed = (MCF_CLK / 3) / (2500000 * 2 ) * 2; |
1702 | fecp->fec_mii_speed = fep->phy_speed; | 1702 | fecp->fec_mii_speed = fep->phy_speed; |
1703 | 1703 | ||
1704 | fec_restart(dev, 0); | 1704 | fec_restart(dev, 0); |
diff --git a/drivers/serial/mcf.c b/drivers/serial/mcf.c index b2001c5b145c..56841fe5f483 100644 --- a/drivers/serial/mcf.c +++ b/drivers/serial/mcf.c | |||
@@ -212,10 +212,18 @@ static void mcf_set_termios(struct uart_port *port, struct ktermios *termios, | |||
212 | { | 212 | { |
213 | unsigned long flags; | 213 | unsigned long flags; |
214 | unsigned int baud, baudclk; | 214 | unsigned int baud, baudclk; |
215 | #if defined(CONFIG_M5272) | ||
216 | unsigned int baudfr; | ||
217 | #endif | ||
215 | unsigned char mr1, mr2; | 218 | unsigned char mr1, mr2; |
216 | 219 | ||
217 | baud = uart_get_baud_rate(port, termios, old, 0, 230400); | 220 | baud = uart_get_baud_rate(port, termios, old, 0, 230400); |
221 | #if defined(CONFIG_M5272) | ||
222 | baudclk = (MCF_BUSCLK / baud) / 32; | ||
223 | baudfr = (((MCF_BUSCLK / baud) + 1) / 2) % 16; | ||
224 | #else | ||
218 | baudclk = ((MCF_BUSCLK / baud) + 16) / 32; | 225 | baudclk = ((MCF_BUSCLK / baud) + 16) / 32; |
226 | #endif | ||
219 | 227 | ||
220 | mr1 = MCFUART_MR1_RXIRQRDY | MCFUART_MR1_RXERRCHAR; | 228 | mr1 = MCFUART_MR1_RXIRQRDY | MCFUART_MR1_RXERRCHAR; |
221 | mr2 = 0; | 229 | mr2 = 0; |
@@ -262,6 +270,9 @@ static void mcf_set_termios(struct uart_port *port, struct ktermios *termios, | |||
262 | writeb(mr2, port->membase + MCFUART_UMR); | 270 | writeb(mr2, port->membase + MCFUART_UMR); |
263 | writeb((baudclk & 0xff00) >> 8, port->membase + MCFUART_UBG1); | 271 | writeb((baudclk & 0xff00) >> 8, port->membase + MCFUART_UBG1); |
264 | writeb((baudclk & 0xff), port->membase + MCFUART_UBG2); | 272 | writeb((baudclk & 0xff), port->membase + MCFUART_UBG2); |
273 | #if defined(CONFIG_M5272) | ||
274 | writeb((baudfr & 0x0f), port->membase + MCFUART_UFPD); | ||
275 | #endif | ||
265 | writeb(MCFUART_UCSR_RXCLKTIMER | MCFUART_UCSR_TXCLKTIMER, | 276 | writeb(MCFUART_UCSR_RXCLKTIMER | MCFUART_UCSR_TXCLKTIMER, |
266 | port->membase + MCFUART_UCSR); | 277 | port->membase + MCFUART_UCSR); |
267 | writeb(MCFUART_UCR_RXENABLE | MCFUART_UCR_TXENABLE, | 278 | writeb(MCFUART_UCR_RXENABLE | MCFUART_UCR_TXENABLE, |
diff --git a/include/drm/drm.h b/include/drm/drm.h index 32e5096554e9..8e77357334ad 100644 --- a/include/drm/drm.h +++ b/include/drm/drm.h | |||
@@ -458,7 +458,7 @@ enum drm_vblank_seq_type { | |||
458 | _DRM_VBLANK_FLIP = 0x8000000, /**< Scheduled buffer swap should flip */ | 458 | _DRM_VBLANK_FLIP = 0x8000000, /**< Scheduled buffer swap should flip */ |
459 | _DRM_VBLANK_NEXTONMISS = 0x10000000, /**< If missed, wait for next vblank */ | 459 | _DRM_VBLANK_NEXTONMISS = 0x10000000, /**< If missed, wait for next vblank */ |
460 | _DRM_VBLANK_SECONDARY = 0x20000000, /**< Secondary display controller */ | 460 | _DRM_VBLANK_SECONDARY = 0x20000000, /**< Secondary display controller */ |
461 | _DRM_VBLANK_SIGNAL = 0x40000000 /**< Send signal instead of blocking */ | 461 | _DRM_VBLANK_SIGNAL = 0x40000000 /**< Send signal instead of blocking, unsupported */ |
462 | }; | 462 | }; |
463 | 463 | ||
464 | #define _DRM_VBLANK_TYPES_MASK (_DRM_VBLANK_ABSOLUTE | _DRM_VBLANK_RELATIVE) | 464 | #define _DRM_VBLANK_TYPES_MASK (_DRM_VBLANK_ABSOLUTE | _DRM_VBLANK_RELATIVE) |
diff --git a/include/drm/drmP.h b/include/drm/drmP.h index afb7858c068d..8190b9bcc2d9 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h | |||
@@ -545,13 +545,6 @@ struct drm_ctx_list { | |||
545 | struct drm_file *tag; /**< associated fd private data */ | 545 | struct drm_file *tag; /**< associated fd private data */ |
546 | }; | 546 | }; |
547 | 547 | ||
548 | struct drm_vbl_sig { | ||
549 | struct list_head head; | ||
550 | unsigned int sequence; | ||
551 | struct siginfo info; | ||
552 | struct task_struct *task; | ||
553 | }; | ||
554 | |||
555 | /* location of GART table */ | 548 | /* location of GART table */ |
556 | #define DRM_ATI_GART_MAIN 1 | 549 | #define DRM_ATI_GART_MAIN 1 |
557 | #define DRM_ATI_GART_FB 2 | 550 | #define DRM_ATI_GART_FB 2 |
@@ -903,8 +896,6 @@ struct drm_device { | |||
903 | wait_queue_head_t *vbl_queue; /**< VBLANK wait queue */ | 896 | wait_queue_head_t *vbl_queue; /**< VBLANK wait queue */ |
904 | atomic_t *_vblank_count; /**< number of VBLANK interrupts (driver must alloc the right number of counters) */ | 897 | atomic_t *_vblank_count; /**< number of VBLANK interrupts (driver must alloc the right number of counters) */ |
905 | spinlock_t vbl_lock; | 898 | spinlock_t vbl_lock; |
906 | struct list_head *vbl_sigs; /**< signal list to send on VBLANK */ | ||
907 | atomic_t vbl_signal_pending; /* number of signals pending on all crtcs*/ | ||
908 | atomic_t *vblank_refcount; /* number of users of vblank interruptsper crtc */ | 899 | atomic_t *vblank_refcount; /* number of users of vblank interruptsper crtc */ |
909 | u32 *last_vblank; /* protected by dev->vbl_lock, used */ | 900 | u32 *last_vblank; /* protected by dev->vbl_lock, used */ |
910 | /* for wraparound handling */ | 901 | /* for wraparound handling */ |
diff --git a/include/linux/dmi.h b/include/linux/dmi.h index aea23105d3ed..d741b9ceb0e0 100644 --- a/include/linux/dmi.h +++ b/include/linux/dmi.h | |||
@@ -65,6 +65,8 @@ static inline int dmi_walk(void (*decode)(const struct dmi_header *)) | |||
65 | { return -1; } | 65 | { return -1; } |
66 | static inline bool dmi_match(enum dmi_field f, const char *str) | 66 | static inline bool dmi_match(enum dmi_field f, const char *str) |
67 | { return false; } | 67 | { return false; } |
68 | static inline const struct dmi_system_id * | ||
69 | dmi_first_match(const struct dmi_system_id *list) { return NULL; } | ||
68 | 70 | ||
69 | #endif | 71 | #endif |
70 | 72 | ||
diff --git a/mm/nommu.c b/mm/nommu.c index 0c3e7d2114f6..2fcf47d449b4 100644 --- a/mm/nommu.c +++ b/mm/nommu.c | |||
@@ -1161,8 +1161,8 @@ error_free: | |||
1161 | return ret; | 1161 | return ret; |
1162 | 1162 | ||
1163 | enomem: | 1163 | enomem: |
1164 | printk("Allocation of length %lu from process %d failed\n", | 1164 | printk("Allocation of length %lu from process %d (%s) failed\n", |
1165 | len, current->pid); | 1165 | len, current->pid, current->comm); |
1166 | show_free_areas(); | 1166 | show_free_areas(); |
1167 | return -ENOMEM; | 1167 | return -ENOMEM; |
1168 | } | 1168 | } |
diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c index 71e2b914363e..8e42800878f4 100644 --- a/security/smack/smackfs.c +++ b/security/smack/smackfs.c | |||
@@ -334,7 +334,7 @@ static ssize_t smk_write_load(struct file *file, const char __user *buf, | |||
334 | break; | 334 | break; |
335 | case 'a': | 335 | case 'a': |
336 | case 'A': | 336 | case 'A': |
337 | rule.smk_access |= MAY_READ; | 337 | rule.smk_access |= MAY_APPEND; |
338 | break; | 338 | break; |
339 | default: | 339 | default: |
340 | goto out; | 340 | goto out; |