0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #include <linux/delay.h>
0017 #include <linux/module.h>
0018 #include <linux/slab.h>
0019 #include <linux/interrupt.h>
0020 #include <linux/init.h>
0021 #include <linux/input.h>
0022 #include <linux/input/vivaldi-fmap.h>
0023 #include <linux/serio.h>
0024 #include <linux/workqueue.h>
0025 #include <linux/libps2.h>
0026 #include <linux/mutex.h>
0027 #include <linux/dmi.h>
0028 #include <linux/property.h>
0029
0030 #define DRIVER_DESC "AT and PS/2 keyboard driver"
0031
0032 MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
0033 MODULE_DESCRIPTION(DRIVER_DESC);
0034 MODULE_LICENSE("GPL");
0035
0036 static int atkbd_set = 2;
0037 module_param_named(set, atkbd_set, int, 0);
0038 MODULE_PARM_DESC(set, "Select keyboard code set (2 = default, 3 = PS/2 native)");
0039
0040 #if defined(__i386__) || defined(__x86_64__) || defined(__hppa__)
0041 static bool atkbd_reset;
0042 #else
0043 static bool atkbd_reset = true;
0044 #endif
0045 module_param_named(reset, atkbd_reset, bool, 0);
0046 MODULE_PARM_DESC(reset, "Reset keyboard during initialization");
0047
0048 static bool atkbd_softrepeat;
0049 module_param_named(softrepeat, atkbd_softrepeat, bool, 0);
0050 MODULE_PARM_DESC(softrepeat, "Use software keyboard repeat");
0051
0052 static bool atkbd_softraw = true;
0053 module_param_named(softraw, atkbd_softraw, bool, 0);
0054 MODULE_PARM_DESC(softraw, "Use software generated rawmode");
0055
0056 static bool atkbd_scroll;
0057 module_param_named(scroll, atkbd_scroll, bool, 0);
0058 MODULE_PARM_DESC(scroll, "Enable scroll-wheel on MS Office and similar keyboards");
0059
0060 static bool atkbd_extra;
0061 module_param_named(extra, atkbd_extra, bool, 0);
0062 MODULE_PARM_DESC(extra, "Enable extra LEDs and keys on IBM RapidAcces, EzKey and similar keyboards");
0063
0064 static bool atkbd_terminal;
0065 module_param_named(terminal, atkbd_terminal, bool, 0);
0066 MODULE_PARM_DESC(terminal, "Enable break codes on an IBM Terminal keyboard connected via AT/PS2");
0067
0068 #define SCANCODE(keymap) ((keymap >> 16) & 0xFFFF)
0069 #define KEYCODE(keymap) (keymap & 0xFFFF)
0070
0071
0072
0073
0074
0075
0076 #define ATKBD_KEYMAP_SIZE 512
0077
0078 static const unsigned short atkbd_set2_keycode[ATKBD_KEYMAP_SIZE] = {
0079
0080 #ifdef CONFIG_KEYBOARD_ATKBD_HP_KEYCODES
0081
0082
0083
0084 #include "hpps2atkbd.h" /* include the keyboard scancodes */
0085
0086 #else
0087 0, 67, 65, 63, 61, 59, 60, 88, 0, 68, 66, 64, 62, 15, 41,117,
0088 0, 56, 42, 93, 29, 16, 2, 0, 0, 0, 44, 31, 30, 17, 3, 0,
0089 0, 46, 45, 32, 18, 5, 4, 95, 0, 57, 47, 33, 20, 19, 6,183,
0090 0, 49, 48, 35, 34, 21, 7,184, 0, 0, 50, 36, 22, 8, 9,185,
0091 0, 51, 37, 23, 24, 11, 10, 0, 0, 52, 53, 38, 39, 25, 12, 0,
0092 0, 89, 40, 0, 26, 13, 0, 0, 58, 54, 28, 27, 0, 43, 0, 85,
0093 0, 86, 91, 90, 92, 0, 14, 94, 0, 79,124, 75, 71,121, 0, 0,
0094 82, 83, 80, 76, 77, 72, 1, 69, 87, 78, 81, 74, 55, 73, 70, 99,
0095
0096 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0097 217,100,255, 0, 97,165, 0, 0,156, 0, 0, 0, 0, 0, 0,125,
0098 173,114, 0,113, 0, 0, 0,126,128, 0, 0,140, 0, 0, 0,127,
0099 159, 0,115, 0,164, 0, 0,116,158, 0,172,166, 0, 0, 0,142,
0100 157, 0, 0, 0, 0, 0, 0, 0,155, 0, 98, 0, 0,163, 0, 0,
0101 226, 0, 0, 0, 0, 0, 0, 0, 0,255, 96, 0, 0, 0,143, 0,
0102 0, 0, 0, 0, 0, 0, 0, 0, 0,107, 0,105,102, 0, 0,112,
0103 110,111,108,112,106,103, 0,119, 0,118,109, 0, 99,104,119, 0,
0104
0105 0, 0, 0, 65, 99,
0106 #endif
0107 };
0108
0109 static const unsigned short atkbd_set3_keycode[ATKBD_KEYMAP_SIZE] = {
0110
0111 0, 0, 0, 0, 0, 0, 0, 59, 1,138,128,129,130, 15, 41, 60,
0112 131, 29, 42, 86, 58, 16, 2, 61,133, 56, 44, 31, 30, 17, 3, 62,
0113 134, 46, 45, 32, 18, 5, 4, 63,135, 57, 47, 33, 20, 19, 6, 64,
0114 136, 49, 48, 35, 34, 21, 7, 65,137,100, 50, 36, 22, 8, 9, 66,
0115 125, 51, 37, 23, 24, 11, 10, 67,126, 52, 53, 38, 39, 25, 12, 68,
0116 113,114, 40, 43, 26, 13, 87, 99, 97, 54, 28, 27, 43, 43, 88, 70,
0117 108,105,119,103,111,107, 14,110, 0, 79,106, 75, 71,109,102,104,
0118 82, 83, 80, 76, 77, 72, 69, 98, 0, 96, 81, 0, 78, 73, 55,183,
0119
0120 184,185,186,187, 74, 94, 92, 93, 0, 0, 0,125,126,127,112, 0,
0121 0,139,172,163,165,115,152,172,166,140,160,154,113,114,167,168,
0122 148,149,147,140
0123 };
0124
0125 static const unsigned short atkbd_unxlate_table[128] = {
0126 0,118, 22, 30, 38, 37, 46, 54, 61, 62, 70, 69, 78, 85,102, 13,
0127 21, 29, 36, 45, 44, 53, 60, 67, 68, 77, 84, 91, 90, 20, 28, 27,
0128 35, 43, 52, 51, 59, 66, 75, 76, 82, 14, 18, 93, 26, 34, 33, 42,
0129 50, 49, 58, 65, 73, 74, 89,124, 17, 41, 88, 5, 6, 4, 12, 3,
0130 11, 2, 10, 1, 9,119,126,108,117,125,123,107,115,116,121,105,
0131 114,122,112,113,127, 96, 97,120, 7, 15, 23, 31, 39, 47, 55, 63,
0132 71, 79, 86, 94, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 87,111,
0133 19, 25, 57, 81, 83, 92, 95, 98, 99,100,101,103,104,106,109,110
0134 };
0135
0136 #define ATKBD_CMD_SETLEDS 0x10ed
0137 #define ATKBD_CMD_GSCANSET 0x11f0
0138 #define ATKBD_CMD_SSCANSET 0x10f0
0139 #define ATKBD_CMD_GETID 0x02f2
0140 #define ATKBD_CMD_SETREP 0x10f3
0141 #define ATKBD_CMD_ENABLE 0x00f4
0142 #define ATKBD_CMD_RESET_DIS 0x00f5
0143 #define ATKBD_CMD_RESET_DEF 0x00f6
0144 #define ATKBD_CMD_SETALL_MB 0x00f8
0145 #define ATKBD_CMD_SETALL_MBR 0x00fa
0146 #define ATKBD_CMD_RESET_BAT 0x02ff
0147 #define ATKBD_CMD_RESEND 0x00fe
0148 #define ATKBD_CMD_EX_ENABLE 0x10ea
0149 #define ATKBD_CMD_EX_SETLEDS 0x20eb
0150 #define ATKBD_CMD_OK_GETID 0x02e8
0151
0152 #define ATKBD_RET_ACK 0xfa
0153 #define ATKBD_RET_NAK 0xfe
0154 #define ATKBD_RET_BAT 0xaa
0155 #define ATKBD_RET_EMUL0 0xe0
0156 #define ATKBD_RET_EMUL1 0xe1
0157 #define ATKBD_RET_RELEASE 0xf0
0158 #define ATKBD_RET_HANJA 0xf1
0159 #define ATKBD_RET_HANGEUL 0xf2
0160 #define ATKBD_RET_ERR 0xff
0161
0162 #define ATKBD_KEY_UNKNOWN 0
0163 #define ATKBD_KEY_NULL 255
0164
0165 #define ATKBD_SCR_1 0xfffe
0166 #define ATKBD_SCR_2 0xfffd
0167 #define ATKBD_SCR_4 0xfffc
0168 #define ATKBD_SCR_8 0xfffb
0169 #define ATKBD_SCR_CLICK 0xfffa
0170 #define ATKBD_SCR_LEFT 0xfff9
0171 #define ATKBD_SCR_RIGHT 0xfff8
0172
0173 #define ATKBD_SPECIAL ATKBD_SCR_RIGHT
0174
0175 #define ATKBD_LED_EVENT_BIT 0
0176 #define ATKBD_REP_EVENT_BIT 1
0177
0178 #define ATKBD_XL_ERR 0x01
0179 #define ATKBD_XL_BAT 0x02
0180 #define ATKBD_XL_ACK 0x04
0181 #define ATKBD_XL_NAK 0x08
0182 #define ATKBD_XL_HANGEUL 0x10
0183 #define ATKBD_XL_HANJA 0x20
0184
0185 static const struct {
0186 unsigned short keycode;
0187 unsigned char set2;
0188 } atkbd_scroll_keys[] = {
0189 { ATKBD_SCR_1, 0xc5 },
0190 { ATKBD_SCR_2, 0x9d },
0191 { ATKBD_SCR_4, 0xa4 },
0192 { ATKBD_SCR_8, 0x9b },
0193 { ATKBD_SCR_CLICK, 0xe0 },
0194 { ATKBD_SCR_LEFT, 0xcb },
0195 { ATKBD_SCR_RIGHT, 0xd2 },
0196 };
0197
0198
0199
0200
0201
0202 struct atkbd {
0203
0204 struct ps2dev ps2dev;
0205 struct input_dev *dev;
0206
0207
0208 char name[64];
0209 char phys[32];
0210
0211 unsigned short id;
0212 unsigned short keycode[ATKBD_KEYMAP_SIZE];
0213 DECLARE_BITMAP(force_release_mask, ATKBD_KEYMAP_SIZE);
0214 unsigned char set;
0215 bool translated;
0216 bool extra;
0217 bool write;
0218 bool softrepeat;
0219 bool softraw;
0220 bool scroll;
0221 bool enabled;
0222
0223
0224 unsigned char emul;
0225 bool resend;
0226 bool release;
0227 unsigned long xl_bit;
0228 unsigned int last;
0229 unsigned long time;
0230 unsigned long err_count;
0231
0232 struct delayed_work event_work;
0233 unsigned long event_jiffies;
0234 unsigned long event_mask;
0235
0236
0237 struct mutex mutex;
0238
0239 struct vivaldi_data vdata;
0240 };
0241
0242
0243
0244
0245 static void (*atkbd_platform_fixup)(struct atkbd *, const void *data);
0246 static void *atkbd_platform_fixup_data;
0247 static unsigned int (*atkbd_platform_scancode_fixup)(struct atkbd *, unsigned int);
0248
0249
0250
0251
0252
0253 static bool atkbd_skip_deactivate;
0254
0255 static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf,
0256 ssize_t (*handler)(struct atkbd *, char *));
0257 static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count,
0258 ssize_t (*handler)(struct atkbd *, const char *, size_t));
0259 #define ATKBD_DEFINE_ATTR(_name) \
0260 static ssize_t atkbd_show_##_name(struct atkbd *, char *); \
0261 static ssize_t atkbd_set_##_name(struct atkbd *, const char *, size_t); \
0262 static ssize_t atkbd_do_show_##_name(struct device *d, \
0263 struct device_attribute *attr, char *b) \
0264 { \
0265 return atkbd_attr_show_helper(d, b, atkbd_show_##_name); \
0266 } \
0267 static ssize_t atkbd_do_set_##_name(struct device *d, \
0268 struct device_attribute *attr, const char *b, size_t s) \
0269 { \
0270 return atkbd_attr_set_helper(d, b, s, atkbd_set_##_name); \
0271 } \
0272 static struct device_attribute atkbd_attr_##_name = \
0273 __ATTR(_name, S_IWUSR | S_IRUGO, atkbd_do_show_##_name, atkbd_do_set_##_name);
0274
0275 ATKBD_DEFINE_ATTR(extra);
0276 ATKBD_DEFINE_ATTR(force_release);
0277 ATKBD_DEFINE_ATTR(scroll);
0278 ATKBD_DEFINE_ATTR(set);
0279 ATKBD_DEFINE_ATTR(softrepeat);
0280 ATKBD_DEFINE_ATTR(softraw);
0281
0282 #define ATKBD_DEFINE_RO_ATTR(_name) \
0283 static ssize_t atkbd_show_##_name(struct atkbd *, char *); \
0284 static ssize_t atkbd_do_show_##_name(struct device *d, \
0285 struct device_attribute *attr, char *b) \
0286 { \
0287 return atkbd_attr_show_helper(d, b, atkbd_show_##_name); \
0288 } \
0289 static struct device_attribute atkbd_attr_##_name = \
0290 __ATTR(_name, S_IRUGO, atkbd_do_show_##_name, NULL);
0291
0292 ATKBD_DEFINE_RO_ATTR(err_count);
0293 ATKBD_DEFINE_RO_ATTR(function_row_physmap);
0294
0295 static struct attribute *atkbd_attributes[] = {
0296 &atkbd_attr_extra.attr,
0297 &atkbd_attr_force_release.attr,
0298 &atkbd_attr_scroll.attr,
0299 &atkbd_attr_set.attr,
0300 &atkbd_attr_softrepeat.attr,
0301 &atkbd_attr_softraw.attr,
0302 &atkbd_attr_err_count.attr,
0303 &atkbd_attr_function_row_physmap.attr,
0304 NULL
0305 };
0306
0307 static ssize_t atkbd_show_function_row_physmap(struct atkbd *atkbd, char *buf)
0308 {
0309 return vivaldi_function_row_physmap_show(&atkbd->vdata, buf);
0310 }
0311
0312 static umode_t atkbd_attr_is_visible(struct kobject *kobj,
0313 struct attribute *attr, int i)
0314 {
0315 struct device *dev = kobj_to_dev(kobj);
0316 struct serio *serio = to_serio_port(dev);
0317 struct atkbd *atkbd = serio_get_drvdata(serio);
0318
0319 if (attr == &atkbd_attr_function_row_physmap.attr &&
0320 !atkbd->vdata.num_function_row_keys)
0321 return 0;
0322
0323 return attr->mode;
0324 }
0325
0326 static struct attribute_group atkbd_attribute_group = {
0327 .attrs = atkbd_attributes,
0328 .is_visible = atkbd_attr_is_visible,
0329 };
0330
0331 static const unsigned int xl_table[] = {
0332 ATKBD_RET_BAT, ATKBD_RET_ERR, ATKBD_RET_ACK,
0333 ATKBD_RET_NAK, ATKBD_RET_HANJA, ATKBD_RET_HANGEUL,
0334 };
0335
0336
0337
0338
0339
0340 static bool atkbd_need_xlate(unsigned long xl_bit, unsigned char code)
0341 {
0342 int i;
0343
0344 if (code == ATKBD_RET_EMUL0 || code == ATKBD_RET_EMUL1)
0345 return false;
0346
0347 for (i = 0; i < ARRAY_SIZE(xl_table); i++)
0348 if (code == xl_table[i])
0349 return test_bit(i, &xl_bit);
0350
0351 return true;
0352 }
0353
0354
0355
0356
0357
0358
0359 static void atkbd_calculate_xl_bit(struct atkbd *atkbd, unsigned char code)
0360 {
0361 int i;
0362
0363 for (i = 0; i < ARRAY_SIZE(xl_table); i++) {
0364 if (!((code ^ xl_table[i]) & 0x7f)) {
0365 if (code & 0x80)
0366 __clear_bit(i, &atkbd->xl_bit);
0367 else
0368 __set_bit(i, &atkbd->xl_bit);
0369 break;
0370 }
0371 }
0372 }
0373
0374
0375
0376
0377
0378 static unsigned int atkbd_compat_scancode(struct atkbd *atkbd, unsigned int code)
0379 {
0380 if (atkbd->set == 3) {
0381 if (atkbd->emul == 1)
0382 code |= 0x100;
0383 } else {
0384 code = (code & 0x7f) | ((code & 0x80) << 1);
0385 if (atkbd->emul == 1)
0386 code |= 0x80;
0387 }
0388
0389 return code;
0390 }
0391
0392
0393
0394
0395
0396
0397 static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
0398 unsigned int flags)
0399 {
0400 struct atkbd *atkbd = serio_get_drvdata(serio);
0401 struct input_dev *dev = atkbd->dev;
0402 unsigned int code = data;
0403 int scroll = 0, hscroll = 0, click = -1;
0404 int value;
0405 unsigned short keycode;
0406
0407 dev_dbg(&serio->dev, "Received %02x flags %02x\n", data, flags);
0408
0409 #if !defined(__i386__) && !defined (__x86_64__)
0410 if ((flags & (SERIO_FRAME | SERIO_PARITY)) && (~flags & SERIO_TIMEOUT) && !atkbd->resend && atkbd->write) {
0411 dev_warn(&serio->dev, "Frame/parity error: %02x\n", flags);
0412 serio_write(serio, ATKBD_CMD_RESEND);
0413 atkbd->resend = true;
0414 goto out;
0415 }
0416
0417 if (!flags && data == ATKBD_RET_ACK)
0418 atkbd->resend = false;
0419 #endif
0420
0421 if (unlikely(atkbd->ps2dev.flags & PS2_FLAG_ACK))
0422 if (ps2_handle_ack(&atkbd->ps2dev, data))
0423 goto out;
0424
0425 if (unlikely(atkbd->ps2dev.flags & PS2_FLAG_CMD))
0426 if (ps2_handle_response(&atkbd->ps2dev, data))
0427 goto out;
0428
0429 pm_wakeup_event(&serio->dev, 0);
0430
0431 if (!atkbd->enabled)
0432 goto out;
0433
0434 input_event(dev, EV_MSC, MSC_RAW, code);
0435
0436 if (atkbd_platform_scancode_fixup)
0437 code = atkbd_platform_scancode_fixup(atkbd, code);
0438
0439 if (atkbd->translated) {
0440
0441 if (atkbd->emul || atkbd_need_xlate(atkbd->xl_bit, code)) {
0442 atkbd->release = code >> 7;
0443 code &= 0x7f;
0444 }
0445
0446 if (!atkbd->emul)
0447 atkbd_calculate_xl_bit(atkbd, data);
0448 }
0449
0450 switch (code) {
0451 case ATKBD_RET_BAT:
0452 atkbd->enabled = false;
0453 serio_reconnect(atkbd->ps2dev.serio);
0454 goto out;
0455 case ATKBD_RET_EMUL0:
0456 atkbd->emul = 1;
0457 goto out;
0458 case ATKBD_RET_EMUL1:
0459 atkbd->emul = 2;
0460 goto out;
0461 case ATKBD_RET_RELEASE:
0462 atkbd->release = true;
0463 goto out;
0464 case ATKBD_RET_ACK:
0465 case ATKBD_RET_NAK:
0466 if (printk_ratelimit())
0467 dev_warn(&serio->dev,
0468 "Spurious %s on %s. "
0469 "Some program might be trying to access hardware directly.\n",
0470 data == ATKBD_RET_ACK ? "ACK" : "NAK", serio->phys);
0471 goto out;
0472 case ATKBD_RET_ERR:
0473 atkbd->err_count++;
0474 dev_dbg(&serio->dev, "Keyboard on %s reports too many keys pressed.\n",
0475 serio->phys);
0476 goto out;
0477 }
0478
0479 code = atkbd_compat_scancode(atkbd, code);
0480
0481 if (atkbd->emul && --atkbd->emul)
0482 goto out;
0483
0484 keycode = atkbd->keycode[code];
0485
0486 if (!(atkbd->release && test_bit(code, atkbd->force_release_mask)))
0487 if (keycode != ATKBD_KEY_NULL)
0488 input_event(dev, EV_MSC, MSC_SCAN, code);
0489
0490 switch (keycode) {
0491 case ATKBD_KEY_NULL:
0492 break;
0493 case ATKBD_KEY_UNKNOWN:
0494 dev_warn(&serio->dev,
0495 "Unknown key %s (%s set %d, code %#x on %s).\n",
0496 atkbd->release ? "released" : "pressed",
0497 atkbd->translated ? "translated" : "raw",
0498 atkbd->set, code, serio->phys);
0499 dev_warn(&serio->dev,
0500 "Use 'setkeycodes %s%02x <keycode>' to make it known.\n",
0501 code & 0x80 ? "e0" : "", code & 0x7f);
0502 input_sync(dev);
0503 break;
0504 case ATKBD_SCR_1:
0505 scroll = 1;
0506 break;
0507 case ATKBD_SCR_2:
0508 scroll = 2;
0509 break;
0510 case ATKBD_SCR_4:
0511 scroll = 4;
0512 break;
0513 case ATKBD_SCR_8:
0514 scroll = 8;
0515 break;
0516 case ATKBD_SCR_CLICK:
0517 click = !atkbd->release;
0518 break;
0519 case ATKBD_SCR_LEFT:
0520 hscroll = -1;
0521 break;
0522 case ATKBD_SCR_RIGHT:
0523 hscroll = 1;
0524 break;
0525 default:
0526 if (atkbd->release) {
0527 value = 0;
0528 atkbd->last = 0;
0529 } else if (!atkbd->softrepeat && test_bit(keycode, dev->key)) {
0530
0531 value = time_before(jiffies, atkbd->time) && atkbd->last == code ? 1 : 2;
0532 } else {
0533 value = 1;
0534 atkbd->last = code;
0535 atkbd->time = jiffies + msecs_to_jiffies(dev->rep[REP_DELAY]) / 2;
0536 }
0537
0538 input_event(dev, EV_KEY, keycode, value);
0539 input_sync(dev);
0540
0541 if (value && test_bit(code, atkbd->force_release_mask)) {
0542 input_event(dev, EV_MSC, MSC_SCAN, code);
0543 input_report_key(dev, keycode, 0);
0544 input_sync(dev);
0545 }
0546 }
0547
0548 if (atkbd->scroll) {
0549 if (click != -1)
0550 input_report_key(dev, BTN_MIDDLE, click);
0551 input_report_rel(dev, REL_WHEEL,
0552 atkbd->release ? -scroll : scroll);
0553 input_report_rel(dev, REL_HWHEEL, hscroll);
0554 input_sync(dev);
0555 }
0556
0557 atkbd->release = false;
0558 out:
0559 return IRQ_HANDLED;
0560 }
0561
0562 static int atkbd_set_repeat_rate(struct atkbd *atkbd)
0563 {
0564 const short period[32] =
0565 { 33, 37, 42, 46, 50, 54, 58, 63, 67, 75, 83, 92, 100, 109, 116, 125,
0566 133, 149, 167, 182, 200, 217, 232, 250, 270, 303, 333, 370, 400, 435, 470, 500 };
0567 const short delay[4] =
0568 { 250, 500, 750, 1000 };
0569
0570 struct input_dev *dev = atkbd->dev;
0571 unsigned char param;
0572 int i = 0, j = 0;
0573
0574 while (i < ARRAY_SIZE(period) - 1 && period[i] < dev->rep[REP_PERIOD])
0575 i++;
0576 dev->rep[REP_PERIOD] = period[i];
0577
0578 while (j < ARRAY_SIZE(delay) - 1 && delay[j] < dev->rep[REP_DELAY])
0579 j++;
0580 dev->rep[REP_DELAY] = delay[j];
0581
0582 param = i | (j << 5);
0583 return ps2_command(&atkbd->ps2dev, ¶m, ATKBD_CMD_SETREP);
0584 }
0585
0586 static int atkbd_set_leds(struct atkbd *atkbd)
0587 {
0588 struct input_dev *dev = atkbd->dev;
0589 unsigned char param[2];
0590
0591 param[0] = (test_bit(LED_SCROLLL, dev->led) ? 1 : 0)
0592 | (test_bit(LED_NUML, dev->led) ? 2 : 0)
0593 | (test_bit(LED_CAPSL, dev->led) ? 4 : 0);
0594 if (ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_SETLEDS))
0595 return -1;
0596
0597 if (atkbd->extra) {
0598 param[0] = 0;
0599 param[1] = (test_bit(LED_COMPOSE, dev->led) ? 0x01 : 0)
0600 | (test_bit(LED_SLEEP, dev->led) ? 0x02 : 0)
0601 | (test_bit(LED_SUSPEND, dev->led) ? 0x04 : 0)
0602 | (test_bit(LED_MISC, dev->led) ? 0x10 : 0)
0603 | (test_bit(LED_MUTE, dev->led) ? 0x20 : 0);
0604 if (ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_EX_SETLEDS))
0605 return -1;
0606 }
0607
0608 return 0;
0609 }
0610
0611
0612
0613
0614
0615
0616
0617 static void atkbd_event_work(struct work_struct *work)
0618 {
0619 struct atkbd *atkbd = container_of(work, struct atkbd, event_work.work);
0620
0621 mutex_lock(&atkbd->mutex);
0622
0623 if (!atkbd->enabled) {
0624
0625
0626
0627
0628
0629
0630 schedule_delayed_work(&atkbd->event_work,
0631 msecs_to_jiffies(100));
0632 } else {
0633 if (test_and_clear_bit(ATKBD_LED_EVENT_BIT, &atkbd->event_mask))
0634 atkbd_set_leds(atkbd);
0635
0636 if (test_and_clear_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask))
0637 atkbd_set_repeat_rate(atkbd);
0638 }
0639
0640 mutex_unlock(&atkbd->mutex);
0641 }
0642
0643
0644
0645
0646
0647 static void atkbd_schedule_event_work(struct atkbd *atkbd, int event_bit)
0648 {
0649 unsigned long delay = msecs_to_jiffies(50);
0650
0651 if (time_after(jiffies, atkbd->event_jiffies + delay))
0652 delay = 0;
0653
0654 atkbd->event_jiffies = jiffies;
0655 set_bit(event_bit, &atkbd->event_mask);
0656 mb();
0657 schedule_delayed_work(&atkbd->event_work, delay);
0658 }
0659
0660
0661
0662
0663
0664
0665
0666 static int atkbd_event(struct input_dev *dev,
0667 unsigned int type, unsigned int code, int value)
0668 {
0669 struct atkbd *atkbd = input_get_drvdata(dev);
0670
0671 if (!atkbd->write)
0672 return -1;
0673
0674 switch (type) {
0675
0676 case EV_LED:
0677 atkbd_schedule_event_work(atkbd, ATKBD_LED_EVENT_BIT);
0678 return 0;
0679
0680 case EV_REP:
0681 if (!atkbd->softrepeat)
0682 atkbd_schedule_event_work(atkbd, ATKBD_REP_EVENT_BIT);
0683 return 0;
0684
0685 default:
0686 return -1;
0687 }
0688 }
0689
0690
0691
0692
0693
0694
0695 static inline void atkbd_enable(struct atkbd *atkbd)
0696 {
0697 serio_pause_rx(atkbd->ps2dev.serio);
0698 atkbd->enabled = true;
0699 serio_continue_rx(atkbd->ps2dev.serio);
0700 }
0701
0702
0703
0704
0705
0706
0707 static inline void atkbd_disable(struct atkbd *atkbd)
0708 {
0709 serio_pause_rx(atkbd->ps2dev.serio);
0710 atkbd->enabled = false;
0711 serio_continue_rx(atkbd->ps2dev.serio);
0712 }
0713
0714 static int atkbd_activate(struct atkbd *atkbd)
0715 {
0716 struct ps2dev *ps2dev = &atkbd->ps2dev;
0717
0718
0719
0720
0721
0722 if (ps2_command(ps2dev, NULL, ATKBD_CMD_ENABLE)) {
0723 dev_err(&ps2dev->serio->dev,
0724 "Failed to enable keyboard on %s\n",
0725 ps2dev->serio->phys);
0726 return -1;
0727 }
0728
0729 return 0;
0730 }
0731
0732
0733
0734
0735
0736
0737 static void atkbd_deactivate(struct atkbd *atkbd)
0738 {
0739 struct ps2dev *ps2dev = &atkbd->ps2dev;
0740
0741 if (ps2_command(ps2dev, NULL, ATKBD_CMD_RESET_DIS))
0742 dev_err(&ps2dev->serio->dev,
0743 "Failed to deactivate keyboard on %s\n",
0744 ps2dev->serio->phys);
0745 }
0746
0747
0748
0749
0750
0751 static int atkbd_probe(struct atkbd *atkbd)
0752 {
0753 struct ps2dev *ps2dev = &atkbd->ps2dev;
0754 unsigned char param[2];
0755
0756
0757
0758
0759
0760
0761
0762 if (atkbd_reset)
0763 if (ps2_command(ps2dev, NULL, ATKBD_CMD_RESET_BAT))
0764 dev_warn(&ps2dev->serio->dev,
0765 "keyboard reset failed on %s\n",
0766 ps2dev->serio->phys);
0767
0768
0769
0770
0771
0772
0773
0774
0775 param[0] = param[1] = 0xa5;
0776 if (ps2_command(ps2dev, param, ATKBD_CMD_GETID)) {
0777
0778
0779
0780
0781
0782
0783 param[0] = 0;
0784 if (ps2_command(ps2dev, param, ATKBD_CMD_SETLEDS))
0785 return -1;
0786 atkbd->id = 0xabba;
0787 return 0;
0788 }
0789
0790 if (!ps2_is_keyboard_id(param[0]))
0791 return -1;
0792
0793 atkbd->id = (param[0] << 8) | param[1];
0794
0795 if (atkbd->id == 0xaca1 && atkbd->translated) {
0796 dev_err(&ps2dev->serio->dev,
0797 "NCD terminal keyboards are only supported on non-translating controllers. "
0798 "Use i8042.direct=1 to disable translation.\n");
0799 return -1;
0800 }
0801
0802
0803
0804
0805
0806 if (!atkbd_skip_deactivate)
0807 atkbd_deactivate(atkbd);
0808
0809 return 0;
0810 }
0811
0812
0813
0814
0815
0816
0817
0818 static int atkbd_select_set(struct atkbd *atkbd, int target_set, int allow_extra)
0819 {
0820 struct ps2dev *ps2dev = &atkbd->ps2dev;
0821 unsigned char param[2];
0822
0823 atkbd->extra = false;
0824
0825
0826
0827
0828
0829
0830 if (atkbd->translated)
0831 return 2;
0832
0833 if (atkbd->id == 0xaca1) {
0834 param[0] = 3;
0835 ps2_command(ps2dev, param, ATKBD_CMD_SSCANSET);
0836 return 3;
0837 }
0838
0839 if (allow_extra) {
0840 param[0] = 0x71;
0841 if (!ps2_command(ps2dev, param, ATKBD_CMD_EX_ENABLE)) {
0842 atkbd->extra = true;
0843 return 2;
0844 }
0845 }
0846
0847 if (atkbd_terminal) {
0848 ps2_command(ps2dev, param, ATKBD_CMD_SETALL_MB);
0849 return 3;
0850 }
0851
0852 if (target_set != 3)
0853 return 2;
0854
0855 if (!ps2_command(ps2dev, param, ATKBD_CMD_OK_GETID)) {
0856 atkbd->id = param[0] << 8 | param[1];
0857 return 2;
0858 }
0859
0860 param[0] = 3;
0861 if (ps2_command(ps2dev, param, ATKBD_CMD_SSCANSET))
0862 return 2;
0863
0864 param[0] = 0;
0865 if (ps2_command(ps2dev, param, ATKBD_CMD_GSCANSET))
0866 return 2;
0867
0868 if (param[0] != 3) {
0869 param[0] = 2;
0870 if (ps2_command(ps2dev, param, ATKBD_CMD_SSCANSET))
0871 return 2;
0872 }
0873
0874 ps2_command(ps2dev, param, ATKBD_CMD_SETALL_MBR);
0875
0876 return 3;
0877 }
0878
0879 static int atkbd_reset_state(struct atkbd *atkbd)
0880 {
0881 struct ps2dev *ps2dev = &atkbd->ps2dev;
0882 unsigned char param[1];
0883
0884
0885
0886
0887
0888 param[0] = 0;
0889 if (ps2_command(ps2dev, param, ATKBD_CMD_SETLEDS))
0890 return -1;
0891
0892
0893
0894
0895
0896 param[0] = 0;
0897 if (ps2_command(ps2dev, param, ATKBD_CMD_SETREP))
0898 return -1;
0899
0900 return 0;
0901 }
0902
0903
0904
0905
0906
0907
0908 static void atkbd_cleanup(struct serio *serio)
0909 {
0910 struct atkbd *atkbd = serio_get_drvdata(serio);
0911
0912 atkbd_disable(atkbd);
0913 ps2_command(&atkbd->ps2dev, NULL, ATKBD_CMD_RESET_DEF);
0914 }
0915
0916
0917
0918
0919
0920
0921 static void atkbd_disconnect(struct serio *serio)
0922 {
0923 struct atkbd *atkbd = serio_get_drvdata(serio);
0924
0925 sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group);
0926
0927 atkbd_disable(atkbd);
0928
0929 input_unregister_device(atkbd->dev);
0930
0931
0932
0933
0934
0935
0936
0937 cancel_delayed_work_sync(&atkbd->event_work);
0938
0939 serio_close(serio);
0940 serio_set_drvdata(serio, NULL);
0941 kfree(atkbd);
0942 }
0943
0944
0945
0946
0947 static void atkbd_apply_forced_release_keylist(struct atkbd* atkbd,
0948 const void *data)
0949 {
0950 const unsigned int *keys = data;
0951 unsigned int i;
0952
0953 if (atkbd->set == 2)
0954 for (i = 0; keys[i] != -1U; i++)
0955 __set_bit(keys[i], atkbd->force_release_mask);
0956 }
0957
0958
0959
0960
0961
0962 static unsigned int atkbd_dell_laptop_forced_release_keys[] = {
0963 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8f, 0x93, -1U
0964 };
0965
0966
0967
0968
0969
0970 static unsigned int atkbd_hp_forced_release_keys[] = {
0971 0x94, -1U
0972 };
0973
0974
0975
0976
0977 static unsigned int atkbd_samsung_forced_release_keys[] = {
0978 0x82, 0x83, 0x84, 0x86, 0x88, 0x89, 0xb3, 0xf7, 0xf9, -1U
0979 };
0980
0981
0982
0983
0984 static unsigned int atkbd_amilo_pi3525_forced_release_keys[] = {
0985 0x20, 0xa0, 0x2e, 0xae, 0x30, 0xb0, -1U
0986 };
0987
0988
0989
0990
0991 static unsigned int atkbd_amilo_xi3650_forced_release_keys[] = {
0992 0x67, 0xed, 0x90, 0xa2, 0x99, 0xa4, 0xae, 0xb0, -1U
0993 };
0994
0995
0996
0997
0998 static unsigned int atkdb_soltech_ta12_forced_release_keys[] = {
0999 0xa0, 0xae, 0xb0, -1U
1000 };
1001
1002
1003
1004
1005
1006 static unsigned int atkbd_volume_forced_release_keys[] = {
1007 0xae, 0xb0, -1U
1008 };
1009
1010
1011
1012
1013
1014 static unsigned int atkbd_oqo_01plus_scancode_fixup(struct atkbd *atkbd,
1015 unsigned int code)
1016 {
1017 if (atkbd->translated && atkbd->emul == 1 &&
1018 (code == 0x64 || code == 0x65 || code == 0x66)) {
1019 atkbd->emul = 0;
1020 code |= 0x80;
1021 }
1022
1023 return code;
1024 }
1025
1026 static int atkbd_get_keymap_from_fwnode(struct atkbd *atkbd)
1027 {
1028 struct device *dev = &atkbd->ps2dev.serio->dev;
1029 int i, n;
1030 u32 *ptr;
1031 u16 scancode, keycode;
1032
1033
1034 n = device_property_count_u32(dev, "linux,keymap");
1035 if (n <= 0 || n > ATKBD_KEYMAP_SIZE)
1036 return -ENXIO;
1037
1038 ptr = kcalloc(n, sizeof(u32), GFP_KERNEL);
1039 if (!ptr)
1040 return -ENOMEM;
1041
1042 if (device_property_read_u32_array(dev, "linux,keymap", ptr, n)) {
1043 dev_err(dev, "problem parsing FW keymap property\n");
1044 kfree(ptr);
1045 return -EINVAL;
1046 }
1047
1048 memset(atkbd->keycode, 0, sizeof(atkbd->keycode));
1049 for (i = 0; i < n; i++) {
1050 scancode = SCANCODE(ptr[i]);
1051 keycode = KEYCODE(ptr[i]);
1052 atkbd->keycode[scancode] = keycode;
1053 }
1054
1055 kfree(ptr);
1056 return 0;
1057 }
1058
1059
1060
1061
1062
1063
1064 static void atkbd_set_keycode_table(struct atkbd *atkbd)
1065 {
1066 struct device *dev = &atkbd->ps2dev.serio->dev;
1067 unsigned int scancode;
1068 int i, j;
1069
1070 memset(atkbd->keycode, 0, sizeof(atkbd->keycode));
1071 bitmap_zero(atkbd->force_release_mask, ATKBD_KEYMAP_SIZE);
1072
1073 if (!atkbd_get_keymap_from_fwnode(atkbd)) {
1074 dev_dbg(dev, "Using FW keymap\n");
1075 } else if (atkbd->translated) {
1076 for (i = 0; i < 128; i++) {
1077 scancode = atkbd_unxlate_table[i];
1078 atkbd->keycode[i] = atkbd_set2_keycode[scancode];
1079 atkbd->keycode[i | 0x80] = atkbd_set2_keycode[scancode | 0x80];
1080 if (atkbd->scroll)
1081 for (j = 0; j < ARRAY_SIZE(atkbd_scroll_keys); j++)
1082 if ((scancode | 0x80) == atkbd_scroll_keys[j].set2)
1083 atkbd->keycode[i | 0x80] = atkbd_scroll_keys[j].keycode;
1084 }
1085 } else if (atkbd->set == 3) {
1086 memcpy(atkbd->keycode, atkbd_set3_keycode, sizeof(atkbd->keycode));
1087 } else {
1088 memcpy(atkbd->keycode, atkbd_set2_keycode, sizeof(atkbd->keycode));
1089
1090 if (atkbd->scroll)
1091 for (i = 0; i < ARRAY_SIZE(atkbd_scroll_keys); i++) {
1092 scancode = atkbd_scroll_keys[i].set2;
1093 atkbd->keycode[scancode] = atkbd_scroll_keys[i].keycode;
1094 }
1095 }
1096
1097
1098
1099
1100
1101 scancode = atkbd_compat_scancode(atkbd, ATKBD_RET_HANGEUL);
1102 atkbd->keycode[scancode] = KEY_HANGEUL;
1103 __set_bit(scancode, atkbd->force_release_mask);
1104
1105 scancode = atkbd_compat_scancode(atkbd, ATKBD_RET_HANJA);
1106 atkbd->keycode[scancode] = KEY_HANJA;
1107 __set_bit(scancode, atkbd->force_release_mask);
1108
1109
1110
1111
1112 if (atkbd_platform_fixup)
1113 atkbd_platform_fixup(atkbd, atkbd_platform_fixup_data);
1114 }
1115
1116
1117
1118
1119
1120 static void atkbd_set_device_attrs(struct atkbd *atkbd)
1121 {
1122 struct input_dev *input_dev = atkbd->dev;
1123 int i;
1124
1125 if (atkbd->extra)
1126 snprintf(atkbd->name, sizeof(atkbd->name),
1127 "AT Set 2 Extra keyboard");
1128 else
1129 snprintf(atkbd->name, sizeof(atkbd->name),
1130 "AT %s Set %d keyboard",
1131 atkbd->translated ? "Translated" : "Raw", atkbd->set);
1132
1133 snprintf(atkbd->phys, sizeof(atkbd->phys),
1134 "%s/input0", atkbd->ps2dev.serio->phys);
1135
1136 input_dev->name = atkbd->name;
1137 input_dev->phys = atkbd->phys;
1138 input_dev->id.bustype = BUS_I8042;
1139 input_dev->id.vendor = 0x0001;
1140 input_dev->id.product = atkbd->translated ? 1 : atkbd->set;
1141 input_dev->id.version = atkbd->id;
1142 input_dev->event = atkbd_event;
1143 input_dev->dev.parent = &atkbd->ps2dev.serio->dev;
1144
1145 input_set_drvdata(input_dev, atkbd);
1146
1147 input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP) |
1148 BIT_MASK(EV_MSC);
1149
1150 if (atkbd->write) {
1151 input_dev->evbit[0] |= BIT_MASK(EV_LED);
1152 input_dev->ledbit[0] = BIT_MASK(LED_NUML) |
1153 BIT_MASK(LED_CAPSL) | BIT_MASK(LED_SCROLLL);
1154 }
1155
1156 if (atkbd->extra)
1157 input_dev->ledbit[0] |= BIT_MASK(LED_COMPOSE) |
1158 BIT_MASK(LED_SUSPEND) | BIT_MASK(LED_SLEEP) |
1159 BIT_MASK(LED_MUTE) | BIT_MASK(LED_MISC);
1160
1161 if (!atkbd->softrepeat) {
1162 input_dev->rep[REP_DELAY] = 250;
1163 input_dev->rep[REP_PERIOD] = 33;
1164 }
1165
1166 input_dev->mscbit[0] = atkbd->softraw ? BIT_MASK(MSC_SCAN) :
1167 BIT_MASK(MSC_RAW) | BIT_MASK(MSC_SCAN);
1168
1169 if (atkbd->scroll) {
1170 input_dev->evbit[0] |= BIT_MASK(EV_REL);
1171 input_dev->relbit[0] = BIT_MASK(REL_WHEEL) |
1172 BIT_MASK(REL_HWHEEL);
1173 __set_bit(BTN_MIDDLE, input_dev->keybit);
1174 }
1175
1176 input_dev->keycode = atkbd->keycode;
1177 input_dev->keycodesize = sizeof(unsigned short);
1178 input_dev->keycodemax = ARRAY_SIZE(atkbd_set2_keycode);
1179
1180 for (i = 0; i < ATKBD_KEYMAP_SIZE; i++) {
1181 if (atkbd->keycode[i] != KEY_RESERVED &&
1182 atkbd->keycode[i] != ATKBD_KEY_NULL &&
1183 atkbd->keycode[i] < ATKBD_SPECIAL) {
1184 __set_bit(atkbd->keycode[i], input_dev->keybit);
1185 }
1186 }
1187 }
1188
1189 static void atkbd_parse_fwnode_data(struct serio *serio)
1190 {
1191 struct atkbd *atkbd = serio_get_drvdata(serio);
1192 struct device *dev = &serio->dev;
1193 int n;
1194
1195
1196 n = device_property_count_u32(dev, "function-row-physmap");
1197 if (n > 0 && n <= VIVALDI_MAX_FUNCTION_ROW_KEYS &&
1198 !device_property_read_u32_array(dev, "function-row-physmap",
1199 atkbd->vdata.function_row_physmap,
1200 n)) {
1201 atkbd->vdata.num_function_row_keys = n;
1202 dev_dbg(dev, "FW reported %d function-row key locations\n", n);
1203 }
1204 }
1205
1206
1207
1208
1209
1210
1211
1212
1213 static int atkbd_connect(struct serio *serio, struct serio_driver *drv)
1214 {
1215 struct atkbd *atkbd;
1216 struct input_dev *dev;
1217 int err = -ENOMEM;
1218
1219 atkbd = kzalloc(sizeof(struct atkbd), GFP_KERNEL);
1220 dev = input_allocate_device();
1221 if (!atkbd || !dev)
1222 goto fail1;
1223
1224 atkbd->dev = dev;
1225 ps2_init(&atkbd->ps2dev, serio);
1226 INIT_DELAYED_WORK(&atkbd->event_work, atkbd_event_work);
1227 mutex_init(&atkbd->mutex);
1228
1229 switch (serio->id.type) {
1230
1231 case SERIO_8042_XL:
1232 atkbd->translated = true;
1233 fallthrough;
1234
1235 case SERIO_8042:
1236 if (serio->write)
1237 atkbd->write = true;
1238 break;
1239 }
1240
1241 atkbd->softraw = atkbd_softraw;
1242 atkbd->softrepeat = atkbd_softrepeat;
1243 atkbd->scroll = atkbd_scroll;
1244
1245 if (atkbd->softrepeat)
1246 atkbd->softraw = true;
1247
1248 serio_set_drvdata(serio, atkbd);
1249
1250 err = serio_open(serio, drv);
1251 if (err)
1252 goto fail2;
1253
1254 if (atkbd->write) {
1255
1256 if (atkbd_probe(atkbd)) {
1257 err = -ENODEV;
1258 goto fail3;
1259 }
1260
1261 atkbd->set = atkbd_select_set(atkbd, atkbd_set, atkbd_extra);
1262 atkbd_reset_state(atkbd);
1263
1264 } else {
1265 atkbd->set = 2;
1266 atkbd->id = 0xab00;
1267 }
1268
1269 atkbd_parse_fwnode_data(serio);
1270
1271 atkbd_set_keycode_table(atkbd);
1272 atkbd_set_device_attrs(atkbd);
1273
1274 err = sysfs_create_group(&serio->dev.kobj, &atkbd_attribute_group);
1275 if (err)
1276 goto fail3;
1277
1278 atkbd_enable(atkbd);
1279 if (serio->write)
1280 atkbd_activate(atkbd);
1281
1282 err = input_register_device(atkbd->dev);
1283 if (err)
1284 goto fail4;
1285
1286 return 0;
1287
1288 fail4: sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group);
1289 fail3: serio_close(serio);
1290 fail2: serio_set_drvdata(serio, NULL);
1291 fail1: input_free_device(dev);
1292 kfree(atkbd);
1293 return err;
1294 }
1295
1296
1297
1298
1299
1300
1301 static int atkbd_reconnect(struct serio *serio)
1302 {
1303 struct atkbd *atkbd = serio_get_drvdata(serio);
1304 struct serio_driver *drv = serio->drv;
1305 int retval = -1;
1306
1307 if (!atkbd || !drv) {
1308 dev_dbg(&serio->dev,
1309 "reconnect request, but serio is disconnected, ignoring...\n");
1310 return -1;
1311 }
1312
1313 mutex_lock(&atkbd->mutex);
1314
1315 atkbd_disable(atkbd);
1316
1317 if (atkbd->write) {
1318 if (atkbd_probe(atkbd))
1319 goto out;
1320
1321 if (atkbd->set != atkbd_select_set(atkbd, atkbd->set, atkbd->extra))
1322 goto out;
1323
1324
1325
1326
1327
1328
1329
1330
1331 atkbd_set_leds(atkbd);
1332 if (!atkbd->softrepeat)
1333 atkbd_set_repeat_rate(atkbd);
1334
1335 }
1336
1337
1338
1339
1340
1341 atkbd->xl_bit = 0;
1342 atkbd->emul = 0;
1343
1344 atkbd_enable(atkbd);
1345 if (atkbd->write)
1346 atkbd_activate(atkbd);
1347
1348 retval = 0;
1349
1350 out:
1351 mutex_unlock(&atkbd->mutex);
1352 return retval;
1353 }
1354
1355 static const struct serio_device_id atkbd_serio_ids[] = {
1356 {
1357 .type = SERIO_8042,
1358 .proto = SERIO_ANY,
1359 .id = SERIO_ANY,
1360 .extra = SERIO_ANY,
1361 },
1362 {
1363 .type = SERIO_8042_XL,
1364 .proto = SERIO_ANY,
1365 .id = SERIO_ANY,
1366 .extra = SERIO_ANY,
1367 },
1368 {
1369 .type = SERIO_RS232,
1370 .proto = SERIO_PS2SER,
1371 .id = SERIO_ANY,
1372 .extra = SERIO_ANY,
1373 },
1374 { 0 }
1375 };
1376
1377 MODULE_DEVICE_TABLE(serio, atkbd_serio_ids);
1378
1379 static struct serio_driver atkbd_drv = {
1380 .driver = {
1381 .name = "atkbd",
1382 },
1383 .description = DRIVER_DESC,
1384 .id_table = atkbd_serio_ids,
1385 .interrupt = atkbd_interrupt,
1386 .connect = atkbd_connect,
1387 .reconnect = atkbd_reconnect,
1388 .disconnect = atkbd_disconnect,
1389 .cleanup = atkbd_cleanup,
1390 };
1391
1392 static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf,
1393 ssize_t (*handler)(struct atkbd *, char *))
1394 {
1395 struct serio *serio = to_serio_port(dev);
1396 struct atkbd *atkbd = serio_get_drvdata(serio);
1397
1398 return handler(atkbd, buf);
1399 }
1400
1401 static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count,
1402 ssize_t (*handler)(struct atkbd *, const char *, size_t))
1403 {
1404 struct serio *serio = to_serio_port(dev);
1405 struct atkbd *atkbd = serio_get_drvdata(serio);
1406 int retval;
1407
1408 retval = mutex_lock_interruptible(&atkbd->mutex);
1409 if (retval)
1410 return retval;
1411
1412 atkbd_disable(atkbd);
1413 retval = handler(atkbd, buf, count);
1414 atkbd_enable(atkbd);
1415
1416 mutex_unlock(&atkbd->mutex);
1417
1418 return retval;
1419 }
1420
1421 static ssize_t atkbd_show_extra(struct atkbd *atkbd, char *buf)
1422 {
1423 return sprintf(buf, "%d\n", atkbd->extra ? 1 : 0);
1424 }
1425
1426 static ssize_t atkbd_set_extra(struct atkbd *atkbd, const char *buf, size_t count)
1427 {
1428 struct input_dev *old_dev, *new_dev;
1429 unsigned int value;
1430 int err;
1431 bool old_extra;
1432 unsigned char old_set;
1433
1434 if (!atkbd->write)
1435 return -EIO;
1436
1437 err = kstrtouint(buf, 10, &value);
1438 if (err)
1439 return err;
1440
1441 if (value > 1)
1442 return -EINVAL;
1443
1444 if (atkbd->extra != value) {
1445
1446
1447
1448
1449
1450 old_dev = atkbd->dev;
1451 old_extra = atkbd->extra;
1452 old_set = atkbd->set;
1453
1454 new_dev = input_allocate_device();
1455 if (!new_dev)
1456 return -ENOMEM;
1457
1458 atkbd->dev = new_dev;
1459 atkbd->set = atkbd_select_set(atkbd, atkbd->set, value);
1460 atkbd_reset_state(atkbd);
1461 atkbd_activate(atkbd);
1462 atkbd_set_keycode_table(atkbd);
1463 atkbd_set_device_attrs(atkbd);
1464
1465 err = input_register_device(atkbd->dev);
1466 if (err) {
1467 input_free_device(new_dev);
1468
1469 atkbd->dev = old_dev;
1470 atkbd->set = atkbd_select_set(atkbd, old_set, old_extra);
1471 atkbd_set_keycode_table(atkbd);
1472 atkbd_set_device_attrs(atkbd);
1473
1474 return err;
1475 }
1476 input_unregister_device(old_dev);
1477
1478 }
1479 return count;
1480 }
1481
1482 static ssize_t atkbd_show_force_release(struct atkbd *atkbd, char *buf)
1483 {
1484 size_t len = scnprintf(buf, PAGE_SIZE - 1, "%*pbl",
1485 ATKBD_KEYMAP_SIZE, atkbd->force_release_mask);
1486
1487 buf[len++] = '\n';
1488 buf[len] = '\0';
1489
1490 return len;
1491 }
1492
1493 static ssize_t atkbd_set_force_release(struct atkbd *atkbd,
1494 const char *buf, size_t count)
1495 {
1496
1497 DECLARE_BITMAP(new_mask, ATKBD_KEYMAP_SIZE);
1498 int err;
1499
1500 err = bitmap_parselist(buf, new_mask, ATKBD_KEYMAP_SIZE);
1501 if (err)
1502 return err;
1503
1504 memcpy(atkbd->force_release_mask, new_mask, sizeof(atkbd->force_release_mask));
1505 return count;
1506 }
1507
1508
1509 static ssize_t atkbd_show_scroll(struct atkbd *atkbd, char *buf)
1510 {
1511 return sprintf(buf, "%d\n", atkbd->scroll ? 1 : 0);
1512 }
1513
1514 static ssize_t atkbd_set_scroll(struct atkbd *atkbd, const char *buf, size_t count)
1515 {
1516 struct input_dev *old_dev, *new_dev;
1517 unsigned int value;
1518 int err;
1519 bool old_scroll;
1520
1521 err = kstrtouint(buf, 10, &value);
1522 if (err)
1523 return err;
1524
1525 if (value > 1)
1526 return -EINVAL;
1527
1528 if (atkbd->scroll != value) {
1529 old_dev = atkbd->dev;
1530 old_scroll = atkbd->scroll;
1531
1532 new_dev = input_allocate_device();
1533 if (!new_dev)
1534 return -ENOMEM;
1535
1536 atkbd->dev = new_dev;
1537 atkbd->scroll = value;
1538 atkbd_set_keycode_table(atkbd);
1539 atkbd_set_device_attrs(atkbd);
1540
1541 err = input_register_device(atkbd->dev);
1542 if (err) {
1543 input_free_device(new_dev);
1544
1545 atkbd->scroll = old_scroll;
1546 atkbd->dev = old_dev;
1547 atkbd_set_keycode_table(atkbd);
1548 atkbd_set_device_attrs(atkbd);
1549
1550 return err;
1551 }
1552 input_unregister_device(old_dev);
1553 }
1554 return count;
1555 }
1556
1557 static ssize_t atkbd_show_set(struct atkbd *atkbd, char *buf)
1558 {
1559 return sprintf(buf, "%d\n", atkbd->set);
1560 }
1561
1562 static ssize_t atkbd_set_set(struct atkbd *atkbd, const char *buf, size_t count)
1563 {
1564 struct input_dev *old_dev, *new_dev;
1565 unsigned int value;
1566 int err;
1567 unsigned char old_set;
1568 bool old_extra;
1569
1570 if (!atkbd->write)
1571 return -EIO;
1572
1573 err = kstrtouint(buf, 10, &value);
1574 if (err)
1575 return err;
1576
1577 if (value != 2 && value != 3)
1578 return -EINVAL;
1579
1580 if (atkbd->set != value) {
1581 old_dev = atkbd->dev;
1582 old_extra = atkbd->extra;
1583 old_set = atkbd->set;
1584
1585 new_dev = input_allocate_device();
1586 if (!new_dev)
1587 return -ENOMEM;
1588
1589 atkbd->dev = new_dev;
1590 atkbd->set = atkbd_select_set(atkbd, value, atkbd->extra);
1591 atkbd_reset_state(atkbd);
1592 atkbd_activate(atkbd);
1593 atkbd_set_keycode_table(atkbd);
1594 atkbd_set_device_attrs(atkbd);
1595
1596 err = input_register_device(atkbd->dev);
1597 if (err) {
1598 input_free_device(new_dev);
1599
1600 atkbd->dev = old_dev;
1601 atkbd->set = atkbd_select_set(atkbd, old_set, old_extra);
1602 atkbd_set_keycode_table(atkbd);
1603 atkbd_set_device_attrs(atkbd);
1604
1605 return err;
1606 }
1607 input_unregister_device(old_dev);
1608 }
1609 return count;
1610 }
1611
1612 static ssize_t atkbd_show_softrepeat(struct atkbd *atkbd, char *buf)
1613 {
1614 return sprintf(buf, "%d\n", atkbd->softrepeat ? 1 : 0);
1615 }
1616
1617 static ssize_t atkbd_set_softrepeat(struct atkbd *atkbd, const char *buf, size_t count)
1618 {
1619 struct input_dev *old_dev, *new_dev;
1620 unsigned int value;
1621 int err;
1622 bool old_softrepeat, old_softraw;
1623
1624 if (!atkbd->write)
1625 return -EIO;
1626
1627 err = kstrtouint(buf, 10, &value);
1628 if (err)
1629 return err;
1630
1631 if (value > 1)
1632 return -EINVAL;
1633
1634 if (atkbd->softrepeat != value) {
1635 old_dev = atkbd->dev;
1636 old_softrepeat = atkbd->softrepeat;
1637 old_softraw = atkbd->softraw;
1638
1639 new_dev = input_allocate_device();
1640 if (!new_dev)
1641 return -ENOMEM;
1642
1643 atkbd->dev = new_dev;
1644 atkbd->softrepeat = value;
1645 if (atkbd->softrepeat)
1646 atkbd->softraw = true;
1647 atkbd_set_device_attrs(atkbd);
1648
1649 err = input_register_device(atkbd->dev);
1650 if (err) {
1651 input_free_device(new_dev);
1652
1653 atkbd->dev = old_dev;
1654 atkbd->softrepeat = old_softrepeat;
1655 atkbd->softraw = old_softraw;
1656 atkbd_set_device_attrs(atkbd);
1657
1658 return err;
1659 }
1660 input_unregister_device(old_dev);
1661 }
1662 return count;
1663 }
1664
1665
1666 static ssize_t atkbd_show_softraw(struct atkbd *atkbd, char *buf)
1667 {
1668 return sprintf(buf, "%d\n", atkbd->softraw ? 1 : 0);
1669 }
1670
1671 static ssize_t atkbd_set_softraw(struct atkbd *atkbd, const char *buf, size_t count)
1672 {
1673 struct input_dev *old_dev, *new_dev;
1674 unsigned int value;
1675 int err;
1676 bool old_softraw;
1677
1678 err = kstrtouint(buf, 10, &value);
1679 if (err)
1680 return err;
1681
1682 if (value > 1)
1683 return -EINVAL;
1684
1685 if (atkbd->softraw != value) {
1686 old_dev = atkbd->dev;
1687 old_softraw = atkbd->softraw;
1688
1689 new_dev = input_allocate_device();
1690 if (!new_dev)
1691 return -ENOMEM;
1692
1693 atkbd->dev = new_dev;
1694 atkbd->softraw = value;
1695 atkbd_set_device_attrs(atkbd);
1696
1697 err = input_register_device(atkbd->dev);
1698 if (err) {
1699 input_free_device(new_dev);
1700
1701 atkbd->dev = old_dev;
1702 atkbd->softraw = old_softraw;
1703 atkbd_set_device_attrs(atkbd);
1704
1705 return err;
1706 }
1707 input_unregister_device(old_dev);
1708 }
1709 return count;
1710 }
1711
1712 static ssize_t atkbd_show_err_count(struct atkbd *atkbd, char *buf)
1713 {
1714 return sprintf(buf, "%lu\n", atkbd->err_count);
1715 }
1716
1717 static int __init atkbd_setup_forced_release(const struct dmi_system_id *id)
1718 {
1719 atkbd_platform_fixup = atkbd_apply_forced_release_keylist;
1720 atkbd_platform_fixup_data = id->driver_data;
1721
1722 return 1;
1723 }
1724
1725 static int __init atkbd_setup_scancode_fixup(const struct dmi_system_id *id)
1726 {
1727 atkbd_platform_scancode_fixup = id->driver_data;
1728
1729 return 1;
1730 }
1731
1732 static int __init atkbd_deactivate_fixup(const struct dmi_system_id *id)
1733 {
1734 atkbd_skip_deactivate = true;
1735 return 1;
1736 }
1737
1738
1739
1740
1741
1742
1743
1744 static const struct dmi_system_id atkbd_dmi_quirk_table[] __initconst = {
1745 {
1746 .matches = {
1747 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1748 DMI_MATCH(DMI_CHASSIS_TYPE, "8"),
1749 },
1750 .callback = atkbd_setup_forced_release,
1751 .driver_data = atkbd_dell_laptop_forced_release_keys,
1752 },
1753 {
1754 .matches = {
1755 DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
1756 DMI_MATCH(DMI_CHASSIS_TYPE, "8"),
1757 },
1758 .callback = atkbd_setup_forced_release,
1759 .driver_data = atkbd_dell_laptop_forced_release_keys,
1760 },
1761 {
1762 .matches = {
1763 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1764 DMI_MATCH(DMI_PRODUCT_NAME, "HP 2133"),
1765 },
1766 .callback = atkbd_setup_forced_release,
1767 .driver_data = atkbd_hp_forced_release_keys,
1768 },
1769 {
1770 .matches = {
1771 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1772 DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion ZV6100"),
1773 },
1774 .callback = atkbd_setup_forced_release,
1775 .driver_data = atkbd_volume_forced_release_keys,
1776 },
1777 {
1778 .matches = {
1779 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1780 DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4000"),
1781 },
1782 .callback = atkbd_setup_forced_release,
1783 .driver_data = atkbd_volume_forced_release_keys,
1784 },
1785 {
1786 .matches = {
1787 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1788 DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4100"),
1789 },
1790 .callback = atkbd_setup_forced_release,
1791 .driver_data = atkbd_volume_forced_release_keys,
1792 },
1793 {
1794 .matches = {
1795 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1796 DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4200"),
1797 },
1798 .callback = atkbd_setup_forced_release,
1799 .driver_data = atkbd_volume_forced_release_keys,
1800 },
1801 {
1802
1803 .matches = {
1804 DMI_MATCH(DMI_SYS_VENDOR, "INVENTEC"),
1805 DMI_MATCH(DMI_PRODUCT_NAME, "SYMPHONY 6.0/7.0"),
1806 },
1807 .callback = atkbd_setup_forced_release,
1808 .driver_data = atkbd_volume_forced_release_keys,
1809 },
1810 {
1811
1812 .matches = {
1813 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
1814 DMI_MATCH(DMI_PRODUCT_NAME, "NC10"),
1815 },
1816 .callback = atkbd_setup_forced_release,
1817 .driver_data = atkbd_samsung_forced_release_keys,
1818 },
1819 {
1820
1821 .matches = {
1822 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
1823 DMI_MATCH(DMI_PRODUCT_NAME, "NC20"),
1824 },
1825 .callback = atkbd_setup_forced_release,
1826 .driver_data = atkbd_samsung_forced_release_keys,
1827 },
1828 {
1829
1830 .matches = {
1831 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
1832 DMI_MATCH(DMI_PRODUCT_NAME, "SQ45S70S"),
1833 },
1834 .callback = atkbd_setup_forced_release,
1835 .driver_data = atkbd_samsung_forced_release_keys,
1836 },
1837 {
1838
1839 .matches = {
1840 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
1841 DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pa 1510"),
1842 },
1843 .callback = atkbd_setup_forced_release,
1844 .driver_data = atkbd_volume_forced_release_keys,
1845 },
1846 {
1847
1848 .matches = {
1849 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
1850 DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 3525"),
1851 },
1852 .callback = atkbd_setup_forced_release,
1853 .driver_data = atkbd_amilo_pi3525_forced_release_keys,
1854 },
1855 {
1856
1857 .matches = {
1858 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
1859 DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xi 3650"),
1860 },
1861 .callback = atkbd_setup_forced_release,
1862 .driver_data = atkbd_amilo_xi3650_forced_release_keys,
1863 },
1864 {
1865 .matches = {
1866 DMI_MATCH(DMI_SYS_VENDOR, "Soltech Corporation"),
1867 DMI_MATCH(DMI_PRODUCT_NAME, "TA12"),
1868 },
1869 .callback = atkbd_setup_forced_release,
1870 .driver_data = atkdb_soltech_ta12_forced_release_keys,
1871 },
1872 {
1873
1874 .matches = {
1875 DMI_MATCH(DMI_SYS_VENDOR, "OQO"),
1876 DMI_MATCH(DMI_PRODUCT_NAME, "ZEPTO"),
1877 },
1878 .callback = atkbd_setup_scancode_fixup,
1879 .driver_data = atkbd_oqo_01plus_scancode_fixup,
1880 },
1881 {
1882 .matches = {
1883 DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"),
1884 },
1885 .callback = atkbd_deactivate_fixup,
1886 },
1887 { }
1888 };
1889
1890 static int __init atkbd_init(void)
1891 {
1892 dmi_check_system(atkbd_dmi_quirk_table);
1893
1894 return serio_register_driver(&atkbd_drv);
1895 }
1896
1897 static void __exit atkbd_exit(void)
1898 {
1899 serio_unregister_driver(&atkbd_drv);
1900 }
1901
1902 module_init(atkbd_init);
1903 module_exit(atkbd_exit);