diff options
Diffstat (limited to 'arch/sh/drivers/pci/pci-dreamcast.c')
-rw-r--r-- | arch/sh/drivers/pci/pci-dreamcast.c | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/arch/sh/drivers/pci/pci-dreamcast.c b/arch/sh/drivers/pci/pci-dreamcast.c new file mode 100644 index 000000000000..210f9d4af141 --- /dev/null +++ b/arch/sh/drivers/pci/pci-dreamcast.c | |||
@@ -0,0 +1,102 @@ | |||
1 | /* | ||
2 | * PCI support for the Sega Dreamcast | ||
3 | * | ||
4 | * Copyright (C) 2001, 2002 M. R. Brown | ||
5 | * Copyright (C) 2002, 2003 Paul Mundt | ||
6 | * | ||
7 | * This file originally bore the message (with enclosed-$): | ||
8 | * Id: pci.c,v 1.3 2003/05/04 19:29:46 lethal Exp | ||
9 | * Dreamcast PCI: Supports SEGA Broadband Adaptor only. | ||
10 | * | ||
11 | * This file is subject to the terms and conditions of the GNU General Public | ||
12 | * License. See the file "COPYING" in the main directory of this archive | ||
13 | * for more details. | ||
14 | */ | ||
15 | |||
16 | #include <linux/sched.h> | ||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/param.h> | ||
19 | #include <linux/interrupt.h> | ||
20 | #include <linux/init.h> | ||
21 | #include <linux/irq.h> | ||
22 | #include <linux/pci.h> | ||
23 | #include <linux/module.h> | ||
24 | #include <asm/io.h> | ||
25 | #include <asm/irq.h> | ||
26 | #include <mach/pci.h> | ||
27 | |||
28 | static struct resource gapspci_io_resource = { | ||
29 | .name = "GAPSPCI IO", | ||
30 | .start = GAPSPCI_BBA_CONFIG, | ||
31 | .end = GAPSPCI_BBA_CONFIG + GAPSPCI_BBA_CONFIG_SIZE - 1, | ||
32 | .flags = IORESOURCE_IO, | ||
33 | }; | ||
34 | |||
35 | static struct resource gapspci_mem_resource = { | ||
36 | .name = "GAPSPCI mem", | ||
37 | .start = GAPSPCI_DMA_BASE, | ||
38 | .end = GAPSPCI_DMA_BASE + GAPSPCI_DMA_SIZE - 1, | ||
39 | .flags = IORESOURCE_MEM, | ||
40 | }; | ||
41 | |||
42 | static struct pci_channel dreamcast_pci_controller = { | ||
43 | .pci_ops = &gapspci_pci_ops, | ||
44 | .io_resource = &gapspci_io_resource, | ||
45 | .io_offset = 0x00000000, | ||
46 | .mem_resource = &gapspci_mem_resource, | ||
47 | .mem_offset = 0x00000000, | ||
48 | }; | ||
49 | |||
50 | /* | ||
51 | * gapspci init | ||
52 | */ | ||
53 | |||
54 | static int __init gapspci_init(void) | ||
55 | { | ||
56 | char idbuf[16]; | ||
57 | int i; | ||
58 | |||
59 | /* | ||
60 | * FIXME: All of this wants documenting to some degree, | ||
61 | * even some basic register definitions would be nice. | ||
62 | * | ||
63 | * I haven't seen anything this ugly since.. maple. | ||
64 | */ | ||
65 | |||
66 | for (i=0; i<16; i++) | ||
67 | idbuf[i] = inb(GAPSPCI_REGS+i); | ||
68 | |||
69 | if (strncmp(idbuf, "GAPSPCI_BRIDGE_2", 16)) | ||
70 | return -ENODEV; | ||
71 | |||
72 | outl(0x5a14a501, GAPSPCI_REGS+0x18); | ||
73 | |||
74 | for (i=0; i<1000000; i++) | ||
75 | cpu_relax(); | ||
76 | |||
77 | if (inl(GAPSPCI_REGS+0x18) != 1) | ||
78 | return -EINVAL; | ||
79 | |||
80 | outl(0x01000000, GAPSPCI_REGS+0x20); | ||
81 | outl(0x01000000, GAPSPCI_REGS+0x24); | ||
82 | |||
83 | outl(GAPSPCI_DMA_BASE, GAPSPCI_REGS+0x28); | ||
84 | outl(GAPSPCI_DMA_BASE+GAPSPCI_DMA_SIZE, GAPSPCI_REGS+0x2c); | ||
85 | |||
86 | outl(1, GAPSPCI_REGS+0x14); | ||
87 | outl(1, GAPSPCI_REGS+0x34); | ||
88 | |||
89 | /* Setting Broadband Adapter */ | ||
90 | outw(0xf900, GAPSPCI_BBA_CONFIG+0x06); | ||
91 | outl(0x00000000, GAPSPCI_BBA_CONFIG+0x30); | ||
92 | outb(0x00, GAPSPCI_BBA_CONFIG+0x3c); | ||
93 | outb(0xf0, GAPSPCI_BBA_CONFIG+0x0d); | ||
94 | outw(0x0006, GAPSPCI_BBA_CONFIG+0x04); | ||
95 | outl(0x00002001, GAPSPCI_BBA_CONFIG+0x10); | ||
96 | outl(0x01000000, GAPSPCI_BBA_CONFIG+0x14); | ||
97 | |||
98 | register_pci_controller(&dreamcast_pci_controller); | ||
99 | |||
100 | return 0; | ||
101 | } | ||
102 | arch_initcall(gapspci_init); | ||