And a property and rename "it_shift" field to "regshift", as it seems to be more popular (and I don't know what "it" stands for).
Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> Reviewed-by: Peter Maydell <peter.mayd...@linaro.org> --- hw/char/serial.c | 28 +++++++++++++++++++++++----- include/hw/char/serial.h | 4 ++-- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/hw/char/serial.c b/hw/char/serial.c index cb9cbd5146..225f09f30f 100644 --- a/hw/char/serial.c +++ b/hw/char/serial.c @@ -1032,7 +1032,7 @@ static uint64_t serial_mm_read(void *opaque, hwaddr addr, unsigned size) { SerialMM *s = SERIAL_MM(opaque); - return serial_ioport_read(&s->serial, addr >> s->it_shift, 1); + return serial_ioport_read(&s->serial, addr >> s->regshift, 1); } static void serial_mm_write(void *opaque, hwaddr addr, @@ -1040,7 +1040,7 @@ static void serial_mm_write(void *opaque, hwaddr addr, { SerialMM *s = SERIAL_MM(opaque); value &= 255; - serial_ioport_write(&s->serial, addr >> s->it_shift, value, 1); + serial_ioport_write(&s->serial, addr >> s->regshift, value, 1); } static const MemoryRegionOps serial_mm_ops[3] = { @@ -1068,14 +1068,14 @@ static const MemoryRegionOps serial_mm_ops[3] = { }; SerialMM *serial_mm_init(MemoryRegion *address_space, - hwaddr base, int it_shift, + hwaddr base, int regshift, qemu_irq irq, int baudbase, Chardev *chr, enum device_endian end) { SerialMM *smm = SERIAL_MM(qdev_create(NULL, TYPE_SERIAL_MM)); SerialState *s = &smm->serial; - smm->it_shift = it_shift; + qdev_prop_set_uint8(DEVICE(smm), "regshift", regshift); s->irq = irq; qdev_prop_set_uint32(DEVICE(s), "baudbase", baudbase); qdev_prop_set_chr(DEVICE(s), "chardev", chr); @@ -1085,7 +1085,7 @@ SerialMM *serial_mm_init(MemoryRegion *address_space, qdev_init_nofail(DEVICE(smm)); memory_region_init_io(&s->io, NULL, &serial_mm_ops[end], smm, - "serial", 8 << it_shift); + "serial", 8 << regshift); memory_region_add_subregion(address_space, base, &s->io); return smm; @@ -1099,11 +1099,29 @@ static void serial_mm_instance_init(Object *o) TYPE_SERIAL, &error_abort, NULL); } +static Property serial_mm_properties[] = { + /* + * Set the spacing between adjacent memory-mapped UART registers. + * Each register will be at (1 << regshift) bytes after the + * previous one. + */ + DEFINE_PROP_UINT8("regshift", SerialMM, regshift, 0), + DEFINE_PROP_END_OF_LIST(), +}; + +static void serial_mm_class_init(ObjectClass *klass, void* data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + + dc->props = serial_mm_properties; +} + static const TypeInfo serial_mm_info = { .name = TYPE_SERIAL_MM, .parent = TYPE_SYS_BUS_DEVICE, .instance_init = serial_mm_instance_init, .instance_size = sizeof(SerialMM), + .class_init = serial_mm_class_init, }; static void serial_register_types(void) diff --git a/include/hw/char/serial.h b/include/hw/char/serial.h index 730165347c..eaeda62698 100644 --- a/include/hw/char/serial.h +++ b/include/hw/char/serial.h @@ -84,7 +84,7 @@ typedef struct SerialMM { SerialState serial; - int it_shift; + uint8_t regshift; } SerialMM; extern const VMStateDescription vmstate_serial; @@ -101,7 +101,7 @@ void serial_set_frequency(SerialState *s, uint32_t frequency); SerialState *serial_init(int base, qemu_irq irq, int baudbase, Chardev *chr, MemoryRegion *system_io); SerialMM *serial_mm_init(MemoryRegion *address_space, - hwaddr base, int it_shift, + hwaddr base, int regshift, qemu_irq irq, int baudbase, Chardev *chr, enum device_endian end); -- 2.24.0