#ifndef _I8042_SPARCIO_H #define _I8042_SPARCIO_H #include <linux/config.h> #include <asm/io.h> #ifdef CONFIG_PCI #include <asm/oplib.h> #include <asm/ebus.h> #endif static int i8042_kbd_irq = -1; static int i8042_aux_irq = -1; #define I8042_KBD_IRQ i8042_kbd_irq #define I8042_AUX_IRQ i8042_aux_irq #define I8042_KBD_PHYS_DESC "sparcps2/serio0" #define I8042_AUX_PHYS_DESC "sparcps2/serio1" #define I8042_MUX_PHYS_DESC "sparcps2/serio%d" static void __iomem *kbd_iobase; #define I8042_COMMAND_REG (kbd_iobase + 0x64UL) #define I8042_DATA_REG (kbd_iobase + 0x60UL) static inline int i8042_read_data(void) { return readb(kbd_iobase + 0x60UL); } static inline int i8042_read_status(void) { return readb(kbd_iobase + 0x64UL); } static inline void i8042_write_data(int val) { writeb(val, kbd_iobase + 0x60UL); } static inline void i8042_write_command(int val) { writeb(val, kbd_iobase + 0x64UL); } #define OBP_PS2KBD_NAME1 "kb_ps2" #define OBP_PS2KBD_NAME2 "keyboard" #define OBP_PS2MS_NAME1 "kdmouse" #define OBP_PS2MS_NAME2 "mouse" static int i8042_platform_init(void) { #ifndef CONFIG_PCI return -1; #else char prop[128]; int len; len = prom_getproperty(prom_root_node, "name", prop, sizeof(prop)); if (len < 0) { printk("i8042: Cannot get name property of root OBP node.\n"); return -1; } if (strncmp(prop, "SUNW,JavaStation-1", len) == 0) { /* Hardcoded values for MrCoffee. */ i8042_kbd_irq = i8042_aux_irq = 13 | 0x20; kbd_iobase = ioremap(0x71300060, 8); if (!kbd_iobase) return -1; } else { struct linux_ebus *ebus; struct linux_ebus_device *edev; struct linux_ebus_child *child; for_each_ebus(ebus) { for_each_ebusdev(edev, ebus) { if (!strcmp(edev->prom_name, "8042")) goto edev_found; } } return -1; edev_found: for_each_edevchild(edev, child) { if (!strcmp(child->prom_name, OBP_PS2KBD_NAME1) || !strcmp(child->prom_name, OBP_PS2KBD_NAME2)) { i8042_kbd_irq = child->irqs[0]; kbd_iobase = ioremap(child->resource[0].start, 8); } if (!strcmp(child->prom_name, OBP_PS2MS_NAME1) || !strcmp(child->prom_name, OBP_PS2MS_NAME2)) i8042_aux_irq = child->irqs[0]; } if (i8042_kbd_irq == -1 || i8042_aux_irq == -1) { printk("i8042: Error, 8042 device lacks both kbd and " "mouse nodes.\n"); return -1; } } i8042_reset = 1; return 0; #endif /* CONFIG_PCI */ } static inline void i8042_platform_exit(void) { #ifdef CONFIG_PCI iounmap(kbd_iobase); #endif } #endif /* _I8042_SPARCIO_H */