diff options
Diffstat (limited to 'arch/arm/mach-iop13xx')
-rw-r--r-- | arch/arm/mach-iop13xx/Makefile | 1 | ||||
-rw-r--r-- | arch/arm/mach-iop13xx/iq81340mc.c | 5 | ||||
-rw-r--r-- | arch/arm/mach-iop13xx/iq81340sc.c | 5 | ||||
-rw-r--r-- | arch/arm/mach-iop13xx/pci.c | 8 | ||||
-rw-r--r-- | arch/arm/mach-iop13xx/setup.c | 6 | ||||
-rw-r--r-- | arch/arm/mach-iop13xx/tpmi.c | 234 |
6 files changed, 248 insertions, 11 deletions
diff --git a/arch/arm/mach-iop13xx/Makefile b/arch/arm/mach-iop13xx/Makefile index 4185e0586c33..da1609dc0dee 100644 --- a/arch/arm/mach-iop13xx/Makefile +++ b/arch/arm/mach-iop13xx/Makefile | |||
@@ -7,5 +7,6 @@ obj-$(CONFIG_ARCH_IOP13XX) += setup.o | |||
7 | obj-$(CONFIG_ARCH_IOP13XX) += irq.o | 7 | obj-$(CONFIG_ARCH_IOP13XX) += irq.o |
8 | obj-$(CONFIG_ARCH_IOP13XX) += pci.o | 8 | obj-$(CONFIG_ARCH_IOP13XX) += pci.o |
9 | obj-$(CONFIG_ARCH_IOP13XX) += io.o | 9 | obj-$(CONFIG_ARCH_IOP13XX) += io.o |
10 | obj-$(CONFIG_ARCH_IOP13XX) += tpmi.o | ||
10 | obj-$(CONFIG_MACH_IQ81340SC) += iq81340sc.o | 11 | obj-$(CONFIG_MACH_IQ81340SC) += iq81340sc.o |
11 | obj-$(CONFIG_MACH_IQ81340MC) += iq81340mc.o | 12 | obj-$(CONFIG_MACH_IQ81340MC) += iq81340mc.o |
diff --git a/arch/arm/mach-iop13xx/iq81340mc.c b/arch/arm/mach-iop13xx/iq81340mc.c index a519d707571c..268a8d84999c 100644 --- a/arch/arm/mach-iop13xx/iq81340mc.c +++ b/arch/arm/mach-iop13xx/iq81340mc.c | |||
@@ -75,11 +75,14 @@ static void __init iq81340mc_init(void) | |||
75 | { | 75 | { |
76 | iop13xx_platform_init(); | 76 | iop13xx_platform_init(); |
77 | iq81340mc_pci_init(); | 77 | iq81340mc_pci_init(); |
78 | iop13xx_add_tpmi_devices(); | ||
78 | } | 79 | } |
79 | 80 | ||
80 | static void __init iq81340mc_timer_init(void) | 81 | static void __init iq81340mc_timer_init(void) |
81 | { | 82 | { |
82 | iop_init_time(400000000); | 83 | unsigned long bus_freq = iop13xx_core_freq() / iop13xx_xsi_bus_ratio(); |
84 | printk(KERN_DEBUG "%s: bus frequency: %lu\n", __FUNCTION__, bus_freq); | ||
85 | iop_init_time(bus_freq); | ||
83 | } | 86 | } |
84 | 87 | ||
85 | static struct sys_timer iq81340mc_timer = { | 88 | static struct sys_timer iq81340mc_timer = { |
diff --git a/arch/arm/mach-iop13xx/iq81340sc.c b/arch/arm/mach-iop13xx/iq81340sc.c index 0e71fbcabe00..a51ffd2683e5 100644 --- a/arch/arm/mach-iop13xx/iq81340sc.c +++ b/arch/arm/mach-iop13xx/iq81340sc.c | |||
@@ -77,11 +77,14 @@ static void __init iq81340sc_init(void) | |||
77 | { | 77 | { |
78 | iop13xx_platform_init(); | 78 | iop13xx_platform_init(); |
79 | iq81340sc_pci_init(); | 79 | iq81340sc_pci_init(); |
80 | iop13xx_add_tpmi_devices(); | ||
80 | } | 81 | } |
81 | 82 | ||
82 | static void __init iq81340sc_timer_init(void) | 83 | static void __init iq81340sc_timer_init(void) |
83 | { | 84 | { |
84 | iop_init_time(400000000); | 85 | unsigned long bus_freq = iop13xx_core_freq() / iop13xx_xsi_bus_ratio(); |
86 | printk(KERN_DEBUG "%s: bus frequency: %lu\n", __FUNCTION__, bus_freq); | ||
87 | iop_init_time(bus_freq); | ||
85 | } | 88 | } |
86 | 89 | ||
87 | static struct sys_timer iq81340sc_timer = { | 90 | static struct sys_timer iq81340sc_timer = { |
diff --git a/arch/arm/mach-iop13xx/pci.c b/arch/arm/mach-iop13xx/pci.c index d85b88fcb7e8..d1d0d32ca77c 100644 --- a/arch/arm/mach-iop13xx/pci.c +++ b/arch/arm/mach-iop13xx/pci.c | |||
@@ -1023,7 +1023,7 @@ int iop13xx_pci_setup(int nr, struct pci_sys_data *sys) | |||
1023 | << IOP13XX_ATUX_PCIXSR_FUNC_NUM; | 1023 | << IOP13XX_ATUX_PCIXSR_FUNC_NUM; |
1024 | __raw_writel(pcixsr, IOP13XX_ATUX_PCIXSR); | 1024 | __raw_writel(pcixsr, IOP13XX_ATUX_PCIXSR); |
1025 | 1025 | ||
1026 | res[0].start = IOP13XX_PCIX_LOWER_IO_PA; | 1026 | res[0].start = IOP13XX_PCIX_LOWER_IO_PA + IOP13XX_PCIX_IO_BUS_OFFSET; |
1027 | res[0].end = IOP13XX_PCIX_UPPER_IO_PA; | 1027 | res[0].end = IOP13XX_PCIX_UPPER_IO_PA; |
1028 | res[0].name = "IQ81340 ATUX PCI I/O Space"; | 1028 | res[0].name = "IQ81340 ATUX PCI I/O Space"; |
1029 | res[0].flags = IORESOURCE_IO; | 1029 | res[0].flags = IORESOURCE_IO; |
@@ -1033,7 +1033,7 @@ int iop13xx_pci_setup(int nr, struct pci_sys_data *sys) | |||
1033 | res[1].name = "IQ81340 ATUX PCI Memory Space"; | 1033 | res[1].name = "IQ81340 ATUX PCI Memory Space"; |
1034 | res[1].flags = IORESOURCE_MEM; | 1034 | res[1].flags = IORESOURCE_MEM; |
1035 | sys->mem_offset = IOP13XX_PCIX_MEM_OFFSET; | 1035 | sys->mem_offset = IOP13XX_PCIX_MEM_OFFSET; |
1036 | sys->io_offset = IOP13XX_PCIX_IO_OFFSET; | 1036 | sys->io_offset = IOP13XX_PCIX_LOWER_IO_PA; |
1037 | break; | 1037 | break; |
1038 | case IOP13XX_INIT_ATU_ATUE: | 1038 | case IOP13XX_INIT_ATU_ATUE: |
1039 | /* Note: the function number field in the PCSR is ro */ | 1039 | /* Note: the function number field in the PCSR is ro */ |
@@ -1044,7 +1044,7 @@ int iop13xx_pci_setup(int nr, struct pci_sys_data *sys) | |||
1044 | 1044 | ||
1045 | __raw_writel(pcsr, IOP13XX_ATUE_PCSR); | 1045 | __raw_writel(pcsr, IOP13XX_ATUE_PCSR); |
1046 | 1046 | ||
1047 | res[0].start = IOP13XX_PCIE_LOWER_IO_PA; | 1047 | res[0].start = IOP13XX_PCIE_LOWER_IO_PA + IOP13XX_PCIE_IO_BUS_OFFSET; |
1048 | res[0].end = IOP13XX_PCIE_UPPER_IO_PA; | 1048 | res[0].end = IOP13XX_PCIE_UPPER_IO_PA; |
1049 | res[0].name = "IQ81340 ATUE PCI I/O Space"; | 1049 | res[0].name = "IQ81340 ATUE PCI I/O Space"; |
1050 | res[0].flags = IORESOURCE_IO; | 1050 | res[0].flags = IORESOURCE_IO; |
@@ -1054,7 +1054,7 @@ int iop13xx_pci_setup(int nr, struct pci_sys_data *sys) | |||
1054 | res[1].name = "IQ81340 ATUE PCI Memory Space"; | 1054 | res[1].name = "IQ81340 ATUE PCI Memory Space"; |
1055 | res[1].flags = IORESOURCE_MEM; | 1055 | res[1].flags = IORESOURCE_MEM; |
1056 | sys->mem_offset = IOP13XX_PCIE_MEM_OFFSET; | 1056 | sys->mem_offset = IOP13XX_PCIE_MEM_OFFSET; |
1057 | sys->io_offset = IOP13XX_PCIE_IO_OFFSET; | 1057 | sys->io_offset = IOP13XX_PCIE_LOWER_IO_PA; |
1058 | sys->map_irq = iop13xx_pcie_map_irq; | 1058 | sys->map_irq = iop13xx_pcie_map_irq; |
1059 | break; | 1059 | break; |
1060 | default: | 1060 | default: |
diff --git a/arch/arm/mach-iop13xx/setup.c b/arch/arm/mach-iop13xx/setup.c index 9a46bcd5f18e..bc4871553f6a 100644 --- a/arch/arm/mach-iop13xx/setup.c +++ b/arch/arm/mach-iop13xx/setup.c | |||
@@ -258,15 +258,11 @@ void __init iop13xx_platform_init(void) | |||
258 | 258 | ||
259 | if (init_uart == IOP13XX_INIT_UART_DEFAULT) { | 259 | if (init_uart == IOP13XX_INIT_UART_DEFAULT) { |
260 | switch (iop13xx_dev_id()) { | 260 | switch (iop13xx_dev_id()) { |
261 | /* enable both uarts on iop341 and iop342 */ | 261 | /* enable both uarts on iop341 */ |
262 | case 0x3380: | 262 | case 0x3380: |
263 | case 0x3384: | 263 | case 0x3384: |
264 | case 0x3388: | 264 | case 0x3388: |
265 | case 0x338c: | 265 | case 0x338c: |
266 | case 0x3382: | ||
267 | case 0x3386: | ||
268 | case 0x338a: | ||
269 | case 0x338e: | ||
270 | init_uart |= IOP13XX_INIT_UART_0; | 266 | init_uart |= IOP13XX_INIT_UART_0; |
271 | init_uart |= IOP13XX_INIT_UART_1; | 267 | init_uart |= IOP13XX_INIT_UART_1; |
272 | break; | 268 | break; |
diff --git a/arch/arm/mach-iop13xx/tpmi.c b/arch/arm/mach-iop13xx/tpmi.c new file mode 100644 index 000000000000..d3dc278213da --- /dev/null +++ b/arch/arm/mach-iop13xx/tpmi.c | |||
@@ -0,0 +1,234 @@ | |||
1 | /* | ||
2 | * iop13xx tpmi device resources | ||
3 | * Copyright (c) 2005-2006, Intel Corporation. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms and conditions of the GNU General Public License, | ||
7 | * version 2, as published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
12 | * more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License along with | ||
15 | * this program; if not, write to the Free Software Foundation, Inc., 59 Temple | ||
16 | * Place - Suite 330, Boston, MA 02111-1307 USA. | ||
17 | * | ||
18 | */ | ||
19 | |||
20 | #include <linux/kernel.h> | ||
21 | #include <linux/init.h> | ||
22 | #include <linux/platform_device.h> | ||
23 | #include <linux/dma-mapping.h> | ||
24 | #include <asm/io.h> | ||
25 | #include <asm/irq.h> | ||
26 | #include <asm/sizes.h> | ||
27 | |||
28 | /* assumes CONTROLLER_ONLY# is never asserted in the ESSR register */ | ||
29 | #define IOP13XX_TPMI_MMR(dev) IOP13XX_REG_ADDR32_PHYS(0x48000 + (dev << 12)) | ||
30 | #define IOP13XX_TPMI_MEM(dev) IOP13XX_REG_ADDR32_PHYS(0x60000 + (dev << 13)) | ||
31 | #define IOP13XX_TPMI_CTRL(dev) IOP13XX_REG_ADDR32_PHYS(0x50000 + (dev << 10)) | ||
32 | #define IOP13XX_TPMI_MMR_SIZE (SZ_4K - 1) | ||
33 | #define IOP13XX_TPMI_MEM_SIZE (255) | ||
34 | #define IOP13XX_TPMI_MEM_CTRL (SZ_1K - 1) | ||
35 | #define IOP13XX_TPMI_RESOURCE_MMR 0 | ||
36 | #define IOP13XX_TPMI_RESOURCE_MEM 1 | ||
37 | #define IOP13XX_TPMI_RESOURCE_CTRL 2 | ||
38 | #define IOP13XX_TPMI_RESOURCE_IRQ 3 | ||
39 | |||
40 | static struct resource iop13xx_tpmi_0_resources[] = { | ||
41 | [IOP13XX_TPMI_RESOURCE_MMR] = { | ||
42 | .start = IOP13XX_TPMI_MMR(4), /* tpmi0 starts at dev == 4 */ | ||
43 | .end = IOP13XX_TPMI_MMR(4) + IOP13XX_TPMI_MMR_SIZE, | ||
44 | .flags = IORESOURCE_MEM, | ||
45 | }, | ||
46 | [IOP13XX_TPMI_RESOURCE_MEM] = { | ||
47 | .start = IOP13XX_TPMI_MEM(0), | ||
48 | .end = IOP13XX_TPMI_MEM(0) + IOP13XX_TPMI_MEM_SIZE, | ||
49 | .flags = IORESOURCE_MEM, | ||
50 | }, | ||
51 | [IOP13XX_TPMI_RESOURCE_CTRL] = { | ||
52 | .start = IOP13XX_TPMI_CTRL(0), | ||
53 | .end = IOP13XX_TPMI_CTRL(0) + IOP13XX_TPMI_MEM_CTRL, | ||
54 | .flags = IORESOURCE_MEM, | ||
55 | }, | ||
56 | [IOP13XX_TPMI_RESOURCE_IRQ] = { | ||
57 | .start = IRQ_IOP13XX_TPMI0_OUT, | ||
58 | .end = IRQ_IOP13XX_TPMI0_OUT, | ||
59 | .flags = IORESOURCE_IRQ | ||
60 | } | ||
61 | }; | ||
62 | |||
63 | static struct resource iop13xx_tpmi_1_resources[] = { | ||
64 | [IOP13XX_TPMI_RESOURCE_MMR] = { | ||
65 | .start = IOP13XX_TPMI_MMR(1), | ||
66 | .end = IOP13XX_TPMI_MMR(1) + IOP13XX_TPMI_MMR_SIZE, | ||
67 | .flags = IORESOURCE_MEM, | ||
68 | }, | ||
69 | [IOP13XX_TPMI_RESOURCE_MEM] = { | ||
70 | .start = IOP13XX_TPMI_MEM(1), | ||
71 | .end = IOP13XX_TPMI_MEM(1) + IOP13XX_TPMI_MEM_SIZE, | ||
72 | .flags = IORESOURCE_MEM, | ||
73 | }, | ||
74 | [IOP13XX_TPMI_RESOURCE_CTRL] = { | ||
75 | .start = IOP13XX_TPMI_CTRL(1), | ||
76 | .end = IOP13XX_TPMI_CTRL(1) + IOP13XX_TPMI_MEM_CTRL, | ||
77 | .flags = IORESOURCE_MEM, | ||
78 | }, | ||
79 | [IOP13XX_TPMI_RESOURCE_IRQ] = { | ||
80 | .start = IRQ_IOP13XX_TPMI1_OUT, | ||
81 | .end = IRQ_IOP13XX_TPMI1_OUT, | ||
82 | .flags = IORESOURCE_IRQ | ||
83 | } | ||
84 | }; | ||
85 | |||
86 | static struct resource iop13xx_tpmi_2_resources[] = { | ||
87 | [IOP13XX_TPMI_RESOURCE_MMR] = { | ||
88 | .start = IOP13XX_TPMI_MMR(2), | ||
89 | .end = IOP13XX_TPMI_MMR(2) + IOP13XX_TPMI_MMR_SIZE, | ||
90 | .flags = IORESOURCE_MEM, | ||
91 | }, | ||
92 | [IOP13XX_TPMI_RESOURCE_MEM] = { | ||
93 | .start = IOP13XX_TPMI_MEM(2), | ||
94 | .end = IOP13XX_TPMI_MEM(2) + IOP13XX_TPMI_MEM_SIZE, | ||
95 | .flags = IORESOURCE_MEM, | ||
96 | }, | ||
97 | [IOP13XX_TPMI_RESOURCE_CTRL] = { | ||
98 | .start = IOP13XX_TPMI_CTRL(2), | ||
99 | .end = IOP13XX_TPMI_CTRL(2) + IOP13XX_TPMI_MEM_CTRL, | ||
100 | .flags = IORESOURCE_MEM, | ||
101 | }, | ||
102 | [IOP13XX_TPMI_RESOURCE_IRQ] = { | ||
103 | .start = IRQ_IOP13XX_TPMI2_OUT, | ||
104 | .end = IRQ_IOP13XX_TPMI2_OUT, | ||
105 | .flags = IORESOURCE_IRQ | ||
106 | } | ||
107 | }; | ||
108 | |||
109 | static struct resource iop13xx_tpmi_3_resources[] = { | ||
110 | [IOP13XX_TPMI_RESOURCE_MMR] = { | ||
111 | .start = IOP13XX_TPMI_MMR(3), | ||
112 | .end = IOP13XX_TPMI_MMR(3) + IOP13XX_TPMI_MMR_SIZE, | ||
113 | .flags = IORESOURCE_MEM, | ||
114 | }, | ||
115 | [IOP13XX_TPMI_RESOURCE_MEM] = { | ||
116 | .start = IOP13XX_TPMI_MEM(3), | ||
117 | .end = IOP13XX_TPMI_MEM(3) + IOP13XX_TPMI_MEM_SIZE, | ||
118 | .flags = IORESOURCE_MEM, | ||
119 | }, | ||
120 | [IOP13XX_TPMI_RESOURCE_CTRL] = { | ||
121 | .start = IOP13XX_TPMI_CTRL(3), | ||
122 | .end = IOP13XX_TPMI_CTRL(3) + IOP13XX_TPMI_MEM_CTRL, | ||
123 | .flags = IORESOURCE_MEM, | ||
124 | }, | ||
125 | [IOP13XX_TPMI_RESOURCE_IRQ] = { | ||
126 | .start = IRQ_IOP13XX_TPMI3_OUT, | ||
127 | .end = IRQ_IOP13XX_TPMI3_OUT, | ||
128 | .flags = IORESOURCE_IRQ | ||
129 | } | ||
130 | }; | ||
131 | |||
132 | u64 iop13xx_tpmi_mask = DMA_64BIT_MASK; | ||
133 | static struct platform_device iop13xx_tpmi_0_device = { | ||
134 | .name = "iop-tpmi", | ||
135 | .id = 0, | ||
136 | .num_resources = 4, | ||
137 | .resource = iop13xx_tpmi_0_resources, | ||
138 | .dev = { | ||
139 | .dma_mask = &iop13xx_tpmi_mask, | ||
140 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
141 | }, | ||
142 | }; | ||
143 | |||
144 | static struct platform_device iop13xx_tpmi_1_device = { | ||
145 | .name = "iop-tpmi", | ||
146 | .id = 1, | ||
147 | .num_resources = 4, | ||
148 | .resource = iop13xx_tpmi_1_resources, | ||
149 | .dev = { | ||
150 | .dma_mask = &iop13xx_tpmi_mask, | ||
151 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
152 | }, | ||
153 | }; | ||
154 | |||
155 | static struct platform_device iop13xx_tpmi_2_device = { | ||
156 | .name = "iop-tpmi", | ||
157 | .id = 2, | ||
158 | .num_resources = 4, | ||
159 | .resource = iop13xx_tpmi_2_resources, | ||
160 | .dev = { | ||
161 | .dma_mask = &iop13xx_tpmi_mask, | ||
162 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
163 | }, | ||
164 | }; | ||
165 | |||
166 | static struct platform_device iop13xx_tpmi_3_device = { | ||
167 | .name = "iop-tpmi", | ||
168 | .id = 3, | ||
169 | .num_resources = 4, | ||
170 | .resource = iop13xx_tpmi_3_resources, | ||
171 | .dev = { | ||
172 | .dma_mask = &iop13xx_tpmi_mask, | ||
173 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
174 | }, | ||
175 | }; | ||
176 | |||
177 | __init void iop13xx_add_tpmi_devices(void) | ||
178 | { | ||
179 | unsigned short device_id; | ||
180 | |||
181 | /* tpmi's not present on iop341 or iop342 */ | ||
182 | if (__raw_readl(IOP13XX_ESSR0) & IOP13XX_INTERFACE_SEL_PCIX) | ||
183 | /* ATUE must be present */ | ||
184 | device_id = __raw_readw(IOP13XX_ATUE_DID); | ||
185 | else | ||
186 | /* ATUX must be present */ | ||
187 | device_id = __raw_readw(IOP13XX_ATUX_DID); | ||
188 | |||
189 | switch (device_id) { | ||
190 | /* iop34[1|2] 0-tpmi */ | ||
191 | case 0x3380: | ||
192 | case 0x3384: | ||
193 | case 0x3388: | ||
194 | case 0x338c: | ||
195 | case 0x3382: | ||
196 | case 0x3386: | ||
197 | case 0x338a: | ||
198 | case 0x338e: | ||
199 | return; | ||
200 | /* iop348 1-tpmi */ | ||
201 | case 0x3310: | ||
202 | case 0x3312: | ||
203 | case 0x3314: | ||
204 | case 0x3318: | ||
205 | case 0x331a: | ||
206 | case 0x331c: | ||
207 | case 0x33c0: | ||
208 | case 0x33c2: | ||
209 | case 0x33c4: | ||
210 | case 0x33c8: | ||
211 | case 0x33ca: | ||
212 | case 0x33cc: | ||
213 | case 0x33b0: | ||
214 | case 0x33b2: | ||
215 | case 0x33b4: | ||
216 | case 0x33b8: | ||
217 | case 0x33ba: | ||
218 | case 0x33bc: | ||
219 | case 0x3320: | ||
220 | case 0x3322: | ||
221 | case 0x3324: | ||
222 | case 0x3328: | ||
223 | case 0x332a: | ||
224 | case 0x332c: | ||
225 | platform_device_register(&iop13xx_tpmi_0_device); | ||
226 | return; | ||
227 | default: | ||
228 | platform_device_register(&iop13xx_tpmi_0_device); | ||
229 | platform_device_register(&iop13xx_tpmi_1_device); | ||
230 | platform_device_register(&iop13xx_tpmi_2_device); | ||
231 | platform_device_register(&iop13xx_tpmi_3_device); | ||
232 | return; | ||
233 | } | ||
234 | } | ||