14
14
#include "qemu/osdep.h"
15
15
#include "qemu/log.h"
16
16
#include "hw/irq.h"
17
+ #include "hw/qdev-properties.h"
17
18
#include "hw/riscv/sifive_gpio.h"
18
19
#include "migration/vmstate.h"
19
20
#include "trace.h"
@@ -28,7 +29,7 @@ static void update_output_irq(SIFIVEGPIOState *s)
28
29
pending |= s -> rise_ip & s -> rise_ie ;
29
30
pending |= s -> fall_ip & s -> fall_ie ;
30
31
31
- for (int i = 0 ; i < SIFIVE_GPIO_PINS ; i ++ ) {
32
+ for (int i = 0 ; i < s -> ngpio ; i ++ ) {
32
33
pin = 1 << i ;
33
34
qemu_set_irq (s -> irq [i ], (pending & pin ) != 0 );
34
35
trace_sifive_gpio_update_output_irq (i , (pending & pin ) != 0 );
@@ -41,7 +42,7 @@ static void update_state(SIFIVEGPIOState *s)
41
42
bool prev_ival , in , in_mask , port , out_xor , pull , output_en , input_en ,
42
43
rise_ip , fall_ip , low_ip , high_ip , oval , actual_value , ival ;
43
44
44
- for (i = 0 ; i < SIFIVE_GPIO_PINS ; i ++ ) {
45
+ for (i = 0 ; i < s -> ngpio ; i ++ ) {
45
46
46
47
prev_ival = extract32 (s -> value , i , 1 );
47
48
in = extract32 (s -> in , i , 1 );
@@ -346,27 +347,35 @@ static const VMStateDescription vmstate_sifive_gpio = {
346
347
}
347
348
};
348
349
349
- static void sifive_gpio_init (Object * obj )
350
+ static Property sifive_gpio_properties [] = {
351
+ DEFINE_PROP_UINT32 ("ngpio" , SIFIVEGPIOState , ngpio , SIFIVE_GPIO_PINS ),
352
+ DEFINE_PROP_END_OF_LIST (),
353
+ };
354
+
355
+ static void sifive_gpio_realize (DeviceState * dev , Error * * errp )
350
356
{
351
- SIFIVEGPIOState * s = SIFIVE_GPIO (obj );
357
+ SIFIVEGPIOState * s = SIFIVE_GPIO (dev );
352
358
353
- memory_region_init_io (& s -> mmio , obj , & gpio_ops , s ,
359
+ memory_region_init_io (& s -> mmio , OBJECT ( dev ) , & gpio_ops , s ,
354
360
TYPE_SIFIVE_GPIO , SIFIVE_GPIO_SIZE );
355
- sysbus_init_mmio (SYS_BUS_DEVICE (obj ), & s -> mmio );
356
361
357
- for (int i = 0 ; i < SIFIVE_GPIO_PINS ; i ++ ) {
358
- sysbus_init_irq (SYS_BUS_DEVICE (obj ), & s -> irq [i ]);
362
+ sysbus_init_mmio (SYS_BUS_DEVICE (dev ), & s -> mmio );
363
+
364
+ for (int i = 0 ; i < s -> ngpio ; i ++ ) {
365
+ sysbus_init_irq (SYS_BUS_DEVICE (dev ), & s -> irq [i ]);
359
366
}
360
367
361
- qdev_init_gpio_in (DEVICE (s ), sifive_gpio_set , SIFIVE_GPIO_PINS );
362
- qdev_init_gpio_out (DEVICE (s ), s -> output , SIFIVE_GPIO_PINS );
368
+ qdev_init_gpio_in (DEVICE (s ), sifive_gpio_set , s -> ngpio );
369
+ qdev_init_gpio_out (DEVICE (s ), s -> output , s -> ngpio );
363
370
}
364
371
365
372
static void sifive_gpio_class_init (ObjectClass * klass , void * data )
366
373
{
367
374
DeviceClass * dc = DEVICE_CLASS (klass );
368
375
376
+ device_class_set_props (dc , sifive_gpio_properties );
369
377
dc -> vmsd = & vmstate_sifive_gpio ;
378
+ dc -> realize = sifive_gpio_realize ;
370
379
dc -> reset = sifive_gpio_reset ;
371
380
dc -> desc = "SiFive GPIO" ;
372
381
}
@@ -375,7 +384,6 @@ static const TypeInfo sifive_gpio_info = {
375
384
.name = TYPE_SIFIVE_GPIO ,
376
385
.parent = TYPE_SYS_BUS_DEVICE ,
377
386
.instance_size = sizeof (SIFIVEGPIOState ),
378
- .instance_init = sifive_gpio_init ,
379
387
.class_init = sifive_gpio_class_init
380
388
};
381
389
0 commit comments