xref: /openbmc/linux/arch/m68k/virt/platform.c (revision 05d51e42)
1*05d51e42SLaurent Vivier // SPDX-License-Identifier: GPL-2.0
2*05d51e42SLaurent Vivier 
3*05d51e42SLaurent Vivier #include <linux/platform_device.h>
4*05d51e42SLaurent Vivier #include <linux/interrupt.h>
5*05d51e42SLaurent Vivier #include <linux/memblock.h>
6*05d51e42SLaurent Vivier #include <asm/virt.h>
7*05d51e42SLaurent Vivier #include <asm/irq.h>
8*05d51e42SLaurent Vivier 
9*05d51e42SLaurent Vivier #define VIRTIO_BUS_NB	128
10*05d51e42SLaurent Vivier 
11*05d51e42SLaurent Vivier static int __init virt_virtio_init(unsigned int id)
12*05d51e42SLaurent Vivier {
13*05d51e42SLaurent Vivier 	const struct resource res[] = {
14*05d51e42SLaurent Vivier 		DEFINE_RES_MEM(virt_bi_data.virtio.mmio + id * 0x200, 0x200),
15*05d51e42SLaurent Vivier 		DEFINE_RES_IRQ(virt_bi_data.virtio.irq + id),
16*05d51e42SLaurent Vivier 	};
17*05d51e42SLaurent Vivier 	struct platform_device *pdev;
18*05d51e42SLaurent Vivier 
19*05d51e42SLaurent Vivier 	pdev = platform_device_register_simple("virtio-mmio", id,
20*05d51e42SLaurent Vivier 					       res, ARRAY_SIZE(res));
21*05d51e42SLaurent Vivier 	if (IS_ERR(pdev))
22*05d51e42SLaurent Vivier 		return PTR_ERR(pdev);
23*05d51e42SLaurent Vivier 
24*05d51e42SLaurent Vivier 	return 0;
25*05d51e42SLaurent Vivier }
26*05d51e42SLaurent Vivier 
27*05d51e42SLaurent Vivier static int __init virt_platform_init(void)
28*05d51e42SLaurent Vivier {
29*05d51e42SLaurent Vivier 	const struct resource goldfish_tty_res[] = {
30*05d51e42SLaurent Vivier 		DEFINE_RES_MEM(virt_bi_data.tty.mmio, 1),
31*05d51e42SLaurent Vivier 		DEFINE_RES_IRQ(virt_bi_data.tty.irq),
32*05d51e42SLaurent Vivier 	};
33*05d51e42SLaurent Vivier 	/* this is the second gf-rtc, the first one is used by the scheduler */
34*05d51e42SLaurent Vivier 	const struct resource goldfish_rtc_res[] = {
35*05d51e42SLaurent Vivier 		DEFINE_RES_MEM(virt_bi_data.rtc.mmio + 0x1000, 0x1000),
36*05d51e42SLaurent Vivier 		DEFINE_RES_IRQ(virt_bi_data.rtc.irq + 1),
37*05d51e42SLaurent Vivier 	};
38*05d51e42SLaurent Vivier 	struct platform_device *pdev;
39*05d51e42SLaurent Vivier 	unsigned int i;
40*05d51e42SLaurent Vivier 
41*05d51e42SLaurent Vivier 	if (!MACH_IS_VIRT)
42*05d51e42SLaurent Vivier 		return -ENODEV;
43*05d51e42SLaurent Vivier 
44*05d51e42SLaurent Vivier 	/* We need this to have DMA'able memory provided to goldfish-tty */
45*05d51e42SLaurent Vivier 	min_low_pfn = 0;
46*05d51e42SLaurent Vivier 
47*05d51e42SLaurent Vivier 	pdev = platform_device_register_simple("goldfish_tty",
48*05d51e42SLaurent Vivier 					       PLATFORM_DEVID_NONE,
49*05d51e42SLaurent Vivier 					       goldfish_tty_res,
50*05d51e42SLaurent Vivier 					       ARRAY_SIZE(goldfish_tty_res));
51*05d51e42SLaurent Vivier 	if (IS_ERR(pdev))
52*05d51e42SLaurent Vivier 		return PTR_ERR(pdev);
53*05d51e42SLaurent Vivier 
54*05d51e42SLaurent Vivier 	pdev = platform_device_register_simple("goldfish_rtc",
55*05d51e42SLaurent Vivier 					       PLATFORM_DEVID_NONE,
56*05d51e42SLaurent Vivier 					       goldfish_rtc_res,
57*05d51e42SLaurent Vivier 					       ARRAY_SIZE(goldfish_rtc_res));
58*05d51e42SLaurent Vivier 	if (IS_ERR(pdev))
59*05d51e42SLaurent Vivier 		return PTR_ERR(pdev);
60*05d51e42SLaurent Vivier 
61*05d51e42SLaurent Vivier 	for (i = 0; i < VIRTIO_BUS_NB; i++) {
62*05d51e42SLaurent Vivier 		int err;
63*05d51e42SLaurent Vivier 
64*05d51e42SLaurent Vivier 		err = virt_virtio_init(i);
65*05d51e42SLaurent Vivier 		if (err)
66*05d51e42SLaurent Vivier 			return err;
67*05d51e42SLaurent Vivier 	}
68*05d51e42SLaurent Vivier 
69*05d51e42SLaurent Vivier 	return 0;
70*05d51e42SLaurent Vivier }
71*05d51e42SLaurent Vivier 
72*05d51e42SLaurent Vivier arch_initcall(virt_platform_init);
73