aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hw/input/lasips2.c59
-rw-r--r--include/hw/input/lasips2.h7
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;
};