pckbd: don't use legacy ps2_kbd_init() function

Instantiate the PS2 keyboard device within KBDState using
object_initialize_child() in i8042_initfn() and i8042_mmio_init() and realize
it in i8042_realizefn() and i8042_mmio_realize() accordingly.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Tested-by: Helge Deller <deller@gmx.de>
Acked-by: Helge Deller <deller@gmx.de>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Message-Id: <20220712215251.7944-37-mark.cave-ayland@ilande.co.uk>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
This commit is contained in:
Mark Cave-Ayland 2022-07-12 22:52:47 +01:00
parent abcacb20f7
commit 652fbff420
2 changed files with 23 additions and 9 deletions

View File

@ -286,7 +286,7 @@ static void kbd_queue(KBDState *s, int b, int aux)
s->pending |= aux ? KBD_PENDING_CTRL_AUX : KBD_PENDING_CTRL_KBD; s->pending |= aux ? KBD_PENDING_CTRL_AUX : KBD_PENDING_CTRL_KBD;
kbd_safe_update_irq(s); kbd_safe_update_irq(s);
} else { } else {
ps2_queue(aux ? s->mouse : s->kbd, b); ps2_queue(aux ? s->mouse : PS2_DEVICE(&s->ps2kbd), b);
} }
} }
@ -408,7 +408,7 @@ static uint64_t kbd_read_data(void *opaque, hwaddr addr,
timer_mod(s->throttle_timer, timer_mod(s->throttle_timer,
qemu_clock_get_us(QEMU_CLOCK_VIRTUAL) + 1000); qemu_clock_get_us(QEMU_CLOCK_VIRTUAL) + 1000);
} }
s->obdata = ps2_read_data(s->kbd); s->obdata = ps2_read_data(PS2_DEVICE(&s->ps2kbd));
} else if (s->obsrc & KBD_OBSRC_MOUSE) { } else if (s->obsrc & KBD_OBSRC_MOUSE) {
s->obdata = ps2_read_data(s->mouse); s->obdata = ps2_read_data(s->mouse);
} else if (s->obsrc & KBD_OBSRC_CTRL) { } else if (s->obsrc & KBD_OBSRC_CTRL) {
@ -429,14 +429,15 @@ static void kbd_write_data(void *opaque, hwaddr addr,
switch (s->write_cmd) { switch (s->write_cmd) {
case 0: case 0:
ps2_write_keyboard(s->kbd, val); ps2_write_keyboard(&s->ps2kbd, val);
/* sending data to the keyboard reenables PS/2 communication */ /* sending data to the keyboard reenables PS/2 communication */
s->mode &= ~KBD_MODE_DISABLE_KBD; s->mode &= ~KBD_MODE_DISABLE_KBD;
kbd_safe_update_irq(s); kbd_safe_update_irq(s);
break; break;
case KBD_CCMD_WRITE_MODE: case KBD_CCMD_WRITE_MODE:
s->mode = val; s->mode = val;
ps2_keyboard_set_translation(s->kbd, (s->mode & KBD_MODE_KCC) != 0); ps2_keyboard_set_translation(&s->ps2kbd,
(s->mode & KBD_MODE_KCC) != 0);
/* /*
* a write to the mode byte interrupt enable flags directly updates * a write to the mode byte interrupt enable flags directly updates
* the irq lines * the irq lines
@ -699,10 +700,14 @@ static void i8042_mmio_realize(DeviceState *dev, Error **errp)
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->region); sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->region);
ks->kbd = ps2_kbd_init(); if (!sysbus_realize(SYS_BUS_DEVICE(&ks->ps2kbd), errp)) {
qdev_connect_gpio_out(DEVICE(ks->kbd), PS2_DEVICE_IRQ, return;
}
qdev_connect_gpio_out(DEVICE(&ks->ps2kbd), PS2_DEVICE_IRQ,
qdev_get_gpio_in_named(dev, "ps2-kbd-input-irq", qdev_get_gpio_in_named(dev, "ps2-kbd-input-irq",
0)); 0));
ks->mouse = ps2_mouse_init(); ks->mouse = ps2_mouse_init();
qdev_connect_gpio_out(DEVICE(ks->mouse), PS2_DEVICE_IRQ, qdev_connect_gpio_out(DEVICE(ks->mouse), PS2_DEVICE_IRQ,
qdev_get_gpio_in_named(dev, "ps2-mouse-input-irq", qdev_get_gpio_in_named(dev, "ps2-mouse-input-irq",
@ -716,6 +721,8 @@ static void i8042_mmio_init(Object *obj)
ks->extended_state = true; ks->extended_state = true;
object_initialize_child(obj, "ps2kbd", &ks->ps2kbd, TYPE_PS2_KBD_DEVICE);
qdev_init_gpio_out(DEVICE(obj), ks->irqs, 2); qdev_init_gpio_out(DEVICE(obj), ks->irqs, 2);
qdev_init_gpio_in_named(DEVICE(obj), i8042_mmio_set_kbd_irq, qdev_init_gpio_in_named(DEVICE(obj), i8042_mmio_set_kbd_irq,
"ps2-kbd-input-irq", 1); "ps2-kbd-input-irq", 1);
@ -851,6 +858,8 @@ static void i8042_initfn(Object *obj)
memory_region_init_io(isa_s->io + 1, obj, &i8042_cmd_ops, s, memory_region_init_io(isa_s->io + 1, obj, &i8042_cmd_ops, s,
"i8042-cmd", 1); "i8042-cmd", 1);
object_initialize_child(obj, "ps2kbd", &s->ps2kbd, TYPE_PS2_KBD_DEVICE);
qdev_init_gpio_out_named(DEVICE(obj), &s->a20_out, I8042_A20_LINE, 1); qdev_init_gpio_out_named(DEVICE(obj), &s->a20_out, I8042_A20_LINE, 1);
qdev_init_gpio_out(DEVICE(obj), s->irqs, 2); qdev_init_gpio_out(DEVICE(obj), s->irqs, 2);
@ -884,10 +893,14 @@ static void i8042_realizefn(DeviceState *dev, Error **errp)
isa_register_ioport(isadev, isa_s->io + 0, 0x60); isa_register_ioport(isadev, isa_s->io + 0, 0x60);
isa_register_ioport(isadev, isa_s->io + 1, 0x64); isa_register_ioport(isadev, isa_s->io + 1, 0x64);
s->kbd = ps2_kbd_init(); if (!sysbus_realize(SYS_BUS_DEVICE(&s->ps2kbd), errp)) {
qdev_connect_gpio_out(DEVICE(s->kbd), PS2_DEVICE_IRQ, return;
}
qdev_connect_gpio_out(DEVICE(&s->ps2kbd), PS2_DEVICE_IRQ,
qdev_get_gpio_in_named(dev, "ps2-kbd-input-irq", qdev_get_gpio_in_named(dev, "ps2-kbd-input-irq",
0)); 0));
s->mouse = ps2_mouse_init(); s->mouse = ps2_mouse_init();
qdev_connect_gpio_out(DEVICE(s->mouse), PS2_DEVICE_IRQ, qdev_connect_gpio_out(DEVICE(s->mouse), PS2_DEVICE_IRQ,
qdev_get_gpio_in_named(dev, "ps2-mouse-input-irq", qdev_get_gpio_in_named(dev, "ps2-mouse-input-irq",

View File

@ -10,6 +10,7 @@
#include "hw/isa/isa.h" #include "hw/isa/isa.h"
#include "hw/sysbus.h" #include "hw/sysbus.h"
#include "hw/input/ps2.h"
#include "qom/object.h" #include "qom/object.h"
#define I8042_KBD_IRQ 0 #define I8042_KBD_IRQ 0
@ -30,7 +31,7 @@ typedef struct KBDState {
uint8_t obdata; uint8_t obdata;
uint8_t cbdata; uint8_t cbdata;
uint8_t pending_tmp; uint8_t pending_tmp;
void *kbd; PS2KbdState ps2kbd;
void *mouse; void *mouse;
QEMUTimer *throttle_timer; QEMUTimer *throttle_timer;