Lines Matching defs:atkbd
200 * The atkbd control structure
203 struct atkbd {
247 static void (*atkbd_platform_fixup)(struct atkbd *, const void *data);
249 static unsigned int (*atkbd_platform_scancode_fixup)(struct atkbd *, unsigned int);
258 ssize_t (*handler)(struct atkbd *, char *));
260 ssize_t (*handler)(struct atkbd *, const char *, size_t));
262 static ssize_t atkbd_show_##_name(struct atkbd *, char *); \
263 static ssize_t atkbd_set_##_name(struct atkbd *, const char *, size_t); \
285 static ssize_t atkbd_show_##_name(struct atkbd *, char *); \
309 static ssize_t atkbd_show_function_row_physmap(struct atkbd *atkbd, char *buf)
314 if (!atkbd->num_function_row_keys)
317 for (i = 0; i < atkbd->num_function_row_keys; i++)
319 atkbd->function_row_physmap[i]);
329 struct atkbd *atkbd = serio_get_drvdata(serio);
332 !atkbd->num_function_row_keys)
371 static void atkbd_calculate_xl_bit(struct atkbd *atkbd, unsigned char code)
378 __clear_bit(i, &atkbd->xl_bit);
380 __set_bit(i, &atkbd->xl_bit);
390 static unsigned int atkbd_compat_scancode(struct atkbd *atkbd, unsigned int code)
392 if (atkbd->set == 3) {
393 if (atkbd->emul == 1)
397 if (atkbd->emul == 1)
412 struct atkbd *atkbd = serio_get_drvdata(serio);
413 struct input_dev *dev = atkbd->dev;
422 if ((flags & (SERIO_FRAME | SERIO_PARITY)) && (~flags & SERIO_TIMEOUT) && !atkbd->resend && atkbd->write) {
425 atkbd->resend = true;
430 atkbd->resend = false;
433 if (unlikely(atkbd->ps2dev.flags & PS2_FLAG_ACK))
434 if (ps2_handle_ack(&atkbd->ps2dev, data))
437 if (unlikely(atkbd->ps2dev.flags & PS2_FLAG_CMD))
438 if (ps2_handle_response(&atkbd->ps2dev, data))
443 if (!atkbd->enabled)
449 code = atkbd_platform_scancode_fixup(atkbd, code);
451 if (atkbd->translated) {
453 if (atkbd->emul || atkbd_need_xlate(atkbd->xl_bit, code)) {
454 atkbd->release = code >> 7;
458 if (!atkbd->emul)
459 atkbd_calculate_xl_bit(atkbd, data);
464 atkbd->enabled = false;
465 serio_reconnect(atkbd->ps2dev.serio);
468 atkbd->emul = 1;
471 atkbd->emul = 2;
474 atkbd->release = true;
485 atkbd->err_count++;
491 code = atkbd_compat_scancode(atkbd, code);
493 if (atkbd->emul && --atkbd->emul)
496 keycode = atkbd->keycode[code];
498 if (!(atkbd->release && test_bit(code, atkbd->force_release_mask)))
508 atkbd->release ? "released" : "pressed",
509 atkbd->translated ? "translated" : "raw",
510 atkbd->set, code, serio->phys);
529 click = !atkbd->release;
538 if (atkbd->release) {
540 atkbd->last = 0;
541 } else if (!atkbd->softrepeat && test_bit(keycode, dev->key)) {
543 value = time_before(jiffies, atkbd->time) && atkbd->last == code ? 1 : 2;
546 atkbd->last = code;
547 atkbd->time = jiffies + msecs_to_jiffies(dev->rep[REP_DELAY]) / 2;
553 if (value && test_bit(code, atkbd->force_release_mask)) {
560 if (atkbd->scroll) {
564 atkbd->release ? -scroll : scroll);
569 atkbd->release = false;
574 static int atkbd_set_repeat_rate(struct atkbd *atkbd)
582 struct input_dev *dev = atkbd->dev;
595 return ps2_command(&atkbd->ps2dev, ¶m, ATKBD_CMD_SETREP);
598 static int atkbd_set_leds(struct atkbd *atkbd)
600 struct input_dev *dev = atkbd->dev;
606 if (ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_SETLEDS))
609 if (atkbd->extra) {
616 if (ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_EX_SETLEDS))
631 struct atkbd *atkbd = container_of(work, struct atkbd, event_work.work);
633 mutex_lock(&atkbd->mutex);
635 if (!atkbd->enabled) {
642 schedule_delayed_work(&atkbd->event_work,
645 if (test_and_clear_bit(ATKBD_LED_EVENT_BIT, &atkbd->event_mask))
646 atkbd_set_leds(atkbd);
648 if (test_and_clear_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask))
649 atkbd_set_repeat_rate(atkbd);
652 mutex_unlock(&atkbd->mutex);
659 static void atkbd_schedule_event_work(struct atkbd *atkbd, int event_bit)
663 if (time_after(jiffies, atkbd->event_jiffies + delay))
666 atkbd->event_jiffies = jiffies;
667 set_bit(event_bit, &atkbd->event_mask);
669 schedule_delayed_work(&atkbd->event_work, delay);
681 struct atkbd *atkbd = input_get_drvdata(dev);
683 if (!atkbd->write)
689 atkbd_schedule_event_work(atkbd, ATKBD_LED_EVENT_BIT);
693 if (!atkbd->softrepeat)
694 atkbd_schedule_event_work(atkbd, ATKBD_REP_EVENT_BIT);
707 static inline void atkbd_enable(struct atkbd *atkbd)
709 serio_pause_rx(atkbd->ps2dev.serio);
710 atkbd->enabled = true;
711 serio_continue_rx(atkbd->ps2dev.serio);
719 static inline void atkbd_disable(struct atkbd *atkbd)
721 serio_pause_rx(atkbd->ps2dev.serio);
722 atkbd->enabled = false;
723 serio_continue_rx(atkbd->ps2dev.serio);
726 static int atkbd_activate(struct atkbd *atkbd)
728 struct ps2dev *ps2dev = &atkbd->ps2dev;
749 static void atkbd_deactivate(struct atkbd *atkbd)
751 struct ps2dev *ps2dev = &atkbd->ps2dev;
786 * 0xab83 id is ok in translated mode, only atkbd_select_set() checks atkbd->id
789 static bool atkbd_skip_getid(struct atkbd *atkbd)
791 return atkbd->translated && atkbd_is_portable_device();
794 static inline bool atkbd_skip_getid(struct atkbd *atkbd) { return false; }
801 static int atkbd_probe(struct atkbd *atkbd)
803 struct ps2dev *ps2dev = &atkbd->ps2dev;
818 if (atkbd_skip_getid(atkbd)) {
819 atkbd->id = 0xab83;
841 atkbd->id = 0xabba;
848 atkbd->id = (param[0] << 8) | param[1];
850 if (atkbd->id == 0xaca1 && atkbd->translated) {
862 atkbd_deactivate(atkbd);
873 static int atkbd_select_set(struct atkbd *atkbd, int target_set, int allow_extra)
875 struct ps2dev *ps2dev = &atkbd->ps2dev;
878 atkbd->extra = false;
885 if (atkbd->translated)
888 if (atkbd->id == 0xaca1) {
897 atkbd->extra = true;
911 atkbd->id = param[0] << 8 | param[1];
934 static int atkbd_reset_state(struct atkbd *atkbd)
936 struct ps2dev *ps2dev = &atkbd->ps2dev;
965 struct atkbd *atkbd = serio_get_drvdata(serio);
967 atkbd_disable(atkbd);
968 ps2_command(&atkbd->ps2dev, NULL, ATKBD_CMD_RESET_DEF);
978 struct atkbd *atkbd = serio_get_drvdata(serio);
982 atkbd_disable(atkbd);
984 input_unregister_device(atkbd->dev);
988 * Note that since atkbd->enabled is false event work will keep
992 cancel_delayed_work_sync(&atkbd->event_work);
996 kfree(atkbd);
1002 static void atkbd_apply_forced_release_keylist(struct atkbd* atkbd,
1008 if (atkbd->set == 2)
1010 __set_bit(keys[i], atkbd->force_release_mask);
1069 static unsigned int atkbd_oqo_01plus_scancode_fixup(struct atkbd *atkbd,
1072 if (atkbd->translated && atkbd->emul == 1 &&
1074 atkbd->emul = 0;
1081 static int atkbd_get_keymap_from_fwnode(struct atkbd *atkbd)
1083 struct device *dev = &atkbd->ps2dev.serio->dev;
1103 memset(atkbd->keycode, 0, sizeof(atkbd->keycode));
1107 atkbd->keycode[scancode] = keycode;
1119 static void atkbd_set_keycode_table(struct atkbd *atkbd)
1121 struct device *dev = &atkbd->ps2dev.serio->dev;
1125 memset(atkbd->keycode, 0, sizeof(atkbd->keycode));
1126 bitmap_zero(atkbd->force_release_mask, ATKBD_KEYMAP_SIZE);
1128 if (!atkbd_get_keymap_from_fwnode(atkbd)) {
1130 } else if (atkbd->translated) {
1133 atkbd->keycode[i] = atkbd_set2_keycode[scancode];
1134 atkbd->keycode[i | 0x80] = atkbd_set2_keycode[scancode | 0x80];
1135 if (atkbd->scroll)
1138 atkbd->keycode[i | 0x80] = atkbd_scroll_keys[j].keycode;
1140 } else if (atkbd->set == 3) {
1141 memcpy(atkbd->keycode, atkbd_set3_keycode, sizeof(atkbd->keycode));
1143 memcpy(atkbd->keycode, atkbd_set2_keycode, sizeof(atkbd->keycode));
1145 if (atkbd->scroll)
1148 atkbd->keycode[scancode] = atkbd_scroll_keys[i].keycode;
1156 scancode = atkbd_compat_scancode(atkbd, ATKBD_RET_HANGEUL);
1157 atkbd->keycode[scancode] = KEY_HANGEUL;
1158 __set_bit(scancode, atkbd->force_release_mask);
1160 scancode = atkbd_compat_scancode(atkbd, ATKBD_RET_HANJA);
1161 atkbd->keycode[scancode] = KEY_HANJA;
1162 __set_bit(scancode, atkbd->force_release_mask);
1168 atkbd_platform_fixup(atkbd, atkbd_platform_fixup_data);
1175 static void atkbd_set_device_attrs(struct atkbd *atkbd)
1177 struct input_dev *input_dev = atkbd->dev;
1180 if (atkbd->extra)
1181 snprintf(atkbd->name, sizeof(atkbd->name),
1184 snprintf(atkbd->name, sizeof(atkbd->name),
1186 atkbd->translated ? "Translated" : "Raw", atkbd->set);
1188 snprintf(atkbd->phys, sizeof(atkbd->phys),
1189 "%s/input0", atkbd->ps2dev.serio->phys);
1191 input_dev->name = atkbd->name;
1192 input_dev->phys = atkbd->phys;
1195 input_dev->id.product = atkbd->translated ? 1 : atkbd->set;
1196 input_dev->id.version = atkbd->id;
1198 input_dev->dev.parent = &atkbd->ps2dev.serio->dev;
1200 input_set_drvdata(input_dev, atkbd);
1205 if (atkbd->write) {
1211 if (atkbd->extra)
1216 if (!atkbd->softrepeat) {
1221 input_dev->mscbit[0] = atkbd->softraw ? BIT_MASK(MSC_SCAN) :
1224 if (atkbd->scroll) {
1231 input_dev->keycode = atkbd->keycode;
1236 if (atkbd->keycode[i] != KEY_RESERVED &&
1237 atkbd->keycode[i] != ATKBD_KEY_NULL &&
1238 atkbd->keycode[i] < ATKBD_SPECIAL) {
1239 __set_bit(atkbd->keycode[i], input_dev->keybit);
1246 struct atkbd *atkbd = serio_get_drvdata(serio);
1254 atkbd->function_row_physmap, n)) {
1255 atkbd->num_function_row_keys = n;
1269 struct atkbd *atkbd;
1273 atkbd = kzalloc(sizeof(struct atkbd), GFP_KERNEL);
1275 if (!atkbd || !dev)
1278 atkbd->dev = dev;
1279 ps2_init(&atkbd->ps2dev, serio);
1280 INIT_DELAYED_WORK(&atkbd->event_work, atkbd_event_work);
1281 mutex_init(&atkbd->mutex);
1286 atkbd->translated = true;
1291 atkbd->write = true;
1295 atkbd->softraw = atkbd_softraw;
1296 atkbd->softrepeat = atkbd_softrepeat;
1297 atkbd->scroll = atkbd_scroll;
1299 if (atkbd->softrepeat)
1300 atkbd->softraw = true;
1302 serio_set_drvdata(serio, atkbd);
1308 if (atkbd->write) {
1310 if (atkbd_probe(atkbd)) {
1315 atkbd->set = atkbd_select_set(atkbd, atkbd_set, atkbd_extra);
1316 atkbd_reset_state(atkbd);
1319 atkbd->set = 2;
1320 atkbd->id = 0xab00;
1325 atkbd_set_keycode_table(atkbd);
1326 atkbd_set_device_attrs(atkbd);
1332 atkbd_enable(atkbd);
1334 atkbd_activate(atkbd);
1336 err = input_register_device(atkbd->dev);
1346 kfree(atkbd);
1357 struct atkbd *atkbd = serio_get_drvdata(serio);
1361 if (!atkbd || !drv) {
1367 mutex_lock(&atkbd->mutex);
1369 atkbd_disable(atkbd);
1371 if (atkbd->write) {
1372 if (atkbd_probe(atkbd))
1375 if (atkbd->set != atkbd_select_set(atkbd, atkbd->set, atkbd->extra))
1385 atkbd_set_leds(atkbd);
1386 if (!atkbd->softrepeat)
1387 atkbd_set_repeat_rate(atkbd);
1395 atkbd->xl_bit = 0;
1396 atkbd->emul = 0;
1398 atkbd_enable(atkbd);
1399 if (atkbd->write)
1400 atkbd_activate(atkbd);
1405 mutex_unlock(&atkbd->mutex);
1435 .name = "atkbd",
1447 ssize_t (*handler)(struct atkbd *, char *))
1450 struct atkbd *atkbd = serio_get_drvdata(serio);
1452 return handler(atkbd, buf);
1456 ssize_t (*handler)(struct atkbd *, const char *, size_t))
1459 struct atkbd *atkbd = serio_get_drvdata(serio);
1462 retval = mutex_lock_interruptible(&atkbd->mutex);
1466 atkbd_disable(atkbd);
1467 retval = handler(atkbd, buf, count);
1468 atkbd_enable(atkbd);
1470 mutex_unlock(&atkbd->mutex);
1475 static ssize_t atkbd_show_extra(struct atkbd *atkbd, char *buf)
1477 return sprintf(buf, "%d\n", atkbd->extra ? 1 : 0);
1480 static ssize_t atkbd_set_extra(struct atkbd *atkbd, const char *buf, size_t count)
1488 if (!atkbd->write)
1498 if (atkbd->extra != value) {
1504 old_dev = atkbd->dev;
1505 old_extra = atkbd->extra;
1506 old_set = atkbd->set;
1512 atkbd->dev = new_dev;
1513 atkbd->set = atkbd_select_set(atkbd, atkbd->set, value);
1514 atkbd_reset_state(atkbd);
1515 atkbd_activate(atkbd);
1516 atkbd_set_keycode_table(atkbd);
1517 atkbd_set_device_attrs(atkbd);
1519 err = input_register_device(atkbd->dev);
1523 atkbd->dev = old_dev;
1524 atkbd->set = atkbd_select_set(atkbd, old_set, old_extra);
1525 atkbd_set_keycode_table(atkbd);
1526 atkbd_set_device_attrs(atkbd);
1536 static ssize_t atkbd_show_force_release(struct atkbd *atkbd, char *buf)
1539 ATKBD_KEYMAP_SIZE, atkbd->force_release_mask);
1547 static ssize_t atkbd_set_force_release(struct atkbd *atkbd,
1558 memcpy(atkbd->force_release_mask, new_mask, sizeof(atkbd->force_release_mask));
1563 static ssize_t atkbd_show_scroll(struct atkbd *atkbd, char *buf)
1565 return sprintf(buf, "%d\n", atkbd->scroll ? 1 : 0);
1568 static ssize_t atkbd_set_scroll(struct atkbd *atkbd, const char *buf, size_t count)
1582 if (atkbd->scroll != value) {
1583 old_dev = atkbd->dev;
1584 old_scroll = atkbd->scroll;
1590 atkbd->dev = new_dev;
1591 atkbd->scroll = value;
1592 atkbd_set_keycode_table(atkbd);
1593 atkbd_set_device_attrs(atkbd);
1595 err = input_register_device(atkbd->dev);
1599 atkbd->scroll = old_scroll;
1600 atkbd->dev = old_dev;
1601 atkbd_set_keycode_table(atkbd);
1602 atkbd_set_device_attrs(atkbd);
1611 static ssize_t atkbd_show_set(struct atkbd *atkbd, char *buf)
1613 return sprintf(buf, "%d\n", atkbd->set);
1616 static ssize_t atkbd_set_set(struct atkbd *atkbd, const char *buf, size_t count)
1624 if (!atkbd->write)
1634 if (atkbd->set != value) {
1635 old_dev = atkbd->dev;
1636 old_extra = atkbd->extra;
1637 old_set = atkbd->set;
1643 atkbd->dev = new_dev;
1644 atkbd->set = atkbd_select_set(atkbd, value, atkbd->extra);
1645 atkbd_reset_state(atkbd);
1646 atkbd_activate(atkbd);
1647 atkbd_set_keycode_table(atkbd);
1648 atkbd_set_device_attrs(atkbd);
1650 err = input_register_device(atkbd->dev);
1654 atkbd->dev = old_dev;
1655 atkbd->set = atkbd_select_set(atkbd, old_set, old_extra);
1656 atkbd_set_keycode_table(atkbd);
1657 atkbd_set_device_attrs(atkbd);
1666 static ssize_t atkbd_show_softrepeat(struct atkbd *atkbd, char *buf)
1668 return sprintf(buf, "%d\n", atkbd->softrepeat ? 1 : 0);
1671 static ssize_t atkbd_set_softrepeat(struct atkbd *atkbd, const char *buf, size_t count)
1678 if (!atkbd->write)
1688 if (atkbd->softrepeat != value) {
1689 old_dev = atkbd->dev;
1690 old_softrepeat = atkbd->softrepeat;
1691 old_softraw = atkbd->softraw;
1697 atkbd->dev = new_dev;
1698 atkbd->softrepeat = value;
1699 if (atkbd->softrepeat)
1700 atkbd->softraw = true;
1701 atkbd_set_device_attrs(atkbd);
1703 err = input_register_device(atkbd->dev);
1707 atkbd->dev = old_dev;
1708 atkbd->softrepeat = old_softrepeat;
1709 atkbd->softraw = old_softraw;
1710 atkbd_set_device_attrs(atkbd);
1720 static ssize_t atkbd_show_softraw(struct atkbd *atkbd, char *buf)
1722 return sprintf(buf, "%d\n", atkbd->softraw ? 1 : 0);
1725 static ssize_t atkbd_set_softraw(struct atkbd *atkbd, const char *buf, size_t count)
1739 if (atkbd->softraw != value) {
1740 old_dev = atkbd->dev;
1741 old_softraw = atkbd->softraw;
1747 atkbd->dev = new_dev;
1748 atkbd->softraw = value;
1749 atkbd_set_device_attrs(atkbd);
1751 err = input_register_device(atkbd->dev);
1755 atkbd->dev = old_dev;
1756 atkbd->softraw = old_softraw;
1757 atkbd_set_device_attrs(atkbd);
1766 static ssize_t atkbd_show_err_count(struct atkbd *atkbd, char *buf)
1768 return sprintf(buf, "%lu\n", atkbd->err_count);