Skip to content

Commit 4bb216f

Browse files
lbmengalistair23
authored andcommitted
hw/riscv: sifive_gpio: Add a new 'ngpio' property
Add a new property to represent the number of GPIO pins supported by the GPIO controller. Signed-off-by: Bin Meng <[email protected]> Reviewed-by: Alistair Francis <[email protected]> Message-id: [email protected] Message-Id: <[email protected]> Signed-off-by: Alistair Francis <[email protected]>
1 parent 2e30ccb commit 4bb216f

File tree

2 files changed

+22
-11
lines changed

2 files changed

+22
-11
lines changed

hw/riscv/sifive_gpio.c

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "qemu/osdep.h"
1515
#include "qemu/log.h"
1616
#include "hw/irq.h"
17+
#include "hw/qdev-properties.h"
1718
#include "hw/riscv/sifive_gpio.h"
1819
#include "migration/vmstate.h"
1920
#include "trace.h"
@@ -28,7 +29,7 @@ static void update_output_irq(SIFIVEGPIOState *s)
2829
pending |= s->rise_ip & s->rise_ie;
2930
pending |= s->fall_ip & s->fall_ie;
3031

31-
for (int i = 0; i < SIFIVE_GPIO_PINS; i++) {
32+
for (int i = 0; i < s->ngpio; i++) {
3233
pin = 1 << i;
3334
qemu_set_irq(s->irq[i], (pending & pin) != 0);
3435
trace_sifive_gpio_update_output_irq(i, (pending & pin) != 0);
@@ -41,7 +42,7 @@ static void update_state(SIFIVEGPIOState *s)
4142
bool prev_ival, in, in_mask, port, out_xor, pull, output_en, input_en,
4243
rise_ip, fall_ip, low_ip, high_ip, oval, actual_value, ival;
4344

44-
for (i = 0; i < SIFIVE_GPIO_PINS; i++) {
45+
for (i = 0; i < s->ngpio; i++) {
4546

4647
prev_ival = extract32(s->value, i, 1);
4748
in = extract32(s->in, i, 1);
@@ -346,27 +347,35 @@ static const VMStateDescription vmstate_sifive_gpio = {
346347
}
347348
};
348349

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)
350356
{
351-
SIFIVEGPIOState *s = SIFIVE_GPIO(obj);
357+
SIFIVEGPIOState *s = SIFIVE_GPIO(dev);
352358

353-
memory_region_init_io(&s->mmio, obj, &gpio_ops, s,
359+
memory_region_init_io(&s->mmio, OBJECT(dev), &gpio_ops, s,
354360
TYPE_SIFIVE_GPIO, SIFIVE_GPIO_SIZE);
355-
sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio);
356361

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]);
359366
}
360367

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);
363370
}
364371

365372
static void sifive_gpio_class_init(ObjectClass *klass, void *data)
366373
{
367374
DeviceClass *dc = DEVICE_CLASS(klass);
368375

376+
device_class_set_props(dc, sifive_gpio_properties);
369377
dc->vmsd = &vmstate_sifive_gpio;
378+
dc->realize = sifive_gpio_realize;
370379
dc->reset = sifive_gpio_reset;
371380
dc->desc = "SiFive GPIO";
372381
}
@@ -375,7 +384,6 @@ static const TypeInfo sifive_gpio_info = {
375384
.name = TYPE_SIFIVE_GPIO,
376385
.parent = TYPE_SYS_BUS_DEVICE,
377386
.instance_size = sizeof(SIFIVEGPIOState),
378-
.instance_init = sifive_gpio_init,
379387
.class_init = sifive_gpio_class_init
380388
};
381389

include/hw/riscv/sifive_gpio.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ typedef struct SIFIVEGPIOState {
6868
uint32_t out_xor;
6969
uint32_t in;
7070
uint32_t in_mask;
71+
72+
/* config */
73+
uint32_t ngpio;
7174
} SIFIVEGPIOState;
7275

7376
#endif /* SIFIVE_GPIO_H */

0 commit comments

Comments
 (0)