diff options
-rw-r--r-- | hw/input/lasips2.c | 59 | ||||
-rw-r--r-- | include/hw/input/lasips2.h | 7 |
2 files changed, 20 insertions, 46 deletions
diff --git a/hw/input/lasips2.c b/hw/input/lasips2.c index 013d891af6..5ceb38c1af 100644 --- a/hw/input/lasips2.c +++ b/hw/input/lasips2.c @@ -42,10 +42,8 @@ static const VMStateDescription vmstate_lasips2 = { .fields = (VMStateField[]) { VMSTATE_UINT8(kbd_port.parent_obj.control, LASIPS2State), VMSTATE_UINT8(kbd_port.parent_obj.id, LASIPS2State), - VMSTATE_BOOL(kbd_port.parent_obj.birq, LASIPS2State), VMSTATE_UINT8(mouse_port.parent_obj.control, LASIPS2State), VMSTATE_UINT8(mouse_port.parent_obj.id, LASIPS2State), - VMSTATE_BOOL(mouse_port.parent_obj.birq, LASIPS2State), VMSTATE_END_OF_LIST() } }; @@ -119,10 +117,10 @@ static const char *lasips2_write_reg_name(uint64_t addr) static void lasips2_update_irq(LASIPS2State *s) { - trace_lasips2_intr(s->kbd_port.parent_obj.birq | - s->mouse_port.parent_obj.birq); - qemu_set_irq(s->irq, s->kbd_port.parent_obj.birq | - s->mouse_port.parent_obj.birq); + int level = s->int_status ? 1 : 0; + + trace_lasips2_intr(level); + qemu_set_irq(s->irq, level); } static void lasips2_set_irq(void *opaque, int n, int level) @@ -154,9 +152,8 @@ static void lasips2_reg_write(void *opaque, hwaddr addr, uint64_t val, case REG_PS2_XMTDATA: if (port->control & LASIPS2_CONTROL_LOOPBACK) { port->buf = val; - port->birq = true; port->loopback_rbne = true; - lasips2_update_irq(port->parent); + qemu_set_irq(port->irq, 1); break; } @@ -189,9 +186,8 @@ static uint64_t lasips2_reg_read(void *opaque, hwaddr addr, unsigned size) case REG_PS2_RCVDATA: if (port->control & LASIPS2_CONTROL_LOOPBACK) { - port->birq = false; port->loopback_rbne = false; - lasips2_update_irq(port->parent); + qemu_set_irq(port->irq, 0); ret = port->buf; break; } @@ -226,9 +222,8 @@ static uint64_t lasips2_reg_read(void *opaque, hwaddr addr, unsigned size) } } - if (port->parent->kbd_port.parent_obj.birq || - port->parent->mouse_port.parent_obj.birq) { - ret |= LASIPS2_STATUS_CMPINTR; + if (port->parent->int_status) { + ret |= LASIPS2_STATUS_CMPINTR; } break; @@ -253,24 +248,6 @@ static const MemoryRegionOps lasips2_reg_ops = { .endianness = DEVICE_NATIVE_ENDIAN, }; -static void lasips2_set_kbd_irq(void *opaque, int n, int level) -{ - LASIPS2State *s = LASIPS2(opaque); - LASIPS2Port *port = LASIPS2_PORT(&s->kbd_port); - - port->birq = level; - lasips2_update_irq(port->parent); -} - -static void lasips2_set_mouse_irq(void *opaque, int n, int level) -{ - LASIPS2State *s = LASIPS2(opaque); - LASIPS2Port *port = LASIPS2_PORT(&s->mouse_port); - - port->birq = level; - lasips2_update_irq(port->parent); -} - static void lasips2_realize(DeviceState *dev, Error **errp) { LASIPS2State *s = LASIPS2(dev); @@ -281,18 +258,18 @@ static void lasips2_realize(DeviceState *dev, Error **errp) return; } - qdev_connect_gpio_out(DEVICE(lp->ps2dev), PS2_DEVICE_IRQ, - qdev_get_gpio_in_named(dev, "ps2-kbd-input-irq", - 0)); + qdev_connect_gpio_out(DEVICE(lp), 0, + qdev_get_gpio_in_named(dev, "lasips2-port-input-irq", + lp->id)); lp = LASIPS2_PORT(&s->mouse_port); if (!(qdev_realize(DEVICE(lp), NULL, errp))) { return; } - qdev_connect_gpio_out(DEVICE(lp->ps2dev), PS2_DEVICE_IRQ, - qdev_get_gpio_in_named(dev, "ps2-mouse-input-irq", - 0)); + qdev_connect_gpio_out(DEVICE(lp), 0, + qdev_get_gpio_in_named(dev, "lasips2-port-input-irq", + lp->id)); } static void lasips2_init(Object *obj) @@ -312,10 +289,6 @@ static void lasips2_init(Object *obj) sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->irq); - qdev_init_gpio_in_named(DEVICE(obj), lasips2_set_kbd_irq, - "ps2-kbd-input-irq", 1); - qdev_init_gpio_in_named(DEVICE(obj), lasips2_set_mouse_irq, - "ps2-mouse-input-irq", 1); qdev_init_gpio_in_named(DEVICE(obj), lasips2_set_irq, "lasips2-port-input-irq", 2); } @@ -381,8 +354,10 @@ static const TypeInfo lasips2_port_info = { static void lasips2_kbd_port_realize(DeviceState *dev, Error **errp) { LASIPS2Port *lp = LASIPS2_PORT(dev); + LASIPS2PortDeviceClass *lpdc = LASIPS2_PORT_GET_CLASS(lp); lp->ps2dev = ps2_kbd_init(); + lpdc->parent_realize(dev, errp); } static void lasips2_kbd_port_init(Object *obj) @@ -416,8 +391,10 @@ static const TypeInfo lasips2_kbd_port_info = { static void lasips2_mouse_port_realize(DeviceState *dev, Error **errp) { LASIPS2Port *lp = LASIPS2_PORT(dev); + LASIPS2PortDeviceClass *lpdc = LASIPS2_PORT_GET_CLASS(lp); lp->ps2dev = ps2_mouse_init(); + lpdc->parent_realize(dev, errp); } static void lasips2_mouse_port_init(Object *obj) diff --git a/include/hw/input/lasips2.h b/include/hw/input/lasips2.h index b79febf64b..7199f16622 100644 --- a/include/hw/input/lasips2.h +++ b/include/hw/input/lasips2.h @@ -12,10 +12,8 @@ * + sysbus MMIO region 1: MemoryRegion defining the LASI PS2 mouse * registers * + sysbus IRQ 0: LASI PS2 output irq - * + Named GPIO input "ps2-kbd-input-irq": set to 1 if the downstream PS2 - * keyboard device has asserted its irq - * + Named GPIO input "ps2-mouse-input-irq": set to 1 if the downstream PS2 - * mouse device has asserted its irq + * + Named GPIO input "lasips2-port-input-irq[0..1]": set to 1 if the downstream + * LASIPS2Port has asserted its irq */ #ifndef HW_INPUT_LASIPS2_H @@ -46,7 +44,6 @@ struct LASIPS2Port { uint8_t control; uint8_t buf; bool loopback_rbne; - bool birq; qemu_irq irq; }; |