Expose the 'xck' clock source. Connect the MCU I/O clock to it. Signed-off-by: Philippe Mathieu-Daudé <f4...@amsat.org> --- include/hw/char/avr_usart.h | 2 ++ hw/avr/atmega.c | 1 + hw/char/avr_usart.c | 3 +++ 3 files changed, 6 insertions(+)
diff --git a/include/hw/char/avr_usart.h b/include/hw/char/avr_usart.h index 46d6c76e50..13cfd5ea07 100644 --- a/include/hw/char/avr_usart.h +++ b/include/hw/char/avr_usart.h @@ -25,6 +25,7 @@ #include "hw/sysbus.h" #include "chardev/char-fe.h" #include "hw/hw.h" +#include "hw/clock.h" #define TYPE_AVR_USART "avr-usart" #define AVR_USART(obj) \ @@ -51,6 +52,7 @@ typedef struct { /* Baud Rate Registers (low/high byte) */ uint8_t brrh; uint8_t brrl; + Clock *clkin; /* Receive Complete */ qemu_irq rxc_irq; diff --git a/hw/avr/atmega.c b/hw/avr/atmega.c index f14b558140..b6e86a4531 100644 --- a/hw/avr/atmega.c +++ b/hw/avr/atmega.c @@ -302,6 +302,7 @@ static void atmega_realize(DeviceState *dev, Error **errp) object_initialize_child(OBJECT(dev), devname, &s->usart[i], TYPE_AVR_USART); qdev_prop_set_chr(DEVICE(&s->usart[i]), "chardev", serial_hd(i)); + qdev_connect_clock_in(DEVICE(&s->usart[i]), "xck", s->ioclk); sbd = SYS_BUS_DEVICE(&s->usart[i]); sysbus_realize(sbd, &error_abort); sysbus_mmio_map(sbd, 0, OFFSET_DATA + mc->dev[USART(i)].addr); diff --git a/hw/char/avr_usart.c b/hw/char/avr_usart.c index fd0b488ef9..4a43492082 100644 --- a/hw/char/avr_usart.c +++ b/hw/char/avr_usart.c @@ -23,6 +23,7 @@ #include "hw/char/avr_usart.h" #include "qemu/log.h" #include "hw/irq.h" +#include "hw/qdev-clock.h" #include "hw/qdev-properties.h" /* Offsets of registers. */ @@ -307,12 +308,14 @@ static void avr_usart_pr(void *opaque, int irq, int level) static void avr_usart_init(Object *obj) { AVRUsartState *s = AVR_USART(obj); + sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->rxc_irq); sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->dre_irq); sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->txc_irq); memory_region_init_io(&s->mmio, obj, &avr_usart_ops, s, TYPE_AVR_USART, 7); sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio); qdev_init_gpio_in(DEVICE(s), avr_usart_pr, 1); + s->clkin = qdev_init_clock_in(DEVICE(obj), "xck", NULL, s); s->enabled = true; } -- 2.21.3