On Tue, 17 Jan 2023 at 22:05, Evgeny Iakovlev <eiakov...@linux.microsoft.com> wrote: > > PL011 currently lacks a reset method. Implement it. > > Signed-off-by: Evgeny Iakovlev <eiakov...@linux.microsoft.com> > --- > hw/char/pl011.c | 31 ++++++++++++++++++++++++++----- > 1 file changed, 26 insertions(+), 5 deletions(-) > > diff --git a/hw/char/pl011.c b/hw/char/pl011.c > index 329cc6926d..404d52a3b8 100644 > --- a/hw/char/pl011.c > +++ b/hw/char/pl011.c > @@ -397,11 +397,6 @@ static void pl011_init(Object *obj) > s->clk = qdev_init_clock_in(DEVICE(obj), "clk", pl011_clock_update, s, > ClockUpdate); > > - s->read_trigger = 1; > - s->ifl = 0x12; > - s->cr = 0x300; > - s->flags = 0x90; > - > s->id = pl011_id_arm; > } > > @@ -413,11 +408,37 @@ static void pl011_realize(DeviceState *dev, Error > **errp) > pl011_event, NULL, s, NULL, true); > } > > +static void pl011_reset(DeviceState *dev) > +{ > + PL011State *s = PL011(dev); > + int i; > + > + s->lcr = 0; > + s->rsr = 0; > + s->dmacr = 0; > + s->int_enabled = 0; > + s->int_level = 0; > + s->ilpr = 0; > + s->ibrd = 0; > + s->fbrd = 0; > + s->read_pos = 0; > + s->read_count = 0; > + s->read_trigger = 1; > + s->ifl = 0x12; > + s->cr = 0x300; > + s->flags = 0x90; > + > + for (i = 0; i < ARRAY_SIZE(s->irq); i++) { > + qemu_irq_lower(s->irq[i]); > + }
Reset should never touch outbound qemu_irq lines. (The other end of the line will also reset and will end up in the correct "as if the input is 0" state.) Otherwise Reviewed-by: Peter Maydell <peter.mayd...@linaro.org> thanks -- PMM