On 17/06/2016 15:11, Efimov Vasily wrote: > The i8042 device has outgouing IRQ line A20. Currently the IRQ is referenced > by a pointer which normally is set during machine initialization. The pointer > is never changed at runtime. So common GPIO model can be applied to A20 IRQ > line. Note that checking for IRQ to be connected as in previous version > of code is not required because qemu_set_irq will do it. > > Signed-off-by: Efimov Vasily <r...@ispras.ru> > --- > hw/input/pckbd.c | 21 +++++++-------------- > 1 file changed, 7 insertions(+), 14 deletions(-) > > diff --git a/hw/input/pckbd.c b/hw/input/pckbd.c > index 1d932ec..1406b6b 100644 > --- a/hw/input/pckbd.c > +++ b/hw/input/pckbd.c > @@ -146,7 +146,7 @@ typedef struct KBDState { > > qemu_irq irq_kbd; > qemu_irq irq_mouse; > - qemu_irq *a20_out; > + qemu_irq a20_out; > hwaddr mask; > } KBDState; > > @@ -224,9 +224,7 @@ static void outport_write(KBDState *s, uint32_t val) > { > DPRINTF("kbd: write outport=0x%02x\n", val); > s->outport = val; > - if (s->a20_out) { > - qemu_set_irq(*s->a20_out, (val >> 1) & 1); > - } > + qemu_set_irq(s->a20_out, (val >> 1) & 1); > if (!(val & 1)) { > qemu_system_reset_request(); > } > @@ -295,15 +293,11 @@ static void kbd_write_command(void *opaque, hwaddr addr, > kbd_queue(s, s->outport, 0); > break; > case KBD_CCMD_ENABLE_A20: > - if (s->a20_out) { > - qemu_irq_raise(*s->a20_out); > - } > + qemu_irq_raise(s->a20_out); > s->outport |= KBD_OUT_A20; > break; > case KBD_CCMD_DISABLE_A20: > - if (s->a20_out) { > - qemu_irq_lower(*s->a20_out); > - } > + qemu_irq_lower(s->a20_out); > s->outport &= ~KBD_OUT_A20; > break; > case KBD_CCMD_RESET: > @@ -507,10 +501,7 @@ void i8042_isa_mouse_fake_event(void *opaque) > > void i8042_setup_a20_line(ISADevice *dev, qemu_irq *a20_out) > { > - ISAKBDState *isa = I8042(dev); > - KBDState *s = &isa->kbd; > - > - s->a20_out = a20_out; > + qdev_connect_gpio_out(DEVICE(dev), 0, *a20_out); > } > > static const VMStateDescription vmstate_kbd_isa = { > @@ -552,6 +543,8 @@ static void i8042_initfn(Object *obj) > "i8042-data", 1); > memory_region_init_io(isa_s->io + 1, obj, &i8042_cmd_ops, s, > "i8042-cmd", 1); > + > + qdev_init_gpio_out(DEVICE(obj), &s->a20_out, 1);
While at it, please use qdev_init_gpio_out_named and qdev_connect_gpio_out_named with "a20" as the name. Paolo > } > > static void i8042_realizefn(DeviceState *dev, Error **errp) >