Signed-off-by: Mark Cave-Ayland mark.cave-ayland@ilande.co.uk --- drivers/pc_kbd.c | 63 +++++++++++++++++++++++++++++++++++++++++---- drivers/pci.c | 4 +-- include/drivers/drivers.h | 4 +-- 3 files changed, 62 insertions(+), 9 deletions(-)
diff --git a/drivers/pc_kbd.c b/drivers/pc_kbd.c index 3e366c5..51b7a1f 100644 --- a/drivers/pc_kbd.c +++ b/drivers/pc_kbd.c @@ -185,8 +185,8 @@ NODE_METHODS(pc_kbd) = { };
void -ob_pc_kbd_init(const char *path, const char *dev_name, uint64_t base, - uint64_t offset, int intr) +ob_pc_kbd_init(const char *path, const char *kdev_name, const char *mdev_name, + uint64_t base, uint64_t offset, int kintr, int mintr) { phandle_t chosen, aliases; char nodebuff[128]; @@ -210,6 +210,19 @@ ob_pc_kbd_init(const char *path, const char *dev_name, uint64_t base, PUSH(SER_SIZE); fword("encode-int"); fword("encode+"); + + if (mdev_name != NULL) { + PUSH((base + offset) >> 32); + fword("encode-int"); + fword("encode+"); + PUSH((base + offset) & 0xffffffff); + fword("encode-int"); + fword("encode+"); + PUSH(SER_SIZE); + fword("encode-int"); + fword("encode+"); + } + push_str("reg"); fword("property");
@@ -217,20 +230,28 @@ ob_pc_kbd_init(const char *path, const char *dev_name, uint64_t base, set_int_property(chosen, "#address-cells", 1); set_int_property(chosen, "#size-cells", 0);
- PUSH(intr); + PUSH(kintr); fword("encode-int"); + + if (mdev_name != NULL) { + PUSH(mintr); + fword("encode-int"); + fword("encode+"); + } + push_str("interrupts"); fword("property");
fword("finish-device");
- snprintf(nodebuff, sizeof(nodebuff), "%s/8042/%s", path, dev_name); + /* Keyboard */ + snprintf(nodebuff, sizeof(nodebuff), "%s/8042/%s", path, kdev_name); REGISTER_NAMED_NODE(pc_kbd, nodebuff);
push_str(nodebuff); fword("find-device");
- push_str(dev_name); + push_str(kdev_name); fword("device-name");
push_str("serial"); @@ -260,4 +281,36 @@ ob_pc_kbd_init(const char *path, const char *dev_name, uint64_t base, set_property(aliases, "keyboard", nodebuff, strlen(nodebuff) + 1);
pc_kbd_controller_cmd(0x60, 0x40); // Write mode command, translated mode + + /* Mouse (optional) */ + if (mdev_name != NULL) { + snprintf(nodebuff, sizeof(nodebuff), "%s/8042", path); + push_str(nodebuff); + fword("find-device"); + + fword("new-device"); + + push_str(mdev_name); + fword("device-name"); + + push_str("mouse"); + fword("device-type"); + + PUSH(1); + fword("encode-int"); + push_str("reg"); + fword("property"); + + PUSH(-1); + fword("encode-int"); + push_str("mouse"); + fword("property"); + + PUSH(offset); + fword("encode-int"); + push_str("address"); + fword("property"); + + fword("finish-device"); + } } diff --git a/drivers/pci.c b/drivers/pci.c index e803ab2..d506a50 100644 --- a/drivers/pci.c +++ b/drivers/pci.c @@ -949,7 +949,7 @@ int ebus_config_cb(const pci_config_t *config) ob_pc_serial_init(config->path, "su", (PCI_BASE_ADDR_1 | 0ULL) << 32, 0x3f8ULL, 0); #endif #ifdef CONFIG_DRIVER_PC_KBD - ob_pc_kbd_init(config->path, "kb_ps2", (PCI_BASE_ADDR_1 | 0ULL) << 32, 0x60ULL, 1); + ob_pc_kbd_init(config->path, "kb_ps2", NULL, (PCI_BASE_ADDR_1 | 0ULL) << 32, 0x60ULL, 1, 0); #endif #endif return 0; @@ -961,7 +961,7 @@ int i82378_config_cb(const pci_config_t *config) ob_pc_serial_init(config->path, "serial", arch->io_base, 0x3f8ULL, 0); #endif #ifdef CONFIG_DRIVER_PC_KBD - ob_pc_kbd_init(config->path, "8042", arch->io_base, 0x60ULL, 0); + ob_pc_kbd_init(config->path, "8042", NULL, arch->io_base, 0x60ULL, 0, 0); #endif #ifdef CONFIG_DRIVER_IDE ob_ide_init(config->path, 0x1f0, 0x3f6, 0x170, 0x376); diff --git a/include/drivers/drivers.h b/include/drivers/drivers.h index 9ea1c6a..59ee436 100644 --- a/include/drivers/drivers.h +++ b/include/drivers/drivers.h @@ -99,8 +99,8 @@ int ob_floppy_init(const char *path, const char *dev_name, unsigned long io_base, unsigned long mmio_base); #endif #ifdef CONFIG_DRIVER_PC_KBD -void ob_pc_kbd_init(const char *path, const char *dev_name, uint64_t base, - uint64_t offset, int intr); +void ob_pc_kbd_init(const char *path, const char *kdev_name, const char *mdev_name, + uint64_t base, uint64_t offset, int kintr, int mintr); int pc_kbd_dataready(void); unsigned char pc_kbd_readdata(void); #endif