linux/drivers/input/keyboard/atkbd.c
<<
>>
Prefs
   1/*
   2 * AT and PS/2 keyboard driver
   3 *
   4 * Copyright (c) 1999-2002 Vojtech Pavlik
   5 */
   6
   7/*
   8 * This program is free software; you can redistribute it and/or modify it
   9 * under the terms of the GNU General Public License version 2 as published by
  10 * the Free Software Foundation.
  11 */
  12
  13/*
  14 * This driver can handle standard AT keyboards and PS/2 keyboards in
  15 * Translated and Raw Set 2 and Set 3, as well as AT keyboards on dumb
  16 * input-only controllers and AT keyboards connected over a one way RS232
  17 * converter.
  18 */
  19
  20#include <linux/delay.h>
  21#include <linux/module.h>
  22#include <linux/slab.h>
  23#include <linux/interrupt.h>
  24#include <linux/init.h>
  25#include <linux/input.h>
  26#include <linux/serio.h>
  27#include <linux/workqueue.h>
  28#include <linux/libps2.h>
  29#include <linux/mutex.h>
  30#include <linux/dmi.h>
  31
  32#define DRIVER_DESC     "AT and PS/2 keyboard driver"
  33
  34MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
  35MODULE_DESCRIPTION(DRIVER_DESC);
  36MODULE_LICENSE("GPL");
  37
  38static int atkbd_set = 2;
  39module_param_named(set, atkbd_set, int, 0);
  40MODULE_PARM_DESC(set, "Select keyboard code set (2 = default, 3 = PS/2 native)");
  41
  42#if defined(__i386__) || defined(__x86_64__) || defined(__hppa__)
  43static int atkbd_reset;
  44#else
  45static int atkbd_reset = 1;
  46#endif
  47module_param_named(reset, atkbd_reset, bool, 0);
  48MODULE_PARM_DESC(reset, "Reset keyboard during initialization");
  49
  50static int atkbd_softrepeat;
  51module_param_named(softrepeat, atkbd_softrepeat, bool, 0);
  52MODULE_PARM_DESC(softrepeat, "Use software keyboard repeat");
  53
  54static int atkbd_softraw = 1;
  55module_param_named(softraw, atkbd_softraw, bool, 0);
  56MODULE_PARM_DESC(softraw, "Use software generated rawmode");
  57
  58static int atkbd_scroll;
  59module_param_named(scroll, atkbd_scroll, bool, 0);
  60MODULE_PARM_DESC(scroll, "Enable scroll-wheel on MS Office and similar keyboards");
  61
  62static int atkbd_extra;
  63module_param_named(extra, atkbd_extra, bool, 0);
  64MODULE_PARM_DESC(extra, "Enable extra LEDs and keys on IBM RapidAcces, EzKey and similar keyboards");
  65
  66/*
  67 * Scancode to keycode tables. These are just the default setting, and
  68 * are loadable via a userland utility.
  69 */
  70
  71#define ATKBD_KEYMAP_SIZE       512
  72
  73static const unsigned short atkbd_set2_keycode[ATKBD_KEYMAP_SIZE] = {
  74
  75#ifdef CONFIG_KEYBOARD_ATKBD_HP_KEYCODES
  76
  77/* XXX: need a more general approach */
  78
  79#include "hpps2atkbd.h" /* include the keyboard scancodes */
  80
  81#else
  82          0, 67, 65, 63, 61, 59, 60, 88,  0, 68, 66, 64, 62, 15, 41,117,
  83          0, 56, 42, 93, 29, 16,  2,  0,  0,  0, 44, 31, 30, 17,  3,  0,
  84          0, 46, 45, 32, 18,  5,  4, 95,  0, 57, 47, 33, 20, 19,  6,183,
  85          0, 49, 48, 35, 34, 21,  7,184,  0,  0, 50, 36, 22,  8,  9,185,
  86          0, 51, 37, 23, 24, 11, 10,  0,  0, 52, 53, 38, 39, 25, 12,  0,
  87          0, 89, 40,  0, 26, 13,  0,  0, 58, 54, 28, 27,  0, 43,  0, 85,
  88          0, 86, 91, 90, 92,  0, 14, 94,  0, 79,124, 75, 71,121,  0,  0,
  89         82, 83, 80, 76, 77, 72,  1, 69, 87, 78, 81, 74, 55, 73, 70, 99,
  90
  91          0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  92        217,100,255,  0, 97,165,  0,  0,156,  0,  0,  0,  0,  0,  0,125,
  93        173,114,  0,113,  0,  0,  0,126,128,  0,  0,140,  0,  0,  0,127,
  94        159,  0,115,  0,164,  0,  0,116,158,  0,172,166,  0,  0,  0,142,
  95        157,  0,  0,  0,  0,  0,  0,  0,155,  0, 98,  0,  0,163,  0,  0,
  96        226,  0,  0,  0,  0,  0,  0,  0,  0,255, 96,  0,  0,  0,143,  0,
  97          0,  0,  0,  0,  0,  0,  0,  0,  0,107,  0,105,102,  0,  0,112,
  98        110,111,108,112,106,103,  0,119,  0,118,109,  0, 99,104,119,  0,
  99
 100          0,  0,  0, 65, 99,
 101#endif
 102};
 103
 104static const unsigned short atkbd_set3_keycode[ATKBD_KEYMAP_SIZE] = {
 105
 106          0,  0,  0,  0,  0,  0,  0, 59,  1,138,128,129,130, 15, 41, 60,
 107        131, 29, 42, 86, 58, 16,  2, 61,133, 56, 44, 31, 30, 17,  3, 62,
 108        134, 46, 45, 32, 18,  5,  4, 63,135, 57, 47, 33, 20, 19,  6, 64,
 109        136, 49, 48, 35, 34, 21,  7, 65,137,100, 50, 36, 22,  8,  9, 66,
 110        125, 51, 37, 23, 24, 11, 10, 67,126, 52, 53, 38, 39, 25, 12, 68,
 111        113,114, 40, 43, 26, 13, 87, 99, 97, 54, 28, 27, 43, 43, 88, 70,
 112        108,105,119,103,111,107, 14,110,  0, 79,106, 75, 71,109,102,104,
 113         82, 83, 80, 76, 77, 72, 69, 98,  0, 96, 81,  0, 78, 73, 55,183,
 114
 115        184,185,186,187, 74, 94, 92, 93,  0,  0,  0,125,126,127,112,  0,
 116          0,139,172,163,165,115,152,172,166,140,160,154,113,114,167,168,
 117        148,149,147,140
 118};
 119
 120static const unsigned short atkbd_unxlate_table[128] = {
 121          0,118, 22, 30, 38, 37, 46, 54, 61, 62, 70, 69, 78, 85,102, 13,
 122         21, 29, 36, 45, 44, 53, 60, 67, 68, 77, 84, 91, 90, 20, 28, 27,
 123         35, 43, 52, 51, 59, 66, 75, 76, 82, 14, 18, 93, 26, 34, 33, 42,
 124         50, 49, 58, 65, 73, 74, 89,124, 17, 41, 88,  5,  6,  4, 12,  3,
 125         11,  2, 10,  1,  9,119,126,108,117,125,123,107,115,116,121,105,
 126        114,122,112,113,127, 96, 97,120,  7, 15, 23, 31, 39, 47, 55, 63,
 127         71, 79, 86, 94,  8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 87,111,
 128         19, 25, 57, 81, 83, 92, 95, 98, 99,100,101,103,104,106,109,110
 129};
 130
 131#define ATKBD_CMD_SETLEDS       0x10ed
 132#define ATKBD_CMD_GSCANSET      0x11f0
 133#define ATKBD_CMD_SSCANSET      0x10f0
 134#define ATKBD_CMD_GETID         0x02f2
 135#define ATKBD_CMD_SETREP        0x10f3
 136#define ATKBD_CMD_ENABLE        0x00f4
 137#define ATKBD_CMD_RESET_DIS     0x00f5
 138#define ATKBD_CMD_SETALL_MBR    0x00fa
 139#define ATKBD_CMD_RESET_BAT     0x02ff
 140#define ATKBD_CMD_RESEND        0x00fe
 141#define ATKBD_CMD_EX_ENABLE     0x10ea
 142#define ATKBD_CMD_EX_SETLEDS    0x20eb
 143#define ATKBD_CMD_OK_GETID      0x02e8
 144
 145#define ATKBD_RET_ACK           0xfa
 146#define ATKBD_RET_NAK           0xfe
 147#define ATKBD_RET_BAT           0xaa
 148#define ATKBD_RET_EMUL0         0xe0
 149#define ATKBD_RET_EMUL1         0xe1
 150#define ATKBD_RET_RELEASE       0xf0
 151#define ATKBD_RET_HANJA         0xf1
 152#define ATKBD_RET_HANGEUL       0xf2
 153#define ATKBD_RET_ERR           0xff
 154
 155#define ATKBD_KEY_UNKNOWN         0
 156#define ATKBD_KEY_NULL          255
 157
 158#define ATKBD_SCR_1             254
 159#define ATKBD_SCR_2             253
 160#define ATKBD_SCR_4             252
 161#define ATKBD_SCR_8             251
 162#define ATKBD_SCR_CLICK         250
 163#define ATKBD_SCR_LEFT          249
 164#define ATKBD_SCR_RIGHT         248
 165
 166#define ATKBD_SPECIAL           ATKBD_SCR_RIGHT
 167
 168#define ATKBD_LED_EVENT_BIT     0
 169#define ATKBD_REP_EVENT_BIT     1
 170
 171#define ATKBD_XL_ERR            0x01
 172#define ATKBD_XL_BAT            0x02
 173#define ATKBD_XL_ACK            0x04
 174#define ATKBD_XL_NAK            0x08
 175#define ATKBD_XL_HANGEUL        0x10
 176#define ATKBD_XL_HANJA          0x20
 177
 178static const struct {
 179        unsigned char keycode;
 180        unsigned char set2;
 181} atkbd_scroll_keys[] = {
 182        { ATKBD_SCR_1,     0xc5 },
 183        { ATKBD_SCR_2,     0x9d },
 184        { ATKBD_SCR_4,     0xa4 },
 185        { ATKBD_SCR_8,     0x9b },
 186        { ATKBD_SCR_CLICK, 0xe0 },
 187        { ATKBD_SCR_LEFT,  0xcb },
 188        { ATKBD_SCR_RIGHT, 0xd2 },
 189};
 190
 191/*
 192 * The atkbd control structure
 193 */
 194
 195struct atkbd {
 196
 197        struct ps2dev ps2dev;
 198        struct input_dev *dev;
 199
 200        /* Written only during init */
 201        char name[64];
 202        char phys[32];
 203
 204        unsigned short id;
 205        unsigned short keycode[ATKBD_KEYMAP_SIZE];
 206        DECLARE_BITMAP(force_release_mask, ATKBD_KEYMAP_SIZE);
 207        unsigned char set;
 208        unsigned char translated;
 209        unsigned char extra;
 210        unsigned char write;
 211        unsigned char softrepeat;
 212        unsigned char softraw;
 213        unsigned char scroll;
 214        unsigned char enabled;
 215
 216        /* Accessed only from interrupt */
 217        unsigned char emul;
 218        unsigned char resend;
 219        unsigned char release;
 220        unsigned long xl_bit;
 221        unsigned int last;
 222        unsigned long time;
 223        unsigned long err_count;
 224
 225        struct delayed_work event_work;
 226        unsigned long event_jiffies;
 227        struct mutex event_mutex;
 228        unsigned long event_mask;
 229};
 230
 231/*
 232 * System-specific keymap fixup routine
 233 */
 234static void (*atkbd_platform_fixup)(struct atkbd *, const void *data);
 235static void *atkbd_platform_fixup_data;
 236static unsigned int (*atkbd_platform_scancode_fixup)(struct atkbd *, unsigned int);
 237
 238static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf,
 239                                ssize_t (*handler)(struct atkbd *, char *));
 240static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count,
 241                                ssize_t (*handler)(struct atkbd *, const char *, size_t));
 242#define ATKBD_DEFINE_ATTR(_name)                                                \
 243static ssize_t atkbd_show_##_name(struct atkbd *, char *);                      \
 244static ssize_t atkbd_set_##_name(struct atkbd *, const char *, size_t);         \
 245static ssize_t atkbd_do_show_##_name(struct device *d,                          \
 246                                struct device_attribute *attr, char *b)         \
 247{                                                                               \
 248        return atkbd_attr_show_helper(d, b, atkbd_show_##_name);                \
 249}                                                                               \
 250static ssize_t atkbd_do_set_##_name(struct device *d,                           \
 251                        struct device_attribute *attr, const char *b, size_t s) \
 252{                                                                               \
 253        return atkbd_attr_set_helper(d, b, s, atkbd_set_##_name);               \
 254}                                                                               \
 255static struct device_attribute atkbd_attr_##_name =                             \
 256        __ATTR(_name, S_IWUSR | S_IRUGO, atkbd_do_show_##_name, atkbd_do_set_##_name);
 257
 258ATKBD_DEFINE_ATTR(extra);
 259ATKBD_DEFINE_ATTR(force_release);
 260ATKBD_DEFINE_ATTR(scroll);
 261ATKBD_DEFINE_ATTR(set);
 262ATKBD_DEFINE_ATTR(softrepeat);
 263ATKBD_DEFINE_ATTR(softraw);
 264
 265#define ATKBD_DEFINE_RO_ATTR(_name)                                             \
 266static ssize_t atkbd_show_##_name(struct atkbd *, char *);                      \
 267static ssize_t atkbd_do_show_##_name(struct device *d,                          \
 268                                struct device_attribute *attr, char *b)         \
 269{                                                                               \
 270        return atkbd_attr_show_helper(d, b, atkbd_show_##_name);                \
 271}                                                                               \
 272static struct device_attribute atkbd_attr_##_name =                             \
 273        __ATTR(_name, S_IRUGO, atkbd_do_show_##_name, NULL);
 274
 275ATKBD_DEFINE_RO_ATTR(err_count);
 276
 277static struct attribute *atkbd_attributes[] = {
 278        &atkbd_attr_extra.attr,
 279        &atkbd_attr_force_release.attr,
 280        &atkbd_attr_scroll.attr,
 281        &atkbd_attr_set.attr,
 282        &atkbd_attr_softrepeat.attr,
 283        &atkbd_attr_softraw.attr,
 284        &atkbd_attr_err_count.attr,
 285        NULL
 286};
 287
 288static struct attribute_group atkbd_attribute_group = {
 289        .attrs  = atkbd_attributes,
 290};
 291
 292static const unsigned int xl_table[] = {
 293        ATKBD_RET_BAT, ATKBD_RET_ERR, ATKBD_RET_ACK,
 294        ATKBD_RET_NAK, ATKBD_RET_HANJA, ATKBD_RET_HANGEUL,
 295};
 296
 297/*
 298 * Checks if we should mangle the scancode to extract 'release' bit
 299 * in translated mode.
 300 */
 301static int atkbd_need_xlate(unsigned long xl_bit, unsigned char code)
 302{
 303        int i;
 304
 305        if (code == ATKBD_RET_EMUL0 || code == ATKBD_RET_EMUL1)
 306                return 0;
 307
 308        for (i = 0; i < ARRAY_SIZE(xl_table); i++)
 309                if (code == xl_table[i])
 310                        return test_bit(i, &xl_bit);
 311
 312        return 1;
 313}
 314
 315/*
 316 * Calculates new value of xl_bit so the driver can distinguish
 317 * between make/break pair of scancodes for select keys and PS/2
 318 * protocol responses.
 319 */
 320static void atkbd_calculate_xl_bit(struct atkbd *atkbd, unsigned char code)
 321{
 322        int i;
 323
 324        for (i = 0; i < ARRAY_SIZE(xl_table); i++) {
 325                if (!((code ^ xl_table[i]) & 0x7f)) {
 326                        if (code & 0x80)
 327                                __clear_bit(i, &atkbd->xl_bit);
 328                        else
 329                                __set_bit(i, &atkbd->xl_bit);
 330                        break;
 331                }
 332        }
 333}
 334
 335/*
 336 * Encode the scancode, 0xe0 prefix, and high bit into a single integer,
 337 * keeping kernel 2.4 compatibility for set 2
 338 */
 339static unsigned int atkbd_compat_scancode(struct atkbd *atkbd, unsigned int code)
 340{
 341        if (atkbd->set == 3) {
 342                if (atkbd->emul == 1)
 343                        code |= 0x100;
 344        } else {
 345                code = (code & 0x7f) | ((code & 0x80) << 1);
 346                if (atkbd->emul == 1)
 347                        code |= 0x80;
 348        }
 349
 350        return code;
 351}
 352
 353/*
 354 * atkbd_interrupt(). Here takes place processing of data received from
 355 * the keyboard into events.
 356 */
 357
 358static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
 359                        unsigned int flags)
 360{
 361        struct atkbd *atkbd = serio_get_drvdata(serio);
 362        struct input_dev *dev = atkbd->dev;
 363        unsigned int code = data;
 364        int scroll = 0, hscroll = 0, click = -1;
 365        int value;
 366        unsigned short keycode;
 367
 368#ifdef ATKBD_DEBUG
 369        printk(KERN_DEBUG "atkbd.c: Received %02x flags %02x\n", data, flags);
 370#endif
 371
 372#if !defined(__i386__) && !defined (__x86_64__)
 373        if ((flags & (SERIO_FRAME | SERIO_PARITY)) && (~flags & SERIO_TIMEOUT) && !atkbd->resend && atkbd->write) {
 374                printk(KERN_WARNING "atkbd.c: frame/parity error: %02x\n", flags);
 375                serio_write(serio, ATKBD_CMD_RESEND);
 376                atkbd->resend = 1;
 377                goto out;
 378        }
 379
 380        if (!flags && data == ATKBD_RET_ACK)
 381                atkbd->resend = 0;
 382#endif
 383
 384        if (unlikely(atkbd->ps2dev.flags & PS2_FLAG_ACK))
 385                if  (ps2_handle_ack(&atkbd->ps2dev, data))
 386                        goto out;
 387
 388        if (unlikely(atkbd->ps2dev.flags & PS2_FLAG_CMD))
 389                if  (ps2_handle_response(&atkbd->ps2dev, data))
 390                        goto out;
 391
 392        if (!atkbd->enabled)
 393                goto out;
 394
 395        input_event(dev, EV_MSC, MSC_RAW, code);
 396
 397        if (atkbd_platform_scancode_fixup)
 398                code = atkbd_platform_scancode_fixup(atkbd, code);
 399
 400        if (atkbd->translated) {
 401
 402                if (atkbd->emul || atkbd_need_xlate(atkbd->xl_bit, code)) {
 403                        atkbd->release = code >> 7;
 404                        code &= 0x7f;
 405                }
 406
 407                if (!atkbd->emul)
 408                        atkbd_calculate_xl_bit(atkbd, data);
 409        }
 410
 411        switch (code) {
 412                case ATKBD_RET_BAT:
 413                        atkbd->enabled = 0;
 414                        serio_reconnect(atkbd->ps2dev.serio);
 415                        goto out;
 416                case ATKBD_RET_EMUL0:
 417                        atkbd->emul = 1;
 418                        goto out;
 419                case ATKBD_RET_EMUL1:
 420                        atkbd->emul = 2;
 421                        goto out;
 422                case ATKBD_RET_RELEASE:
 423                        atkbd->release = 1;
 424                        goto out;
 425                case ATKBD_RET_ACK:
 426                case ATKBD_RET_NAK:
 427                        if (printk_ratelimit())
 428                                printk(KERN_WARNING "atkbd.c: Spurious %s on %s. "
 429                                       "Some program might be trying access hardware directly.\n",
 430                                       data == ATKBD_RET_ACK ? "ACK" : "NAK", serio->phys);
 431                        goto out;
 432                case ATKBD_RET_ERR:
 433                        atkbd->err_count++;
 434#ifdef ATKBD_DEBUG
 435                        printk(KERN_DEBUG "atkbd.c: Keyboard on %s reports too many keys pressed.\n", serio->phys);
 436#endif
 437                        goto out;
 438        }
 439
 440        code = atkbd_compat_scancode(atkbd, code);
 441
 442        if (atkbd->emul && --atkbd->emul)
 443                goto out;
 444
 445        keycode = atkbd->keycode[code];
 446
 447        if (keycode != ATKBD_KEY_NULL)
 448                input_event(dev, EV_MSC, MSC_SCAN, code);
 449
 450        switch (keycode) {
 451                case ATKBD_KEY_NULL:
 452                        break;
 453                case ATKBD_KEY_UNKNOWN:
 454                        printk(KERN_WARNING
 455                               "atkbd.c: Unknown key %s (%s set %d, code %#x on %s).\n",
 456                               atkbd->release ? "released" : "pressed",
 457                               atkbd->translated ? "translated" : "raw",
 458                               atkbd->set, code, serio->phys);
 459                        printk(KERN_WARNING
 460                               "atkbd.c: Use 'setkeycodes %s%02x <keycode>' to make it known.\n",
 461                               code & 0x80 ? "e0" : "", code & 0x7f);
 462                        input_sync(dev);
 463                        break;
 464                case ATKBD_SCR_1:
 465                        scroll = 1 - atkbd->release * 2;
 466                        break;
 467                case ATKBD_SCR_2:
 468                        scroll = 2 - atkbd->release * 4;
 469                        break;
 470                case ATKBD_SCR_4:
 471                        scroll = 4 - atkbd->release * 8;
 472                        break;
 473                case ATKBD_SCR_8:
 474                        scroll = 8 - atkbd->release * 16;
 475                        break;
 476                case ATKBD_SCR_CLICK:
 477                        click = !atkbd->release;
 478                        break;
 479                case ATKBD_SCR_LEFT:
 480                        hscroll = -1;
 481                        break;
 482                case ATKBD_SCR_RIGHT:
 483                        hscroll = 1;
 484                        break;
 485                default:
 486                        if (atkbd->release) {
 487                                value = 0;
 488                                atkbd->last = 0;
 489                        } else if (!atkbd->softrepeat && test_bit(keycode, dev->key)) {
 490                                /* Workaround Toshiba laptop multiple keypress */
 491                                value = time_before(jiffies, atkbd->time) && atkbd->last == code ? 1 : 2;
 492                        } else {
 493                                value = 1;
 494                                atkbd->last = code;
 495                                atkbd->time = jiffies + msecs_to_jiffies(dev->rep[REP_DELAY]) / 2;
 496                        }
 497
 498                        input_event(dev, EV_KEY, keycode, value);
 499                        input_sync(dev);
 500
 501                        if (value && test_bit(code, atkbd->force_release_mask)) {
 502                                input_report_key(dev, keycode, 0);
 503                                input_sync(dev);
 504                        }
 505        }
 506
 507        if (atkbd->scroll) {
 508                if (click != -1)
 509                        input_report_key(dev, BTN_MIDDLE, click);
 510                input_report_rel(dev, REL_WHEEL, scroll);
 511                input_report_rel(dev, REL_HWHEEL, hscroll);
 512                input_sync(dev);
 513        }
 514
 515        atkbd->release = 0;
 516out:
 517        return IRQ_HANDLED;
 518}
 519
 520static int atkbd_set_repeat_rate(struct atkbd *atkbd)
 521{
 522        const short period[32] =
 523                { 33,  37,  42,  46,  50,  54,  58,  63,  67,  75,  83,  92, 100, 109, 116, 125,
 524                 133, 149, 167, 182, 200, 217, 232, 250, 270, 303, 333, 370, 400, 435, 470, 500 };
 525        const short delay[4] =
 526                { 250, 500, 750, 1000 };
 527
 528        struct input_dev *dev = atkbd->dev;
 529        unsigned char param;
 530        int i = 0, j = 0;
 531
 532        while (i < ARRAY_SIZE(period) - 1 && period[i] < dev->rep[REP_PERIOD])
 533                i++;
 534        dev->rep[REP_PERIOD] = period[i];
 535
 536        while (j < ARRAY_SIZE(delay) - 1 && delay[j] < dev->rep[REP_DELAY])
 537                j++;
 538        dev->rep[REP_DELAY] = delay[j];
 539
 540        param = i | (j << 5);
 541        return ps2_command(&atkbd->ps2dev, &param, ATKBD_CMD_SETREP);
 542}
 543
 544static int atkbd_set_leds(struct atkbd *atkbd)
 545{
 546        struct input_dev *dev = atkbd->dev;
 547        unsigned char param[2];
 548
 549        param[0] = (test_bit(LED_SCROLLL, dev->led) ? 1 : 0)
 550                 | (test_bit(LED_NUML,    dev->led) ? 2 : 0)
 551                 | (test_bit(LED_CAPSL,   dev->led) ? 4 : 0);
 552        if (ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_SETLEDS))
 553                return -1;
 554
 555        if (atkbd->extra) {
 556                param[0] = 0;
 557                param[1] = (test_bit(LED_COMPOSE, dev->led) ? 0x01 : 0)
 558                         | (test_bit(LED_SLEEP,   dev->led) ? 0x02 : 0)
 559                         | (test_bit(LED_SUSPEND, dev->led) ? 0x04 : 0)
 560                         | (test_bit(LED_MISC,    dev->led) ? 0x10 : 0)
 561                         | (test_bit(LED_MUTE,    dev->led) ? 0x20 : 0);
 562                if (ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_EX_SETLEDS))
 563                        return -1;
 564        }
 565
 566        return 0;
 567}
 568
 569/*
 570 * atkbd_event_work() is used to complete processing of events that
 571 * can not be processed by input_event() which is often called from
 572 * interrupt context.
 573 */
 574
 575static void atkbd_event_work(struct work_struct *work)
 576{
 577        struct atkbd *atkbd = container_of(work, struct atkbd, event_work.work);
 578
 579        mutex_lock(&atkbd->event_mutex);
 580
 581        if (!atkbd->enabled) {
 582                /*
 583                 * Serio ports are resumed asynchronously so while driver core
 584                 * thinks that device is already fully operational in reality
 585                 * it may not be ready yet. In this case we need to keep
 586                 * rescheduling till reconnect completes.
 587                 */
 588                schedule_delayed_work(&atkbd->event_work,
 589                                        msecs_to_jiffies(100));
 590        } else {
 591                if (test_and_clear_bit(ATKBD_LED_EVENT_BIT, &atkbd->event_mask))
 592                        atkbd_set_leds(atkbd);
 593
 594                if (test_and_clear_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask))
 595                        atkbd_set_repeat_rate(atkbd);
 596        }
 597
 598        mutex_unlock(&atkbd->event_mutex);
 599}
 600
 601/*
 602 * Schedule switch for execution. We need to throttle requests,
 603 * otherwise keyboard may become unresponsive.
 604 */
 605static void atkbd_schedule_event_work(struct atkbd *atkbd, int event_bit)
 606{
 607        unsigned long delay = msecs_to_jiffies(50);
 608
 609        if (time_after(jiffies, atkbd->event_jiffies + delay))
 610                delay = 0;
 611
 612        atkbd->event_jiffies = jiffies;
 613        set_bit(event_bit, &atkbd->event_mask);
 614        wmb();
 615        schedule_delayed_work(&atkbd->event_work, delay);
 616}
 617
 618/*
 619 * Event callback from the input module. Events that change the state of
 620 * the hardware are processed here. If action can not be performed in
 621 * interrupt context it is offloaded to atkbd_event_work.
 622 */
 623
 624static int atkbd_event(struct input_dev *dev,
 625                        unsigned int type, unsigned int code, int value)
 626{
 627        struct atkbd *atkbd = input_get_drvdata(dev);
 628
 629        if (!atkbd->write)
 630                return -1;
 631
 632        switch (type) {
 633
 634                case EV_LED:
 635                        atkbd_schedule_event_work(atkbd, ATKBD_LED_EVENT_BIT);
 636                        return 0;
 637
 638                case EV_REP:
 639                        if (!atkbd->softrepeat)
 640                                atkbd_schedule_event_work(atkbd, ATKBD_REP_EVENT_BIT);
 641                        return 0;
 642        }
 643
 644        return -1;
 645}
 646
 647/*
 648 * atkbd_enable() signals that interrupt handler is allowed to
 649 * generate input events.
 650 */
 651
 652static inline void atkbd_enable(struct atkbd *atkbd)
 653{
 654        serio_pause_rx(atkbd->ps2dev.serio);
 655        atkbd->enabled = 1;
 656        serio_continue_rx(atkbd->ps2dev.serio);
 657}
 658
 659/*
 660 * atkbd_disable() tells input handler that all incoming data except
 661 * for ACKs and command response should be dropped.
 662 */
 663
 664static inline void atkbd_disable(struct atkbd *atkbd)
 665{
 666        serio_pause_rx(atkbd->ps2dev.serio);
 667        atkbd->enabled = 0;
 668        serio_continue_rx(atkbd->ps2dev.serio);
 669}
 670
 671/*
 672 * atkbd_probe() probes for an AT keyboard on a serio port.
 673 */
 674
 675static int atkbd_probe(struct atkbd *atkbd)
 676{
 677        struct ps2dev *ps2dev = &atkbd->ps2dev;
 678        unsigned char param[2];
 679
 680/*
 681 * Some systems, where the bit-twiddling when testing the io-lines of the
 682 * controller may confuse the keyboard need a full reset of the keyboard. On
 683 * these systems the BIOS also usually doesn't do it for us.
 684 */
 685
 686        if (atkbd_reset)
 687                if (ps2_command(ps2dev, NULL, ATKBD_CMD_RESET_BAT))
 688                        printk(KERN_WARNING "atkbd.c: keyboard reset failed on %s\n", ps2dev->serio->phys);
 689
 690/*
 691 * Then we check the keyboard ID. We should get 0xab83 under normal conditions.
 692 * Some keyboards report different values, but the first byte is always 0xab or
 693 * 0xac. Some old AT keyboards don't report anything. If a mouse is connected, this
 694 * should make sure we don't try to set the LEDs on it.
 695 */
 696
 697        param[0] = param[1] = 0xa5;     /* initialize with invalid values */
 698        if (ps2_command(ps2dev, param, ATKBD_CMD_GETID)) {
 699
 700/*
 701 * If the get ID command failed, we check if we can at least set the LEDs on
 702 * the keyboard. This should work on every keyboard out there. It also turns
 703 * the LEDs off, which we want anyway.
 704 */
 705                param[0] = 0;
 706                if (ps2_command(ps2dev, param, ATKBD_CMD_SETLEDS))
 707                        return -1;
 708                atkbd->id = 0xabba;
 709                return 0;
 710        }
 711
 712        if (!ps2_is_keyboard_id(param[0]))
 713                return -1;
 714
 715        atkbd->id = (param[0] << 8) | param[1];
 716
 717        if (atkbd->id == 0xaca1 && atkbd->translated) {
 718                printk(KERN_ERR "atkbd.c: NCD terminal keyboards are only supported on non-translating\n");
 719                printk(KERN_ERR "atkbd.c: controllers. Use i8042.direct=1 to disable translation.\n");
 720                return -1;
 721        }
 722
 723        return 0;
 724}
 725
 726/*
 727 * atkbd_select_set checks if a keyboard has a working Set 3 support, and
 728 * sets it into that. Unfortunately there are keyboards that can be switched
 729 * to Set 3, but don't work well in that (BTC Multimedia ...)
 730 */
 731
 732static int atkbd_select_set(struct atkbd *atkbd, int target_set, int allow_extra)
 733{
 734        struct ps2dev *ps2dev = &atkbd->ps2dev;
 735        unsigned char param[2];
 736
 737        atkbd->extra = 0;
 738/*
 739 * For known special keyboards we can go ahead and set the correct set.
 740 * We check for NCD PS/2 Sun, NorthGate OmniKey 101 and
 741 * IBM RapidAccess / IBM EzButton / Chicony KBP-8993 keyboards.
 742 */
 743
 744        if (atkbd->translated)
 745                return 2;
 746
 747        if (atkbd->id == 0xaca1) {
 748                param[0] = 3;
 749                ps2_command(ps2dev, param, ATKBD_CMD_SSCANSET);
 750                return 3;
 751        }
 752
 753        if (allow_extra) {
 754                param[0] = 0x71;
 755                if (!ps2_command(ps2dev, param, ATKBD_CMD_EX_ENABLE)) {
 756                        atkbd->extra = 1;
 757                        return 2;
 758                }
 759        }
 760
 761        if (target_set != 3)
 762                return 2;
 763
 764        if (!ps2_command(ps2dev, param, ATKBD_CMD_OK_GETID)) {
 765                atkbd->id = param[0] << 8 | param[1];
 766                return 2;
 767        }
 768
 769        param[0] = 3;
 770        if (ps2_command(ps2dev, param, ATKBD_CMD_SSCANSET))
 771                return 2;
 772
 773        param[0] = 0;
 774        if (ps2_command(ps2dev, param, ATKBD_CMD_GSCANSET))
 775                return 2;
 776
 777        if (param[0] != 3) {
 778                param[0] = 2;
 779                if (ps2_command(ps2dev, param, ATKBD_CMD_SSCANSET))
 780                return 2;
 781        }
 782
 783        ps2_command(ps2dev, param, ATKBD_CMD_SETALL_MBR);
 784
 785        return 3;
 786}
 787
 788static int atkbd_reset_state(struct atkbd *atkbd)
 789{
 790        struct ps2dev *ps2dev = &atkbd->ps2dev;
 791        unsigned char param[1];
 792
 793/*
 794 * Set the LEDs to a predefined state (all off).
 795 */
 796
 797        param[0] = 0;
 798        if (ps2_command(ps2dev, param, ATKBD_CMD_SETLEDS))
 799                return -1;
 800
 801/*
 802 * Set autorepeat to fastest possible.
 803 */
 804
 805        param[0] = 0;
 806        if (ps2_command(ps2dev, param, ATKBD_CMD_SETREP))
 807                return -1;
 808
 809        return 0;
 810}
 811
 812static int atkbd_activate(struct atkbd *atkbd)
 813{
 814        struct ps2dev *ps2dev = &atkbd->ps2dev;
 815
 816/*
 817 * Enable the keyboard to receive keystrokes.
 818 */
 819
 820        if (ps2_command(ps2dev, NULL, ATKBD_CMD_ENABLE)) {
 821                printk(KERN_ERR "atkbd.c: Failed to enable keyboard on %s\n",
 822                        ps2dev->serio->phys);
 823                return -1;
 824        }
 825
 826        return 0;
 827}
 828
 829/*
 830 * atkbd_cleanup() restores the keyboard state so that BIOS is happy after a
 831 * reboot.
 832 */
 833
 834static void atkbd_cleanup(struct serio *serio)
 835{
 836        struct atkbd *atkbd = serio_get_drvdata(serio);
 837
 838        atkbd_disable(atkbd);
 839        ps2_command(&atkbd->ps2dev, NULL, ATKBD_CMD_RESET_BAT);
 840}
 841
 842
 843/*
 844 * atkbd_disconnect() closes and frees.
 845 */
 846
 847static void atkbd_disconnect(struct serio *serio)
 848{
 849        struct atkbd *atkbd = serio_get_drvdata(serio);
 850
 851        atkbd_disable(atkbd);
 852
 853        /* make sure we don't have a command in flight */
 854        cancel_delayed_work_sync(&atkbd->event_work);
 855
 856        sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group);
 857        input_unregister_device(atkbd->dev);
 858        serio_close(serio);
 859        serio_set_drvdata(serio, NULL);
 860        kfree(atkbd);
 861}
 862
 863/*
 864 * generate release events for the keycodes given in data
 865 */
 866static void atkbd_apply_forced_release_keylist(struct atkbd* atkbd,
 867                                                const void *data)
 868{
 869        const unsigned int *keys = data;
 870        unsigned int i;
 871
 872        if (atkbd->set == 2)
 873                for (i = 0; keys[i] != -1U; i++)
 874                        __set_bit(keys[i], atkbd->force_release_mask);
 875}
 876
 877/*
 878 * Most special keys (Fn+F?) on Dell laptops do not generate release
 879 * events so we have to do it ourselves.
 880 */
 881static unsigned int atkbd_dell_laptop_forced_release_keys[] = {
 882        0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8f, 0x93, -1U
 883};
 884
 885/*
 886 * Perform fixup for HP system that doesn't generate release
 887 * for its video switch
 888 */
 889static unsigned int atkbd_hp_forced_release_keys[] = {
 890        0x94, -1U
 891};
 892
 893/*
 894 * Samsung NC10,NC20 with Fn+F? key release not working
 895 */
 896static unsigned int atkbd_samsung_forced_release_keys[] = {
 897        0x82, 0x83, 0x84, 0x86, 0x88, 0x89, 0xb3, 0xf7, 0xf9, -1U
 898};
 899
 900/*
 901 * Amilo Pi 3525 key release for Fn+Volume keys not working
 902 */
 903static unsigned int atkbd_amilo_pi3525_forced_release_keys[] = {
 904        0x20, 0xa0, 0x2e, 0xae, 0x30, 0xb0, -1U
 905};
 906
 907/*
 908 * Amilo Xi 3650 key release for light touch bar not working
 909 */
 910static unsigned int atkbd_amilo_xi3650_forced_release_keys[] = {
 911        0x67, 0xed, 0x90, 0xa2, 0x99, 0xa4, 0xae, 0xb0, -1U
 912};
 913
 914/*
 915 * Soltech TA12 system with broken key release on volume keys and mute key
 916 */
 917static unsigned int atkdb_soltech_ta12_forced_release_keys[] = {
 918        0xa0, 0xae, 0xb0, -1U
 919};
 920
 921/*
 922 * Many notebooks don't send key release event for volume up/down
 923 * keys, with key list below common among them
 924 */
 925static unsigned int atkbd_volume_forced_release_keys[] = {
 926        0xae, 0xb0, -1U
 927};
 928
 929/*
 930 * OQO 01+ multimedia keys (64--66) generate e0 6x upon release whereas
 931 * they should be generating e4-e6 (0x80 | code).
 932 */
 933static unsigned int atkbd_oqo_01plus_scancode_fixup(struct atkbd *atkbd,
 934                                                    unsigned int code)
 935{
 936        if (atkbd->translated && atkbd->emul == 1 &&
 937            (code == 0x64 || code == 0x65 || code == 0x66)) {
 938                atkbd->emul = 0;
 939                code |= 0x80;
 940        }
 941
 942        return code;
 943}
 944
 945/*
 946 * atkbd_set_keycode_table() initializes keyboard's keycode table
 947 * according to the selected scancode set
 948 */
 949
 950static void atkbd_set_keycode_table(struct atkbd *atkbd)
 951{
 952        unsigned int scancode;
 953        int i, j;
 954
 955        memset(atkbd->keycode, 0, sizeof(atkbd->keycode));
 956        bitmap_zero(atkbd->force_release_mask, ATKBD_KEYMAP_SIZE);
 957
 958        if (atkbd->translated) {
 959                for (i = 0; i < 128; i++) {
 960                        scancode = atkbd_unxlate_table[i];
 961                        atkbd->keycode[i] = atkbd_set2_keycode[scancode];
 962                        atkbd->keycode[i | 0x80] = atkbd_set2_keycode[scancode | 0x80];
 963                        if (atkbd->scroll)
 964                                for (j = 0; j < ARRAY_SIZE(atkbd_scroll_keys); j++)
 965                                        if ((scancode | 0x80) == atkbd_scroll_keys[j].set2)
 966                                                atkbd->keycode[i | 0x80] = atkbd_scroll_keys[j].keycode;
 967                }
 968        } else if (atkbd->set == 3) {
 969                memcpy(atkbd->keycode, atkbd_set3_keycode, sizeof(atkbd->keycode));
 970        } else {
 971                memcpy(atkbd->keycode, atkbd_set2_keycode, sizeof(atkbd->keycode));
 972
 973                if (atkbd->scroll)
 974                        for (i = 0; i < ARRAY_SIZE(atkbd_scroll_keys); i++) {
 975                                scancode = atkbd_scroll_keys[i].set2;
 976                                atkbd->keycode[scancode] = atkbd_scroll_keys[i].keycode;
 977                }
 978        }
 979
 980/*
 981 * HANGEUL and HANJA keys do not send release events so we need to
 982 * generate such events ourselves
 983 */
 984        scancode = atkbd_compat_scancode(atkbd, ATKBD_RET_HANGEUL);
 985        atkbd->keycode[scancode] = KEY_HANGEUL;
 986        __set_bit(scancode, atkbd->force_release_mask);
 987
 988        scancode = atkbd_compat_scancode(atkbd, ATKBD_RET_HANJA);
 989        atkbd->keycode[scancode] = KEY_HANJA;
 990        __set_bit(scancode, atkbd->force_release_mask);
 991
 992/*
 993 * Perform additional fixups
 994 */
 995        if (atkbd_platform_fixup)
 996                atkbd_platform_fixup(atkbd, atkbd_platform_fixup_data);
 997}
 998
 999/*
1000 * atkbd_set_device_attrs() sets up keyboard's input device structure
1001 */
1002
1003static void atkbd_set_device_attrs(struct atkbd *atkbd)
1004{
1005        struct input_dev *input_dev = atkbd->dev;
1006        int i;
1007
1008        if (atkbd->extra)
1009                snprintf(atkbd->name, sizeof(atkbd->name),
1010                         "AT Set 2 Extra keyboard");
1011        else
1012                snprintf(atkbd->name, sizeof(atkbd->name),
1013                         "AT %s Set %d keyboard",
1014                         atkbd->translated ? "Translated" : "Raw", atkbd->set);
1015
1016        snprintf(atkbd->phys, sizeof(atkbd->phys),
1017                 "%s/input0", atkbd->ps2dev.serio->phys);
1018
1019        input_dev->name = atkbd->name;
1020        input_dev->phys = atkbd->phys;
1021        input_dev->id.bustype = BUS_I8042;
1022        input_dev->id.vendor = 0x0001;
1023        input_dev->id.product = atkbd->translated ? 1 : atkbd->set;
1024        input_dev->id.version = atkbd->id;
1025        input_dev->event = atkbd_event;
1026        input_dev->dev.parent = &atkbd->ps2dev.serio->dev;
1027
1028        input_set_drvdata(input_dev, atkbd);
1029
1030        input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP) |
1031                BIT_MASK(EV_MSC);
1032
1033        if (atkbd->write) {
1034                input_dev->evbit[0] |= BIT_MASK(EV_LED);
1035                input_dev->ledbit[0] = BIT_MASK(LED_NUML) |
1036                        BIT_MASK(LED_CAPSL) | BIT_MASK(LED_SCROLLL);
1037        }
1038
1039        if (atkbd->extra)
1040                input_dev->ledbit[0] |= BIT_MASK(LED_COMPOSE) |
1041                        BIT_MASK(LED_SUSPEND) | BIT_MASK(LED_SLEEP) |
1042                        BIT_MASK(LED_MUTE) | BIT_MASK(LED_MISC);
1043
1044        if (!atkbd->softrepeat) {
1045                input_dev->rep[REP_DELAY] = 250;
1046                input_dev->rep[REP_PERIOD] = 33;
1047        }
1048
1049        input_dev->mscbit[0] = atkbd->softraw ? BIT_MASK(MSC_SCAN) :
1050                BIT_MASK(MSC_RAW) | BIT_MASK(MSC_SCAN);
1051
1052        if (atkbd->scroll) {
1053                input_dev->evbit[0] |= BIT_MASK(EV_REL);
1054                input_dev->relbit[0] = BIT_MASK(REL_WHEEL) |
1055                        BIT_MASK(REL_HWHEEL);
1056                __set_bit(BTN_MIDDLE, input_dev->keybit);
1057        }
1058
1059        input_dev->keycode = atkbd->keycode;
1060        input_dev->keycodesize = sizeof(unsigned short);
1061        input_dev->keycodemax = ARRAY_SIZE(atkbd_set2_keycode);
1062
1063        for (i = 0; i < ATKBD_KEYMAP_SIZE; i++)
1064                if (atkbd->keycode[i] && atkbd->keycode[i] < ATKBD_SPECIAL)
1065                        __set_bit(atkbd->keycode[i], input_dev->keybit);
1066}
1067
1068/*
1069 * atkbd_connect() is called when the serio module finds an interface
1070 * that isn't handled yet by an appropriate device driver. We check if
1071 * there is an AT keyboard out there and if yes, we register ourselves
1072 * to the input module.
1073 */
1074
1075static int atkbd_connect(struct serio *serio, struct serio_driver *drv)
1076{
1077        struct atkbd *atkbd;
1078        struct input_dev *dev;
1079        int err = -ENOMEM;
1080
1081        atkbd = kzalloc(sizeof(struct atkbd), GFP_KERNEL);
1082        dev = input_allocate_device();
1083        if (!atkbd || !dev)
1084                goto fail1;
1085
1086        atkbd->dev = dev;
1087        ps2_init(&atkbd->ps2dev, serio);
1088        INIT_DELAYED_WORK(&atkbd->event_work, atkbd_event_work);
1089        mutex_init(&atkbd->event_mutex);
1090
1091        switch (serio->id.type) {
1092
1093                case SERIO_8042_XL:
1094                        atkbd->translated = 1;
1095                case SERIO_8042:
1096                        if (serio->write)
1097                                atkbd->write = 1;
1098                        break;
1099        }
1100
1101        atkbd->softraw = atkbd_softraw;
1102        atkbd->softrepeat = atkbd_softrepeat;
1103        atkbd->scroll = atkbd_scroll;
1104
1105        if (atkbd->softrepeat)
1106                atkbd->softraw = 1;
1107
1108        serio_set_drvdata(serio, atkbd);
1109
1110        err = serio_open(serio, drv);
1111        if (err)
1112                goto fail2;
1113
1114        if (atkbd->write) {
1115
1116                if (atkbd_probe(atkbd)) {
1117                        err = -ENODEV;
1118                        goto fail3;
1119                }
1120
1121                atkbd->set = atkbd_select_set(atkbd, atkbd_set, atkbd_extra);
1122                atkbd_reset_state(atkbd);
1123                atkbd_activate(atkbd);
1124
1125        } else {
1126                atkbd->set = 2;
1127                atkbd->id = 0xab00;
1128        }
1129
1130        atkbd_set_keycode_table(atkbd);
1131        atkbd_set_device_attrs(atkbd);
1132
1133        err = sysfs_create_group(&serio->dev.kobj, &atkbd_attribute_group);
1134        if (err)
1135                goto fail3;
1136
1137        atkbd_enable(atkbd);
1138
1139        err = input_register_device(atkbd->dev);
1140        if (err)
1141                goto fail4;
1142
1143        return 0;
1144
1145 fail4: sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group);
1146 fail3: serio_close(serio);
1147 fail2: serio_set_drvdata(serio, NULL);
1148 fail1: input_free_device(dev);
1149        kfree(atkbd);
1150        return err;
1151}
1152
1153/*
1154 * atkbd_reconnect() tries to restore keyboard into a sane state and is
1155 * most likely called on resume.
1156 */
1157
1158static int atkbd_reconnect(struct serio *serio)
1159{
1160        struct atkbd *atkbd = serio_get_drvdata(serio);
1161        struct serio_driver *drv = serio->drv;
1162
1163        if (!atkbd || !drv) {
1164                printk(KERN_DEBUG "atkbd: reconnect request, but serio is disconnected, ignoring...\n");
1165                return -1;
1166        }
1167
1168        atkbd_disable(atkbd);
1169
1170        if (atkbd->write) {
1171                if (atkbd_probe(atkbd))
1172                        return -1;
1173                if (atkbd->set != atkbd_select_set(atkbd, atkbd->set, atkbd->extra))
1174                        return -1;
1175
1176                atkbd_activate(atkbd);
1177
1178                /*
1179                 * Restore LED state and repeat rate. While input core
1180                 * will do this for us at resume time reconnect may happen
1181                 * because user requested it via sysfs or simply because
1182                 * keyboard was unplugged and plugged in again so we need
1183                 * to do it ourselves here.
1184                 */
1185                atkbd_set_leds(atkbd);
1186                if (!atkbd->softrepeat)
1187                        atkbd_set_repeat_rate(atkbd);
1188
1189        }
1190
1191        atkbd_enable(atkbd);
1192
1193        return 0;
1194}
1195
1196static struct serio_device_id atkbd_serio_ids[] = {
1197        {
1198                .type   = SERIO_8042,
1199                .proto  = SERIO_ANY,
1200                .id     = SERIO_ANY,
1201                .extra  = SERIO_ANY,
1202        },
1203        {
1204                .type   = SERIO_8042_XL,
1205                .proto  = SERIO_ANY,
1206                .id     = SERIO_ANY,
1207                .extra  = SERIO_ANY,
1208        },
1209        {
1210                .type   = SERIO_RS232,
1211                .proto  = SERIO_PS2SER,
1212                .id     = SERIO_ANY,
1213                .extra  = SERIO_ANY,
1214        },
1215        { 0 }
1216};
1217
1218MODULE_DEVICE_TABLE(serio, atkbd_serio_ids);
1219
1220static struct serio_driver atkbd_drv = {
1221        .driver         = {
1222                .name   = "atkbd",
1223        },
1224        .description    = DRIVER_DESC,
1225        .id_table       = atkbd_serio_ids,
1226        .interrupt      = atkbd_interrupt,
1227        .connect        = atkbd_connect,
1228        .reconnect      = atkbd_reconnect,
1229        .disconnect     = atkbd_disconnect,
1230        .cleanup        = atkbd_cleanup,
1231};
1232
1233static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf,
1234                                ssize_t (*handler)(struct atkbd *, char *))
1235{
1236        struct serio *serio = to_serio_port(dev);
1237        int retval;
1238
1239        retval = serio_pin_driver(serio);
1240        if (retval)
1241                return retval;
1242
1243        if (serio->drv != &atkbd_drv) {
1244                retval = -ENODEV;
1245                goto out;
1246        }
1247
1248        retval = handler((struct atkbd *)serio_get_drvdata(serio), buf);
1249
1250out:
1251        serio_unpin_driver(serio);
1252        return retval;
1253}
1254
1255static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count,
1256                                ssize_t (*handler)(struct atkbd *, const char *, size_t))
1257{
1258        struct serio *serio = to_serio_port(dev);
1259        struct atkbd *atkbd;
1260        int retval;
1261
1262        retval = serio_pin_driver(serio);
1263        if (retval)
1264                return retval;
1265
1266        if (serio->drv != &atkbd_drv) {
1267                retval = -ENODEV;
1268                goto out;
1269        }
1270
1271        atkbd = serio_get_drvdata(serio);
1272        atkbd_disable(atkbd);
1273        retval = handler(atkbd, buf, count);
1274        atkbd_enable(atkbd);
1275
1276out:
1277        serio_unpin_driver(serio);
1278        return retval;
1279}
1280
1281static ssize_t atkbd_show_extra(struct atkbd *atkbd, char *buf)
1282{
1283        return sprintf(buf, "%d\n", atkbd->extra ? 1 : 0);
1284}
1285
1286static ssize_t atkbd_set_extra(struct atkbd *atkbd, const char *buf, size_t count)
1287{
1288        struct input_dev *old_dev, *new_dev;
1289        unsigned long value;
1290        int err;
1291        unsigned char old_extra, old_set;
1292
1293        if (!atkbd->write)
1294                return -EIO;
1295
1296        if (strict_strtoul(buf, 10, &value) || value > 1)
1297                return -EINVAL;
1298
1299        if (atkbd->extra != value) {
1300                /*
1301                 * Since device's properties will change we need to
1302                 * unregister old device. But allocate and register
1303                 * new one first to make sure we have it.
1304                 */
1305                old_dev = atkbd->dev;
1306                old_extra = atkbd->extra;
1307                old_set = atkbd->set;
1308
1309                new_dev = input_allocate_device();
1310                if (!new_dev)
1311                        return -ENOMEM;
1312
1313                atkbd->dev = new_dev;
1314                atkbd->set = atkbd_select_set(atkbd, atkbd->set, value);
1315                atkbd_reset_state(atkbd);
1316                atkbd_activate(atkbd);
1317                atkbd_set_keycode_table(atkbd);
1318                atkbd_set_device_attrs(atkbd);
1319
1320                err = input_register_device(atkbd->dev);
1321                if (err) {
1322                        input_free_device(new_dev);
1323
1324                        atkbd->dev = old_dev;
1325                        atkbd->set = atkbd_select_set(atkbd, old_set, old_extra);
1326                        atkbd_set_keycode_table(atkbd);
1327                        atkbd_set_device_attrs(atkbd);
1328
1329                        return err;
1330                }
1331                input_unregister_device(old_dev);
1332
1333        }
1334        return count;
1335}
1336
1337static ssize_t atkbd_show_force_release(struct atkbd *atkbd, char *buf)
1338{
1339        size_t len = bitmap_scnlistprintf(buf, PAGE_SIZE - 2,
1340                        atkbd->force_release_mask, ATKBD_KEYMAP_SIZE);
1341
1342        buf[len++] = '\n';
1343        buf[len] = '\0';
1344
1345        return len;
1346}
1347
1348static ssize_t atkbd_set_force_release(struct atkbd *atkbd,
1349                                        const char *buf, size_t count)
1350{
1351        /* 64 bytes on stack should be acceptable */
1352        DECLARE_BITMAP(new_mask, ATKBD_KEYMAP_SIZE);
1353        int err;
1354
1355        err = bitmap_parselist(buf, new_mask, ATKBD_KEYMAP_SIZE);
1356        if (err)
1357                return err;
1358
1359        memcpy(atkbd->force_release_mask, new_mask, sizeof(atkbd->force_release_mask));
1360        return count;
1361}
1362
1363
1364static ssize_t atkbd_show_scroll(struct atkbd *atkbd, char *buf)
1365{
1366        return sprintf(buf, "%d\n", atkbd->scroll ? 1 : 0);
1367}
1368
1369static ssize_t atkbd_set_scroll(struct atkbd *atkbd, const char *buf, size_t count)
1370{
1371        struct input_dev *old_dev, *new_dev;
1372        unsigned long value;
1373        int err;
1374        unsigned char old_scroll;
1375
1376        if (strict_strtoul(buf, 10, &value) || value > 1)
1377                return -EINVAL;
1378
1379        if (atkbd->scroll != value) {
1380                old_dev = atkbd->dev;
1381                old_scroll = atkbd->scroll;
1382
1383                new_dev = input_allocate_device();
1384                if (!new_dev)
1385                        return -ENOMEM;
1386
1387                atkbd->dev = new_dev;
1388                atkbd->scroll = value;
1389                atkbd_set_keycode_table(atkbd);
1390                atkbd_set_device_attrs(atkbd);
1391
1392                err = input_register_device(atkbd->dev);
1393                if (err) {
1394                        input_free_device(new_dev);
1395
1396                        atkbd->scroll = old_scroll;
1397                        atkbd->dev = old_dev;
1398                        atkbd_set_keycode_table(atkbd);
1399                        atkbd_set_device_attrs(atkbd);
1400
1401                        return err;
1402                }
1403                input_unregister_device(old_dev);
1404        }
1405        return count;
1406}
1407
1408static ssize_t atkbd_show_set(struct atkbd *atkbd, char *buf)
1409{
1410        return sprintf(buf, "%d\n", atkbd->set);
1411}
1412
1413static ssize_t atkbd_set_set(struct atkbd *atkbd, const char *buf, size_t count)
1414{
1415        struct input_dev *old_dev, *new_dev;
1416        unsigned long value;
1417        int err;
1418        unsigned char old_set, old_extra;
1419
1420        if (!atkbd->write)
1421                return -EIO;
1422
1423        if (strict_strtoul(buf, 10, &value) || (value != 2 && value != 3))
1424                return -EINVAL;
1425
1426        if (atkbd->set != value) {
1427                old_dev = atkbd->dev;
1428                old_extra = atkbd->extra;
1429                old_set = atkbd->set;
1430
1431                new_dev = input_allocate_device();
1432                if (!new_dev)
1433                        return -ENOMEM;
1434
1435                atkbd->dev = new_dev;
1436                atkbd->set = atkbd_select_set(atkbd, value, atkbd->extra);
1437                atkbd_reset_state(atkbd);
1438                atkbd_activate(atkbd);
1439                atkbd_set_keycode_table(atkbd);
1440                atkbd_set_device_attrs(atkbd);
1441
1442                err = input_register_device(atkbd->dev);
1443                if (err) {
1444                        input_free_device(new_dev);
1445
1446                        atkbd->dev = old_dev;
1447                        atkbd->set = atkbd_select_set(atkbd, old_set, old_extra);
1448                        atkbd_set_keycode_table(atkbd);
1449                        atkbd_set_device_attrs(atkbd);
1450
1451                        return err;
1452                }
1453                input_unregister_device(old_dev);
1454        }
1455        return count;
1456}
1457
1458static ssize_t atkbd_show_softrepeat(struct atkbd *atkbd, char *buf)
1459{
1460        return sprintf(buf, "%d\n", atkbd->softrepeat ? 1 : 0);
1461}
1462
1463static ssize_t atkbd_set_softrepeat(struct atkbd *atkbd, const char *buf, size_t count)
1464{
1465        struct input_dev *old_dev, *new_dev;
1466        unsigned long value;
1467        int err;
1468        unsigned char old_softrepeat, old_softraw;
1469
1470        if (!atkbd->write)
1471                return -EIO;
1472
1473        if (strict_strtoul(buf, 10, &value) || value > 1)
1474                return -EINVAL;
1475
1476        if (atkbd->softrepeat != value) {
1477                old_dev = atkbd->dev;
1478                old_softrepeat = atkbd->softrepeat;
1479                old_softraw = atkbd->softraw;
1480
1481                new_dev = input_allocate_device();
1482                if (!new_dev)
1483                        return -ENOMEM;
1484
1485                atkbd->dev = new_dev;
1486                atkbd->softrepeat = value;
1487                if (atkbd->softrepeat)
1488                        atkbd->softraw = 1;
1489                atkbd_set_device_attrs(atkbd);
1490
1491                err = input_register_device(atkbd->dev);
1492                if (err) {
1493                        input_free_device(new_dev);
1494
1495                        atkbd->dev = old_dev;
1496                        atkbd->softrepeat = old_softrepeat;
1497                        atkbd->softraw = old_softraw;
1498                        atkbd_set_device_attrs(atkbd);
1499
1500                        return err;
1501                }
1502                input_unregister_device(old_dev);
1503        }
1504        return count;
1505}
1506
1507
1508static ssize_t atkbd_show_softraw(struct atkbd *atkbd, char *buf)
1509{
1510        return sprintf(buf, "%d\n", atkbd->softraw ? 1 : 0);
1511}
1512
1513static ssize_t atkbd_set_softraw(struct atkbd *atkbd, const char *buf, size_t count)
1514{
1515        struct input_dev *old_dev, *new_dev;
1516        unsigned long value;
1517        int err;
1518        unsigned char old_softraw;
1519
1520        if (strict_strtoul(buf, 10, &value) || value > 1)
1521                return -EINVAL;
1522
1523        if (atkbd->softraw != value) {
1524                old_dev = atkbd->dev;
1525                old_softraw = atkbd->softraw;
1526
1527                new_dev = input_allocate_device();
1528                if (!new_dev)
1529                        return -ENOMEM;
1530
1531                atkbd->dev = new_dev;
1532                atkbd->softraw = value;
1533                atkbd_set_device_attrs(atkbd);
1534
1535                err = input_register_device(atkbd->dev);
1536                if (err) {
1537                        input_free_device(new_dev);
1538
1539                        atkbd->dev = old_dev;
1540                        atkbd->softraw = old_softraw;
1541                        atkbd_set_device_attrs(atkbd);
1542
1543                        return err;
1544                }
1545                input_unregister_device(old_dev);
1546        }
1547        return count;
1548}
1549
1550static ssize_t atkbd_show_err_count(struct atkbd *atkbd, char *buf)
1551{
1552        return sprintf(buf, "%lu\n", atkbd->err_count);
1553}
1554
1555static int __init atkbd_setup_forced_release(const struct dmi_system_id *id)
1556{
1557        atkbd_platform_fixup = atkbd_apply_forced_release_keylist;
1558        atkbd_platform_fixup_data = id->driver_data;
1559
1560        return 0;
1561}
1562
1563static int __init atkbd_setup_scancode_fixup(const struct dmi_system_id *id)
1564{
1565        atkbd_platform_scancode_fixup = id->driver_data;
1566
1567        return 0;
1568}
1569
1570static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
1571        {
1572                .ident = "Dell Laptop",
1573                .matches = {
1574                        DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1575                        DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */
1576                },
1577                .callback = atkbd_setup_forced_release,
1578                .driver_data = atkbd_dell_laptop_forced_release_keys,
1579        },
1580        {
1581                .ident = "Dell Laptop",
1582                .matches = {
1583                        DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
1584                        DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */
1585                },
1586                .callback = atkbd_setup_forced_release,
1587                .driver_data = atkbd_dell_laptop_forced_release_keys,
1588        },
1589        {
1590                .ident = "HP 2133",
1591                .matches = {
1592                        DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1593                        DMI_MATCH(DMI_PRODUCT_NAME, "HP 2133"),
1594                },
1595                .callback = atkbd_setup_forced_release,
1596                .driver_data = atkbd_hp_forced_release_keys,
1597        },
1598        {
1599                .ident = "HP Pavilion ZV6100",
1600                .matches = {
1601                        DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1602                        DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion ZV6100"),
1603                },
1604                .callback = atkbd_setup_forced_release,
1605                .driver_data = atkbd_volume_forced_release_keys,
1606        },
1607        {
1608                .ident = "HP Presario R4000",
1609                .matches = {
1610                        DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1611                        DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4000"),
1612                },
1613                .callback = atkbd_setup_forced_release,
1614                .driver_data = atkbd_volume_forced_release_keys,
1615        },
1616        {
1617                .ident = "HP Presario R4100",
1618                .matches = {
1619                        DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1620                        DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4100"),
1621                },
1622                .callback = atkbd_setup_forced_release,
1623                .driver_data = atkbd_volume_forced_release_keys,
1624        },
1625        {
1626                .ident = "HP Presario R4200",
1627                .matches = {
1628                        DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1629                        DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4200"),
1630                },
1631                .callback = atkbd_setup_forced_release,
1632                .driver_data = atkbd_volume_forced_release_keys,
1633        },
1634        {
1635                .ident = "Inventec Symphony",
1636                .matches = {
1637                        DMI_MATCH(DMI_SYS_VENDOR, "INVENTEC"),
1638                        DMI_MATCH(DMI_PRODUCT_NAME, "SYMPHONY 6.0/7.0"),
1639                },
1640                .callback = atkbd_setup_forced_release,
1641                .driver_data = atkbd_volume_forced_release_keys,
1642        },
1643        {
1644                .ident = "Samsung NC10",
1645                .matches = {
1646                        DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
1647                        DMI_MATCH(DMI_PRODUCT_NAME, "NC10"),
1648                },
1649                .callback = atkbd_setup_forced_release,
1650                .driver_data = atkbd_samsung_forced_release_keys,
1651        },
1652        {
1653                .ident = "Samsung NC20",
1654                .matches = {
1655                        DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
1656                        DMI_MATCH(DMI_PRODUCT_NAME, "NC20"),
1657                },
1658                .callback = atkbd_setup_forced_release,
1659                .driver_data = atkbd_samsung_forced_release_keys,
1660        },
1661        {
1662                .ident = "Samsung SQ45S70S",
1663                .matches = {
1664                        DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
1665                        DMI_MATCH(DMI_PRODUCT_NAME, "SQ45S70S"),
1666                },
1667                .callback = atkbd_setup_forced_release,
1668                .driver_data = atkbd_samsung_forced_release_keys,
1669        },
1670        {
1671                .ident = "Fujitsu Amilo PA 1510",
1672                .matches = {
1673                        DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
1674                        DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pa 1510"),
1675                },
1676                .callback = atkbd_setup_forced_release,
1677                .driver_data = atkbd_volume_forced_release_keys,
1678        },
1679        {
1680                .ident = "Fujitsu Amilo Pi 3525",
1681                .matches = {
1682                        DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
1683                        DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 3525"),
1684                },
1685                .callback = atkbd_setup_forced_release,
1686                .driver_data = atkbd_amilo_pi3525_forced_release_keys,
1687        },
1688        {
1689                .ident = "Fujitsu Amilo Xi 3650",
1690                .matches = {
1691                        DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
1692                        DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xi 3650"),
1693                },
1694                .callback = atkbd_setup_forced_release,
1695                .driver_data = atkbd_amilo_xi3650_forced_release_keys,
1696        },
1697        {
1698                .ident = "Soltech Corporation TA12",
1699                .matches = {
1700                        DMI_MATCH(DMI_SYS_VENDOR, "Soltech Corporation"),
1701                        DMI_MATCH(DMI_PRODUCT_NAME, "TA12"),
1702                },
1703                .callback = atkbd_setup_forced_release,
1704                .driver_data = atkdb_soltech_ta12_forced_release_keys,
1705        },
1706        {
1707                .ident = "OQO Model 01+",
1708                .matches = {
1709                        DMI_MATCH(DMI_SYS_VENDOR, "OQO"),
1710                        DMI_MATCH(DMI_PRODUCT_NAME, "ZEPTO"),
1711                },
1712                .callback = atkbd_setup_scancode_fixup,
1713                .driver_data = atkbd_oqo_01plus_scancode_fixup,
1714        },
1715        { }
1716};
1717
1718static int __init atkbd_init(void)
1719{
1720        dmi_check_system(atkbd_dmi_quirk_table);
1721
1722        return serio_register_driver(&atkbd_drv);
1723}
1724
1725static void __exit atkbd_exit(void)
1726{
1727        serio_unregister_driver(&atkbd_drv);
1728}
1729
1730module_init(atkbd_init);
1731module_exit(atkbd_exit);
1732