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