allwinner-a10.c (9bdee7f4a5b45f0240c9296fe0daacb6c08f247c) | allwinner-a10.c (db873cc5d1a4aaa67eea87768d504b2f89d88738) |
---|---|
1/* 2 * Allwinner A10 SoC emulation 3 * 4 * Copyright (C) 2013 Li Guang 5 * Written by Li Guang <lig.fnst@cn.fujitsu.com> 6 * 7 * This program is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License as published by the --- 30 unchanged lines hidden (view full) --- 39 40static void aw_a10_init(Object *obj) 41{ 42 AwA10State *s = AW_A10(obj); 43 44 object_initialize_child(obj, "cpu", &s->cpu, 45 ARM_CPU_TYPE_NAME("cortex-a8")); 46 | 1/* 2 * Allwinner A10 SoC emulation 3 * 4 * Copyright (C) 2013 Li Guang 5 * Written by Li Guang <lig.fnst@cn.fujitsu.com> 6 * 7 * This program is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License as published by the --- 30 unchanged lines hidden (view full) --- 39 40static void aw_a10_init(Object *obj) 41{ 42 AwA10State *s = AW_A10(obj); 43 44 object_initialize_child(obj, "cpu", &s->cpu, 45 ARM_CPU_TYPE_NAME("cortex-a8")); 46 |
47 sysbus_init_child_obj(obj, "intc", &s->intc, sizeof(s->intc), 48 TYPE_AW_A10_PIC); | 47 object_initialize_child(obj, "intc", &s->intc, TYPE_AW_A10_PIC); |
49 | 48 |
50 sysbus_init_child_obj(obj, "timer", &s->timer, sizeof(s->timer), 51 TYPE_AW_A10_PIT); | 49 object_initialize_child(obj, "timer", &s->timer, TYPE_AW_A10_PIT); |
52 | 50 |
53 sysbus_init_child_obj(obj, "emac", &s->emac, sizeof(s->emac), TYPE_AW_EMAC); | 51 object_initialize_child(obj, "emac", &s->emac, TYPE_AW_EMAC); |
54 | 52 |
55 sysbus_init_child_obj(obj, "sata", &s->sata, sizeof(s->sata), 56 TYPE_ALLWINNER_AHCI); | 53 object_initialize_child(obj, "sata", &s->sata, TYPE_ALLWINNER_AHCI); |
57 58 if (machine_usb(current_machine)) { 59 int i; 60 61 for (i = 0; i < AW_A10_NUM_USB; i++) { | 54 55 if (machine_usb(current_machine)) { 56 int i; 57 58 for (i = 0; i < AW_A10_NUM_USB; i++) { |
62 sysbus_init_child_obj(obj, "ehci[*]", &s->ehci[i], 63 sizeof(s->ehci[i]), TYPE_PLATFORM_EHCI); 64 sysbus_init_child_obj(obj, "ohci[*]", &s->ohci[i], 65 sizeof(s->ohci[i]), TYPE_SYSBUS_OHCI); | 59 object_initialize_child(obj, "ehci[*]", &s->ehci[i], 60 TYPE_PLATFORM_EHCI); 61 object_initialize_child(obj, "ohci[*]", &s->ohci[i], 62 TYPE_SYSBUS_OHCI); |
66 } 67 } 68 | 63 } 64 } 65 |
69 sysbus_init_child_obj(obj, "mmc0", &s->mmc0, sizeof(s->mmc0), 70 TYPE_AW_SDHOST_SUN4I); | 66 object_initialize_child(obj, "mmc0", &s->mmc0, TYPE_AW_SDHOST_SUN4I); |
71 | 67 |
72 sysbus_init_child_obj(obj, "rtc", &s->rtc, sizeof(s->rtc), 73 TYPE_AW_RTC_SUN4I); | 68 object_initialize_child(obj, "rtc", &s->rtc, TYPE_AW_RTC_SUN4I); |
74} 75 76static void aw_a10_realize(DeviceState *dev, Error **errp) 77{ 78 AwA10State *s = AW_A10(dev); 79 SysBusDevice *sysbusdev; 80 Error *err = NULL; 81 82 object_property_set_bool(OBJECT(&s->cpu), true, "realized", &err); 83 if (err != NULL) { 84 error_propagate(errp, err); 85 return; 86 } 87 | 69} 70 71static void aw_a10_realize(DeviceState *dev, Error **errp) 72{ 73 AwA10State *s = AW_A10(dev); 74 SysBusDevice *sysbusdev; 75 Error *err = NULL; 76 77 object_property_set_bool(OBJECT(&s->cpu), true, "realized", &err); 78 if (err != NULL) { 79 error_propagate(errp, err); 80 return; 81 } 82 |
88 object_property_set_bool(OBJECT(&s->intc), true, "realized", &err); | 83 sysbus_realize(SYS_BUS_DEVICE(&s->intc), &err); |
89 if (err != NULL) { 90 error_propagate(errp, err); 91 return; 92 } 93 sysbusdev = SYS_BUS_DEVICE(&s->intc); 94 sysbus_mmio_map(sysbusdev, 0, AW_A10_PIC_REG_BASE); 95 sysbus_connect_irq(sysbusdev, 0, 96 qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_IRQ)); 97 sysbus_connect_irq(sysbusdev, 1, 98 qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ)); 99 qdev_pass_gpios(DEVICE(&s->intc), dev, NULL); 100 | 84 if (err != NULL) { 85 error_propagate(errp, err); 86 return; 87 } 88 sysbusdev = SYS_BUS_DEVICE(&s->intc); 89 sysbus_mmio_map(sysbusdev, 0, AW_A10_PIC_REG_BASE); 90 sysbus_connect_irq(sysbusdev, 0, 91 qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_IRQ)); 92 sysbus_connect_irq(sysbusdev, 1, 93 qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ)); 94 qdev_pass_gpios(DEVICE(&s->intc), dev, NULL); 95 |
101 object_property_set_bool(OBJECT(&s->timer), true, "realized", &err); | 96 sysbus_realize(SYS_BUS_DEVICE(&s->timer), &err); |
102 if (err != NULL) { 103 error_propagate(errp, err); 104 return; 105 } 106 sysbusdev = SYS_BUS_DEVICE(&s->timer); 107 sysbus_mmio_map(sysbusdev, 0, AW_A10_PIT_REG_BASE); 108 sysbus_connect_irq(sysbusdev, 0, qdev_get_gpio_in(dev, 22)); 109 sysbus_connect_irq(sysbusdev, 1, qdev_get_gpio_in(dev, 23)); --- 7 unchanged lines hidden (view full) --- 117 memory_region_add_subregion(get_system_memory(), 0x00000000, &s->sram_a); 118 create_unimplemented_device("a10-sram-ctrl", 0x01c00000, 4 * KiB); 119 120 /* FIXME use qdev NIC properties instead of nd_table[] */ 121 if (nd_table[0].used) { 122 qemu_check_nic_model(&nd_table[0], TYPE_AW_EMAC); 123 qdev_set_nic_properties(DEVICE(&s->emac), &nd_table[0]); 124 } | 97 if (err != NULL) { 98 error_propagate(errp, err); 99 return; 100 } 101 sysbusdev = SYS_BUS_DEVICE(&s->timer); 102 sysbus_mmio_map(sysbusdev, 0, AW_A10_PIT_REG_BASE); 103 sysbus_connect_irq(sysbusdev, 0, qdev_get_gpio_in(dev, 22)); 104 sysbus_connect_irq(sysbusdev, 1, qdev_get_gpio_in(dev, 23)); --- 7 unchanged lines hidden (view full) --- 112 memory_region_add_subregion(get_system_memory(), 0x00000000, &s->sram_a); 113 create_unimplemented_device("a10-sram-ctrl", 0x01c00000, 4 * KiB); 114 115 /* FIXME use qdev NIC properties instead of nd_table[] */ 116 if (nd_table[0].used) { 117 qemu_check_nic_model(&nd_table[0], TYPE_AW_EMAC); 118 qdev_set_nic_properties(DEVICE(&s->emac), &nd_table[0]); 119 } |
125 object_property_set_bool(OBJECT(&s->emac), true, "realized", &err); | 120 sysbus_realize(SYS_BUS_DEVICE(&s->emac), &err); |
126 if (err != NULL) { 127 error_propagate(errp, err); 128 return; 129 } 130 sysbusdev = SYS_BUS_DEVICE(&s->emac); 131 sysbus_mmio_map(sysbusdev, 0, AW_A10_EMAC_BASE); 132 sysbus_connect_irq(sysbusdev, 0, qdev_get_gpio_in(dev, 55)); 133 | 121 if (err != NULL) { 122 error_propagate(errp, err); 123 return; 124 } 125 sysbusdev = SYS_BUS_DEVICE(&s->emac); 126 sysbus_mmio_map(sysbusdev, 0, AW_A10_EMAC_BASE); 127 sysbus_connect_irq(sysbusdev, 0, qdev_get_gpio_in(dev, 55)); 128 |
134 object_property_set_bool(OBJECT(&s->sata), true, "realized", &err); | 129 sysbus_realize(SYS_BUS_DEVICE(&s->sata), &err); |
135 if (err) { 136 error_propagate(errp, err); 137 return; 138 } 139 sysbus_mmio_map(SYS_BUS_DEVICE(&s->sata), 0, AW_A10_SATA_BASE); 140 sysbus_connect_irq(SYS_BUS_DEVICE(&s->sata), 0, qdev_get_gpio_in(dev, 56)); 141 142 /* FIXME use a qdev chardev prop instead of serial_hd() */ --- 6 unchanged lines hidden (view full) --- 149 150 for (i = 0; i < AW_A10_NUM_USB; i++) { 151 char bus[16]; 152 153 sprintf(bus, "usb-bus.%d", i); 154 155 object_property_set_bool(OBJECT(&s->ehci[i]), true, 156 "companion-enable", &error_fatal); | 130 if (err) { 131 error_propagate(errp, err); 132 return; 133 } 134 sysbus_mmio_map(SYS_BUS_DEVICE(&s->sata), 0, AW_A10_SATA_BASE); 135 sysbus_connect_irq(SYS_BUS_DEVICE(&s->sata), 0, qdev_get_gpio_in(dev, 56)); 136 137 /* FIXME use a qdev chardev prop instead of serial_hd() */ --- 6 unchanged lines hidden (view full) --- 144 145 for (i = 0; i < AW_A10_NUM_USB; i++) { 146 char bus[16]; 147 148 sprintf(bus, "usb-bus.%d", i); 149 150 object_property_set_bool(OBJECT(&s->ehci[i]), true, 151 "companion-enable", &error_fatal); |
157 object_property_set_bool(OBJECT(&s->ehci[i]), true, "realized", 158 &error_fatal); | 152 sysbus_realize(SYS_BUS_DEVICE(&s->ehci[i]), &error_fatal); |
159 sysbus_mmio_map(SYS_BUS_DEVICE(&s->ehci[i]), 0, 160 AW_A10_EHCI_BASE + i * 0x8000); 161 sysbus_connect_irq(SYS_BUS_DEVICE(&s->ehci[i]), 0, 162 qdev_get_gpio_in(dev, 39 + i)); 163 164 object_property_set_str(OBJECT(&s->ohci[i]), bus, "masterbus", 165 &error_fatal); | 153 sysbus_mmio_map(SYS_BUS_DEVICE(&s->ehci[i]), 0, 154 AW_A10_EHCI_BASE + i * 0x8000); 155 sysbus_connect_irq(SYS_BUS_DEVICE(&s->ehci[i]), 0, 156 qdev_get_gpio_in(dev, 39 + i)); 157 158 object_property_set_str(OBJECT(&s->ohci[i]), bus, "masterbus", 159 &error_fatal); |
166 object_property_set_bool(OBJECT(&s->ohci[i]), true, "realized", 167 &error_fatal); | 160 sysbus_realize(SYS_BUS_DEVICE(&s->ohci[i]), &error_fatal); |
168 sysbus_mmio_map(SYS_BUS_DEVICE(&s->ohci[i]), 0, 169 AW_A10_OHCI_BASE + i * 0x8000); 170 sysbus_connect_irq(SYS_BUS_DEVICE(&s->ohci[i]), 0, 171 qdev_get_gpio_in(dev, 64 + i)); 172 } 173 } 174 175 /* SD/MMC */ | 161 sysbus_mmio_map(SYS_BUS_DEVICE(&s->ohci[i]), 0, 162 AW_A10_OHCI_BASE + i * 0x8000); 163 sysbus_connect_irq(SYS_BUS_DEVICE(&s->ohci[i]), 0, 164 qdev_get_gpio_in(dev, 64 + i)); 165 } 166 } 167 168 /* SD/MMC */ |
176 qdev_init_nofail(DEVICE(&s->mmc0)); | 169 sysbus_realize(SYS_BUS_DEVICE(&s->mmc0), &error_fatal); |
177 sysbus_mmio_map(SYS_BUS_DEVICE(&s->mmc0), 0, AW_A10_MMC0_BASE); 178 sysbus_connect_irq(SYS_BUS_DEVICE(&s->mmc0), 0, qdev_get_gpio_in(dev, 32)); 179 object_property_add_alias(OBJECT(s), "sd-bus", OBJECT(&s->mmc0), 180 "sd-bus"); 181 182 /* RTC */ | 170 sysbus_mmio_map(SYS_BUS_DEVICE(&s->mmc0), 0, AW_A10_MMC0_BASE); 171 sysbus_connect_irq(SYS_BUS_DEVICE(&s->mmc0), 0, qdev_get_gpio_in(dev, 32)); 172 object_property_add_alias(OBJECT(s), "sd-bus", OBJECT(&s->mmc0), 173 "sd-bus"); 174 175 /* RTC */ |
183 qdev_init_nofail(DEVICE(&s->rtc)); | 176 sysbus_realize(SYS_BUS_DEVICE(&s->rtc), &error_fatal); |
184 sysbus_mmio_map_overlap(SYS_BUS_DEVICE(&s->rtc), 0, AW_A10_RTC_BASE, 10); 185} 186 187static void aw_a10_class_init(ObjectClass *oc, void *data) 188{ 189 DeviceClass *dc = DEVICE_CLASS(oc); 190 191 dc->realize = aw_a10_realize; --- 18 unchanged lines hidden --- | 177 sysbus_mmio_map_overlap(SYS_BUS_DEVICE(&s->rtc), 0, AW_A10_RTC_BASE, 10); 178} 179 180static void aw_a10_class_init(ObjectClass *oc, void *data) 181{ 182 DeviceClass *dc = DEVICE_CLASS(oc); 183 184 dc->realize = aw_a10_realize; --- 18 unchanged lines hidden --- |