xref: /openbmc/linux/arch/m68k/amiga/platform.c (revision bd9ba8f4)
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