ar71xx: fix inline attribute location
[openwrt.git] / target / linux / coldfire / patches / 078-m547x_8x_pci_initial.patch
1 From 7f92b68c12c1891435c75f7f83a6390b4c73eaa6 Mon Sep 17 00:00:00 2001
2 From: Kurt Mahan <kmahan@freescale.com>
3 Date: Thu, 10 Jul 2008 19:17:11 -0600
4 Subject: [PATCH] Add PCI to m547x/m548x.
5
6 LTIBName: m547x-8x-pci-initial
7 Signed-off-by: Kurt Mahan <kmahan@freescale.com>
8 Signed-off-by: Shrek Wu <b16972@freescale.com>
9 ---
10  arch/m68k/Kconfig                 |    4 +-
11  arch/m68k/coldfire/Makefile       |    7 +-
12  arch/m68k/coldfire/ints.c         |    8 +-
13  arch/m68k/coldfire/mcf548x-pci.c  |  934 +++++++++++++++++++++++++++++++++++++
14  arch/m68k/kernel/Makefile         |    3 +
15  arch/m68k/kernel/bios32_mcf548x.c |  631 +++++++++++++++++++++++++
16  arch/m68k/kernel/dma.c            |   32 +-
17  arch/m68k/mm/kmap.c               |   11 +-
18  drivers/pci/access.c              |   16 +-
19  drivers/usb/host/Makefile         |    2 +-
20  include/asm-m68k/5445x_pci.h      |   94 ++++
21  include/asm-m68k/548x_pci.h       |   99 ++++
22  include/asm-m68k/io.h             |   65 +++-
23  include/asm-m68k/m5485pci.h       |  330 +++++++++++++
24  include/asm-m68k/pci.h            |   96 +----
25  include/asm-m68k/raw_io.h         |   26 +
26  include/asm-m68k/virtconvert.h    |    5 +
27  include/linux/pci.h               |    2 +
28  18 files changed, 2250 insertions(+), 115 deletions(-)
29  create mode 100644 arch/m68k/coldfire/mcf548x-pci.c
30  create mode 100644 arch/m68k/kernel/bios32_mcf548x.c
31  create mode 100644 include/asm-m68k/5445x_pci.h
32  create mode 100644 include/asm-m68k/548x_pci.h
33  create mode 100644 include/asm-m68k/m5485pci.h
34
35 --- a/arch/m68k/Kconfig
36 +++ b/arch/m68k/Kconfig
37 @@ -175,8 +175,8 @@ config HADES
38           to use this kernel on a Hades, say Y here; otherwise say N.
39  
40  config PCI
41 -       bool
42 -       depends on HADES || M54455
43 +       bool "PCI bus support"
44 +       depends on HADES || M54455 || M547X_8X
45         default n
46         help
47           Find out whether you have a PCI motherboard. PCI is the name of a
48 --- a/arch/m68k/coldfire/Makefile
49 +++ b/arch/m68k/coldfire/Makefile
50 @@ -3,12 +3,17 @@
51  #
52  
53  obj-y:= entry.o config.o cache.o signal.o muldi3.o traps.o ints.o
54 -
55 +ifdef CONFIG_M5445X
56  ifneq ($(strip $(CONFIG_USB) $(CONFIG_USB_GADGET_MCF5445X)),)
57         obj-y   += usb.o usb/
58  endif
59 +endif
60  
61 +ifdef CONFIG_M547X_8X
62 +obj-$(CONFIG_PCI)       += mcf548x-pci.o
63 +else
64  obj-$(CONFIG_PCI)      += pci.o mcf5445x-pci.o iomap.o
65 +endif
66  obj-$(CONFIG_M5445X)   += mcf5445x-devices.o
67  obj-$(CONFIG_M547X_8X) += m547x_8x-devices.o
68  obj-$(CONFIG_M547X_8X) += mcf548x-devices.o
69 --- a/arch/m68k/coldfire/ints.c
70 +++ b/arch/m68k/coldfire/ints.c
71 @@ -192,6 +192,8 @@ int setup_irq(unsigned int irq, struct i
72                 /* Can't share interrupts unless both agree to */
73                 if (!((*prev)->flags & node->flags & IRQF_SHARED)) {
74                         spin_unlock_irqrestore(&contr->lock, flags);
75 +                       printk(KERN_INFO "%s: -BUSY-Incorrect IRQ %d \n",
76 +                               __FUNCTION__, irq);
77                         return -EBUSY;
78                 }
79                 while (*prev)
80 @@ -219,9 +221,11 @@ int request_irq(unsigned int irq,
81         struct irq_node *node = get_irq_node();
82         int res;
83  
84 -       if (!node)
85 +       if (!node) {
86 +               printk(KERN_INFO "%s:get_irq_node error %x\n",
87 +                       __FUNCTION__,(unsigned int) node);
88                 return -ENOMEM;
89 -
90 +       }
91         node->handler = handler;
92         node->flags   = flags;
93         node->dev_id  = dev_id;
94 --- /dev/null
95 +++ b/arch/m68k/coldfire/mcf548x-pci.c
96 @@ -0,0 +1,934 @@
97 +/*
98 + *     ColdFire 547x/548x PCI Host Controller functions
99 + */
100 +#include <linux/kernel.h>
101 +#include <linux/types.h>
102 +#include <linux/init.h>
103 +#include <linux/mm.h>
104 +#include <linux/string.h>
105 +#include <linux/pci.h>
106 +#include <linux/ioport.h>
107 +#include <linux/slab.h>
108 +#include <linux/version.h>
109 +#include <linux/interrupt.h>
110 +
111 +#include <linux/dma-mapping.h>
112 +#include <asm/coldfire.h>
113 +#include <asm/io.h>
114 +#include <asm/m5485sim.h>
115 +#include <asm/m5485pci.h>
116 +#include <asm/irq.h>
117 +#include <asm/pci.h>
118 +#include <asm/virtconvert.h>
119 +
120 +
121 +#undef DEBUG
122 +//#define DEBUG
123 +
124 +#ifdef DEBUG
125 +//#define DBG(x...) printk(KERN_DEBUG x)
126 +#define DBG(x...) printk(x)
127 +#else
128 +#define DBG(x...)
129 +#endif
130 +
131 +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,75))
132 +# define irqreturn_t void
133 +# define IRQ_HANDLED
134 +# define IRQ_NONE
135 +#endif
136 +
137 +/*
138 + *  Bridge configration dafaults
139 + */
140 +#define PCI_RETRIES    0
141 +#define PCI_CACHE_LINE         8
142 +#define PCI_MINGNT     1
143 +#define PCI_MAXLAT     42
144 +
145 +
146 +/*
147 + *  Initiator windows setting
148 + */
149 +#define HOST_MEM_BASE          0xD0000000      /* ColdFire Memory window base  */
150 +#define PCI_MEM_BASE           0xD0000000      /* PCI Memory window base       */
151 +#define PCI_MEM_SIZE           0x08000000      /* Memory window size (128M)    */
152 +#define HOST_IO_BASE           0xD8000000      /* ColdFire I/O window base     */
153 +#define PCI_IO_BASE_ADDR       0x00000000      /* PCI I/O window base          */
154 +#define PCI_IO_SIZE            0x00010000      /* I/O window size (64K)        */
155 +#define HOST_CFG_BASE          0xD8000000      /* ColdFire config window base  */
156 +#define HOST_DMA_BASE   CONFIG_SDRAM_BASE      /* ColdFire PCI-DMA window base */
157 +#define PCI_HDR_BASE           (MCF_MBAR+0xB00)/* ColdFire config registers    */
158 +
159 +#define PCI_MEM_MASK           (PCI_MEM_SIZE-1)
160 +#define PCI_IO_MASK            (PCI_IO_SIZE-1)
161 +
162 +/* Macro to set initiator window */
163 +#define WxBAR(host_address, pci_address, size)         \
164 +       (((host_address)  & 0xff000000)      |  \
165 +       ((((size)-1) & 0xff000000) >> 8)     |  \
166 +       ((pci_address) & 0xff000000) >> 16)
167 +
168 +/*
169 + *  BIOS internal data
170 + */
171 +static u8 revision;            /* controller revision */
172 +
173 +/*
174 + *     Board specific setting
175 + */
176 +const unsigned int irq_lines[] = { 5, 7 };
177 +
178 +#define N_SLOTS        (sizeof(board_info) / sizeof(board_info[0]))
179 +#define N_IRQS         (sizeof(irq_lines)  / sizeof(irq_lines[0]))
180 +#define BRIDGE_SLOT    0
181 +
182 +const struct slotinfo {
183 +       unsigned char idsel;    /* device number     */
184 +       unsigned char irq;      /* external IRQ      */
185 +       unsigned char req;      /* REQ line number   */
186 +       unsigned char gnt;      /* GNT line number   */
187 +} board_info[] = {
188 +       {0,  0, 0, 0},          /* Bridge      */
189 +       {17, 5, 1, 1},          /* Slot #1     */
190 +       {18, 5, 2, 2},          /* Slot #2     */       
191 +       {20, 7, 3, 3},          /* Slot #3     */
192 +       {21, 7, 4, 4},          /* Slot #4     */
193 +};
194 +
195 +/************************************************************************/
196 +
197 +/*
198 + * static int mk_conf_addr()
199 + *
200 + * Return type0 or type1 configuration address
201 + * by the means of device address and PCI dword location
202 + * 0 - for not existing slots
203 + */
204 +static int mk_conf_addr(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where)
205 +{
206 +       int slot, func, address, idsel, dev_fn;
207 +
208 +       if (bus->number) {
209 +               address = MCF_PCICAR_E | (bus->number << 16) |
210 +                   (devfn << 8) | (where & 0xfc);
211 +       } else {
212 +               slot = PCI_SLOT(devfn);
213 +               if (slot > N_SLOTS || slot == BRIDGE_SLOT)
214 +                       return 0;
215 +               else {
216 +                       func = PCI_FUNC(devfn);
217 +                       idsel = board_info[slot].idsel;
218 +
219 +                       dev_fn = PCI_DEVFN(idsel, func);
220 +                       address = MCF_PCICAR_E | (bus->number << 16) |
221 +                           (dev_fn << 8) | (where & 0xfc);
222 +               }
223 +       }
224 +
225 +       return (address);
226 +}
227 +
228 +/*
229 + * static int read_config_byte()
230 + *
231 + * Read a byte from configuration space of specified device
232 + */
233 +static int read_config_byte(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u8 *value)
234 +{
235 +       int slot;
236 +       int address;
237 +       int result;
238 +
239 +       *value = 0xff;
240 +       result = PCIBIOS_SUCCESSFUL;
241 +
242 +       slot = PCI_SLOT(devfn);
243 +       if (slot == BRIDGE_SLOT) {
244 +               if (where <= 0x40)
245 +                       *value = *(volatile u8 *) (PCI_HDR_BASE + (where ^ 3));
246 +               else
247 +                       *value = 0;
248 +       } else {
249 +               address = mk_conf_addr(bus, devfn, where);
250 +               if (!address)
251 +                       result = PCIBIOS_DEVICE_NOT_FOUND;
252 +               else {
253 +                       MCF_PCICAR = address;
254 +                       *value = *(volatile u8 *) (HOST_CFG_BASE + (where & 3));
255 +               }
256 +       }
257 +       __asm__ __volatile__("nop");
258 +       __asm__ __volatile__("nop");
259 +       MCF_PCICAR &= ~MCF_PCICAR_E;
260 +
261 +       DBG("PCI: read_config_byte bus=%d, devfn=%d, addr=0x%02X, val=0x%02X, ret=%02X\n",
262 +           bus->number, devfn, where, *value, result);
263 +
264 +       return (result);
265 +}
266 +
267 +/*
268 + * static int read_config_word()
269 + *
270 + * Read a word from configuration space of specified device
271 + */
272 +static int read_config_word(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u16 *value)
273 +{
274 +       int slot;
275 +       int address;
276 +       int result;
277 +
278 +       *value = 0xffff;
279 +       result = PCIBIOS_SUCCESSFUL;
280 +
281 +       if (where & 0x1)
282 +               result = PCIBIOS_BAD_REGISTER_NUMBER;
283 +       else {
284 +               slot = PCI_SLOT(devfn);
285 +               if (slot == BRIDGE_SLOT) {
286 +                       if (where <= 0x3f)
287 +                               *value =
288 +                                   *(volatile u16 *) (PCI_HDR_BASE +
289 +                                                      (where ^ 2));
290 +                       else
291 +                               *value = 0;
292 +               } else {
293 +                       address = mk_conf_addr(bus, devfn, where);
294 +                       if (!address)
295 +                               result = PCIBIOS_DEVICE_NOT_FOUND;
296 +                       else {
297 +                               MCF_PCICAR = address;
298 +                               *value = le16_to_cpu(*(volatile u16 *)
299 +                                                    (HOST_CFG_BASE +
300 +                                                     (where & 2)));
301 +                       }
302 +               }
303 +       }
304 +        __asm__ __volatile__("nop");
305 +        __asm__ __volatile__("nop");
306 +       MCF_PCICAR &= ~MCF_PCICAR_E;
307 +
308 +       DBG("PCI: read_config_word bus=%d, devfn=%d, addr=0x%02X, val=0x%04X ret=%02X\n",
309 +           bus->number, devfn, where, *value, result);
310 +
311 +       return (result);
312 +}
313 +
314 +/*
315 + * static int read_config_dword()
316 + *
317 + * Read a long word from configuration space of specified device
318 + */
319 +static int read_config_dword(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u32 *value)
320 +{
321 +       int slot;
322 +       int address;
323 +       int result;
324 +
325 +       *value = 0xffffffff;
326 +       result = PCIBIOS_SUCCESSFUL;
327 +
328 +       if (where & 0x3)
329 +               result = PCIBIOS_BAD_REGISTER_NUMBER;
330 +       else {
331 +               slot = PCI_SLOT(devfn);
332 +               if (slot == BRIDGE_SLOT) {
333 +                       if (where <= 0x3d)
334 +                               *value =
335 +                                   *(volatile u32 *) (PCI_HDR_BASE + where);
336 +                       else
337 +                               *value = 0;
338 +                       __asm__ __volatile__("nop");
339 +                       __asm__ __volatile__("nop");
340 +               } else {
341 +                       address = mk_conf_addr(bus, devfn, where);
342 +                       if (!address)
343 +                               result = PCIBIOS_DEVICE_NOT_FOUND;
344 +                       else {
345 +                               MCF_PCICAR = address;
346 +                               *value = le32_to_cpu(*(volatile u32 *)
347 +                                                    (HOST_CFG_BASE));
348 +                               __asm__ __volatile__("nop");
349 +                               __asm__ __volatile__("nop");
350 +                               if (bus->number != 0 && revision < 1) {
351 +                                       volatile u32 temp;
352 +
353 +                                       MCF_PCICAR |= 0xff0000;
354 +                                       temp = *(volatile u32 *) (HOST_CFG_BASE);
355 +                               }
356 +                       }
357 +               }
358 +       }
359 +
360 +       MCF_PCICAR &= ~MCF_PCICAR_E;
361 +
362 +       DBG("PCI: read_config_dword bus=%d, devfn=%d, addr=0x%02X, value=0x%08X ret=%02X\n",
363 +            bus->number, devfn, where, *value, result);
364 +
365 +       return (result);
366 +}
367 +
368 +/*
369 + * static int write_config_byte()
370 + *
371 + * Write a byte to configuration space of specified device
372 + */
373 +static int write_config_byte(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u8 value)
374 +{
375 +       int slot;
376 +       int address;
377 +       int result;
378 +
379 +       result = PCIBIOS_SUCCESSFUL;
380 +
381 +       slot = PCI_SLOT(devfn);
382 +       if (slot == BRIDGE_SLOT) {
383 +               if (where <= 0x40)
384 +                       *(volatile u8 *) (PCI_HDR_BASE + (where ^ 3)) = value;
385 +       } else {
386 +               address = mk_conf_addr(bus, devfn, where);
387 +               if (!address)
388 +                       result = PCIBIOS_DEVICE_NOT_FOUND;
389 +               else {
390 +                       MCF_PCICAR = address;
391 +                       *(volatile u8 *) (HOST_CFG_BASE + (where & 3)) = value;
392 +               }
393 +       }
394 +        __asm__ __volatile__("nop");
395 +        __asm__ __volatile__("nop");
396 +       MCF_PCICAR &= ~MCF_PCICAR_E;
397 +
398 +       DBG("PCI: write_config_byte bus=%d, devfn=%d, addr=0x%02X, value=0x%02X ret=%02X\n",
399 +            bus->number, devfn, where, value, result);
400 +
401 +       return (result);
402 +}
403 +
404 +/*
405 + * static int write_config_word()
406 + *
407 + * Write a word to configuration space of specified device
408 + */
409 +static int write_config_word(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u16 value)
410 +{
411 +       int slot;
412 +       int address;
413 +       int result;
414 +
415 +       result = PCIBIOS_SUCCESSFUL;
416 +
417 +       if (where & 0x1)
418 +               result = PCIBIOS_BAD_REGISTER_NUMBER;
419 +       else {
420 +               slot = PCI_SLOT(devfn);
421 +               if (slot == BRIDGE_SLOT) {
422 +                       if (where <= 0x3f)
423 +                               *(volatile u16 *) (PCI_HDR_BASE + (where ^ 2)) =
424 +                                   value;
425 +               } else {
426 +                       address = mk_conf_addr(bus, devfn, where);
427 +                       if (!address)
428 +                               result = PCIBIOS_DEVICE_NOT_FOUND;
429 +                       else {
430 +                               MCF_PCICAR = address;
431 +                               *(volatile u16 *) (HOST_CFG_BASE + (where & 2)) =
432 +                                   cpu_to_le16(value);
433 +                       }
434 +               }
435 +       }
436 +       __asm__ __volatile__("nop");
437 +        __asm__ __volatile__("nop");
438 +       MCF_PCICAR &= ~MCF_PCICAR_E;
439 +
440 +       DBG("PCI: write_config_word bus=%d, devfn=%d, addr=0x%02X, value=0x%04X ret=%02X\n",
441 +            bus->number, devfn, where, value, result);
442 +
443 +       return (result);
444 +}
445 +
446 +/*
447 + * static int write_config_dword()
448 + *
449 + * Write a long word to configuration space of specified device
450 + */
451 +static int write_config_dword(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u32 value)
452 +{
453 +       int slot;
454 +       int address;
455 +       int result;
456 +
457 +       result = PCIBIOS_SUCCESSFUL;
458 +
459 +       if (where & 0x3)
460 +               result = PCIBIOS_BAD_REGISTER_NUMBER;
461 +       else {
462 +               slot = PCI_SLOT(devfn);
463 +               if (slot == BRIDGE_SLOT) {
464 +                       if (where <= 0x3d)
465 +                               *(volatile u32 *) (PCI_HDR_BASE + where) =
466 +                                   value;
467 +               } else {
468 +                       address = mk_conf_addr(bus, devfn, where);
469 +                       if (!address)
470 +                               result = PCIBIOS_DEVICE_NOT_FOUND;
471 +                       else {
472 +                               MCF_PCICAR = address;
473 +                               *(volatile u32 *) (HOST_CFG_BASE) =
474 +                                   cpu_to_le32(value);
475 +                       }
476 +               }
477 +       }
478 +       __asm__ __volatile__("nop");
479 +        __asm__ __volatile__("nop");
480 +       MCF_PCICAR &= ~MCF_PCICAR_E;
481 +
482 +       DBG("PCI: write_config_dword dev=%d, fn=%d, addr=0x%02X, value=0x%08X ret=%02X\n",
483 +           PCI_SLOT(devfn), PCI_FUNC(devfn), where,  value, result);
484 +
485 +       return (result);
486 +}
487 +
488 +static int config_read(struct pci_bus *bus, unsigned int devfn,
489 +                      int where, int size, u32 * val)
490 +{
491 +       switch (size) {
492 +       case 1:
493 +               return read_config_byte(bus, devfn, where, (u8 *) val);
494 +       case 2:
495 +               return read_config_word(bus, devfn, where, (u16 *) val);
496 +       default:
497 +               return read_config_dword(bus, devfn, where, val);
498 +       }
499 +}
500 +
501 +static int config_write(struct pci_bus *bus, unsigned int devfn,
502 +                       int where, int size, u32 val)
503 +{
504 +       switch (size) {
505 +       case 1:
506 +               return write_config_byte(bus, devfn, where, (u8) val);
507 +       case 2:
508 +               return write_config_word(bus, devfn, where, (u16) val);
509 +       default:
510 +               return write_config_dword(bus, devfn, where, val);
511 +       }
512 +}
513 +
514 +/*
515 + *  configuration routines entry points
516 + */
517 +static struct pci_ops bus_ops = {
518 +      read:            config_read,
519 +      write:           config_write
520 +};
521 +
522 +/************************************************************************/
523 +
524 +/*
525 + * u8 pci_inb()
526 + *
527 + * Read a byte at specified address from I/O space
528 + */
529 +unsigned char pci_inb(long addr)
530 +{
531 +       char value;
532 +
533 +       value = *(volatile unsigned char *) (HOST_IO_BASE | (addr & PCI_IO_MASK));
534 +       DBG("PCI: inb addr=0x%08X, value=0x%02X\n", addr, value);
535 +
536 +       return (unsigned char) value;
537 +}
538 +
539 +
540 +/*
541 + * u16 pci_inw()
542 + *
543 + * Read a word at specified address from I/O space
544 + */
545 +unsigned short pci_inw(long addr)
546 +{
547 +       short value;
548 +       volatile unsigned short *ptr;
549 +
550 +       ptr = (volatile unsigned short *) (HOST_IO_BASE | (addr & PCI_IO_MASK));
551 +       value = le16_to_cpu(*ptr);
552 +
553 +       DBG("PCI: inw addr=0x%08X, value=0x%04X\n",  addr, value);
554 +       return (unsigned short) value;
555 +}
556 +
557 +/*
558 + * u16 pci_raw_inw()
559 + *
560 + * Read a raw word at specified address from I/O space
561 + */
562 +unsigned short pci_raw_inw(long addr)
563 +{
564 +       short value;
565 +       volatile unsigned short *ptr;
566 +
567 +       ptr = (volatile unsigned short *) (HOST_IO_BASE | (addr & PCI_IO_MASK));
568 +       value = *ptr;
569 +
570 +       DBG("PCI: raw_inw addr=0x%08X, value=0x%04X\n",  addr, value);
571 +       return (unsigned short) value;
572 +}
573 +
574 +/*
575 + * u32 pci_inl()
576 + *
577 + * Read a dword at specified address from I/O space
578 + */
579 +unsigned long pci_inl(long addr)
580 +{
581 +       long value;
582 +       volatile unsigned long *ptr;
583 +
584 +       ptr = (volatile unsigned long *) (HOST_IO_BASE | (addr & PCI_IO_MASK));
585 +       value = le32_to_cpu(*ptr);
586 +
587 +       DBG("PCI: inl addr=0x%08X, value=0x%08X\n",  addr, value);
588 +       return (unsigned long) value;
589 +}
590 +
591 +/*
592 + * u32 pci_raw_inl()
593 + *
594 + * Read a raw dword at specified address from I/O space
595 + */
596 +unsigned long pci_raw_inl(long addr)
597 +{
598 +       long value;
599 +       volatile unsigned long *ptr;
600 +
601 +       ptr = (volatile unsigned long *) (HOST_IO_BASE | (addr & PCI_IO_MASK));
602 +       value = *ptr;
603 +
604 +       DBG("PCI: raw_inl addr=0x%08X, value=0x%08X\n",  addr, value);
605 +       return (unsigned long) value;
606 +}
607 +
608 +/*
609 + * void pci_outb()
610 + *
611 + * Write a byte value at specified address to I/O space
612 + */
613 +void pci_outb( unsigned char value,  long addr)
614 +{
615 +
616 +       *(volatile unsigned char *) (HOST_IO_BASE | (addr & PCI_IO_MASK)) = value;
617 +       DBG("PCI: outb addr=0x%08X, value=0x%02X\n",  addr, value);
618 +}
619 +
620 +
621 +/*
622 + * void pci_outw()
623 + *
624 + * Write a word value at specified address to I/O space
625 + */
626 +void pci_outw(volatile unsigned short value, volatile  long addr)
627 +{
628 +       volatile unsigned short *ptr;
629 +
630 +       ptr = (volatile unsigned short *) (HOST_IO_BASE | (addr & PCI_IO_MASK));
631 +       *ptr = cpu_to_le16(value);
632 +       DBG("PCI: outw addr=0x%08X, value=0x%04X\n",  addr, value);
633 +}
634 +
635 +/*
636 + * void pci_raw_outw()
637 + *
638 + * Write a raw word value at specified address to I/O space
639 + */
640 +void pci_raw_outw(volatile unsigned short value, volatile  long addr)
641 +{
642 +       volatile unsigned short *ptr;
643 +
644 +       ptr = (volatile unsigned short *) (HOST_IO_BASE | (addr & PCI_IO_MASK));
645 +       *ptr = value;
646 +       DBG("PCI: raw_outw addr=0x%08X, value=0x%04X\n",  addr, value);
647 +}
648 +
649 +/*
650 + * void pci_outl()
651 + *
652 + * Write a long word value at specified address to I/O space
653 + */
654 +void pci_outl(volatile unsigned long value, volatile long addr)
655 +{
656 +       volatile unsigned long *ptr;
657 +
658 +       ptr = (volatile unsigned long *)(HOST_IO_BASE | (addr & PCI_IO_MASK));
659 +       *ptr = cpu_to_le32(value);
660 +       DBG("PCI: outl addr=0x%08X, value=0x%08X\n", addr, value);
661 +}
662 +
663 +/*
664 + * void pci_raw_outl()
665 + *
666 + * Write a raw long word value at specified address to I/O space
667 + */
668 +void pci_raw_outl(volatile unsigned long value, volatile long addr)
669 +{
670 +       volatile unsigned long *ptr;
671 +
672 +       ptr = (volatile unsigned long *)(HOST_IO_BASE | (addr & PCI_IO_MASK));
673 +       *ptr = value;
674 +       DBG("PCI: raw_outl addr=0x%08X, value=0x%08X\n", addr, value);
675 +}
676 +
677 +/*
678 + * void pci_insb()
679 + *
680 + * Read several byte values from specified I/O port
681 + */
682 +void pci_insb(volatile unsigned char *addr, unsigned char *buf, int len)
683 +{
684 +       for (; len--; buf++)
685 +               *buf = pci_inb((unsigned long)addr);
686 +       DBG("PCI: pci_insb addr=0x%08X, buf=%p, len=%d\n", addr, buf, len);
687 +}
688 +
689 +
690 +/*
691 + * void pci_insw()
692 + *
693 + * Read several word values from specified I/O port
694 + */
695 +void pci_insw(volatile unsigned short *addr, unsigned short *buf, int len)
696 +{
697 +       for (; len--; buf++)
698 +               *buf = pci_inw((unsigned long)addr);
699 +       DBG("PCI: pci_insw addr=0x%08X, buf=%p, len=%d\n", addr, buf, len);
700 +}
701 +
702 +/*
703 + * void pci_insl()
704 + *
705 + * Read several dword values from specified I/O port
706 + */
707 +void pci_insl(volatile unsigned long *addr, unsigned long *buf, int len)
708 +{
709 +       for (; len--; buf++)
710 +               *buf = pci_inl((unsigned long)addr);
711 +       DBG("PCI: pci_insl addr=0x%08X, buf=%p, len=%d\n", addr, buf, len);
712 +}
713 +
714 +/*
715 + * void pci_outsb()
716 + *
717 + * Write several byte values to specified I/O port
718 + */
719 +void pci_outsb(volatile unsigned char *addr, const unsigned char *buf, int len)
720 +{
721 +       for (; len--; buf++)
722 +               pci_outb((unsigned long)addr, *buf);
723 +       DBG("PCI: pci_outsb addr=0x%08X, buf=%p, len=%d\n", addr, buf, len);
724 +}
725 +
726 +/*
727 + * void pci_outsw()
728 + *
729 + * Write several word values to specified I/O port
730 + */
731 +void pci_outsw(volatile unsigned short *addr, const unsigned short *buf, int len)
732 +{
733 +       for (; len--; buf++)
734 +               pci_outw((unsigned long)addr, *buf);
735 +       DBG("PCI: pci_outsw addr=0x%08X, buf=%p, len=%d\n", addr, buf, len);
736 +}
737 +
738 +/*
739 + * void pci_outsl()
740 + *
741 + * Write several dword values to specified I/O port
742 + */
743 +void pci_outsl(volatile unsigned long *addr, const unsigned long *buf, int len)
744 +{
745 +       for (; len--; buf++)
746 +               pci_outl((unsigned long)addr, *buf);
747 +       DBG("PCI: pci_outsl addr=0x%08X, buf=%p, len=%d\n", addr, buf, len);
748 +}
749 +
750 +/*
751 + * void pci_xlb_handler()
752 + *
753 + * PCI XLB interrupt handler
754 + */
755 +irqreturn_t xlb_interrupt(int irq, void *dev)
756 +{
757 +       volatile int xlb_error = MCF_PCIISR;
758 +
759 +       /* Acknowlege interrupt */
760 +       MCF_PCIISR = xlb_error;
761 +
762 +       /* Dump interrupt reason */
763 +       if (xlb_error & MCF_PCIISR_RE)
764 +               DBG("PCI: Retry Error Received\n");
765 +               
766 +       if (xlb_error & MCF_PCIISR_IA)
767 +               DBG("PCI: Initiator Abort Received\n");
768 +               
769 +       if (xlb_error & MCF_PCIISR_TA)
770 +               DBG("PCI: Target Abort Received\n");
771 +
772 +       return IRQ_HANDLED;
773 +}
774 +
775 +
776 +/*
777 + * void pci_arbiter_handler()
778 + *
779 + * PCI arbiter interrupt handler
780 + */
781 +irqreturn_t arb_interrupt(int irq, void *dev)
782 +{
783 +       volatile unsigned long arb_error = MCF_PCIARB_PASR;
784 +
785 +       /* Acknowlege interrupt */
786 +       printk("%s\n",__FUNCTION__);
787 +       MCF_PCIARB_PASR = arb_error;
788 +
789 +       if (arb_error & MCF_PCIARB_PASR_ITLMBK) {
790 +               DBG("PCI: coldfire master time-out\n");                         
791 +                               
792 +               /* Set infinite  number of retries */                   
793 +               MCF_PCIICR &= ~0xFF;                            
794 +       }
795 +               
796 +       if (arb_error & MCF_PCIARB_PASR_EXTMBK(0x1F)) {
797 +               arb_error >>= 17;
798 +               DBG("PCI: external master time-out (mask = 0x%X)\n", arb_error);
799 +               
800 +               /* raise arbitration priority level */          
801 +               MCF_PCIARB_PACR = MCF_PCIARB_PACR_EXTMPRI(arb_error);
802 +       }
803 +
804 +       return IRQ_HANDLED;
805 +}
806 +
807 +
808 +/*
809 + * void pci_eint_handler()
810 + *
811 + * Eport interrupt handler
812 + */
813 +irqreturn_t eint_handler(int irq, void *dev)
814 +{
815 +       /* Just acknowlege interrupt and exit */
816 +       MCF_EPFR = 0x1 << (irq - 64);
817 +       return IRQ_HANDLED;
818 +}
819 +
820 +
821 +/*
822 + * void __init coldfire_fixup(int pci_modify)
823 + *
824 + * Assign IRQ numbers as used by Linux to the interrupt pins
825 + * of the PCI cards.
826 + */
827 +static void __init coldfire_fixup(int pci_modify)
828 +{
829 +       struct pci_dev *dev;
830 +       unsigned char slot, pin;
831 +
832 +       DBG("%s\n",__FUNCTION__);
833 +#ifdef NL_ORIGINAL
834 +       pci_for_each_dev(dev) {
835 +#else
836 +       dev = NULL;
837 +       while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
838 +#endif
839 +               if (dev->class >> 16 != PCI_BASE_CLASS_BRIDGE) {
840 +                       slot = PCI_SLOT(dev->devfn);
841 +                       dev->irq = 64 + board_info[slot].irq;
842 +
843 +                       /* Check if device needs interrupt */
844 +#ifdef NL_ORIGINAL
845 +                       pcibios_read_config_byte(
846 +                                   dev->bus->number, dev->devfn,
847 +                                   PCI_INTERRUPT_PIN, &pin);
848 +
849 +                       if ( pin ) {
850 +                               pcibios_write_config_byte(
851 +                                       dev->bus->number, dev->devfn,
852 +                                       PCI_INTERRUPT_LINE, dev->irq);
853 +                       }
854 +#else
855 +                       pci_read_config_byte(dev,
856 +                                   PCI_INTERRUPT_PIN, &pin);
857 +
858 +                       if ( pin ) {
859 +                               pci_write_config_byte(dev,
860 +                                       PCI_INTERRUPT_LINE, dev->irq);
861 +                       }
862 +#endif
863 +               }
864 +       }
865 +}
866 +
867 +static void __init configure_device(struct pci_dev *dev)
868 +{
869 +       /* TODO: This should depend from disable_pci_burst setting */
870 +       DBG("%s\n",__FUNCTION__);
871 +#ifdef NL_ORIGINAL
872 +       pcibios_write_config_byte(bus, devfn, PCI_CACHE_LINE_SIZE, PCI_CACHE_LINE);
873 +#else
874 +       pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, PCI_CACHE_LINE);
875 +#endif
876 +}
877 +
878 +struct pci_bus_info *__init init_coldfire_pci(void)
879 +{
880 +       static struct pci_bus_info bus;
881 +       int i;
882 +       int pci_mem_va;
883 +       static char irq_name[N_IRQS][15];
884 +
885 +       /* Get controller revision */
886 +       revision = MCF_PCICCRIR;
887 +       printk("ColdFire PCI Host Bridge (Rev. %d) detected:"
888 +               "MEMBase %x,MEMLen %x,IOBase %x,IOLen %x\n",
889 +               revision, HOST_MEM_BASE, PCI_MEM_SIZE - 1, 0, PCI_IO_SIZE - 1);
890 +
891 +       /* Setup bus info structure. */
892 +       memset(&bus, 0, sizeof (struct pci_bus_info));
893 +
894 +       /* Request intiator memory resource */
895 +       bus.mem_space.start = PCI_MEM_BASE;//HOST_MEM_BASE;
896 +       bus.mem_space.end = bus.mem_space.start + PCI_MEM_SIZE - 1;
897 +       bus.mem_space.name = "PCI Bus #0";
898 +       if (request_resource(&iomem_resource, &bus.mem_space) != 0)
899 +       {
900 +               printk("Failed to request bridge iomem resource\n");
901 +               return NULL;
902 +       }
903 +
904 +       /* Request intiator memory resource */
905 +       bus.io_space.start = 0;
906 +       bus.io_space.end = bus.io_space.start + PCI_IO_SIZE - 1;
907 +       bus.io_space.name =  "PCI Bus #0";
908 +       if (request_resource(&ioport_resource, &bus.io_space) != 0)
909 +       {
910 +               printk("Failed to request bridge ioport resource\n");
911 +               return NULL;
912 +       }
913 +
914 +       /* Set up the arbiter */
915 +       MCF_PCIARB_PACR = 0 /*MCF_PCIARB_PACR_PKMD*/
916 +                       | MCF_PCIARB_PACR_INTMPRI 
917 +                       | MCF_PCIARB_PACR_INTMINTEN 
918 +                       | MCF_PCIARB_PACR_EXTMPRI(0x1F) 
919 +                       | MCF_PCIARB_PACR_EXTMINTEN(0x1F);
920 +
921 +       /* GNT and REQ */
922 +       MCF_PAR_PCIBG = 0x3FF;
923 +       MCF_PAR_PCIBR = 0x3FF;
924 +
925 +       /* Enable bus mastering, memory access and MWI */
926 +       MCF_PCISCR = MCF_PCISCR_B | MCF_PCISCR_M | MCF_PCISCR_MW;
927 +
928 +       /* Setup burst parameters */
929 +       MCF_PCICR1 = MCF_PCICR1_LATTIMER(32) |
930 +                    MCF_PCICR1_CACHELINESIZE(PCI_CACHE_LINE);
931 +
932 +       MCF_PCICR2 = 0;
933 +       /*MCF_PCICR2_MINGNT(PCI_MINGNT) |
934 +               MCF_PCICR2_MAXLAT(PCI_MAXLAT);
935 +       */
936 +       /* Turn on error signaling */
937 +       MCF_PCIICR = MCF_PCIICR_TAE | MCF_PCIICR_IAE | PCI_RETRIES;
938 +       MCF_PCIGSCR |= MCF_PCIGSCR_SEE;
939 +       /*
940 +        * Configure Initiator Windows
941 +        * Window 0: 128M PCI Memory @ HOST_MEM_BASE, 1:1 mapping
942 +        * Window 1: 64K  I/O Memory @ HOST_IO_BASE,  1:0 mapping
943 +        */
944 +       MCF_PCIIW0BTAR = WxBAR(HOST_MEM_BASE, PCI_MEM_BASE, PCI_MEM_SIZE);
945 +       MCF_PCIIW1BTAR = WxBAR(HOST_IO_BASE,  PCI_IO_BASE_ADDR,  PCI_IO_SIZE);
946 +
947 +       MCF_PCIIWCR = MCF_PCIIWCR_WINCTRL1_IO |
948 +                     MCF_PCIIWCR_WINCTRL0_MEMRDLINE;
949 +
950 +       /* Target PCI DMA Windows */
951 +       MCF_PCIBAR1   = PCI_DMA_BASE;
952 +       MCF_PCITBATR1 = HOST_DMA_BASE | MCF_PCITBATR1_EN;
953 +        MCF_PCIBAR0   = MCF_RAMBAR0;;
954 +        MCF_PCITBATR0 = MCF_RAMBAR0 | MCF_PCITBATR0_EN;
955 +        DBG("PCI TCR %x,MCF_PCIBAR1 %x,MCF_PCITBATR1 %x."
956 +               "MCF_PCIBAR0 %x,MCF_PCITBATR9 %x\n", MCF_PCITCR, MCF_PCIBAR1,
957 +               MCF_PCITBATR1, MCF_PCIBAR0, MCF_PCITBATR0);
958 +       /* Enable internal PCI controller interrupts */
959 +       MCF_ICR(ISC_PCI_XLB) = ILP_PCI_XLB;
960 +       /*request_irq(64+ISC_PCI_XLB, xlb_interrupt, 
961 +                       SA_INTERRUPT, "PCI XL Bus", (void*)-1);
962 +       enable_irq (64+ISC_PCI_XLB);
963 +       */
964 +        if(request_irq(64+ISC_PCI_XLB, xlb_interrupt, 
965 +                         IRQF_DISABLED, "PCI XL Bus", (void*)-1)){
966 +               printk("Cannot allocate ISC_PCI_XLB  IRQ\n");
967 +                return (struct pci_bus_info *)-EBUSY;
968 +       }
969 +
970 +       MCF_ICR(ISC_PCI_ARB) = ILP_PCI_ARB;
971 +       /*request_irq(64+ISC_PCI_ARB, arb_interrupt, 
972 +                       SA_INTERRUPT, "PCI Arbiter", (void*)-1);
973 +       enable_irq (64+ISC_PCI_ARB);
974 +       */
975 +        if(request_irq(64+ISC_PCI_ARB, arb_interrupt,
976 +                        IRQF_DISABLED, "PCI Arbiter", (void*)-1)){
977 +                printk("Cannot allocate ISC_PCI_ARB  IRQ\n");
978 +                return (struct pci_bus_info *)-EBUSY;
979 +        }
980 +
981 +       /* Set slots interrupt setting */
982 +       for (i = 0; i < N_IRQS; i++) 
983 +       {       
984 +               /* Set trailing edge for PCI interrupts */
985 +               MCF_EPPAR &= ~MCF_EPPAR_EPPA(irq_lines[i], 0x3);
986 +               if (irq_lines[i] == 5)
987 +                       MCF_EPPAR |= MCF_EPPAR_EPPA(irq_lines[i],  MCF_EPPAR_EPPAx_FALLING);
988 +               else
989 +                        MCF_EPPAR |= MCF_EPPAR_EPPA(irq_lines[i],  0/*MCF_EPPAR_EPPAx_FALLING*/);
990 +               /* Turn on irq line in eport */
991 +               MCF_EPIER |= MCF_EPIER_EPIE(irq_lines[i]);
992 +
993 +               /* Enable irq in gpio */
994 +               if (irq_lines[i] == 5)
995 +                   MCF_PAR_FECI2CIRQ |= 1;
996 +                   
997 +               if (irq_lines[i] == 6)
998 +                   MCF_PAR_FECI2CIRQ |= 2;   
999 +
1000 +               /* Register external interrupt handlers */
1001 +               sprintf(irq_name[i], "PCI IRQ%d", irq_lines[i]);
1002 +               /*request_irq(64 + irq_lines[i], eint_handler, 
1003 +                           SA_SHIRQ, irq_name[i], (void*)-1);
1004 +               enable_irq(64 + irq_lines[i]);*/
1005 +               if(request_irq(64 + irq_lines[i], eint_handler, 
1006 +                               IRQF_SHARED, irq_name[i], (void*)-1)){
1007 +                       printk("Cannot allocate irq_lines[%d] IRQ\n", irq_lines[i]);
1008 +                       return (struct pci_bus_info *)-EBUSY;
1009 +               }
1010 +       }
1011 +
1012 +       /* Clear PCI Reset and wait for devices to reset */
1013 +       MCF_PCIGSCR &= ~MCF_PCIGSCR_PR;
1014 +       schedule_timeout((5 * HZ) / 10);
1015 +       /* Remap initiator windows (should be 1:1 to the physical memory) */
1016 +       pci_mem_va = (int) ioremap_nocache(HOST_MEM_BASE, PCI_MEM_SIZE + PCI_IO_SIZE);
1017 +#if 1
1018 +       printk("%s: MEMBase_phy %x, Virt %x, len %x\n",__FUNCTION__,
1019 +               HOST_MEM_BASE,pci_mem_va,PCI_MEM_SIZE + PCI_IO_SIZE);
1020 +#endif
1021 +       BUG_ON(pci_mem_va != HOST_MEM_BASE);
1022 +
1023 +       /* Setup bios32 and pci bus driver callbacks */
1024 +       bus.m68k_pci_ops = &bus_ops;
1025 +       bus.fixup = coldfire_fixup;
1026 +       bus.conf_device = configure_device;
1027 +
1028 +       return &bus;
1029 +}
1030 +
1031 --- a/arch/m68k/kernel/Makefile
1032 +++ b/arch/m68k/kernel/Makefile
1033 @@ -12,6 +12,9 @@ ifndef CONFIG_COLDFIRE
1034    obj-$(CONFIG_PCI) += bios32.o
1035  else   # CONFIG_COLDFIRE
1036    extra-y := ../coldfire/head.o vmlinux.lds
1037 +ifdef CONFIG_M547X_8X
1038 +  obj-$(CONFIG_PCI) += bios32_mcf548x.o
1039 +endif
1040  endif
1041  endif
1042  
1043 --- /dev/null
1044 +++ b/arch/m68k/kernel/bios32_mcf548x.c
1045 @@ -0,0 +1,631 @@
1046 +/*
1047 + * bios32.c - PCI BIOS functions for m68k systems.
1048 + *
1049 + * Written by Wout Klaren.
1050 + *
1051 + * Based on the DEC Alpha bios32.c by Dave Rusling and David Mosberger.
1052 + */
1053 +#include <linux/init.h>
1054 +#include <linux/kernel.h>
1055 +
1056 +#if 0
1057 +# define DBG_DEVS(args)                printk args
1058 +#else
1059 +# define DBG_DEVS(args)
1060 +#endif
1061 +
1062 +#ifdef CONFIG_PCI
1063 +
1064 +/*
1065 + * PCI support for Linux/m68k. Currently only the Hades is supported.
1066 + *
1067 + * The support for PCI bridges in the DEC Alpha version has
1068 + * been removed in this version.
1069 + */
1070 +
1071 +#include <linux/pci.h>
1072 +#include <linux/slab.h>
1073 +#include <linux/mm.h>
1074 +
1075 +#include <asm/io.h>
1076 +#include <asm/pci.h>
1077 +#include <asm/uaccess.h>
1078 +
1079 +#define KB             1024
1080 +#define MB             (1024*KB)
1081 +#define GB             (1024*MB)
1082 +
1083 +#define MAJOR_REV      0
1084 +#define MINOR_REV      5
1085 +
1086 +/*
1087 + * Align VAL to ALIGN, which must be a power of two.
1088 + */
1089 +
1090 +#define MAX(val1, val2)                (((val1) > (val2)) ? val1 : val2)
1091 +
1092 +/*
1093 + * Offsets relative to the I/O and memory base addresses from where resources
1094 + * are allocated.
1095 + */
1096 +
1097 +#ifdef CONFIG_COLDFIRE
1098 +#define IO_ALLOC_OFFSET                0x00000100
1099 +#define MEM_ALLOC_OFFSET       0x00000000
1100 +#else /* CONFIG_COLDFIRE */
1101 +#define IO_ALLOC_OFFSET                0x00004000
1102 +#define MEM_ALLOC_OFFSET       0x04000000
1103 +#endif /* CONFIG_COLDFIRE */
1104 +
1105 +/*
1106 + * Declarations of hardware specific initialisation functions.
1107 + */
1108 +
1109 +extern struct pci_bus_info *init_hades_pci(void);
1110 +
1111 +/*
1112 + * Bus info structure of the PCI bus. A pointer to this structure is
1113 + * put in the sysdata member of the pci_bus structure.
1114 + */
1115 +
1116 +static struct pci_bus_info *bus_info;
1117 +
1118 +static int pci_modify = 1;             /* If set, layout the PCI bus ourself. */
1119 +static int skip_vga;                   /* If set do not modify base addresses
1120 +                                          of vga cards.*/
1121 +static int disable_pci_burst;          /* If set do not allow PCI bursts. */
1122 +
1123 +static unsigned int io_base;
1124 +static unsigned int mem_base;
1125 +
1126 +/*
1127 + * static void disable_dev(struct pci_dev *dev)
1128 + *
1129 + * Disable PCI device DEV so that it does not respond to I/O or memory
1130 + * accesses.
1131 + *
1132 + * Parameters:
1133 + *
1134 + * dev - device to disable.
1135 + */
1136 +
1137 +static void __init disable_dev(struct pci_dev *dev)
1138 +{
1139 +       unsigned short cmd;
1140 +
1141 +       if (((dev->class >> 8 == PCI_CLASS_NOT_DEFINED_VGA) ||
1142 +            (dev->class >> 8 == PCI_CLASS_DISPLAY_VGA) ||
1143 +            (dev->class >> 8 == PCI_CLASS_DISPLAY_XGA)) && skip_vga)
1144 +               return;
1145 +
1146 +       pci_read_config_word(dev, PCI_COMMAND, &cmd);
1147 +
1148 +       cmd &= (~PCI_COMMAND_IO & ~PCI_COMMAND_MEMORY & ~PCI_COMMAND_MASTER);
1149 +       pci_write_config_word(dev, PCI_COMMAND, cmd);
1150 +}
1151 +
1152 +/* Stolen from pcibios_enable_resources/i386 */
1153 +int pcibios_enable_device(struct pci_dev *dev, int mask)
1154 +{
1155 +       u16 cmd, old_cmd;
1156 +       int idx;
1157 +       struct resource *r;
1158 +
1159 +       pci_read_config_word(dev, PCI_COMMAND, &cmd);
1160 +       old_cmd = cmd;
1161 +       for(idx=0; idx<6; idx++) {
1162 +               /* Only set up the requested stuff */
1163 +               if (!(mask & (1<<idx)))
1164 +                       continue;
1165 +
1166 +               r = &dev->resource[idx];
1167 +               if (!r->start && r->end) {
1168 +                       printk("PCI: Device %s not available because"
1169 +                               " of resource collisions\n", dev->dev.bus_id);
1170 +                       return -EINVAL;
1171 +               }
1172 +               if (r->flags & IORESOURCE_IO)
1173 +                       cmd |= PCI_COMMAND_IO;
1174 +               if (r->flags & IORESOURCE_MEM)
1175 +                       cmd |= PCI_COMMAND_MEMORY;
1176 +       }
1177 +       if (dev->resource[PCI_ROM_RESOURCE].start)
1178 +               cmd |= PCI_COMMAND_MEMORY;
1179 +       if (cmd != old_cmd) {
1180 +               printk("PCI: Enabling device %s (%04x -> %04x)\n", dev->dev.bus_id, old_cmd, cmd);
1181 +               pci_write_config_word(dev, PCI_COMMAND, cmd);
1182 +       }
1183 +       return 0;
1184 +}
1185 +
1186 +/*
1187 + * static void layout_dev(struct pci_dev *dev)
1188 + *
1189 + * Layout memory and I/O for a device.
1190 + *
1191 + * Parameters:
1192 + *
1193 + * device      - device to layout memory and I/O for.
1194 + */
1195 +
1196 +static void __init layout_dev(struct pci_dev *dev)
1197 +{
1198 +       unsigned short cmd;
1199 +       unsigned int base, mask, size, reg;
1200 +       unsigned int alignto;
1201 +       int i;
1202 +
1203 +       /*
1204 +        * Skip video cards if requested.
1205 +        */
1206 +       if (((dev->class >> 8 == PCI_CLASS_NOT_DEFINED_VGA) ||
1207 +            (dev->class >> 8 == PCI_CLASS_DISPLAY_VGA) ||
1208 +            (dev->class >> 8 == PCI_CLASS_DISPLAY_XGA)) && skip_vga){
1209 +               printk("%s: VGA\n",__FUNCTION__);
1210 +               return;
1211 +       }
1212 +       pci_read_config_word(dev, PCI_COMMAND, &cmd);
1213 +
1214 +       for (reg = PCI_BASE_ADDRESS_0, i = 0; reg <= PCI_BASE_ADDRESS_5; reg += 4, i++)
1215 +       {
1216 +               /*
1217 +                * Figure out how much space and of what type this
1218 +                * device wants.
1219 +                */
1220 +
1221 +               pci_write_config_dword(dev, reg, 0xffffffff);
1222 +               pci_read_config_dword(dev, reg, &base);
1223 +               if (!base)
1224 +               {
1225 +                       /* this base-address register is unused */
1226 +                       dev->resource[i].start = 0;
1227 +                       dev->resource[i].end = 0;
1228 +                       dev->resource[i].flags = 0;
1229 +                       continue;
1230 +               }
1231 +
1232 +               /*
1233 +                * We've read the base address register back after
1234 +                * writing all ones and so now we must decode it.
1235 +                */
1236 +       
1237 +               if (base & PCI_BASE_ADDRESS_SPACE_IO)
1238 +               {
1239 +                       /*
1240 +                        * I/O space base address register.
1241 +                        */
1242 +
1243 +                       cmd |= PCI_COMMAND_IO;
1244 +
1245 +                       base &= PCI_BASE_ADDRESS_IO_MASK;
1246 +                       mask = (~base << 1) | 0x1;
1247 +                       size = (mask & base) & 0xffffffff;
1248 +
1249 +                       /*
1250 +                        * Align to multiple of size of minimum base.
1251 +                        */
1252 +
1253 +#ifdef CONFIG_COLDFIRE
1254 +                       alignto = MAX(PAGE_SIZE, size) ;
1255 +#else /* CONFIG_COLDFIRE */
1256 +                       alignto = MAX(0x040, size) ;
1257 +#endif /* CONFIG_COLDFIRE */
1258 +                       base = ALIGN(io_base, alignto);
1259 +                       io_base = base + size;
1260 +                       pci_write_config_dword(dev, reg, base | PCI_BASE_ADDRESS_SPACE_IO);
1261 +
1262 +                       dev->resource[i].start = base;
1263 +                       dev->resource[i].end = dev->resource[i].start + size - 1;
1264 +                       dev->resource[i].flags = IORESOURCE_IO | PCI_BASE_ADDRESS_SPACE_IO;
1265 +
1266 +                       DBG_DEVS(("layout_dev: IO address: %x\n", base));
1267 +               }
1268 +               else
1269 +               {
1270 +                       unsigned int type;
1271 +
1272 +                       /*
1273 +                        * Memory space base address register.
1274 +                        */
1275 +
1276 +                       cmd |= PCI_COMMAND_MEMORY;
1277 +                       type = base & PCI_BASE_ADDRESS_MEM_TYPE_MASK;
1278 +                       base &= PCI_BASE_ADDRESS_MEM_MASK;
1279 +                       mask = (~base << 1) | 0x1;
1280 +                       size = (mask & base) & 0xffffffff;
1281 +                       switch (type)
1282 +                       {
1283 +                       case PCI_BASE_ADDRESS_MEM_TYPE_32:
1284 +                       case PCI_BASE_ADDRESS_MEM_TYPE_64:
1285 +                               break;
1286 +
1287 +                       case PCI_BASE_ADDRESS_MEM_TYPE_1M:
1288 +                               printk("bios32 WARNING: slot %d, function %d "
1289 +                                      "requests memory below 1MB---don't "
1290 +                                      "know how to do that.\n",
1291 +                                      PCI_SLOT(dev->devfn),
1292 +                                      PCI_FUNC(dev->devfn));
1293 +                               continue;
1294 +                       }
1295 +                       DBG_DEVS(("%s MEM: base %x,type %x,mask %x,size %x\n",
1296 +                               __FUNCTION__, base, type, mask, size));
1297 +                       /*
1298 +                        * Align to multiple of size of minimum base.
1299 +                        */
1300 +
1301 +                       alignto = max_t(unsigned int, 0x1000, size);
1302 +                       base = ALIGN(mem_base, alignto);
1303 +                       mem_base = base + size;
1304 +                       pci_write_config_dword(dev, reg, base);
1305 +
1306 +                       dev->resource[i].start = base;
1307 +                       dev->resource[i].end = dev->resource[i].start + size - 1;
1308 +                       dev->resource[i].flags = IORESOURCE_MEM;
1309 +                       DBG_DEVS(("%s MEM :base %x,size %x\n",
1310 +                               __FUNCTION__, base, size));
1311 +                       if (type == PCI_BASE_ADDRESS_MEM_TYPE_64)
1312 +                       {
1313 +                               /*
1314 +                                * 64-bit address, set the highest 32 bits
1315 +                                * to zero.
1316 +                                */
1317 +
1318 +                               reg += 4;
1319 +                               pci_write_config_dword(dev, reg, 0);
1320 +
1321 +                               i++;
1322 +                               dev->resource[i].start = 0;
1323 +                               dev->resource[i].end = 0;
1324 +                               dev->resource[i].flags = 0;
1325 +                               printk("%s:type == 64\n",__FUNCTION__);
1326 +                       }
1327 +               }
1328 +       }
1329 +
1330 +       /*
1331 +        * Enable device:
1332 +        */
1333 +
1334 +       if (dev->class >> 8 == PCI_CLASS_NOT_DEFINED ||
1335 +           dev->class >> 8 == PCI_CLASS_NOT_DEFINED_VGA ||
1336 +           dev->class >> 8 == PCI_CLASS_DISPLAY_VGA ||
1337 +           dev->class >> 8 == PCI_CLASS_DISPLAY_XGA)
1338 +       {
1339 +               /*
1340 +                * All of these (may) have I/O scattered all around
1341 +                * and may not use i/o-base address registers at all.
1342 +                * So we just have to always enable I/O to these
1343 +                * devices.
1344 +                */
1345 +               cmd |= PCI_COMMAND_IO;
1346 +       }
1347 +
1348 +       pci_write_config_word(dev, PCI_COMMAND, cmd | PCI_COMMAND_MASTER);
1349 +
1350 +       pci_write_config_byte(dev, PCI_LATENCY_TIMER, (disable_pci_burst) ? 0 : 32);
1351 +
1352 +       if (bus_info != NULL)
1353 +               bus_info->conf_device(dev);     /* Machine dependent configuration. */
1354 +
1355 +       printk(KERN_INFO "layout_dev: bus %d  slot 0x%x  VID 0x%x  DID 0x%x  class 0x%x\n",
1356 +               dev->bus->number, PCI_SLOT(dev->devfn),
1357 +               dev->vendor, dev->device, dev->class);
1358 +}
1359 +
1360 +/*
1361 + * static void layout_bus(struct pci_bus *bus)
1362 + *
1363 + * Layout memory and I/O for all devices on the given bus.
1364 + *
1365 + * Parameters:
1366 + *
1367 + * bus - bus.
1368 + */
1369 +
1370 +static void __init layout_bus(struct pci_bus *bus)
1371 +{
1372 +       unsigned int bio, bmem;
1373 +       struct pci_dev *dev;
1374 +
1375 +       DBG_DEVS(("layout_bus: starting bus %d\n", bus->number));
1376 +
1377 +       if (list_empty(&bus->devices) && list_empty(&bus->children))
1378 +               return;
1379 +
1380 +       /*
1381 +        * Align the current bases on appropriate boundaries (4K for
1382 +        * IO and 1MB for memory).
1383 +        */
1384 +
1385 +       bio = io_base = ALIGN(io_base, 4*KB);
1386 +       bmem = mem_base = ALIGN(mem_base, 1*MB);
1387 +
1388 +       /*
1389 +        * PCI devices might have been setup by a PCI BIOS emulation
1390 +        * running under TOS. In these cases there is a
1391 +        * window during which two devices may have an overlapping
1392 +        * address range. To avoid this causing trouble, we first
1393 +        * turn off the I/O and memory address decoders for all PCI
1394 +        * devices.  They'll be re-enabled only once all address
1395 +        * decoders are programmed consistently.
1396 +        */
1397 +
1398 +       DBG_DEVS(("layout_bus: disable_dev for bus %d\n", bus->number));
1399 +
1400 +#ifdef NL_ORIGINAL
1401 +       for (dev = bus->devices; dev; dev = dev->sibling)
1402 +#else
1403 +       dev = NULL;
1404 +       while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL)
1405 +#endif
1406 +       {
1407 +               if ((dev->class >> 16 != PCI_BASE_CLASS_BRIDGE) ||
1408 +                   (dev->class >> 8 == PCI_CLASS_BRIDGE_PCMCIA))
1409 +                       disable_dev(dev);
1410 +       }
1411 +
1412 +       /*
1413 +        * Allocate space to each device:
1414 +        */
1415 +
1416 +       DBG_DEVS(("layout_bus: starting bus %d devices\n", bus->number));
1417 +
1418 +#ifdef NL_ORIGINAL
1419 +       for (dev = bus->devices; dev; dev = dev->sibling)
1420 +#else
1421 +       dev = NULL;
1422 +       while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL)
1423 +#endif
1424 +       {
1425 +               if ((dev->class >> 16 != PCI_BASE_CLASS_BRIDGE) ||
1426 +                   (dev->class >> 8 == PCI_CLASS_BRIDGE_PCMCIA))
1427 +                       layout_dev(dev);
1428 +       }
1429 +
1430 +       DBG_DEVS(("layout_bus: bus %d finished\n", bus->number));
1431 +}
1432 +
1433 +/*
1434 + * static void pcibios_fixup(void)
1435 + *
1436 + * Layout memory and I/O of all devices on the PCI bus if 'pci_modify' is
1437 + * true. This might be necessary because not every m68k machine with a PCI
1438 + * bus has a PCI BIOS. This function should be called right after
1439 + * pci_scan_bus() in pcibios_init().
1440 + */
1441 +
1442 +static void __init pcibios_fixup(void)
1443 +{
1444 +       DBG_DEVS(("%s\n", __FUNCTION__));
1445 +       if (pci_modify)
1446 +       {
1447 +               /*
1448 +                * Set base addresses for allocation of I/O and memory space.
1449 +                */
1450 +
1451 +               io_base = bus_info->io_space.start + IO_ALLOC_OFFSET;
1452 +               mem_base = bus_info->mem_space.start + MEM_ALLOC_OFFSET;
1453 +
1454 +               /*
1455 +                * Scan the tree, allocating PCI memory and I/O space.
1456 +                */
1457 +
1458 +#ifdef NL_ORIGINAL
1459 +               layout_bus(pci_bus_b(pci_root.next));
1460 +#else
1461 +               layout_bus(pci_bus_b(pci_root_buses.next));
1462 +#endif
1463 +       }
1464 +
1465 +       /*
1466 +        * Fix interrupt assignments, etc.
1467 +        */
1468 +
1469 +       bus_info->fixup(pci_modify);
1470 +}
1471 +
1472 +/*
1473 + * static void pcibios_claim_resources(struct pci_bus *bus)
1474 + *
1475 + * Claim all resources that are assigned to devices on the given bus.
1476 + *
1477 + * Parameters:
1478 + *
1479 + * bus - bus.
1480 + */
1481 +
1482 +static void __init pcibios_claim_resources(struct pci_bus *bus)
1483 +{
1484 +       struct pci_dev *dev;
1485 +       int i;
1486 +       DBG_DEVS(("%s\n", __FUNCTION__));
1487 +#ifdef NL_ORIGINAL
1488 +       while (bus)
1489 +#else
1490 +       while ((bus = pci_find_next_bus(bus)) != NULL)
1491 +#endif
1492 +       {
1493 +
1494 +#ifdef NL_ORIGINAL
1495 +               for (dev = bus->devices; (dev != NULL); dev = dev->sibling)
1496 +#else
1497 +               dev = NULL;
1498 +               while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL)
1499 +#endif
1500 +               {
1501 +                       for (i = 0; i < PCI_NUM_RESOURCES; i++)
1502 +                       {
1503 +                               struct resource *r = &dev->resource[i];
1504 +                               struct resource *pr;
1505 +                               struct pci_bus_info *bus_info = 
1506 +                                       (struct pci_bus_info *) dev->sysdata;
1507 +
1508 +                               if ((r->start == 0) || (r->parent != NULL))
1509 +                                       continue;
1510 +
1511 +#ifdef CONFIG_COLDFIRE
1512 +                               if (dev->class >> 16 == PCI_BASE_CLASS_BRIDGE)
1513 +                                       continue;
1514 +#endif /* CONFIG_COLDFIRE */
1515 +#if 1
1516 +                               if (r->flags & IORESOURCE_IO)
1517 +                                       pr = &bus_info->io_space;
1518 +                               else
1519 +                                       pr = &bus_info->mem_space;
1520 +#else
1521 +                               if (r->flags & IORESOURCE_IO)
1522 +                                       pr = &ioport_resource;
1523 +                               else
1524 +                                       pr = &iomem_resource;
1525 +#endif
1526 +                               if (request_resource(pr, r) < 0)
1527 +                               {
1528 +#ifdef NL_ORIGINAL
1529 +                                       DBG_DEVS(("PCI: Address space collision on "
1530 +                                               "region %d of device %s\n", i, dev->name));
1531 +#else
1532 +                                       printk("PCI: Address space collision on region %d of device %s\n", i, dev->dev.bus_id);
1533 +#endif
1534 +                               }
1535 +                       }
1536 +               }
1537 +
1538 +#ifdef NL_ORIGINAL
1539 +               if (bus->children)
1540 +                       pcibios_claim_resources(bus->children);
1541 +#else
1542 +               if (!list_empty(&bus->children))
1543 +                       pcibios_claim_resources(pci_bus_b(bus->children.next));
1544 +#endif
1545 +
1546 +#ifdef NL_ORIGINAL
1547 +               bus = bus->next;
1548 +#endif
1549 +       }
1550 +}
1551 +
1552 +/*
1553 + * int pcibios_assign_resource(struct pci_dev *dev, int i)
1554 + *
1555 + * Assign a new address to a PCI resource.
1556 + *
1557 + * Parameters:
1558 + *
1559 + * dev - device.
1560 + * i   - resource.
1561 + *
1562 + * Result: 0 if successful.
1563 + */
1564 +
1565 +int __init pcibios_assign_resource(struct pci_dev *dev, int i)
1566 +{
1567 +       struct resource *r = &dev->resource[i];
1568 +       struct resource *pr = pci_find_parent_resource(dev, r);
1569 +       unsigned long size = r->end + 1;
1570 +       DBG_DEVS(("%s:IO_ALLOC_OFFSET %x\n", __FUNCTION__, IO_ALLOC_OFFSET));
1571 +       if (!pr)
1572 +               return -EINVAL;
1573 +
1574 +       if (r->flags & IORESOURCE_IO)
1575 +       {
1576 +               DBG_DEVS(("%s:IORESOURCE_IO:start %x, size %lx\n",
1577 +                       __FUNCTION__, bus_info->io_space.start, size));
1578 +               if (size > 0x100)
1579 +                       return -EFBIG;
1580 +
1581 +#ifdef NL_ORIGINAL
1582 +               if (allocate_resource(pr, r, size, bus_info->io_space.start +
1583 +                                     IO_ALLOC_OFFSET,  bus_info->io_space.end, 1024))
1584 +#else
1585 +               if (allocate_resource(pr, r, size, bus_info->io_space.start +
1586 +                                  IO_ALLOC_OFFSET,  bus_info->io_space.end, 1024, NULL, NULL))
1587 +#endif
1588 +                       return -EBUSY;
1589 +       }
1590 +       else
1591 +       {
1592 +               DBG_DEVS(("%s:IORESOURCE_MEM:start %x, size %lx\n",
1593 +                               __FUNCTION__, bus_info->mem_space.start, size));
1594 +#ifdef NL_ORIGINAL
1595 +               if (allocate_resource(pr, r, size, bus_info->mem_space.start +
1596 +                                     MEM_ALLOC_OFFSET, bus_info->mem_space.end, size))
1597 +#else
1598 +               if (allocate_resource(pr, r, size, bus_info->io_space.start +
1599 +                                  IO_ALLOC_OFFSET,  bus_info->io_space.end, 1024, NULL, NULL))
1600 +#endif
1601 +                       return -EBUSY;
1602 +       }
1603 +
1604 +       if (i < 6)
1605 +               pci_write_config_dword(dev, PCI_BASE_ADDRESS_0 + 4 * i, r->start);
1606 +
1607 +       return 0;
1608 +}
1609 +
1610 +void pcibios_fixup_bus(struct pci_bus *bus)
1611 +{
1612 +       struct pci_dev *dev;
1613 +       void *sysdata;
1614 +
1615 +       sysdata = (bus->parent) ? bus->parent->sysdata : bus->sysdata;
1616 +
1617 +#ifdef NL_ORIGINAL
1618 +       for (dev = bus->devices; (dev != NULL); dev = dev->sibling)
1619 +#else
1620 +       dev = NULL;
1621 +       while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL)
1622 +#endif
1623 +               dev->sysdata = sysdata;
1624 +}
1625 +
1626 +int __init pcibios_init(void)
1627 +{
1628 +       printk("Linux/m68k PCI BIOS32 revision %x.%02x\n", MAJOR_REV, MINOR_REV);
1629 +
1630 +       bus_info = NULL;
1631 +#ifdef CONFIG_COLDFIRE
1632 +       bus_info = init_coldfire_pci();
1633 +#endif /* CONFIG_COLDFIRE */
1634 +#ifdef CONFIG_HADES
1635 +       if (MACH_IS_HADES)
1636 +               bus_info = init_hades_pci();
1637 +#endif
1638 +       if (bus_info != NULL)
1639 +       {
1640 +               printk("PCI: Probing PCI hardware\n");
1641 +               pci_scan_bus(0, bus_info->m68k_pci_ops, bus_info);
1642 +               pcibios_fixup();
1643 +#ifdef NL_ORIGINAL
1644 +               pcibios_claim_resources(pci_root);
1645 +#else
1646 +               pcibios_claim_resources(pci_bus_b(pci_root_buses.next));
1647 +#endif
1648 +       }
1649 +       else
1650 +               printk("PCI: No PCI bus detected\n");
1651 +       return 0;
1652 +}
1653 +
1654 +subsys_initcall(pcibios_init);
1655 +
1656 +char * pcibios_setup(char *str)
1657 +{
1658 +       if (!strcmp(str, "nomodify"))
1659 +       {
1660 +               pci_modify = 0;
1661 +               return NULL;
1662 +       }
1663 +       else if (!strcmp(str, "skipvga"))
1664 +       {
1665 +               skip_vga = 1;
1666 +               return NULL;
1667 +       }
1668 +       else if (!strcmp(str, "noburst"))
1669 +       {
1670 +               disable_pci_burst = 1;
1671 +               return NULL;
1672 +       }
1673 +
1674 +       return str;
1675 +}
1676 +#endif /* CONFIG_PCI */
1677 --- a/arch/m68k/kernel/dma.c
1678 +++ b/arch/m68k/kernel/dma.c
1679 @@ -11,13 +11,24 @@
1680  #include <linux/kernel.h>
1681  #include <linux/scatterlist.h>
1682  #include <linux/vmalloc.h>
1683 -
1684 +#include <linux/pci.h>
1685  #include <asm/pgalloc.h>
1686  
1687  void *dma_alloc_coherent(struct device *dev, size_t size,
1688                          dma_addr_t *handle, gfp_t flag)
1689  {
1690 -#ifndef CONFIG_M5445X
1691 +#if    defined(CONFIG_M547X_8X) | defined(CONFIG_M54455)
1692 +        /*
1693 +       * On the M5445x platform the memory allocated with GFP_DMA
1694 +       * is guaranteed to be DMA'able.
1695 +       */
1696 +        void *addr;
1697 +
1698 +        size = PAGE_ALIGN(size);
1699 +        addr = kmalloc(size, GFP_DMA);
1700 +        *handle = virt_to_phys(addr);
1701 +        return addr;
1702 +#else
1703         struct page *page, **map;
1704         pgprot_t pgprot;
1705         void *addr;
1706 @@ -56,17 +67,6 @@ void *dma_alloc_coherent(struct device *
1707         kfree(map);
1708  
1709         return addr;
1710 -#else
1711 -       /*
1712 -        * On the M5445x platform the memory allocated with GFP_DMA
1713 -        * is guaranteed to be DMA'able.
1714 -        */
1715 -       void *addr;
1716 -
1717 -       size = PAGE_ALIGN(size);
1718 -       addr = kmalloc(size, GFP_DMA);
1719 -       *handle = virt_to_phys(addr);
1720 -       return addr;
1721  #endif
1722  }
1723  EXPORT_SYMBOL(dma_alloc_coherent);
1724 @@ -75,10 +75,10 @@ void dma_free_coherent(struct device *de
1725                        void *addr, dma_addr_t handle)
1726  {
1727         pr_debug("dma_free_coherent: %p, %x\n", addr, handle);
1728 -#ifndef CONFIG_M5445X
1729 -       vfree(addr);
1730 -#else
1731 +#if    defined(CONFIG_M547X_8X) | defined(CONFIG_M54455)
1732         kfree(addr);
1733 +#else
1734 +       vfree(addr);
1735  #endif
1736  }
1737  EXPORT_SYMBOL(dma_free_coherent);
1738 --- a/arch/m68k/mm/kmap.c
1739 +++ b/arch/m68k/mm/kmap.c
1740 @@ -153,6 +153,10 @@ void __iomem *__ioremap(unsigned long ph
1741                  */
1742                 return (void __iomem *)physaddr;
1743         }
1744 +        if ((physaddr >= 0xd0000000) && (physaddr + size < 0xd800ffff)) {
1745 +                printk("ioremap:PCI 0x%lx,0x%lx(%d) - PCI area hit\n", physaddr, size, cacheflag);
1746 +                return (void *)physaddr;
1747 +        }
1748  #endif
1749  
1750  #ifdef DEBUG
1751 @@ -284,7 +288,12 @@ void __iounmap(void *addr, unsigned long
1752         pgd_t *pgd_dir;
1753         pmd_t *pmd_dir;
1754         pte_t *pte_dir;
1755 -
1756 +#ifdef CONFIG_M547X_8X
1757 +        if ((addr >= (void*)0xd0000000) && (addr + size < (void*)0xd800ffff)) {
1758 +                printk("%s: PCI address\n",__FUNCTION__);
1759 +                return;
1760 +        }
1761 +#endif
1762         while ((long)size > 0) {
1763                 pgd_dir = pgd_offset_k(virtaddr);
1764                 if (pgd_bad(*pgd_dir)) {
1765 --- a/drivers/pci/access.c
1766 +++ b/drivers/pci/access.c
1767 @@ -23,6 +23,7 @@ static DEFINE_SPINLOCK(pci_lock);
1768  #define PCI_word_BAD (pos & 1)
1769  #define PCI_dword_BAD (pos & 3)
1770  
1771 +#ifdef NL_ORIGINAL
1772  #define PCI_OP_READ(size,type,len) \
1773  int pci_bus_read_config_##size \
1774         (struct pci_bus *bus, unsigned int devfn, int pos, type *value) \
1775 @@ -37,7 +38,20 @@ int pci_bus_read_config_##size \
1776         spin_unlock_irqrestore(&pci_lock, flags);                       \
1777         return res;                                                     \
1778  }
1779 -
1780 +#else /* NL_ORIGINAL */
1781 +#define PCI_OP_READ(size,type,len) \
1782 +int pci_bus_read_config_##size \
1783 +        (struct pci_bus *bus, unsigned int devfn, int pos, type *value) \
1784 +{                                                                       \
1785 +        int res;                                                        \
1786 +        unsigned long flags;                                            \
1787 +        if (PCI_##size##_BAD) return PCIBIOS_BAD_REGISTER_NUMBER;       \
1788 +        spin_lock_irqsave(&pci_lock, flags);                            \
1789 +        res = bus->ops->read(bus, devfn, pos, len, (u32 *)value);       \
1790 +        spin_unlock_irqrestore(&pci_lock, flags);                       \
1791 +        return res;                                                     \
1792 +}
1793 +#endif /* NL_ORIGINAL */
1794  #define PCI_OP_WRITE(size,type,len) \
1795  int pci_bus_write_config_##size \
1796         (struct pci_bus *bus, unsigned int devfn, int pos, type value)  \
1797 --- a/drivers/usb/host/Makefile
1798 +++ b/drivers/usb/host/Makefile
1799 @@ -6,7 +6,7 @@ ifeq ($(CONFIG_USB_DEBUG),y)
1800         EXTRA_CFLAGS            += -DDEBUG
1801  endif
1802  
1803 -obj-$(CONFIG_PCI)              += pci-quirks.o
1804 +#obj-$(CONFIG_PCI)             += pci-quirks.o
1805  
1806  obj-$(CONFIG_USB_EHCI_HCD)     += ehci-hcd.o
1807  obj-$(CONFIG_USB_ISP116X_HCD)  += isp116x-hcd.o
1808 --- /dev/null
1809 +++ b/include/asm-m68k/5445x_pci.h
1810 @@ -0,0 +1,94 @@
1811 +/*
1812 + * asm-m68k/pci.h - m68k specific PCI declarations.
1813 + *
1814 + * Coldfire Implementation Copyright (c) 2007 Freescale Semiconductor, Inc.
1815 + *     Kurt Mahan <kmahan@freescale.com>
1816 + */
1817 +#ifndef _ASM_M68K_5445X_PCI_H
1818 +#define _ASM_M68K_5445x_PCI_H
1819 +
1820 +#ifndef CONFIG_PCI
1821 +/*
1822 + * The PCI address space does equal the physical memory
1823 + * address space.  The networking and block device layers use
1824 + * this boolean for bounce buffer decisions.
1825 + */
1826 +#define PCI_DMA_BUS_IS_PHYS            (1)
1827 +#else
1828 +#include <asm-generic/pci-dma-compat.h>
1829 +
1830 +/*
1831 + * The PCI address space does equal the physical memory
1832 + * address space.  The networking and block device layers use
1833 + * this boolean for bounce buffer decisions.
1834 + */
1835 +#define PCI_DMA_BUS_IS_PHYS            (1)
1836 +
1837 +#define PCIBIOS_MIN_IO                 0x00004000
1838 +#define PCIBIOS_MIN_MEM                        0x02000000
1839 +
1840 +#define pcibios_assign_all_busses()    0
1841 +#define pcibios_scan_all_fns(a, b)     0
1842 +
1843 +static inline void
1844 +pcibios_set_master(struct pci_dev *dev)
1845 +{
1846 +       /* no special bus mastering setup handling */
1847 +}
1848 +
1849 +static inline void
1850 +pcibios_penalize_isa_irq(int irq, int active)
1851 +{
1852 +       /* no dynamic PCI IRQ allocation */
1853 +}
1854 +
1855 +#if 0
1856 +static inline void
1857 +pcibios_add_platform_entries(struct pci_dev *dev)
1858 +{
1859 +       /* no special handling */
1860 +}
1861 +#endif
1862 +
1863 +static inline void
1864 +pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
1865 +                        struct resource *res)
1866 +{
1867 +#ifdef CONFIG_M54455
1868 +       if ((res->start == 0xa0000000) || (res->start == 0xa8000000)) {
1869 +               /* HACK!  FIX! kludge to fix bridge mapping */
1870 +               region->start = res->start & 0x0fffffff;
1871 +               region->end = res->end & 0x0fffffff;
1872 +       } else {
1873 +               region->start = res->start;
1874 +               region->end = res->end;
1875 +       }
1876 +#else
1877 +       region->start = res->start;
1878 +       region->end = res->end;
1879 +#endif
1880 +}
1881 +
1882 +static inline void
1883 +pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
1884 +                       struct pci_bus_region *region)
1885 +{
1886 +       res->start = region->start;
1887 +       res->end = region->end;
1888 +}
1889 +
1890 +static inline struct resource *
1891 +pcibios_select_root(struct pci_dev *pdev, struct resource *res)
1892 +{
1893 +       struct resource *root = NULL;
1894 +
1895 +       if (res->flags & IORESOURCE_IO)
1896 +               root = &ioport_resource;
1897 +       if (res->flags & IORESOURCE_MEM)
1898 +               root = &iomem_resource;
1899 +
1900 +       return root;
1901 +}
1902 +
1903 +#endif /* CONFIG_PCI */
1904 +#endif /* _ASM_M68K_5445X_PCI_H */
1905 --- /dev/null
1906 +++ b/include/asm-m68k/548x_pci.h
1907 @@ -0,0 +1,99 @@
1908 +#ifndef _ASM_M68K_548X_PCI_H
1909 +#define _ASM_M68K_548X_PCI_H
1910 +
1911 +/*
1912 + * asm-m68k/pci_m68k.h - m68k specific PCI declarations.
1913 + *
1914 + * Written by Wout Klaren.
1915 + */
1916 +#include <linux/mm.h>
1917 +#include <asm/scatterlist.h>
1918 +
1919 +#include <asm-generic/pci.h>
1920 +
1921 +struct pci_ops;
1922 +
1923 +/*
1924 + * Structure with hardware dependent information and functions of the
1925 + * PCI bus.
1926 + */
1927 +
1928 +struct pci_bus_info
1929 +{
1930 +       /*
1931 +        * Resources of the PCI bus.
1932 +        */
1933 +
1934 +       struct resource mem_space;
1935 +       struct resource io_space;
1936 +
1937 +       /*
1938 +        * System dependent functions.
1939 +        */
1940 +
1941 +       struct pci_ops *m68k_pci_ops;
1942 +
1943 +       void (*fixup)(int pci_modify);
1944 +       void (*conf_device)(struct pci_dev *dev);
1945 +};
1946 +
1947 +#define pcibios_assign_all_busses()    0
1948 +#define pcibios_scan_all_fns(a, b)     0
1949 +
1950 +static inline void pcibios_set_master(struct pci_dev *dev)
1951 +{
1952 +       /* No special bus mastering setup handling */
1953 +}
1954 +
1955 +static inline void pcibios_penalize_isa_irq(int irq)
1956 +{
1957 +       /* We don't do dynamic PCI IRQ allocation */
1958 +}
1959 +
1960 +#ifndef CONFIG_COLDFIRE
1961 +/* The PCI address space does equal the physical memory
1962 + * address space.  The networking and block device layers use
1963 + * this boolean for bounce buffer decisions.
1964 + */
1965 +#define PCI_DMA_BUS_IS_PHYS    (1)
1966 +
1967 +#define PCIBIOS_MIN_IO                 0x00004000
1968 +#define PCIBIOS_MIN_MEM        0x04000000
1969 +
1970 +#else /* !CONFIG_COLDFIRE */
1971 +#include <asm-generic/pci-dma-compat.h>
1972 +#define PCI_DMA_BASE           /*0x40000000*/0 /* PCI-DMA window base          */
1973 +
1974 +extern struct pci_bus_info *__init init_coldfire_pci(void);
1975 +extern void * pci_alloc_son(struct pci_dev *, size_t,
1976 +                            dma_addr_t *, int);
1977 +/*
1978 + * The PCI address space equal the virtual memory
1979 + * address space on m547X/m548X.
1980 + */
1981 +#define PCI_DMA_BUS_IS_PHYS    (1)
1982 +
1983 +#define PCIBIOS_MIN_IO                 0x00000100
1984 +#define PCIBIOS_MIN_MEM        0x02000000
1985 +
1986 +struct scatterlist;
1987 +
1988 +
1989 +/* This is always fine. */
1990 +#define pci_dac_dma_supported(pci_dev, mask)   (1)
1991 +
1992 +
1993 +/* These macros should be used after a pci_map_sg call has been done
1994 + * to get bus addresses of each of the SG entries and their lengths.
1995 + * You should only work with the number of sg entries pci_map_sg
1996 + * returns.
1997 + */
1998 +#define sg_dma_address(sg)     ((sg)->dma_address)
1999 +#define sg_dma_len(sg)         ((sg)->length)
2000 +
2001 +static inline void pcibios_align_resource(void *data, struct resource *res, unsigned long size, unsigned long align)
2002 +{
2003 +}
2004 +
2005 +#endif /* !CONFIG_COLDFIRE*/
2006 +#endif /* _ASM_M68K_548X_PCI_H */
2007 --- a/include/asm-m68k/io.h
2008 +++ b/include/asm-m68k/io.h
2009 @@ -204,6 +204,12 @@ static inline u16 __iomem *isa_mtw(unsig
2010  #define isa_outw(val,port) (ISA_SEX ? out_be16(isa_itw(port),(val)) : out_le16(isa_itw(port),(val)))
2011  #define isa_outl(val,port) (ISA_SEX ? out_be32(isa_itl(port),(val)) : out_le32(isa_itl(port),(val)))
2012  
2013 +#ifndef CONFIG_COLDFIRE
2014 +#define isa_readb(p)       in_8(isa_mtb(p))
2015 +#define isa_readw(p)       (ISA_SEX ? in_be16(isa_mtw(p)) : in_le16(isa_mtw(p)))
2016 +#define isa_writeb(val,p)  out_8(isa_mtb(p),(val))
2017 +#define isa_writew(val,p)  (ISA_SEX ? out_be16(isa_mtw(p),(val)) : out_le16(isa_mtw(p),(val)))
2018 +#else
2019  #define isa_readb(p)       in_8(isa_mtb((unsigned long)(p)))
2020  #define isa_readw(p)       \
2021         (ISA_SEX ? in_be16(isa_mtw((unsigned long)(p))) \
2022 @@ -212,7 +218,7 @@ static inline u16 __iomem *isa_mtw(unsig
2023  #define isa_writew(val,p)  \
2024         (ISA_SEX ? out_be16(isa_mtw((unsigned long)(p)),(val))  \
2025                  : out_le16(isa_mtw((unsigned long)(p)),(val)))
2026 -
2027 +#endif
2028  static inline void isa_delay(void)
2029  {
2030    switch(ISA_TYPE)
2031 @@ -285,6 +291,29 @@ static inline void isa_delay(void)
2032  #endif /* CONFIG_ISA */
2033  
2034  #if defined(CONFIG_PCI)
2035 +#ifdef CONFIG_COLDFIRE
2036 +#define inb_p   inb
2037 +#define inw_p   inw
2038 +#define inl_p   inl
2039 +#define outb_p  outb
2040 +#define outw_p  outw
2041 +#define outl_p  outl
2042 +
2043 +unsigned char  pci_inb(long addr);
2044 +unsigned short pci_inw(long addr);
2045 +unsigned long  pci_inl(long addr);
2046 +void pci_outb(unsigned char  val, long addr);
2047 +void pci_outw(unsigned short val, long addr);
2048 +void pci_outl(unsigned long  val, long addr);
2049 +
2050 +void pci_insb(volatile unsigned char* addr, unsigned char* buf, int len);
2051 +void pci_insw(volatile unsigned short* addr, unsigned short* buf, int len);
2052 +void pci_insl(volatile unsigned long* addr, unsigned long* buf, int len);
2053 +
2054 +void pci_outsb(volatile unsigned char* addr, const unsigned char* buf, int len);
2055 +void pci_outsw(volatile unsigned short* addr, const unsigned short* buf, int len);
2056 +void pci_outsl(volatile unsigned long* addr, const unsigned long* buf, int len);
2057 +#endif
2058  
2059  #define readl(addr)      in_le32(addr)
2060  #define writel(val,addr) out_le32((addr),(val))
2061 @@ -300,6 +329,7 @@ static inline void isa_delay(void)
2062  #define readl_relaxed(addr) readl(addr)
2063  
2064  #ifndef CONFIG_ISA
2065 +#ifndef CONFIG_COLDFIRE
2066  #define inb(port)      in_8(port)
2067  #define outb(val,port) out_8((port),(val))
2068  #define inw(port)      in_le16(port)
2069 @@ -319,6 +349,30 @@ static inline void isa_delay(void)
2070  #define outsl(port, buf, nr)   \
2071                 raw_outsw_swapw((u16 *)(port), (u16 *)(buf), (nr)<<1)
2072  #else
2073 +#define inb(port)      pci_inb(port)
2074 +#define outb(val,port) pci_outb((val),(port))
2075 +#define inw(port)      pci_inw(port)
2076 +#define outw(val,port) pci_outw((val),(port))
2077 +#define insb(a,b,c)  pci_insb((volatile unsigned char*)a,(unsigned char*)b,c)
2078 +#define insw(a,b,c)  pci_insw((volatile unsigned short*)a,(const unsigned short*)b,c)
2079 +#define insl(a,b,c)  pci_insl((volatile unsigned long*)a,(const unsigned long*)b,c)
2080 +#define outsb(a,b,c) pci_outsb((volatile unsigned char*)a,(const unsigned char*)b,c)
2081 +#define outsw(a,b,c) pci_outsw((volatile unsigned short*)a,(const unsigned short*)b,c)
2082 +#define outsl(a,b,c) pci_outsl((volatile unsigned long*)a,(const unsigned long*)b,c)
2083 +#define inl(port)        pci_inl(port)
2084 +#define outl(val,port)   pci_outl((val),(port))
2085 +#endif
2086 +
2087 +#ifndef CONFIG_COLDFIRE
2088 +#define __raw_readb readb
2089 +#define __raw_readw readw
2090 +#define __raw_readl readl
2091 +#define __raw_writeb writeb
2092 +#define __raw_writew writew
2093 +#define __raw_writel writel
2094 +#endif
2095 +
2096 +#else
2097  /*
2098   * kernel with both ISA and PCI compiled in, those have
2099   * conflicting defs for in/out. Simply consider port < 1024
2100 @@ -432,6 +486,15 @@ static inline void memcpy_toio(volatile 
2101  #define xlate_dev_kmem_ptr(p)  p
2102  
2103  #ifdef CONFIG_COLDFIRE
2104 +#define __raw_readb(addr) \
2105 +    ({ unsigned char __v = (*(volatile unsigned char *) (addr)); __v; })
2106 +#define __raw_readw(addr) \
2107 +    ({ unsigned short __v = (*(volatile unsigned short *) (addr)); __v; })
2108 +#define __raw_readl(addr) \
2109 +    ({ unsigned long __v = (*(volatile unsigned long *) (addr)); __v; })
2110 +#define __raw_writeb(b,addr) (void)((*(volatile unsigned char *) (addr)) = (b))
2111 +#define __raw_writew(b,addr) (void)((*(volatile unsigned short *) (addr)) = (b))
2112 +#define __raw_writel(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b))
2113  
2114  #define memset_io(a, b, c) memset((void *)(a), (b), (c))
2115  #define memcpy_fromio(a, b, c) memcpy((a), (void *)(b), (c))
2116 --- /dev/null
2117 +++ b/include/asm-m68k/m5485pci.h
2118 @@ -0,0 +1,330 @@
2119 +/*
2120 + *     m5485pci.h -- ColdFire 547x/548x PCI controller support.
2121 + */
2122 +#ifndef __MCF548X_PCI_H__
2123 +#define __MCF548X_PCI_H__
2124 +
2125 +
2126 +/* PCI Type 0 Configuration Registers */
2127 +#define MCF_PCIIDR        MCF_REG32(0x000B00)   /* PCI Device ID/Vendor ID      */
2128 +#define MCF_PCISCR        MCF_REG32(0x000B04)   /* PCI Status/Command           */
2129 +#define MCF_PCICCRIR      MCF_REG32(0x000B08)   /* PCI Class Code / Revision ID */
2130 +#define MCF_PCICR1        MCF_REG32(0x000B0C)   /* PCI Configuration 1 Register */
2131 +#define MCF_PCIBAR0       MCF_REG32(0x000B10)   /* PCI Base Address Register 0  */
2132 +#define MCF_PCIBAR1       MCF_REG32(0x000B14)   /* PCI Base Address Register 1  */
2133 +#define MCF_PCICCPR       MCF_REG32(0x000B28)   /* PCI Cardbus CIS Pointer      */
2134 +#define MCF_PCISID        MCF_REG32(0x000B2C)   /* Subsystem ID/Subsystem Vendor ID*/
2135 +#define MCF_PCIERBAR      MCF_REG32(0x000B30)   /* PCI Expansion ROM            */
2136 +#define MCF_PCICPR        MCF_REG32(0x000B30)   /* PCI Capabilities Pointer     */
2137 +#define MCF_PCICR2        MCF_REG32(0x000B3C)   /* PCI Configuration Register 2 */
2138 +
2139 +/* General Control/Status Registers */
2140 +#define MCF_PCIGSCR       MCF_REG32(0x000B60)   /* Global Status/Control Register   */
2141 +#define MCF_PCITBATR0     MCF_REG32(0x000B64)   /* Target Base Address Translation 0*/
2142 +#define MCF_PCITBATR1     MCF_REG32(0x000B68)   /* Target Base Address Translation 1*/
2143 +#define MCF_PCITCR        MCF_REG32(0x000B6C)   /* Target Control Register          */
2144 +#define MCF_PCIIW0BTAR    MCF_REG32(0x000B70)   /* Initiator Window 0 Base Address  */
2145 +#define MCF_PCIIW1BTAR    MCF_REG32(0x000B74)   /* Initiator Window 1 Base Address  */
2146 +#define MCF_PCIIW2BTAR    MCF_REG32(0x000B78)   /* Initiator Window 2 Base  Address */
2147 +#define MCF_PCIIWCR       MCF_REG32(0x000B80)   /* Initiator Window Configuration   */
2148 +#define MCF_PCIICR        MCF_REG32(0x000B84)   /* Initiator Control Register       */
2149 +#define MCF_PCIISR        MCF_REG32(0x000B88)   /* Initiator Status Register        */
2150 +#define MCF_PCICAR        MCF_REG32(0x000BF8)   /* Configuration Address Register   */
2151 +
2152 +/* CommBus FIFO Transmit Interface Registers */
2153 +#define MCF_PCITPSR       MCF_REG32(0x008400)   /* Tx Packet Size Register             */
2154 +#define MCF_PCITSAR       MCF_REG32(0x008404)   /* Tx Start Address Register        */
2155 +#define MCF_PCITTCR       MCF_REG32(0x008408)   /* Tx Transaction Control Register  */
2156 +#define MCF_PCITER        MCF_REG32(0x00840C)   /* Tx Enables Register                 */
2157 +#define MCF_PCITNAR       MCF_REG32(0x008410)   /* Tx Next Address Register         */
2158 +#define MCF_PCITLWR       MCF_REG32(0x008414)   /* Tx Last Word Register               */
2159 +#define MCF_PCITDCR       MCF_REG32(0x008418)   /* Tx Done Counts Register          */
2160 +#define MCF_PCITSR        MCF_REG32(0x00841C)   /* Tx Status Register                  */
2161 +#define MCF_PCITFDR       MCF_REG32(0x008440)   /* Tx FIFO Data Register               */
2162 +#define MCF_PCITFSR       MCF_REG32(0x008444)   /* Tx FIFO Status Register          */
2163 +#define MCF_PCITFCR       MCF_REG32(0x008448)   /* Tx FIFO Control Register         */
2164 +#define MCF_PCITFAR       MCF_REG32(0x00844C)   /* Tx FIFO Alarm Register              */
2165 +#define MCF_PCITFRPR      MCF_REG32(0x008450)   /* Tx FIFO Read Pointer Register    */
2166 +#define MCF_PCITFWPR      MCF_REG32(0x008454)   /* Tx FIFO Write Pointer Register   */
2167 +
2168 +/* CommBus FIFO Receive Interface Registers */
2169 +#define MCF_PCIRPSR       MCF_REG32(0x008480)   /* Tx Packet Size Register             */
2170 +#define MCF_PCIRSAR       MCF_REG32(0x008484)   /* Tx Start Address Register        */
2171 +#define MCF_PCIRTCR       MCF_REG32(0x008488)   /* Tx Transaction Control Register  */
2172 +#define MCF_PCIRER        MCF_REG32(0x00848C)   /* Tx Enables Register                 */
2173 +#define MCF_PCIRNAR       MCF_REG32(0x008490)   /* Tx Next Address Register         */
2174 +#define MCF_PCIRDCR       MCF_REG32(0x008498)   /* Tx Done Counts Register          */
2175 +#define MCF_PCIRSR        MCF_REG32(0x00849C)   /* Tx Status Register                  */
2176 +#define MCF_PCIRFDR       MCF_REG32(0x0084C0)   /* Tx FIFO Data Register               */
2177 +#define MCF_PCIRFSR       MCF_REG32(0x0084C4)   /* Tx FIFO Status Register          */
2178 +#define MCF_PCIRFCR       MCF_REG32(0x0084C8)   /* Tx FIFO Control Register         */
2179 +#define MCF_PCIRFAR       MCF_REG32(0x0084CC)   /* Tx FIFO Alarm Register              */
2180 +#define MCF_PCIRFRPR      MCF_REG32(0x0084D0)   /* Tx FIFO Read Pointer Register    */
2181 +#define MCF_PCIRFWPR      MCF_REG32(0x0084D4)   /* Tx FIFO Write Pointer Register   */
2182 +
2183 +/* PCI Arbiter Registers */
2184 +#define MCF_PCIARB_PACR   MCF_REG32(0x000C00)
2185 +#define MCF_PCIARB_PASR   MCF_REG32(0x000C04)
2186 +
2187 +
2188 +/* Bit definitions and macros for MCF_PCIIDR */
2189 +#define MCF_PCIIDR_VENDORID(x)            (((x)&0x0000FFFF)<<0)
2190 +#define MCF_PCIIDR_DEVICEID(x)            (((x)&0x0000FFFF)<<16)
2191 +
2192 +/* Bit definitions and macros for MCF_PCISCR */
2193 +#define MCF_PCISCR_M      (0x00000002)
2194 +#define MCF_PCISCR_B      (0x00000004)
2195 +#define MCF_PCISCR_SP     (0x00000008)
2196 +#define MCF_PCISCR_MW     (0x00000010)
2197 +#define MCF_PCISCR_PER    (0x00000040)
2198 +#define MCF_PCISCR_S      (0x00000100)
2199 +#define MCF_PCISCR_F      (0x00000200)
2200 +#define MCF_PCISCR_C      (0x00100000)
2201 +#define MCF_PCISCR_66M    (0x00200000)
2202 +#define MCF_PCISCR_R      (0x00400000)
2203 +#define MCF_PCISCR_FC     (0x00800000)
2204 +#define MCF_PCISCR_DP     (0x01000000)
2205 +#define MCF_PCISCR_DT(x)  (((x)&0x00000003)<<25)
2206 +#define MCF_PCISCR_TS     (0x08000000)
2207 +#define MCF_PCISCR_TR     (0x10000000)
2208 +#define MCF_PCISCR_MA     (0x20000000)
2209 +#define MCF_PCISCR_SE     (0x40000000)
2210 +#define MCF_PCISCR_PE     (0x80000000)
2211 +
2212 +/* Bit definitions and macros for MCF_PCICCRIR */
2213 +#define MCF_PCICCRIR_REVID(x)             (((x)&0x000000FF)<<0)
2214 +#define MCF_PCICCRIR_CLASSCODE(x)         (((x)&0x00FFFFFF)<<8)
2215 +
2216 +/* Bit definitions and macros for MCF_PCICR1 */
2217 +#define MCF_PCICR1_CACHELINESIZE(x)       (((x)&0x0000000F)<<0)
2218 +#define MCF_PCICR1_LATTIMER(x)            (((x)&0x000000FF)<<8)
2219 +#define MCF_PCICR1_HEADERTYPE(x)          (((x)&0x000000FF)<<16)
2220 +#define MCF_PCICR1_BIST(x)                (((x)&0x000000FF)<<24)
2221 +
2222 +/* Bit definitions and macros for MCF_PCIBAR# */
2223 +#define MCF_PCIBAR0_ADDR(x)               (((x)&0x00003FFF)<<18)
2224 +#define MCF_PCIBAR1_ADDR(x)               (((x)&0x00000003)<<30)
2225 +
2226 +/* Bit definitions and macros for MCF_PCICR2 */
2227 +#define MCF_PCICR2_INTLINE(x)             (((x)&0x000000FF)<<0)
2228 +#define MCF_PCICR2_INTPIN(x)              (((x)&0x000000FF)<<8)
2229 +#define MCF_PCICR2_MINGNT(x)              (((x)&0x000000FF)<<16)
2230 +#define MCF_PCICR2_MAXLAT(x)              (((x)&0x000000FF)<<24)
2231 +
2232 +/* Bit definitions and macros for MCF_PCIGSCR */
2233 +#define MCF_PCIGSCR_PR                    (0x00000001)
2234 +#define MCF_PCIGSCR_SEE                   (0x00001000)
2235 +#define MCF_PCIGSCR_PEE                   (0x00002000)
2236 +#define MCF_PCIGSCR_SE                    (0x10000000)
2237 +#define MCF_PCIGSCR_PE                    (0x20000000)
2238 +
2239 +/* Bit definitions and macros for MCF_PCITBATR0 */
2240 +#define MCF_PCITBATR0_EN                  (0x00000001)
2241 +#define MCF_PCITBATR0_BAT0(x)             (((x)&0x00003FFF)<<18)
2242 +
2243 +/* Bit definitions and macros for MCF_PCITBATR1 */
2244 +#define MCF_PCITBATR1_EN                  (0x00000001)
2245 +#define MCF_PCITBATR1_BAT1(x)             (((x)&0x00000003)<<30)
2246 +
2247 +/* Bit definitions and macros for MCF_PCITCR */
2248 +#define MCF_PCITCR_P                      (0x00010000)
2249 +#define MCF_PCITCR_LD                     (0x01000000)
2250 +
2251 +/* Bit definitions and macros for MCF_PCIIW0BTAR */
2252 +#define MCF_PCIIW0BTAR_WTA0(x)            (((x)&0x000000FF)<<8)
2253 +#define MCF_PCIIW0BTAR_WAM0(x)            (((x)&0x000000FF)<<16)
2254 +#define MCF_PCIIW0BTAR_WBA0(x)            (((x)&0x000000FF)<<24)
2255 +
2256 +/* Bit definitions and macros for MCF_PCIIW1BTAR */
2257 +#define MCF_PCIIW1BTAR_WTA1(x)            (((x)&0x000000FF)<<8)
2258 +#define MCF_PCIIW1BTAR_WAM1(x)            (((x)&0x000000FF)<<16)
2259 +#define MCF_PCIIW1BTAR_WBA1(x)            (((x)&0x000000FF)<<24)
2260 +
2261 +/* Bit definitions and macros for MCF_PCIIW2BTAR */
2262 +#define MCF_PCIIW2BTAR_WTA2(x)            (((x)&0x000000FF)<<8)
2263 +#define MCF_PCIIW2BTAR_WAM2(x)            (((x)&0x000000FF)<<16)
2264 +#define MCF_PCIIW2BTAR_WBA2(x)            (((x)&0x000000FF)<<24)
2265 +
2266 +/* Bit definitions and macros for MCF_PCIIWCR */
2267 +#define MCF_PCIIWCR_WINCTRL2(x)           (((x)&0x0000000F)<<8)
2268 +#define MCF_PCIIWCR_WINCTRL1(x)           (((x)&0x0000000F)<<16)
2269 +#define MCF_PCIIWCR_WINCTRL0(x)           (((x)&0x0000000F)<<24)
2270 +#define MCF_PCIIWCR_WINCTRL0_MEMREAD      (0x01000000)
2271 +#define MCF_PCIIWCR_WINCTRL0_MEMRDLINE    (0x03000000)
2272 +#define MCF_PCIIWCR_WINCTRL0_MEMRDMUL     (0x05000000)
2273 +#define MCF_PCIIWCR_WINCTRL0_IO           (0x09000000)
2274 +#define MCF_PCIIWCR_WINCTRL0_E            (0x01000000)
2275 +#define MCF_PCIIWCR_WINCTRL1_MEMREAD      (0x00010000)
2276 +#define MCF_PCIIWCR_WINCTRL1_MEMRDLINE    (0x00030000)
2277 +#define MCF_PCIIWCR_WINCTRL1_MEMRDMUL     (0x00050000)
2278 +#define MCF_PCIIWCR_WINCTRL1_IO           (0x00090000)
2279 +#define MCF_PCIIWCR_WINCTRL1_E            (0x00010000)
2280 +#define MCF_PCIIWCR_WINCTRL2_MEMREAD      (0x00000100)
2281 +#define MCF_PCIIWCR_WINCTRL2_MEMRDLINE    (0x00000300)
2282 +#define MCF_PCIIWCR_WINCTRL2_MEMRDMUL     (0x00000500)
2283 +#define MCF_PCIIWCR_WINCTRL2_IO           (0x00000900)
2284 +#define MCF_PCIIWCR_WINCTRL2_E            (0x00000100)
2285 +
2286 +
2287 +/* Bit definitions and macros for MCF_PCIICR */
2288 +#define MCF_PCIICR_MAXRETRY(x)            (((x)&0x000000FF)<<0)
2289 +#define MCF_PCIICR_TAE                    (0x01000000)
2290 +#define MCF_PCIICR_IAE                    (0x02000000)
2291 +#define MCF_PCIICR_REE                    (0x04000000)
2292 +
2293 +/* Bit definitions and macros for MCF_PCIISR */
2294 +#define MCF_PCIISR_TA                     (0x01000000)
2295 +#define MCF_PCIISR_IA                     (0x02000000)
2296 +#define MCF_PCIISR_RE                     (0x04000000)
2297 +
2298 +/* Bit definitions and macros for MCF_PCICAR */
2299 +#define MCF_PCICAR_DWORD(x)               (((x)&0x0000003F)<<2)
2300 +#define MCF_PCICAR_FUNCNUM(x)             (((x)&0x00000007)<<8)
2301 +#define MCF_PCICAR_DEVNUM(x)              (((x)&0x0000001F)<<11)
2302 +#define MCF_PCICAR_BUSNUM(x)              (((x)&0x000000FF)<<16)
2303 +#define MCF_PCICAR_E                      (0x80000000)
2304 +
2305 +/* Bit definitions and macros for MCF_PCITPSR */
2306 +#define MCF_PCITPSR_PKTSIZE(x)            (((x)&0x0000FFFF)<<16)
2307 +
2308 +/* Bit definitions and macros for MCF_PCITTCR */
2309 +#define MCF_PCITTCR_DI                    (0x00000001)
2310 +#define MCF_PCITTCR_W                     (0x00000010)
2311 +#define MCF_PCITTCR_MAXBEATS(x)           (((x)&0x00000007)<<8)
2312 +#define MCF_PCITTCR_MAXRETRY(x)           (((x)&0x000000FF)<<16)
2313 +#define MCF_PCITTCR_PCICMD(x)             (((x)&0x0000000F)<<24)
2314 +
2315 +/* Bit definitions and macros for MCF_PCITER */
2316 +#define MCF_PCITER_NE                     (0x00010000)
2317 +#define MCF_PCITER_IAE                    (0x00020000)
2318 +#define MCF_PCITER_TAE                    (0x00040000)
2319 +#define MCF_PCITER_RE                     (0x00080000)
2320 +#define MCF_PCITER_SE                     (0x00100000)
2321 +#define MCF_PCITER_FEE                    (0x00200000)
2322 +#define MCF_PCITER_ME                     (0x01000000)
2323 +#define MCF_PCITER_BE                     (0x08000000)
2324 +#define MCF_PCITER_CM                     (0x10000000)
2325 +#define MCF_PCITER_RF                     (0x40000000)
2326 +#define MCF_PCITER_RC                     (0x80000000)
2327 +
2328 +/* Bit definitions and macros for MCF_PCITDCR */
2329 +#define MCF_PCITDCR_PKTSDONE(x)           (((x)&0x0000FFFF)<<0)
2330 +#define MCF_PCITDCR_BYTESDONE(x)          (((x)&0x0000FFFF)<<16)
2331 +
2332 +/* Bit definitions and macros for MCF_PCITSR */
2333 +#define MCF_PCITSR_IA                     (0x00010000)
2334 +#define MCF_PCITSR_TA                     (0x00020000)
2335 +#define MCF_PCITSR_RE                     (0x00040000)
2336 +#define MCF_PCITSR_SE                     (0x00080000)
2337 +#define MCF_PCITSR_FE                     (0x00100000)
2338 +#define MCF_PCITSR_BE1                    (0x00200000)
2339 +#define MCF_PCITSR_BE2                    (0x00400000)
2340 +#define MCF_PCITSR_BE3                    (0x00800000)
2341 +#define MCF_PCITSR_NT                     (0x01000000)
2342 +
2343 +/* Bit definitions and macros for MCF_PCITFSR */
2344 +#define MCF_PCITFSR_EMT                   (0x00010000)
2345 +#define MCF_PCITFSR_ALARM                 (0x00020000)
2346 +#define MCF_PCITFSR_FU                    (0x00040000)
2347 +#define MCF_PCITFSR_FR                    (0x00080000)
2348 +#define MCF_PCITFSR_OF                    (0x00100000)
2349 +#define MCF_PCITFSR_UF                    (0x00200000)
2350 +#define MCF_PCITFSR_RXW                   (0x00400000)
2351 +
2352 +/* Bit definitions and macros for MCF_PCITFCR */
2353 +#define MCF_PCITFCR_OF_MSK                (0x00080000)
2354 +#define MCF_PCITFCR_UF_MSK                (0x00100000)
2355 +#define MCF_PCITFCR_RXW_MSK               (0x00200000)
2356 +#define MCF_PCITFCR_FAE_MSK               (0x00400000)
2357 +#define MCF_PCITFCR_IP_MSK                (0x00800000)
2358 +#define MCF_PCITFCR_GR(x)                 (((x)&0x00000007)<<24)
2359 +
2360 +/* Bit definitions and macros for MCF_PCITFAR */
2361 +#define MCF_PCITFAR_ALARM(x)              (((x)&0x0000007F)<<0)
2362 +
2363 +/* Bit definitions and macros for MCF_PCITFRPR */
2364 +#define MCF_PCITFRPR_READ(x)              (((x)&0x00000FFF)<<0)
2365 +
2366 +/* Bit definitions and macros for MCF_PCITFWPR */
2367 +#define MCF_PCITFWPR_WRITE(x)             (((x)&0x00000FFF)<<0)
2368 +
2369 +/* Bit definitions and macros for MCF_PCIRPSR */
2370 +#define MCF_PCIRPSR_PKTSIZE(x)            (((x)&0x0000FFFF)<<16)
2371 +
2372 +/* Bit definitions and macros for MCF_PCIRTCR */
2373 +#define MCF_PCIRTCR_DI                    (0x00000001)
2374 +#define MCF_PCIRTCR_W                     (0x00000010)
2375 +#define MCF_PCIRTCR_MAXBEATS(x)           (((x)&0x00000007)<<8)
2376 +#define MCF_PCIRTCR_FB                    (0x00001000)
2377 +#define MCF_PCIRTCR_MAXRETRY(x)           (((x)&0x000000FF)<<16)
2378 +#define MCF_PCIRTCR_PCICMD(x)             (((x)&0x0000000F)<<24)
2379 +
2380 +/* Bit definitions and macros for MCF_PCIRER */
2381 +#define MCF_PCIRER_NE                     (0x00010000)
2382 +#define MCF_PCIRER_IAE                    (0x00020000)
2383 +#define MCF_PCIRER_TAE                    (0x00040000)
2384 +#define MCF_PCIRER_RE                     (0x00080000)
2385 +#define MCF_PCIRER_SE                     (0x00100000)
2386 +#define MCF_PCIRER_FEE                    (0x00200000)
2387 +#define MCF_PCIRER_ME                     (0x01000000)
2388 +#define MCF_PCIRER_BE                     (0x08000000)
2389 +#define MCF_PCIRER_CM                     (0x10000000)
2390 +#define MCF_PCIRER_FE                     (0x20000000)
2391 +#define MCF_PCIRER_RF                     (0x40000000)
2392 +#define MCF_PCIRER_RC                     (0x80000000)
2393 +
2394 +/* Bit definitions and macros for MCF_PCIRDCR */
2395 +#define MCF_PCIRDCR_PKTSDONE(x)           (((x)&0x0000FFFF)<<0)
2396 +#define MCF_PCIRDCR_BYTESDONE(x)          (((x)&0x0000FFFF)<<16)
2397 +
2398 +/* Bit definitions and macros for MCF_PCIRSR */
2399 +#define MCF_PCIRSR_IA                     (0x00010000)
2400 +#define MCF_PCIRSR_TA                     (0x00020000)
2401 +#define MCF_PCIRSR_RE                     (0x00040000)
2402 +#define MCF_PCIRSR_SE                     (0x00080000)
2403 +#define MCF_PCIRSR_FE                     (0x00100000)
2404 +#define MCF_PCIRSR_BE1                    (0x00200000)
2405 +#define MCF_PCIRSR_BE2                    (0x00400000)
2406 +#define MCF_PCIRSR_BE3                    (0x00800000)
2407 +#define MCF_PCIRSR_NT                     (0x01000000)
2408 +
2409 +/* Bit definitions and macros for MCF_PCIRFSR */
2410 +#define MCF_PCIRFSR_EMT                   (0x00010000)
2411 +#define MCF_PCIRFSR_ALARM                 (0x00020000)
2412 +#define MCF_PCIRFSR_FU                    (0x00040000)
2413 +#define MCF_PCIRFSR_FR                    (0x00080000)
2414 +#define MCF_PCIRFSR_OF                    (0x00100000)
2415 +#define MCF_PCIRFSR_UF                    (0x00200000)
2416 +#define MCF_PCIRFSR_RXW                   (0x00400000)
2417 +
2418 +/* Bit definitions and macros for MCF_PCIRFCR */
2419 +#define MCF_PCIRFCR_OF_MSK                (0x00080000)
2420 +#define MCF_PCIRFCR_UF_MSK                (0x00100000)
2421 +#define MCF_PCIRFCR_RXW_MSK               (0x00200000)
2422 +#define MCF_PCIRFCR_FAE_MSK               (0x00400000)
2423 +#define MCF_PCIRFCR_IP_MSK                (0x00800000)
2424 +#define MCF_PCIRFCR_GR(x)                 (((x)&0x00000007)<<24)
2425 +
2426 +/* Bit definitions and macros for MCF_PCIRFAR */
2427 +#define MCF_PCIRFAR_ALARM(x)              (((x)&0x0000007F)<<0)
2428 +
2429 +/* Bit definitions and macros for MCF_PCIRFRPR */
2430 +#define MCF_PCIRFRPR_READ(x)              (((x)&0x00000FFF)<<0)
2431 +
2432 +/* Bit definitions and macros for MCF_PCIRFWPR */
2433 +#define MCF_PCIRFWPR_WRITE(x)             (((x)&0x00000FFF)<<0)
2434 +
2435 +
2436 +/* Bit definitions and macros for MCF_PCIARB_PACR */
2437 +#define MCF_PCIARB_PACR_INTMPRI         (0x00000001)
2438 +#define MCF_PCIARB_PACR_EXTMPRI(x)      (((x)&0x0000001F)<<1)
2439 +#define MCF_PCIARB_PACR_INTMINTEN       (0x00010000)
2440 +#define MCF_PCIARB_PACR_EXTMINTEN(x)    (((x)&0x0000001F)<<17)
2441 +#define MCF_PCIARB_PACR_PKMD            (0x40000000)
2442 +#define MCF_PCIARB_PACR_DS              (0x80000000)
2443 +
2444 +/* Bit definitions and macros for MCF_PCIARB_PASR */
2445 +#define MCF_PCIARB_PASR_ITLMBK          (0x00010000)
2446 +#define MCF_PCIARB_PASR_EXTMBK(x)       (((x)&0x0000001F)<<17)
2447 +
2448 +#endif /* __MCF548X_PCI_H__ */
2449 --- a/include/asm-m68k/pci.h
2450 +++ b/include/asm-m68k/pci.h
2451 @@ -1,94 +1,10 @@
2452 -/*
2453 - * asm-m68k/pci.h - m68k specific PCI declarations.
2454 - *
2455 - * Coldfire Implementation Copyright (c) 2007 Freescale Semiconductor, Inc.
2456 - *     Kurt Mahan <kmahan@freescale.com>
2457 - */
2458 -#ifndef _ASM_M68K_PCI_H
2459 -#define _ASM_M68K_PCI_H
2460 +#ifndef M68K_PCI_H
2461 +#define M68K_PCI_H
2462  
2463 -#ifndef CONFIG_PCI
2464 -/*
2465 - * The PCI address space does equal the physical memory
2466 - * address space.  The networking and block device layers use
2467 - * this boolean for bounce buffer decisions.
2468 - */
2469 -#define PCI_DMA_BUS_IS_PHYS            (1)
2470 +#ifdef CONFIG_M5445X
2471 +#include "5445x_pci.h"
2472  #else
2473 -#include <asm-generic/pci-dma-compat.h>
2474 -
2475 -/*
2476 - * The PCI address space does equal the physical memory
2477 - * address space.  The networking and block device layers use
2478 - * this boolean for bounce buffer decisions.
2479 - */
2480 -#define PCI_DMA_BUS_IS_PHYS            (1)
2481 -
2482 -#define PCIBIOS_MIN_IO                 0x00004000
2483 -#define PCIBIOS_MIN_MEM                        0x02000000
2484 -
2485 -#define pcibios_assign_all_busses()    0
2486 -#define pcibios_scan_all_fns(a, b)     0
2487 -
2488 -static inline void
2489 -pcibios_set_master(struct pci_dev *dev)
2490 -{
2491 -       /* no special bus mastering setup handling */
2492 -}
2493 -
2494 -static inline void
2495 -pcibios_penalize_isa_irq(int irq, int active)
2496 -{
2497 -       /* no dynamic PCI IRQ allocation */
2498 -}
2499 -
2500 -#if 0
2501 -static inline void
2502 -pcibios_add_platform_entries(struct pci_dev *dev)
2503 -{
2504 -       /* no special handling */
2505 -}
2506 +#include "548x_pci.h"
2507  #endif
2508  
2509 -static inline void
2510 -pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
2511 -                        struct resource *res)
2512 -{
2513 -#ifdef CONFIG_M54455
2514 -       if ((res->start == 0xa0000000) || (res->start == 0xa8000000)) {
2515 -               /* HACK!  FIX! kludge to fix bridge mapping */
2516 -               region->start = res->start & 0x0fffffff;
2517 -               region->end = res->end & 0x0fffffff;
2518 -       } else {
2519 -               region->start = res->start;
2520 -               region->end = res->end;
2521 -       }
2522 -#else
2523 -       region->start = res->start;
2524 -       region->end = res->end;
2525 -#endif
2526 -}
2527 -
2528 -static inline void
2529 -pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
2530 -                       struct pci_bus_region *region)
2531 -{
2532 -       res->start = region->start;
2533 -       res->end = region->end;
2534 -}
2535 -
2536 -static inline struct resource *
2537 -pcibios_select_root(struct pci_dev *pdev, struct resource *res)
2538 -{
2539 -       struct resource *root = NULL;
2540 -
2541 -       if (res->flags & IORESOURCE_IO)
2542 -               root = &ioport_resource;
2543 -       if (res->flags & IORESOURCE_MEM)
2544 -               root = &iomem_resource;
2545 -
2546 -       return root;
2547 -}
2548 -
2549 -#endif /* CONFIG_PCI */
2550 -#endif /* _ASM_M68K_PCI_H */
2551 +#endif /* M68K_PCI_H */
2552 --- a/include/asm-m68k/raw_io.h
2553 +++ b/include/asm-m68k/raw_io.h
2554 @@ -46,6 +46,29 @@ extern void __iounmap(void *addr, unsign
2555  #define out_le16(addr,w) (void)((*(__force volatile __le16 *) (addr)) = cpu_to_le16(w))
2556  #define out_le32(addr,l) (void)((*(__force volatile __le32 *) (addr)) = cpu_to_le32(l))
2557  
2558 +#if (defined CONFIG_COLDFIRE) && (defined CONFIG_PCI)
2559 +unsigned char  pci_inb(long addr);
2560 +unsigned short pci_inw(long addr);
2561 +unsigned long  pci_inl(long addr);
2562 +void pci_outb(unsigned char  val, long addr);
2563 +void pci_outw(unsigned short val, long addr);
2564 +void pci_outl(unsigned long  val, long addr);
2565 +unsigned short pci_raw_inw(long addr);
2566 +unsigned long  pci_raw_inl(long addr);
2567 +void pci_raw_outw(unsigned short val, long addr);
2568 +void pci_raw_outl(unsigned long  val, long addr);
2569 +#define raw_inb(port) pci_inb((long)((volatile unsigned char *)(port)))
2570 +#define raw_inw(port) pci_raw_inw((long)((volatile unsigned short *)(port)))
2571 +#define raw_inl(port) pci_raw_inl((long)((volatile unsigned long *)(port)))
2572 +
2573 +#define raw_outb(val,port) pci_outb((val),(long)((volatile unsigned char *)(port)))
2574 +#define raw_outw(val,port) pci_raw_outw((val),(long)((volatile unsigned short *)(port)))
2575 +#define raw_outl(val,port) pci_raw_outl((val),(long)((volatile unsigned long *)(port)))
2576 +
2577 +#define swap_inw(port) pci_inw((long)((volatile unsigned short *)(port)))
2578 +#define swap_outw(val,port) pci_outw((val),(long)((volatile unsigned short *)(port)))
2579 +
2580 +#else
2581  #define raw_inb in_8
2582  #define raw_inw in_be16
2583  #define raw_inl in_be32
2584 @@ -60,6 +83,9 @@ extern void __iounmap(void *addr, unsign
2585  #define __raw_writew(val,addr) out_be16((addr),(val))
2586  #define __raw_writel(val,addr) out_be32((addr),(val))
2587  
2588 +#define swap_inw(port) in_le16((port))
2589 +#define swap_outw(val,port) out_le16((port),(val))
2590 +#endif
2591  static inline void raw_insb(volatile u8 __iomem *port, u8 *buf, unsigned int len)
2592  {
2593         unsigned int i;
2594 --- a/include/asm-m68k/virtconvert.h
2595 +++ b/include/asm-m68k/virtconvert.h
2596 @@ -46,9 +46,14 @@ static inline void *phys_to_virt(unsigne
2597  #define virt_to_bus(a) (virt_to_phys(a) + (MACH_IS_HADES ? 0x80000000 : 0))
2598  #define bus_to_virt(a) (phys_to_virt((a) - (MACH_IS_HADES ? 0x80000000 : 0)))
2599  #else
2600 +#ifdef CONFIG_COLDFIRE
2601 +#define virt_to_bus(a) (a - PAGE_OFFSET + PCI_DMA_BASE)
2602 +#define bus_to_virt(a) (a - PCI_DMA_BASE + PAGE_OFFSET)
2603 +#else /* CONFIG_COLDFIRE */
2604  #define virt_to_bus virt_to_phys
2605  #define bus_to_virt phys_to_virt
2606  #endif
2607 +#endif
2608  
2609  #endif
2610  #endif
2611 --- a/include/linux/pci.h
2612 +++ b/include/linux/pci.h
2613 @@ -458,8 +458,10 @@ int __must_check pcibios_enable_device(s
2614  char *pcibios_setup(char *str);
2615  
2616  /* Used only when drivers/pci/setup.c is used */
2617 +#ifndef CONFIG_COLDFIRE
2618  void pcibios_align_resource(void *, struct resource *, resource_size_t,
2619                                 resource_size_t);
2620 +#endif
2621  void pcibios_update_irq(struct pci_dev *, int irq);
2622  
2623  /* Generic PCI functions used internally */