2  *  linux/drivers/hil/hilkbd.c
 
   4  *  Copyright (C) 1998 Philip Blundell <philb@gnu.org>
 
   5  *  Copyright (C) 1999 Matthew Wilcox <willy@bofh.ai>
 
   6  *  Copyright (C) 1999-2007 Helge Deller <deller@gmx.de>
 
   8  *  Very basic HP Human Interface Loop (HIL) driver.
 
   9  *  This driver handles the keyboard on HP300 (m68k) and on some
 
  10  *  HP700 (parisc) series machines.
 
  13  * This file is subject to the terms and conditions of the GNU General Public
 
  14  * License version 2.  See the file COPYING in the main directory of this
 
  15  * archive for more details.
 
  18 #include <linux/pci_ids.h>
 
  19 #include <linux/ioport.h>
 
  20 #include <linux/module.h>
 
  21 #include <linux/errno.h>
 
  22 #include <linux/input.h>
 
  23 #include <linux/init.h>
 
  24 #include <linux/interrupt.h>
 
  25 #include <linux/hil.h>
 
  27 #include <linux/spinlock.h>
 
  30 #include <asm/hwtest.h>
 
  34 MODULE_AUTHOR("Philip Blundell, Matthew Wilcox, Helge Deller");
 
  35 MODULE_DESCRIPTION("HIL keyboard driver (basic functionality)");
 
  36 MODULE_LICENSE("GPL v2");
 
  39 #if defined(CONFIG_PARISC)
 
  42  #include <asm/hardware.h>
 
  43  #include <asm/parisc-device.h>
 
  44  static unsigned long hil_base; /* HPA for the HIL device */
 
  45  static unsigned int hil_irq;
 
  46  #define HILBASE                hil_base /* HPPA (parisc) port address */
 
  47  #define HIL_DATA               0x800
 
  49  #define HIL_IRQ                hil_irq
 
  50  #define hil_readb(p)           gsc_readb(p)
 
  51  #define hil_writeb(v,p)        gsc_writeb((v),(p))
 
  53 #elif defined(CONFIG_HP300)
 
  55  #define HILBASE                0xf0428000UL /* HP300 (m68k) port address */
 
  59  #define hil_readb(p)           readb(p)
 
  60  #define hil_writeb(v,p)        writeb((v),(p))
 
  63 #error "HIL is not supported on this platform"
 
  68 /* HIL helper functions */
 
  70 #define hil_busy()              (hil_readb(HILBASE + HIL_CMD) & HIL_BUSY)
 
  71 #define hil_data_available()    (hil_readb(HILBASE + HIL_CMD) & HIL_DATA_RDY)
 
  72 #define hil_status()            (hil_readb(HILBASE + HIL_CMD))
 
  73 #define hil_command(x)          do { hil_writeb((x), HILBASE + HIL_CMD); } while (0)
 
  74 #define hil_read_data()         (hil_readb(HILBASE + HIL_DATA))
 
  75 #define hil_write_data(x)       do { hil_writeb((x), HILBASE + HIL_DATA); } while (0)
 
  80 #define HIL_DATA_RDY            0x01
 
  82 #define HIL_SETARD              0xA0            /* set auto-repeat delay */
 
  83 #define HIL_SETARR              0xA2            /* set auto-repeat rate */
 
  84 #define HIL_SETTONE             0xA3            /* set tone generator */
 
  85 #define HIL_CNMT                0xB2            /* clear nmi */
 
  86 #define HIL_INTON               0x5C            /* Turn on interrupts. */
 
  87 #define HIL_INTOFF              0x5D            /* Turn off interrupts. */
 
  89 #define HIL_READKBDSADR         0xF9
 
  90 #define HIL_WRITEKBDSADR        0xE9
 
  92 static unsigned int hphilkeyb_keycode[HIL_KEYCODES_SET1_TBLSIZE] __read_mostly =
 
  93         { HIL_KEYCODES_SET1 };
 
  97         struct input_dev *dev;
 
 105         unsigned char data[16];
 
 109         void *dev_id;   /* native bus device */
 
 113 static void poll_finished(void)
 
 119         switch (hil_dev.data[0]) {
 
 121                 down = (hil_dev.data[1] & 1) == 0;
 
 122                 scode = hil_dev.data[1] >> 1;
 
 123                 key = hphilkeyb_keycode[scode];
 
 124                 input_report_key(hil_dev.dev, key, down);
 
 131 static inline void handle_status(unsigned char s, unsigned char c)
 
 140                                 poll_finished();  /* just in case */
 
 141                         hil_dev.curdev = c & 7;
 
 148 static inline void handle_data(unsigned char s, unsigned char c)
 
 150         if (hil_dev.curdev) {
 
 151                 hil_dev.data[hil_dev.ptr++] = c;
 
 157 /* handle HIL interrupts */
 
 158 static irqreturn_t hil_interrupt(int irq, void *handle)
 
 183 /* send a command to the HIL */
 
 184 static void hil_do(unsigned char cmd, unsigned char *data, unsigned int len)
 
 188         spin_lock_irqsave(&hil_dev.lock, flags);
 
 195                 hil_write_data(*(data++));
 
 197         spin_unlock_irqrestore(&hil_dev.lock, flags);
 
 206         unsigned int i, kbid;
 
 207         wait_queue_head_t hil_wait;
 
 211                 return -ENODEV; /* already initialized */
 
 214         spin_lock_init(&hil_dev.lock);
 
 215         hil_dev.dev = input_allocate_device();
 
 219 #if defined(CONFIG_HP300)
 
 220         if (!MACH_IS_HP300) {
 
 224         if (!hwreg_present((void *)(HILBASE + HIL_DATA))) {
 
 225                 printk(KERN_ERR "HIL: hardware register was not found\n");
 
 229         if (!request_region(HILBASE + HIL_DATA, 2, "hil")) {
 
 230                 printk(KERN_ERR "HIL: IOPORT region already used\n");
 
 236         err = request_irq(HIL_IRQ, hil_interrupt, 0, "hil", hil_dev.dev_id);
 
 238                 printk(KERN_ERR "HIL: Can't get IRQ\n");
 
 242         /* Turn on interrupts */
 
 243         hil_do(HIL_INTON, NULL, 0);
 
 245         /* Look for keyboards */
 
 246         hil_dev.valid = 0;      /* clear any pending data */
 
 247         hil_do(HIL_READKBDSADR, NULL, 0);
 
 249         init_waitqueue_head(&hil_wait);
 
 250         wait_event_interruptible_timeout(hil_wait, hil_dev.valid, 3*HZ);
 
 251         if (!hil_dev.valid) {
 
 252                 printk(KERN_WARNING "HIL: timed out, assuming no keyboard present\n");
 
 259                 printk(KERN_WARNING "HIL: no keyboard present\n");
 
 262                 printk(KERN_INFO "HIL: keyboard found at id %d\n", kbid);
 
 265         /* set it to raw mode */
 
 267         hil_do(HIL_WRITEKBDSADR, &c, 1);
 
 269         for (i = 0; i < HIL_KEYCODES_SET1_TBLSIZE; i++)
 
 270                 if (hphilkeyb_keycode[i] != KEY_RESERVED)
 
 271                         set_bit(hphilkeyb_keycode[i], hil_dev.dev->keybit);
 
 273         hil_dev.dev->evbit[0]   = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP);
 
 274         hil_dev.dev->ledbit[0]  = BIT_MASK(LED_NUML) | BIT_MASK(LED_CAPSL) |
 
 275                 BIT_MASK(LED_SCROLLL);
 
 276         hil_dev.dev->keycodemax = HIL_KEYCODES_SET1_TBLSIZE;
 
 277         hil_dev.dev->keycodesize= sizeof(hphilkeyb_keycode[0]);
 
 278         hil_dev.dev->keycode    = hphilkeyb_keycode;
 
 279         hil_dev.dev->name       = "HIL keyboard";
 
 280         hil_dev.dev->phys       = "hpkbd/input0";
 
 282         hil_dev.dev->id.bustype = BUS_HIL;
 
 283         hil_dev.dev->id.vendor  = PCI_VENDOR_ID_HP;
 
 284         hil_dev.dev->id.product = 0x0001;
 
 285         hil_dev.dev->id.version = 0x0010;
 
 287         err = input_register_device(hil_dev.dev);
 
 289                 printk(KERN_ERR "HIL: Can't register device\n");
 
 292         printk(KERN_INFO "input: %s, ID %d at 0x%08lx (irq %d) found and attached\n",
 
 293                hil_dev.dev->name, kbid, HILBASE, HIL_IRQ);
 
 298         hil_do(HIL_INTOFF, NULL, 0);
 
 299         disable_irq(HIL_IRQ);
 
 300         free_irq(HIL_IRQ, hil_dev.dev_id);
 
 302 #if defined(CONFIG_HP300)
 
 303         release_region(HILBASE + HIL_DATA, 2);
 
 306         input_free_device(hil_dev.dev);
 
 312 #if defined(CONFIG_PARISC)
 
 314 hil_init_chip(struct parisc_device *dev)
 
 317                 printk(KERN_WARNING "HIL: IRQ not found for HIL bus at 0x%08lx\n", dev->hpa.start);
 
 321         hil_base = dev->hpa.start;
 
 323         hil_dev.dev_id = dev;
 
 325         printk(KERN_INFO "Found HIL bus at 0x%08lx, IRQ %d\n", hil_base, hil_irq);
 
 327         return hil_keyb_init();
 
 330 static struct parisc_device_id hil_tbl[] = {
 
 331         { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x00073 },
 
 335 MODULE_DEVICE_TABLE(parisc, hil_tbl);
 
 337 static struct parisc_driver hil_driver = {
 
 340         .probe =        hil_init_chip,
 
 342 #endif /* CONFIG_PARISC */
 
 345 static int __init hil_init(void)
 
 347 #if defined(CONFIG_PARISC)
 
 348         return register_parisc_driver(&hil_driver);
 
 350         return hil_keyb_init();
 
 355 static void __exit hil_exit(void)
 
 358                 disable_irq(HIL_IRQ);
 
 359                 free_irq(HIL_IRQ, hil_dev.dev_id);
 
 362         /* Turn off interrupts */
 
 363         hil_do(HIL_INTOFF, NULL, 0);
 
 365         input_unregister_device(hil_dev.dev);
 
 369 #if defined(CONFIG_PARISC)
 
 370         unregister_parisc_driver(&hil_driver);
 
 372         release_region(HILBASE+HIL_DATA, 2);
 
 376 module_init(hil_init);
 
 377 module_exit(hil_exit);