10d305464SGeert Uytterhoeven /*
20d305464SGeert Uytterhoeven * Copyright (C) 2007-2009 Geert Uytterhoeven
30d305464SGeert Uytterhoeven *
40d305464SGeert Uytterhoeven * This file is subject to the terms and conditions of the GNU General Public
50d305464SGeert Uytterhoeven * License. See the file COPYING in the main directory of this archive
60d305464SGeert Uytterhoeven * for more details.
70d305464SGeert Uytterhoeven */
80d305464SGeert Uytterhoeven
9eeed2279SGeert Uytterhoeven #include <linux/err.h>
100d305464SGeert Uytterhoeven #include <linux/init.h>
110d305464SGeert Uytterhoeven #include <linux/platform_device.h>
120d305464SGeert Uytterhoeven #include <linux/zorro.h>
130d305464SGeert Uytterhoeven
140d305464SGeert Uytterhoeven #include <asm/amigahw.h>
159aed2302SGeert Uytterhoeven #include <asm/amigayle.h>
16bd9ba8f4SGeert Uytterhoeven #include <asm/byteorder.h>
170d305464SGeert Uytterhoeven
180d305464SGeert Uytterhoeven
190d305464SGeert Uytterhoeven #ifdef CONFIG_ZORRO
200d305464SGeert Uytterhoeven
210d305464SGeert Uytterhoeven static const struct resource zorro_resources[] __initconst = {
220d305464SGeert Uytterhoeven /* Zorro II regions (on Zorro II/III) */
230d305464SGeert Uytterhoeven {
240d305464SGeert Uytterhoeven .name = "Zorro II exp",
250d305464SGeert Uytterhoeven .start = 0x00e80000,
260d305464SGeert Uytterhoeven .end = 0x00efffff,
270d305464SGeert Uytterhoeven .flags = IORESOURCE_MEM,
280d305464SGeert Uytterhoeven }, {
290d305464SGeert Uytterhoeven .name = "Zorro II mem",
300d305464SGeert Uytterhoeven .start = 0x00200000,
310d305464SGeert Uytterhoeven .end = 0x009fffff,
320d305464SGeert Uytterhoeven .flags = IORESOURCE_MEM,
330d305464SGeert Uytterhoeven },
340d305464SGeert Uytterhoeven /* Zorro III regions (on Zorro III only) */
350d305464SGeert Uytterhoeven {
360d305464SGeert Uytterhoeven .name = "Zorro III exp",
370d305464SGeert Uytterhoeven .start = 0xff000000,
380d305464SGeert Uytterhoeven .end = 0xffffffff,
390d305464SGeert Uytterhoeven .flags = IORESOURCE_MEM,
400d305464SGeert Uytterhoeven }, {
410d305464SGeert Uytterhoeven .name = "Zorro III cfg",
420d305464SGeert Uytterhoeven .start = 0x40000000,
430d305464SGeert Uytterhoeven .end = 0x7fffffff,
440d305464SGeert Uytterhoeven .flags = IORESOURCE_MEM,
450d305464SGeert Uytterhoeven }
460d305464SGeert Uytterhoeven };
470d305464SGeert Uytterhoeven
480d305464SGeert Uytterhoeven
amiga_init_bus(void)490d305464SGeert Uytterhoeven static int __init amiga_init_bus(void)
500d305464SGeert Uytterhoeven {
51eeed2279SGeert Uytterhoeven struct platform_device *pdev;
52eeed2279SGeert Uytterhoeven unsigned int n;
53eeed2279SGeert Uytterhoeven
540d305464SGeert Uytterhoeven if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(ZORRO))
550d305464SGeert Uytterhoeven return -ENODEV;
560d305464SGeert Uytterhoeven
57eeed2279SGeert Uytterhoeven n = AMIGAHW_PRESENT(ZORRO3) ? 4 : 2;
58eeed2279SGeert Uytterhoeven pdev = platform_device_register_simple("amiga-zorro", -1,
59eeed2279SGeert Uytterhoeven zorro_resources, n);
608c6ffba0SRusty Russell return PTR_ERR_OR_ZERO(pdev);
610d305464SGeert Uytterhoeven }
620d305464SGeert Uytterhoeven
630d305464SGeert Uytterhoeven subsys_initcall(amiga_init_bus);
640d305464SGeert Uytterhoeven
659aed2302SGeert Uytterhoeven
z_dev_present(zorro_id id)66943ce308SGeert Uytterhoeven static int __init z_dev_present(zorro_id id)
679aed2302SGeert Uytterhoeven {
689aed2302SGeert Uytterhoeven unsigned int i;
699aed2302SGeert Uytterhoeven
70bd9ba8f4SGeert Uytterhoeven for (i = 0; i < zorro_num_autocon; i++) {
71bd9ba8f4SGeert Uytterhoeven const struct ExpansionRom *rom = &zorro_autocon_init[i].rom;
72bd9ba8f4SGeert Uytterhoeven if (be16_to_cpu(rom->er_Manufacturer) == ZORRO_MANUF(id) &&
73bd9ba8f4SGeert Uytterhoeven rom->er_Product == ZORRO_PROD(id))
749aed2302SGeert Uytterhoeven return 1;
75bd9ba8f4SGeert Uytterhoeven }
769aed2302SGeert Uytterhoeven
779aed2302SGeert Uytterhoeven return 0;
789aed2302SGeert Uytterhoeven }
799aed2302SGeert Uytterhoeven
809aed2302SGeert Uytterhoeven #else /* !CONFIG_ZORRO */
819aed2302SGeert Uytterhoeven
z_dev_present(zorro_id id)829aed2302SGeert Uytterhoeven static inline int z_dev_present(zorro_id id) { return 0; }
839aed2302SGeert Uytterhoeven
849aed2302SGeert Uytterhoeven #endif /* !CONFIG_ZORRO */
85fa6688e1SGeert Uytterhoeven
86fa6688e1SGeert Uytterhoeven
87c2a24a4cSGeert Uytterhoeven static const struct resource a3000_scsi_resource __initconst = {
88c2a24a4cSGeert Uytterhoeven .start = 0xdd0000,
89c2a24a4cSGeert Uytterhoeven .end = 0xdd00ff,
90c2a24a4cSGeert Uytterhoeven .flags = IORESOURCE_MEM,
91c2a24a4cSGeert Uytterhoeven };
92c2a24a4cSGeert Uytterhoeven
93c2a24a4cSGeert Uytterhoeven
94a24a6b22SGeert Uytterhoeven static const struct resource a4000t_scsi_resource __initconst = {
95a24a6b22SGeert Uytterhoeven .start = 0xdd0000,
96a24a6b22SGeert Uytterhoeven .end = 0xdd0fff,
97a24a6b22SGeert Uytterhoeven .flags = IORESOURCE_MEM,
98a24a6b22SGeert Uytterhoeven };
99a24a6b22SGeert Uytterhoeven
100a24a6b22SGeert Uytterhoeven
1019aed2302SGeert Uytterhoeven static const struct resource a1200_ide_resource __initconst = {
1029aed2302SGeert Uytterhoeven .start = 0xda0000,
1039aed2302SGeert Uytterhoeven .end = 0xda1fff,
1049aed2302SGeert Uytterhoeven .flags = IORESOURCE_MEM,
1059aed2302SGeert Uytterhoeven };
1069aed2302SGeert Uytterhoeven
1079aed2302SGeert Uytterhoeven static const struct gayle_ide_platform_data a1200_ide_pdata __initconst = {
1089aed2302SGeert Uytterhoeven .base = 0xda0000,
1099aed2302SGeert Uytterhoeven .irqport = 0xda9000,
1109aed2302SGeert Uytterhoeven .explicit_ack = 1,
1119aed2302SGeert Uytterhoeven };
1129aed2302SGeert Uytterhoeven
1139aed2302SGeert Uytterhoeven
1149aed2302SGeert Uytterhoeven static const struct resource a4000_ide_resource __initconst = {
1159aed2302SGeert Uytterhoeven .start = 0xdd2000,
1169aed2302SGeert Uytterhoeven .end = 0xdd3fff,
1179aed2302SGeert Uytterhoeven .flags = IORESOURCE_MEM,
1189aed2302SGeert Uytterhoeven };
1199aed2302SGeert Uytterhoeven
1209aed2302SGeert Uytterhoeven static const struct gayle_ide_platform_data a4000_ide_pdata __initconst = {
1219aed2302SGeert Uytterhoeven .base = 0xdd2020,
1229aed2302SGeert Uytterhoeven .irqport = 0xdd3020,
1239aed2302SGeert Uytterhoeven .explicit_ack = 0,
1249aed2302SGeert Uytterhoeven };
1259aed2302SGeert Uytterhoeven
1269aed2302SGeert Uytterhoeven
1270779c862SGeert Uytterhoeven static const struct resource amiga_rtc_resource __initconst = {
1280779c862SGeert Uytterhoeven .start = 0x00dc0000,
1290779c862SGeert Uytterhoeven .end = 0x00dcffff,
1300779c862SGeert Uytterhoeven .flags = IORESOURCE_MEM,
1310779c862SGeert Uytterhoeven };
1320779c862SGeert Uytterhoeven
1330779c862SGeert Uytterhoeven
amiga_init_devices(void)134fa6688e1SGeert Uytterhoeven static int __init amiga_init_devices(void)
135fa6688e1SGeert Uytterhoeven {
1369aed2302SGeert Uytterhoeven struct platform_device *pdev;
137eeed2279SGeert Uytterhoeven int error;
1389aed2302SGeert Uytterhoeven
139fa6688e1SGeert Uytterhoeven if (!MACH_IS_AMIGA)
140fa6688e1SGeert Uytterhoeven return -ENODEV;
141fa6688e1SGeert Uytterhoeven
142fa6688e1SGeert Uytterhoeven /* video hardware */
143eeed2279SGeert Uytterhoeven if (AMIGAHW_PRESENT(AMI_VIDEO)) {
144eeed2279SGeert Uytterhoeven pdev = platform_device_register_simple("amiga-video", -1, NULL,
145eeed2279SGeert Uytterhoeven 0);
146eeed2279SGeert Uytterhoeven if (IS_ERR(pdev))
147eeed2279SGeert Uytterhoeven return PTR_ERR(pdev);
148eeed2279SGeert Uytterhoeven }
149fa6688e1SGeert Uytterhoeven
150ff2db7c5SGeert Uytterhoeven
151ff2db7c5SGeert Uytterhoeven /* sound hardware */
152eeed2279SGeert Uytterhoeven if (AMIGAHW_PRESENT(AMI_AUDIO)) {
153eeed2279SGeert Uytterhoeven pdev = platform_device_register_simple("amiga-audio", -1, NULL,
154eeed2279SGeert Uytterhoeven 0);
155eeed2279SGeert Uytterhoeven if (IS_ERR(pdev))
156eeed2279SGeert Uytterhoeven return PTR_ERR(pdev);
157eeed2279SGeert Uytterhoeven }
158ff2db7c5SGeert Uytterhoeven
15992183b34SGeert Uytterhoeven
16092183b34SGeert Uytterhoeven /* storage interfaces */
161eeed2279SGeert Uytterhoeven if (AMIGAHW_PRESENT(AMI_FLOPPY)) {
162eeed2279SGeert Uytterhoeven pdev = platform_device_register_simple("amiga-floppy", -1,
163eeed2279SGeert Uytterhoeven NULL, 0);
164eeed2279SGeert Uytterhoeven if (IS_ERR(pdev))
165eeed2279SGeert Uytterhoeven return PTR_ERR(pdev);
166eeed2279SGeert Uytterhoeven }
16792183b34SGeert Uytterhoeven
168eeed2279SGeert Uytterhoeven if (AMIGAHW_PRESENT(A3000_SCSI)) {
169eeed2279SGeert Uytterhoeven pdev = platform_device_register_simple("amiga-a3000-scsi", -1,
170c2a24a4cSGeert Uytterhoeven &a3000_scsi_resource, 1);
171eeed2279SGeert Uytterhoeven if (IS_ERR(pdev))
172eeed2279SGeert Uytterhoeven return PTR_ERR(pdev);
173eeed2279SGeert Uytterhoeven }
174c2a24a4cSGeert Uytterhoeven
175eeed2279SGeert Uytterhoeven if (AMIGAHW_PRESENT(A4000_SCSI)) {
176eeed2279SGeert Uytterhoeven pdev = platform_device_register_simple("amiga-a4000t-scsi", -1,
177eeed2279SGeert Uytterhoeven &a4000t_scsi_resource,
178eeed2279SGeert Uytterhoeven 1);
179eeed2279SGeert Uytterhoeven if (IS_ERR(pdev))
180eeed2279SGeert Uytterhoeven return PTR_ERR(pdev);
181eeed2279SGeert Uytterhoeven }
182a24a6b22SGeert Uytterhoeven
1839aed2302SGeert Uytterhoeven if (AMIGAHW_PRESENT(A1200_IDE) ||
1849aed2302SGeert Uytterhoeven z_dev_present(ZORRO_PROD_MTEC_VIPER_MK_V_E_MATRIX_530_SCSI_IDE)) {
1859aed2302SGeert Uytterhoeven pdev = platform_device_register_simple("amiga-gayle-ide", -1,
1869aed2302SGeert Uytterhoeven &a1200_ide_resource, 1);
187eeed2279SGeert Uytterhoeven if (IS_ERR(pdev))
188eeed2279SGeert Uytterhoeven return PTR_ERR(pdev);
189eeed2279SGeert Uytterhoeven error = platform_device_add_data(pdev, &a1200_ide_pdata,
1909aed2302SGeert Uytterhoeven sizeof(a1200_ide_pdata));
191eeed2279SGeert Uytterhoeven if (error)
192eeed2279SGeert Uytterhoeven return error;
1939aed2302SGeert Uytterhoeven }
1949aed2302SGeert Uytterhoeven
1959aed2302SGeert Uytterhoeven if (AMIGAHW_PRESENT(A4000_IDE)) {
1969aed2302SGeert Uytterhoeven pdev = platform_device_register_simple("amiga-gayle-ide", -1,
1979aed2302SGeert Uytterhoeven &a4000_ide_resource, 1);
198eeed2279SGeert Uytterhoeven if (IS_ERR(pdev))
199eeed2279SGeert Uytterhoeven return PTR_ERR(pdev);
200eeed2279SGeert Uytterhoeven error = platform_device_add_data(pdev, &a4000_ide_pdata,
2019aed2302SGeert Uytterhoeven sizeof(a4000_ide_pdata));
202eeed2279SGeert Uytterhoeven if (error)
203eeed2279SGeert Uytterhoeven return error;
2049aed2302SGeert Uytterhoeven }
2059aed2302SGeert Uytterhoeven
2065121c717SGeert Uytterhoeven
2075121c717SGeert Uytterhoeven /* other I/O hardware */
208eeed2279SGeert Uytterhoeven if (AMIGAHW_PRESENT(AMI_KEYBOARD)) {
209eeed2279SGeert Uytterhoeven pdev = platform_device_register_simple("amiga-keyboard", -1,
210eeed2279SGeert Uytterhoeven NULL, 0);
211eeed2279SGeert Uytterhoeven if (IS_ERR(pdev))
212eeed2279SGeert Uytterhoeven return PTR_ERR(pdev);
213eeed2279SGeert Uytterhoeven }
2145121c717SGeert Uytterhoeven
215eeed2279SGeert Uytterhoeven if (AMIGAHW_PRESENT(AMI_MOUSE)) {
216eeed2279SGeert Uytterhoeven pdev = platform_device_register_simple("amiga-mouse", -1, NULL,
217eeed2279SGeert Uytterhoeven 0);
218eeed2279SGeert Uytterhoeven if (IS_ERR(pdev))
219eeed2279SGeert Uytterhoeven return PTR_ERR(pdev);
220eeed2279SGeert Uytterhoeven }
221314c926fSGeert Uytterhoeven
222eeed2279SGeert Uytterhoeven if (AMIGAHW_PRESENT(AMI_SERIAL)) {
223eeed2279SGeert Uytterhoeven pdev = platform_device_register_simple("amiga-serial", -1,
224eeed2279SGeert Uytterhoeven NULL, 0);
225eeed2279SGeert Uytterhoeven if (IS_ERR(pdev))
226eeed2279SGeert Uytterhoeven return PTR_ERR(pdev);
227eeed2279SGeert Uytterhoeven }
228826e8c8cSGeert Uytterhoeven
229eeed2279SGeert Uytterhoeven if (AMIGAHW_PRESENT(AMI_PARALLEL)) {
230eeed2279SGeert Uytterhoeven pdev = platform_device_register_simple("amiga-parallel", -1,
231eeed2279SGeert Uytterhoeven NULL, 0);
232eeed2279SGeert Uytterhoeven if (IS_ERR(pdev))
233eeed2279SGeert Uytterhoeven return PTR_ERR(pdev);
234eeed2279SGeert Uytterhoeven }
2356f8221c2SGeert Uytterhoeven
2360779c862SGeert Uytterhoeven
2370779c862SGeert Uytterhoeven /* real time clocks */
238eeed2279SGeert Uytterhoeven if (AMIGAHW_PRESENT(A2000_CLK)) {
239eeed2279SGeert Uytterhoeven pdev = platform_device_register_simple("rtc-msm6242", -1,
2400779c862SGeert Uytterhoeven &amiga_rtc_resource, 1);
241eeed2279SGeert Uytterhoeven if (IS_ERR(pdev))
242eeed2279SGeert Uytterhoeven return PTR_ERR(pdev);
243eeed2279SGeert Uytterhoeven }
2440779c862SGeert Uytterhoeven
245eeed2279SGeert Uytterhoeven if (AMIGAHW_PRESENT(A3000_CLK)) {
246eeed2279SGeert Uytterhoeven pdev = platform_device_register_simple("rtc-rp5c01", -1,
2470779c862SGeert Uytterhoeven &amiga_rtc_resource, 1);
248eeed2279SGeert Uytterhoeven if (IS_ERR(pdev))
249eeed2279SGeert Uytterhoeven return PTR_ERR(pdev);
250eeed2279SGeert Uytterhoeven }
2510779c862SGeert Uytterhoeven
252fa6688e1SGeert Uytterhoeven return 0;
253fa6688e1SGeert Uytterhoeven }
254fa6688e1SGeert Uytterhoeven
255e2b56288SGeert Uytterhoeven arch_initcall(amiga_init_devices);
256