pl050.c (e607f25a620e769cb6a231314aa13804723ab734) | pl050.c (3e5dd364d933ccc066cbea8620bdc16525e19230) |
---|---|
1/* 2 * Arm PrimeCell PL050 Keyboard / Mouse Interface 3 * 4 * Copyright (c) 2006-2007 CodeSourcery. 5 * Written by Paul Brook 6 * 7 * This code is licensed under the GPL. 8 */ 9 10#include "hw/sysbus.h" 11#include "hw/input/ps2.h" 12 | 1/* 2 * Arm PrimeCell PL050 Keyboard / Mouse Interface 3 * 4 * Copyright (c) 2006-2007 CodeSourcery. 5 * Written by Paul Brook 6 * 7 * This code is licensed under the GPL. 8 */ 9 10#include "hw/sysbus.h" 11#include "hw/input/ps2.h" 12 |
13#define TYPE_PL050 "pl050" 14#define PL050(obj) OBJECT_CHECK(PL050State, (obj), TYPE_PL050) 15 |
|
13typedef struct PL050State { | 16typedef struct PL050State { |
14 SysBusDevice busdev; | 17 SysBusDevice parent_obj; 18 |
15 MemoryRegion iomem; 16 void *dev; 17 uint32_t cr; 18 uint32_t clk; 19 uint32_t last; 20 int pending; 21 qemu_irq irq; | 19 MemoryRegion iomem; 20 void *dev; 21 uint32_t cr; 22 uint32_t clk; 23 uint32_t last; 24 int pending; 25 qemu_irq irq; |
22 int is_mouse; | 26 bool is_mouse; |
23} PL050State; 24 25static const VMStateDescription vmstate_pl050 = { 26 .name = "pl050", 27 .version_id = 2, 28 .minimum_version_id = 2, 29 .fields = (VMStateField[]) { 30 VMSTATE_UINT32(cr, PL050State), --- 97 unchanged lines hidden (view full) --- 128 } 129} 130static const MemoryRegionOps pl050_ops = { 131 .read = pl050_read, 132 .write = pl050_write, 133 .endianness = DEVICE_NATIVE_ENDIAN, 134}; 135 | 27} PL050State; 28 29static const VMStateDescription vmstate_pl050 = { 30 .name = "pl050", 31 .version_id = 2, 32 .minimum_version_id = 2, 33 .fields = (VMStateField[]) { 34 VMSTATE_UINT32(cr, PL050State), --- 97 unchanged lines hidden (view full) --- 132 } 133} 134static const MemoryRegionOps pl050_ops = { 135 .read = pl050_read, 136 .write = pl050_write, 137 .endianness = DEVICE_NATIVE_ENDIAN, 138}; 139 |
136static int pl050_init(SysBusDevice *dev, int is_mouse) | 140static int pl050_initfn(SysBusDevice *dev) |
137{ | 141{ |
138 PL050State *s = FROM_SYSBUS(PL050State, dev); | 142 PL050State *s = PL050(dev); |
139 140 memory_region_init_io(&s->iomem, OBJECT(s), &pl050_ops, s, "pl050", 0x1000); 141 sysbus_init_mmio(dev, &s->iomem); 142 sysbus_init_irq(dev, &s->irq); | 143 144 memory_region_init_io(&s->iomem, OBJECT(s), &pl050_ops, s, "pl050", 0x1000); 145 sysbus_init_mmio(dev, &s->iomem); 146 sysbus_init_irq(dev, &s->irq); |
143 s->is_mouse = is_mouse; 144 if (s->is_mouse) | 147 if (s->is_mouse) { |
145 s->dev = ps2_mouse_init(pl050_update, s); | 148 s->dev = ps2_mouse_init(pl050_update, s); |
146 else | 149 } else { |
147 s->dev = ps2_kbd_init(pl050_update, s); | 150 s->dev = ps2_kbd_init(pl050_update, s); |
151 } |
|
148 return 0; 149} 150 | 152 return 0; 153} 154 |
151static int pl050_init_keyboard(SysBusDevice *dev) | 155static void pl050_keyboard_init(Object *obj) |
152{ | 156{ |
153 return pl050_init(dev, 0); 154} | 157 PL050State *s = PL050(obj); |
155 | 158 |
156static int pl050_init_mouse(SysBusDevice *dev) 157{ 158 return pl050_init(dev, 1); | 159 s->is_mouse = false; |
159} 160 | 160} 161 |
161static void pl050_kbd_class_init(ObjectClass *klass, void *data) | 162static void pl050_mouse_init(Object *obj) |
162{ | 163{ |
163 DeviceClass *dc = DEVICE_CLASS(klass); 164 SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass); | 164 PL050State *s = PL050(obj); |
165 | 165 |
166 k->init = pl050_init_keyboard; 167 dc->vmsd = &vmstate_pl050; | 166 s->is_mouse = true; |
168} 169 170static const TypeInfo pl050_kbd_info = { 171 .name = "pl050_keyboard", | 167} 168 169static const TypeInfo pl050_kbd_info = { 170 .name = "pl050_keyboard", |
172 .parent = TYPE_SYS_BUS_DEVICE, 173 .instance_size = sizeof(PL050State), 174 .class_init = pl050_kbd_class_init, | 171 .parent = TYPE_PL050, 172 .instance_init = pl050_keyboard_init, |
175}; 176 | 173}; 174 |
177static void pl050_mouse_class_init(ObjectClass *klass, void *data) | 175static const TypeInfo pl050_mouse_info = { 176 .name = "pl050_mouse", 177 .parent = TYPE_PL050, 178 .instance_init = pl050_mouse_init, 179}; 180 181static void pl050_class_init(ObjectClass *oc, void *data) |
178{ | 182{ |
179 DeviceClass *dc = DEVICE_CLASS(klass); 180 SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass); | 183 DeviceClass *dc = DEVICE_CLASS(oc); 184 SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(oc); |
181 | 185 |
182 k->init = pl050_init_mouse; | 186 sdc->init = pl050_initfn; |
183 dc->vmsd = &vmstate_pl050; 184} 185 | 187 dc->vmsd = &vmstate_pl050; 188} 189 |
186static const TypeInfo pl050_mouse_info = { 187 .name = "pl050_mouse", | 190static const TypeInfo pl050_type_info = { 191 .name = TYPE_PL050, |
188 .parent = TYPE_SYS_BUS_DEVICE, 189 .instance_size = sizeof(PL050State), | 192 .parent = TYPE_SYS_BUS_DEVICE, 193 .instance_size = sizeof(PL050State), |
190 .class_init = pl050_mouse_class_init, | 194 .abstract = true, 195 .class_init = pl050_class_init, |
191}; 192 193static void pl050_register_types(void) 194{ | 196}; 197 198static void pl050_register_types(void) 199{ |
200 type_register_static(&pl050_type_info); |
|
195 type_register_static(&pl050_kbd_info); 196 type_register_static(&pl050_mouse_info); 197} 198 199type_init(pl050_register_types) | 201 type_register_static(&pl050_kbd_info); 202 type_register_static(&pl050_mouse_info); 203} 204 205type_init(pl050_register_types) |