• Home
  • Raw
  • Download

Lines Matching +full:kbd +full:- +full:led +full:- +full:backlight

1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (c) 2015-2018 Federico Lorenzi
6 * Copyright (c) 2017-2018 Ronald Tschalär
26 * SPI-based Protocol
27 * ------------------
40 * fixed, 256-byte size). In that case it will be split over multiple,
85 ((KBD_BL_LEVEL_MAX - KBD_BL_LEVEL_MIN) * KBD_BL_LEVEL_SCALE / 255U)
102 …emap Fn key ([0] = no-remap; 1 = left-ctrl, 2 = left-shift, 3 = left-alt, 4 = left-meta, 6 = right
106 MODULE_PARM_DESC(iso_layout, "Enable/Disable hardcoded ISO-layout of the keyboard. ([0] = disabled,…
114 * struct keyboard_protocol - keyboard message.
118 * @modifiers: bit-set of modifier/control keys pressed
120 * @keys_pressed: the (non-modifier) keys currently pressed
135 * struct tp_finger - single trackpad finger structure, le16-aligned
172 * struct touchpad_protocol - touchpad message.
176 * @clicked: 1 if a button-click was detected, 0 otherwise
194 * struct command_protocol_tp_info - get touchpad info.
205 * struct touchpad_info - touchpad info response.
225 * struct command_protocol_mt_init - initialize multitouch.
238 * struct command_protocol_capsl - toggle caps-lock led
242 * @led: 0 off, 2 on
248 u8 led; member
253 * struct command_protocol_bl - set keyboard backlight brightness
258 * @const2: value: 0x0001 (backlight off), 0x01F4 (backlight on)
270 * struct message - a complete spi message.
272 * Each message begins with fixed header, followed by a message-type specific
273 * payload, and ends with a 16-bit crc. Because of the varying lengths of the
287 * structure (after re-assembly in case of being split over
288 * multiple spi-packets), minus the trailing crc. The total size
313 * struct spi_packet - a complete spi packet; always 256 bytes. This carries
334 * covers just this packet, even on multi-packet messages (in
348 u64 spi_cs_delay; /* cs-to-clk delay in us */
349 u64 reset_a2r_usec; /* active-to-receive delay? */
503 .tp_info = { -5087, -182, 5579, 6089 },
507 .tp_info = { -6243, -170, 6749, 7685 },
511 .tp_info = { -7456, -163, 7976, 9283 },
542 struct spi_message *msg = &applespi->rd_m; in applespi_setup_read_txfrs()
543 struct spi_transfer *dl_t = &applespi->dl_t; in applespi_setup_read_txfrs()
544 struct spi_transfer *rd_t = &applespi->rd_t; in applespi_setup_read_txfrs()
549 dl_t->delay_usecs = applespi->spi_settings.spi_cs_delay; in applespi_setup_read_txfrs()
551 rd_t->rx_buf = applespi->rx_buffer; in applespi_setup_read_txfrs()
552 rd_t->len = APPLESPI_PACKET_SIZE; in applespi_setup_read_txfrs()
561 struct spi_message *msg = &applespi->wr_m; in applespi_setup_write_txfrs()
562 struct spi_transfer *wt_t = &applespi->ww_t; in applespi_setup_write_txfrs()
563 struct spi_transfer *dl_t = &applespi->wd_t; in applespi_setup_write_txfrs()
564 struct spi_transfer *wr_t = &applespi->wr_t; in applespi_setup_write_txfrs()
565 struct spi_transfer *st_t = &applespi->st_t; in applespi_setup_write_txfrs()
578 wt_t->delay_usecs = SPI_RW_CHG_DELAY_US; in applespi_setup_write_txfrs()
579 wt_t->cs_change = 1; in applespi_setup_write_txfrs()
581 dl_t->delay_usecs = applespi->spi_settings.spi_cs_delay; in applespi_setup_write_txfrs()
583 wr_t->tx_buf = applespi->tx_buffer; in applespi_setup_write_txfrs()
584 wr_t->len = APPLESPI_PACKET_SIZE; in applespi_setup_write_txfrs()
585 wr_t->delay_usecs = SPI_RW_CHG_DELAY_US; in applespi_setup_write_txfrs()
587 st_t->rx_buf = applespi->tx_status; in applespi_setup_write_txfrs()
588 st_t->len = APPLESPI_STATUS_SIZE; in applespi_setup_write_txfrs()
600 message->complete = complete; in applespi_async()
601 message->context = applespi; in applespi_async()
603 return spi_async(applespi->spi, message); in applespi_async()
612 dev_warn(&applespi->spi->dev, "Error writing to device: %d\n", in applespi_check_write_status()
617 if (memcmp(applespi->tx_status, status_ok, APPLESPI_STATUS_SIZE)) { in applespi_check_write_status()
618 dev_warn(&applespi->spi->dev, "Error writing to device: %*ph\n", in applespi_check_write_status()
619 APPLESPI_STATUS_SIZE, applespi->tx_status); in applespi_check_write_status()
628 struct acpi_device *adev = ACPI_COMPANION(&applespi->spi->dev); in applespi_get_spi_settings()
630 struct spi_settings *settings = &applespi->spi_settings; in applespi_get_spi_settings()
633 settings->spi_cs_delay = *(u64 *)o->buffer.pointer; in applespi_get_spi_settings()
635 dev_warn(&applespi->spi->dev, in applespi_get_spi_settings()
639 settings->reset_a2r_usec = *(u64 *)o->buffer.pointer; in applespi_get_spi_settings()
641 dev_warn(&applespi->spi->dev, in applespi_get_spi_settings()
645 settings->reset_rec_usec = *(u64 *)o->buffer.pointer; in applespi_get_spi_settings()
647 dev_warn(&applespi->spi->dev, in applespi_get_spi_settings()
650 dev_dbg(&applespi->spi->dev, in applespi_get_spi_settings()
652 settings->spi_cs_delay, settings->reset_a2r_usec, in applespi_get_spi_settings()
653 settings->reset_rec_usec); in applespi_get_spi_settings()
666 spin_lock_init(&applespi->cmd_msg_lock); in applespi_setup_spi()
667 init_waitqueue_head(&applespi->drain_complete); in applespi_setup_spi()
678 acpi_sts = acpi_evaluate_integer(applespi->sist, NULL, NULL, in applespi_enable_spi()
684 acpi_sts = acpi_execute_simple_method(applespi->sien, NULL, 1); in applespi_enable_spi()
686 dev_err(&applespi->spi->dev, "SIEN failed: %s\n", in applespi_enable_spi()
688 return -ENODEV; in applespi_enable_spi()
709 spin_lock_irqsave(&applespi->cmd_msg_lock, flags); in applespi_msg_complete()
712 applespi->read_active = false; in applespi_msg_complete()
714 applespi->write_active = false; in applespi_msg_complete()
716 if (applespi->drain && !applespi->write_active) in applespi_msg_complete()
717 wake_up_all(&applespi->drain_complete); in applespi_msg_complete()
720 applespi->cmd_msg_queued = 0; in applespi_msg_complete()
724 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags); in applespi_msg_complete()
730 enum applespi_evt_type evt_type = applespi->cmd_evt_type; in applespi_async_write_complete()
733 applespi->tx_buffer, in applespi_async_write_complete()
736 applespi->tx_status, in applespi_async_write_complete()
739 if (!applespi_check_write_status(applespi, applespi->wr_m.status)) { in applespi_async_write_complete()
752 struct spi_packet *packet = (struct spi_packet *)applespi->tx_buffer; in applespi_send_cmd_msg()
753 struct message *message = (struct message *)packet->data; in applespi_send_cmd_msg()
758 if (applespi->drain) in applespi_send_cmd_msg()
762 if (applespi->cmd_msg_queued) { in applespi_send_cmd_msg()
763 if (ktime_ms_delta(ktime_get(), applespi->cmd_msg_queued) < 1000) in applespi_send_cmd_msg()
766 dev_warn(&applespi->spi->dev, "Command %d timed out\n", in applespi_send_cmd_msg()
767 applespi->cmd_evt_type); in applespi_send_cmd_msg()
769 applespi->cmd_msg_queued = 0; in applespi_send_cmd_msg()
770 applespi->write_active = false; in applespi_send_cmd_msg()
777 if (applespi->want_tp_info_cmd) { in applespi_send_cmd_msg()
778 applespi->want_tp_info_cmd = false; in applespi_send_cmd_msg()
779 applespi->want_mt_init_cmd = true; in applespi_send_cmd_msg()
780 applespi->cmd_evt_type = ET_CMD_TP_INI; in applespi_send_cmd_msg()
785 message->type = cpu_to_le16(0x1020); in applespi_send_cmd_msg()
786 msg_len = sizeof(message->tp_info_command); in applespi_send_cmd_msg()
788 message->zero = 0x02; in applespi_send_cmd_msg()
789 message->rsp_buf_len = cpu_to_le16(0x0200); in applespi_send_cmd_msg()
791 } else if (applespi->want_mt_init_cmd) { in applespi_send_cmd_msg()
792 applespi->want_mt_init_cmd = false; in applespi_send_cmd_msg()
793 applespi->cmd_evt_type = ET_CMD_TP_INI; in applespi_send_cmd_msg()
798 message->type = cpu_to_le16(0x0252); in applespi_send_cmd_msg()
799 msg_len = sizeof(message->init_mt_command); in applespi_send_cmd_msg()
801 message->init_mt_command.cmd = cpu_to_le16(0x0102); in applespi_send_cmd_msg()
803 /* do we need caps-lock command? */ in applespi_send_cmd_msg()
804 } else if (applespi->want_cl_led_on != applespi->have_cl_led_on) { in applespi_send_cmd_msg()
805 applespi->have_cl_led_on = applespi->want_cl_led_on; in applespi_send_cmd_msg()
806 applespi->cmd_evt_type = ET_CMD_CL; in applespi_send_cmd_msg()
808 /* build led command */ in applespi_send_cmd_msg()
811 message->type = cpu_to_le16(0x0151); in applespi_send_cmd_msg()
812 msg_len = sizeof(message->capsl_command); in applespi_send_cmd_msg()
814 message->capsl_command.unknown = 0x01; in applespi_send_cmd_msg()
815 message->capsl_command.led = applespi->have_cl_led_on ? 2 : 0; in applespi_send_cmd_msg()
817 /* do we need backlight command? */ in applespi_send_cmd_msg()
818 } else if (applespi->want_bl_level != applespi->have_bl_level) { in applespi_send_cmd_msg()
819 applespi->have_bl_level = applespi->want_bl_level; in applespi_send_cmd_msg()
820 applespi->cmd_evt_type = ET_CMD_BL; in applespi_send_cmd_msg()
825 message->type = cpu_to_le16(0xB051); in applespi_send_cmd_msg()
826 msg_len = sizeof(message->bl_command); in applespi_send_cmd_msg()
828 message->bl_command.const1 = cpu_to_le16(0x01B0); in applespi_send_cmd_msg()
829 message->bl_command.level = in applespi_send_cmd_msg()
830 cpu_to_le16(applespi->have_bl_level); in applespi_send_cmd_msg()
832 if (applespi->have_bl_level > 0) in applespi_send_cmd_msg()
833 message->bl_command.const2 = cpu_to_le16(0x01F4); in applespi_send_cmd_msg()
835 message->bl_command.const2 = cpu_to_le16(0x0001); in applespi_send_cmd_msg()
837 /* everything's up-to-date */ in applespi_send_cmd_msg()
843 packet->flags = PACKET_TYPE_WRITE; in applespi_send_cmd_msg()
844 packet->device = device; in applespi_send_cmd_msg()
845 packet->length = cpu_to_le16(MSG_HEADER_SIZE + msg_len); in applespi_send_cmd_msg()
847 message->counter = applespi->cmd_msg_cntr++ % (U8_MAX + 1); in applespi_send_cmd_msg()
849 message->length = cpu_to_le16(msg_len - 2); in applespi_send_cmd_msg()
850 if (!message->rsp_buf_len) in applespi_send_cmd_msg()
851 message->rsp_buf_len = message->length; in applespi_send_cmd_msg()
853 crc = crc16(0, (u8 *)message, le16_to_cpu(packet->length) - 2); in applespi_send_cmd_msg()
854 put_unaligned_le16(crc, &message->data[msg_len - 2]); in applespi_send_cmd_msg()
856 crc = crc16(0, (u8 *)packet, sizeof(*packet) - 2); in applespi_send_cmd_msg()
857 packet->crc16 = cpu_to_le16(crc); in applespi_send_cmd_msg()
860 sts = applespi_async(applespi, &applespi->wr_m, in applespi_send_cmd_msg()
863 dev_warn(&applespi->spi->dev, in applespi_send_cmd_msg()
868 applespi->cmd_msg_queued = ktime_get_coarse(); in applespi_send_cmd_msg()
869 applespi->write_active = true; in applespi_send_cmd_msg()
878 spin_lock_irqsave(&applespi->cmd_msg_lock, flags); in applespi_init()
881 applespi->want_mt_init_cmd = true; in applespi_init()
883 applespi->want_tp_info_cmd = true; in applespi_init()
886 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags); in applespi_init()
895 spin_lock_irqsave(&applespi->cmd_msg_lock, flags); in applespi_set_capsl_led()
897 applespi->want_cl_led_on = capslock_on; in applespi_set_capsl_led()
900 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags); in applespi_set_capsl_led()
912 spin_lock_irqsave(&applespi->cmd_msg_lock, flags); in applespi_set_bl_level()
915 applespi->want_bl_level = value; in applespi_set_bl_level()
918 * The backlight does not turn on till level 32, so we scale in applespi_set_bl_level()
922 applespi->want_bl_level = in applespi_set_bl_level()
929 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags); in applespi_set_bl_level()
939 applespi_set_capsl_led(applespi, !!test_bit(LED_CAPSL, dev->led)); in applespi_event()
943 return -EINVAL; in applespi_event()
947 /* convert 16-bit little endian to signed integer */
956 applespi->tp_dim_min_x = min(applespi->tp_dim_min_x, in applespi_debug_update_dimensions()
957 le16_to_int(f->abs_x)); in applespi_debug_update_dimensions()
958 applespi->tp_dim_max_x = max(applespi->tp_dim_max_x, in applespi_debug_update_dimensions()
959 le16_to_int(f->abs_x)); in applespi_debug_update_dimensions()
960 applespi->tp_dim_min_y = min(applespi->tp_dim_min_y, in applespi_debug_update_dimensions()
961 le16_to_int(f->abs_y)); in applespi_debug_update_dimensions()
962 applespi->tp_dim_max_y = max(applespi->tp_dim_max_y, in applespi_debug_update_dimensions()
963 le16_to_int(f->abs_y)); in applespi_debug_update_dimensions()
968 struct applespi_data *applespi = inode->i_private; in applespi_tp_dim_open()
970 file->private_data = applespi; in applespi_tp_dim_open()
972 snprintf(applespi->tp_dim_val, sizeof(applespi->tp_dim_val), in applespi_tp_dim_open()
974 applespi->touchpad_input_dev->id.product, in applespi_tp_dim_open()
975 applespi->tp_dim_min_x, applespi->tp_dim_min_y, in applespi_tp_dim_open()
976 applespi->tp_dim_max_x - applespi->tp_dim_min_x, in applespi_tp_dim_open()
977 applespi->tp_dim_max_y - applespi->tp_dim_min_y); in applespi_tp_dim_open()
985 struct applespi_data *applespi = file->private_data; in applespi_tp_dim_read()
987 return simple_read_from_buffer(buf, len, off, applespi->tp_dim_val, in applespi_tp_dim_read()
988 strlen(applespi->tp_dim_val)); in applespi_tp_dim_read()
1006 le16_to_int(f->touch_major) << 1); in report_finger_data()
1008 le16_to_int(f->touch_minor) << 1); in report_finger_data()
1010 le16_to_int(f->tool_major) << 1); in report_finger_data()
1012 le16_to_int(f->tool_minor) << 1); in report_finger_data()
1014 MAX_FINGER_ORIENTATION - le16_to_int(f->orientation)); in report_finger_data()
1015 input_report_abs(input, ABS_MT_POSITION_X, pos->x); in report_finger_data()
1016 input_report_abs(input, ABS_MT_POSITION_Y, pos->y); in report_finger_data()
1024 const struct applespi_tp_info *tp_info = &applespi->tp_info; in report_tp_state()
1028 input = smp_load_acquire(&applespi->touchpad_input_dev); in report_tp_state()
1034 for (i = 0; i < t->number_of_fingers; i++) { in report_tp_state()
1035 f = &t->fingers[i]; in report_tp_state()
1036 if (le16_to_int(f->touch_major) == 0) in report_tp_state()
1038 applespi->pos[n].x = le16_to_int(f->abs_x); in report_tp_state()
1039 applespi->pos[n].y = tp_info->y_min + tp_info->y_max - in report_tp_state()
1040 le16_to_int(f->abs_y); in report_tp_state()
1043 if (applespi->debug_tp_dim) in report_tp_state()
1047 input_mt_assign_slots(input, applespi->slots, applespi->pos, n, 0); in report_tp_state()
1050 report_finger_data(input, applespi->slots[i], in report_tp_state()
1051 &applespi->pos[i], &t->fingers[i]); in report_tp_state()
1054 input_report_key(input, BTN_LEFT, t->clicked); in report_tp_state()
1064 for (trans = table; trans->from; trans++) in applespi_find_translation()
1065 if (trans->from == key) in applespi_find_translation()
1078 if (trans->flags & APPLE_FLAG_FKEY) in applespi_translate_fn_key()
1085 key = trans->to; in applespi_translate_fn_key()
1097 key = trans->to; in applespi_translate_iso_layout()
1117 u8 bit = BIT((fnremap - 1) & 0x07); in applespi_remap_fn_key()
1120 !applespi_controlcodes[fnremap - 1]) in applespi_remap_fn_key()
1123 tmp = keyboard_protocol->fn_pressed; in applespi_remap_fn_key()
1124 keyboard_protocol->fn_pressed = !!(keyboard_protocol->modifiers & bit); in applespi_remap_fn_key()
1126 keyboard_protocol->modifiers |= bit; in applespi_remap_fn_key()
1128 keyboard_protocol->modifiers &= ~bit; in applespi_remap_fn_key()
1143 if (!memchr_inv(keyboard_protocol->keys_pressed, 1, MAX_ROLLOVER)) in applespi_handle_keyboard_event()
1151 if (memchr(keyboard_protocol->keys_pressed, in applespi_handle_keyboard_event()
1152 applespi->last_keys_pressed[i], MAX_ROLLOVER)) in applespi_handle_keyboard_event()
1155 key = applespi_code_to_key(applespi->last_keys_pressed[i], in applespi_handle_keyboard_event()
1156 applespi->last_keys_fn_pressed[i]); in applespi_handle_keyboard_event()
1157 input_report_key(applespi->keyboard_input_dev, key, 0); in applespi_handle_keyboard_event()
1158 applespi->last_keys_fn_pressed[i] = 0; in applespi_handle_keyboard_event()
1163 if (keyboard_protocol->keys_pressed[i] < in applespi_handle_keyboard_event()
1165 keyboard_protocol->keys_pressed[i] > 0) { in applespi_handle_keyboard_event()
1167 keyboard_protocol->keys_pressed[i], in applespi_handle_keyboard_event()
1168 keyboard_protocol->fn_pressed); in applespi_handle_keyboard_event()
1169 input_report_key(applespi->keyboard_input_dev, key, 1); in applespi_handle_keyboard_event()
1170 applespi->last_keys_fn_pressed[i] = in applespi_handle_keyboard_event()
1171 keyboard_protocol->fn_pressed; in applespi_handle_keyboard_event()
1177 if (keyboard_protocol->modifiers & BIT(i)) in applespi_handle_keyboard_event()
1178 input_report_key(applespi->keyboard_input_dev, in applespi_handle_keyboard_event()
1181 input_report_key(applespi->keyboard_input_dev, in applespi_handle_keyboard_event()
1186 if (keyboard_protocol->fn_pressed && !applespi->last_fn_pressed) in applespi_handle_keyboard_event()
1187 input_report_key(applespi->keyboard_input_dev, KEY_FN, 1); in applespi_handle_keyboard_event()
1188 else if (!keyboard_protocol->fn_pressed && applespi->last_fn_pressed) in applespi_handle_keyboard_event()
1189 input_report_key(applespi->keyboard_input_dev, KEY_FN, 0); in applespi_handle_keyboard_event()
1190 applespi->last_fn_pressed = keyboard_protocol->fn_pressed; in applespi_handle_keyboard_event()
1193 input_sync(applespi->keyboard_input_dev); in applespi_handle_keyboard_event()
1194 memcpy(&applespi->last_keys_pressed, keyboard_protocol->keys_pressed, in applespi_handle_keyboard_event()
1195 sizeof(applespi->last_keys_pressed)); in applespi_handle_keyboard_event()
1202 for (info = applespi_tp_models; info->model; info++) { in applespi_find_touchpad_info()
1203 if (info->model == model) in applespi_find_touchpad_info()
1204 return &info->tp_info; in applespi_find_touchpad_info()
1219 tp_info = applespi_find_touchpad_info(rcvd_tp_info->model_no); in applespi_register_touchpad_device()
1221 dev_warn(&applespi->spi->dev, in applespi_register_touchpad_device()
1222 "Unknown touchpad model %x - falling back to MB8 touchpad\n", in applespi_register_touchpad_device()
1223 rcvd_tp_info->model_no); in applespi_register_touchpad_device()
1227 applespi->tp_info = *tp_info; in applespi_register_touchpad_device()
1234 dev_info(&applespi->spi->dev, in applespi_register_touchpad_device()
1236 applespi->tp_info.x_min = x; in applespi_register_touchpad_device()
1237 applespi->tp_info.y_min = y; in applespi_register_touchpad_device()
1238 applespi->tp_info.x_max = x + w; in applespi_register_touchpad_device()
1239 applespi->tp_info.y_max = y + h; in applespi_register_touchpad_device()
1241 dev_warn(&applespi->spi->dev, in applespi_register_touchpad_device()
1250 applespi->tp_info.x_min, in applespi_register_touchpad_device()
1251 applespi->tp_info.y_min, in applespi_register_touchpad_device()
1252 applespi->tp_info.x_max - applespi->tp_info.x_min, in applespi_register_touchpad_device()
1253 applespi->tp_info.y_max - applespi->tp_info.y_min); in applespi_register_touchpad_device()
1257 touchpad_input_dev = devm_input_allocate_device(&applespi->spi->dev); in applespi_register_touchpad_device()
1259 dev_err(&applespi->spi->dev, in applespi_register_touchpad_device()
1261 return -ENOMEM; in applespi_register_touchpad_device()
1264 touchpad_input_dev->name = "Apple SPI Touchpad"; in applespi_register_touchpad_device()
1265 touchpad_input_dev->phys = "applespi/input1"; in applespi_register_touchpad_device()
1266 touchpad_input_dev->dev.parent = &applespi->spi->dev; in applespi_register_touchpad_device()
1267 touchpad_input_dev->id.bustype = BUS_SPI; in applespi_register_touchpad_device()
1268 touchpad_input_dev->id.vendor = SYNAPTICS_VENDOR_ID; in applespi_register_touchpad_device()
1269 touchpad_input_dev->id.product = in applespi_register_touchpad_device()
1270 rcvd_tp_info->model_no << 8 | rcvd_tp_info->model_flags; in applespi_register_touchpad_device()
1276 __set_bit(INPUT_PROP_POINTER, touchpad_input_dev->propbit); in applespi_register_touchpad_device()
1277 __set_bit(INPUT_PROP_BUTTONPAD, touchpad_input_dev->propbit); in applespi_register_touchpad_device()
1293 -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION, in applespi_register_touchpad_device()
1298 applespi->tp_info.x_min, applespi->tp_info.x_max, in applespi_register_touchpad_device()
1301 applespi->tp_info.y_min, applespi->tp_info.y_max, in applespi_register_touchpad_device()
1312 dev_err(&applespi->spi->dev, in applespi_register_touchpad_device()
1320 dev_err(&applespi->spi->dev, in applespi_register_touchpad_device()
1326 smp_store_release(&applespi->touchpad_input_dev, touchpad_input_dev); in applespi_register_touchpad_device()
1336 applespi_register_touchpad_device(applespi, &applespi->rcvd_tp_info); in applespi_worker()
1343 if (packet->device == PACKET_DEV_INFO && in applespi_handle_cmd_response()
1344 le16_to_cpu(message->type) == 0x1020) { in applespi_handle_cmd_response()
1349 applespi->rcvd_tp_info = message->tp_info; in applespi_handle_cmd_response()
1350 schedule_work(&applespi->work); in applespi_handle_cmd_response()
1354 if (le16_to_cpu(message->length) != 0x0000) { in applespi_handle_cmd_response()
1355 dev_warn_ratelimited(&applespi->spi->dev, in applespi_handle_cmd_response()
1357 le16_to_cpu(message->length)); in applespi_handle_cmd_response()
1361 if (packet->device == PACKET_DEV_TPAD && in applespi_handle_cmd_response()
1362 le16_to_cpu(message->type) == 0x0252 && in applespi_handle_cmd_response()
1363 le16_to_cpu(message->rsp_buf_len) == 0x0002) in applespi_handle_cmd_response()
1364 dev_info(&applespi->spi->dev, "modeswitch done.\n"); in applespi_handle_cmd_response()
1374 dev_warn_ratelimited(&applespi->spi->dev, in applespi_verify_crc()
1389 if (packet->flags == PACKET_TYPE_READ && in applespi_debug_print_read_packet()
1390 packet->device == PACKET_DEV_KEYB) in applespi_debug_print_read_packet()
1392 else if (packet->flags == PACKET_TYPE_READ && in applespi_debug_print_read_packet()
1393 packet->device == PACKET_DEV_TPAD) in applespi_debug_print_read_packet()
1395 else if (packet->flags == PACKET_TYPE_WRITE) in applespi_debug_print_read_packet()
1396 evt_type = applespi->cmd_evt_type; in applespi_debug_print_read_packet()
1400 applespi_get_trace_fun(evt_type)(evt_type, PT_READ, applespi->rx_buffer, in applespi_debug_print_read_packet()
1414 if (!applespi_verify_crc(applespi, applespi->rx_buffer, in applespi_got_data()
1418 spin_lock_irqsave(&applespi->cmd_msg_lock, flags); in applespi_got_data()
1420 if (applespi->drain) { in applespi_got_data()
1421 applespi->read_active = false; in applespi_got_data()
1422 applespi->write_active = false; in applespi_got_data()
1424 wake_up_all(&applespi->drain_complete); in applespi_got_data()
1427 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags); in applespi_got_data()
1432 packet = (struct spi_packet *)applespi->rx_buffer; in applespi_got_data()
1436 off = le16_to_cpu(packet->offset); in applespi_got_data()
1437 rem = le16_to_cpu(packet->remaining); in applespi_got_data()
1438 len = le16_to_cpu(packet->length); in applespi_got_data()
1440 if (len > sizeof(packet->data)) { in applespi_got_data()
1441 dev_warn_ratelimited(&applespi->spi->dev, in applespi_got_data()
1447 /* handle multi-packet messages */ in applespi_got_data()
1449 if (off != applespi->saved_msg_len) { in applespi_got_data()
1450 dev_warn_ratelimited(&applespi->spi->dev, in applespi_got_data()
1452 off, applespi->saved_msg_len); in applespi_got_data()
1457 dev_warn_ratelimited(&applespi->spi->dev, in applespi_got_data()
1464 dev_warn_ratelimited(&applespi->spi->dev, in applespi_got_data()
1470 memcpy(applespi->msg_buf + off, &packet->data, len); in applespi_got_data()
1471 applespi->saved_msg_len += len; in applespi_got_data()
1476 message = (struct message *)applespi->msg_buf; in applespi_got_data()
1477 msg_len = applespi->saved_msg_len; in applespi_got_data()
1479 message = (struct message *)&packet->data; in applespi_got_data()
1483 /* got complete message - verify */ in applespi_got_data()
1487 if (le16_to_cpu(message->length) != msg_len - MSG_HEADER_SIZE - 2) { in applespi_got_data()
1488 dev_warn_ratelimited(&applespi->spi->dev, in applespi_got_data()
1489 "Received corrupted packet (invalid message length %u - expected %u)\n", in applespi_got_data()
1490 le16_to_cpu(message->length), in applespi_got_data()
1491 msg_len - MSG_HEADER_SIZE - 2); in applespi_got_data()
1496 if (packet->flags == PACKET_TYPE_READ && in applespi_got_data()
1497 packet->device == PACKET_DEV_KEYB) { in applespi_got_data()
1498 applespi_handle_keyboard_event(applespi, &message->keyboard); in applespi_got_data()
1500 } else if (packet->flags == PACKET_TYPE_READ && in applespi_got_data()
1501 packet->device == PACKET_DEV_TPAD) { in applespi_got_data()
1505 tp = &message->touchpad; in applespi_got_data()
1506 tp_len = struct_size(tp, fingers, tp->number_of_fingers); in applespi_got_data()
1508 if (le16_to_cpu(message->length) + 2 != tp_len) { in applespi_got_data()
1509 dev_warn_ratelimited(&applespi->spi->dev, in applespi_got_data()
1510 "Received corrupted packet (invalid message length %u - num-fingers %u, tp-len %zu)\n", in applespi_got_data()
1511 le16_to_cpu(message->length), in applespi_got_data()
1512 tp->number_of_fingers, tp_len); in applespi_got_data()
1516 if (tp->number_of_fingers > MAX_FINGERS) { in applespi_got_data()
1517 dev_warn_ratelimited(&applespi->spi->dev, in applespi_got_data()
1519 tp->number_of_fingers, in applespi_got_data()
1521 tp->number_of_fingers = MAX_FINGERS; in applespi_got_data()
1526 } else if (packet->flags == PACKET_TYPE_WRITE) { in applespi_got_data()
1531 applespi->saved_msg_len = 0; in applespi_got_data()
1533 applespi_msg_complete(applespi, packet->flags == PACKET_TYPE_WRITE, in applespi_got_data()
1541 if (applespi->rd_m.status < 0) { in applespi_async_read_complete()
1542 dev_warn(&applespi->spi->dev, "Error reading from device: %d\n", in applespi_async_read_complete()
1543 applespi->rd_m.status); in applespi_async_read_complete()
1554 acpi_finish_gpe(NULL, applespi->gpe); in applespi_async_read_complete()
1565 spin_lock_irqsave(&applespi->cmd_msg_lock, flags); in applespi_notify()
1567 if (!applespi->suspended) { in applespi_notify()
1568 sts = applespi_async(applespi, &applespi->rd_m, in applespi_notify()
1571 dev_warn(&applespi->spi->dev, in applespi_notify()
1575 applespi->read_active = true; in applespi_notify()
1578 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags); in applespi_notify()
1592 return -ENOMEM; in applespi_get_saved_bl_level()
1594 memcpy(efivar_entry->var.VariableName, EFI_BL_LEVEL_NAME, in applespi_get_saved_bl_level()
1596 efivar_entry->var.VendorGuid = EFI_BL_LEVEL_GUID; in applespi_get_saved_bl_level()
1600 if (sts && sts != -ENOENT) in applespi_get_saved_bl_level()
1601 dev_warn(&applespi->spi->dev, in applespi_get_saved_bl_level()
1602 "Error getting backlight level from EFI vars: %d\n", in applespi_get_saved_bl_level()
1619 /* Save keyboard backlight level */ in applespi_save_bl_level()
1629 dev_warn(&applespi->spi->dev, in applespi_save_bl_level()
1630 "Error saving backlight level to EFI vars: %d\n", sts); in applespi_save_bl_level()
1636 acpi_handle spi_handle = ACPI_HANDLE(&spi->dev); in applespi_probe()
1645 dev_info(&spi->dev, "USB interface already enabled\n"); in applespi_probe()
1646 return -ENODEV; in applespi_probe()
1650 applespi = devm_kzalloc(&spi->dev, sizeof(*applespi), GFP_KERNEL); in applespi_probe()
1652 return -ENOMEM; in applespi_probe()
1654 applespi->spi = spi; in applespi_probe()
1656 INIT_WORK(&applespi->work, applespi_worker); in applespi_probe()
1662 applespi->tx_buffer = devm_kmalloc(&spi->dev, APPLESPI_PACKET_SIZE, in applespi_probe()
1664 applespi->tx_status = devm_kmalloc(&spi->dev, APPLESPI_STATUS_SIZE, in applespi_probe()
1666 applespi->rx_buffer = devm_kmalloc(&spi->dev, APPLESPI_PACKET_SIZE, in applespi_probe()
1668 applespi->msg_buf = devm_kmalloc_array(&spi->dev, MAX_PKTS_PER_MSG, in applespi_probe()
1672 if (!applespi->tx_buffer || !applespi->tx_status || in applespi_probe()
1673 !applespi->rx_buffer || !applespi->msg_buf) in applespi_probe()
1674 return -ENOMEM; in applespi_probe()
1681 acpi_sts = acpi_get_handle(spi_handle, "SIEN", &applespi->sien); in applespi_probe()
1683 dev_err(&applespi->spi->dev, in applespi_probe()
1686 return -ENODEV; in applespi_probe()
1689 acpi_sts = acpi_get_handle(spi_handle, "SIST", &applespi->sist); in applespi_probe()
1691 dev_err(&applespi->spi->dev, in applespi_probe()
1694 return -ENODEV; in applespi_probe()
1707 applespi->keyboard_input_dev = devm_input_allocate_device(&spi->dev); in applespi_probe()
1709 if (!applespi->keyboard_input_dev) in applespi_probe()
1710 return -ENOMEM; in applespi_probe()
1712 applespi->keyboard_input_dev->name = "Apple SPI Keyboard"; in applespi_probe()
1713 applespi->keyboard_input_dev->phys = "applespi/input0"; in applespi_probe()
1714 applespi->keyboard_input_dev->dev.parent = &spi->dev; in applespi_probe()
1715 applespi->keyboard_input_dev->id.bustype = BUS_SPI; in applespi_probe()
1717 applespi->keyboard_input_dev->evbit[0] = in applespi_probe()
1719 applespi->keyboard_input_dev->ledbit[0] = BIT_MASK(LED_CAPSL); in applespi_probe()
1721 input_set_drvdata(applespi->keyboard_input_dev, applespi); in applespi_probe()
1722 applespi->keyboard_input_dev->event = applespi_event; in applespi_probe()
1726 input_set_capability(applespi->keyboard_input_dev, in applespi_probe()
1731 input_set_capability(applespi->keyboard_input_dev, in applespi_probe()
1736 input_set_capability(applespi->keyboard_input_dev, in applespi_probe()
1739 input_set_capability(applespi->keyboard_input_dev, EV_KEY, KEY_FN); in applespi_probe()
1741 sts = input_register_device(applespi->keyboard_input_dev); in applespi_probe()
1743 dev_err(&applespi->spi->dev, in applespi_probe()
1745 return -ENODEV; in applespi_probe()
1754 dev_err(&applespi->spi->dev, in applespi_probe()
1757 return -ENODEV; in applespi_probe()
1759 applespi->gpe = (int)gpe; in applespi_probe()
1761 acpi_sts = acpi_install_gpe_handler(NULL, applespi->gpe, in applespi_probe()
1765 dev_err(&applespi->spi->dev, in applespi_probe()
1767 applespi->gpe, acpi_format_exception(acpi_sts)); in applespi_probe()
1768 return -ENODEV; in applespi_probe()
1771 applespi->suspended = false; in applespi_probe()
1773 acpi_sts = acpi_enable_gpe(NULL, applespi->gpe); in applespi_probe()
1775 dev_err(&applespi->spi->dev, in applespi_probe()
1777 applespi->gpe, acpi_format_exception(acpi_sts)); in applespi_probe()
1778 acpi_remove_gpe_handler(NULL, applespi->gpe, applespi_notify); in applespi_probe()
1779 return -ENODEV; in applespi_probe()
1790 device_wakeup_enable(&spi->dev); in applespi_probe()
1792 /* set up keyboard-backlight */ in applespi_probe()
1795 applespi_set_bl_level(&applespi->backlight_info, sts); in applespi_probe()
1797 applespi->backlight_info.name = "spi::kbd_backlight"; in applespi_probe()
1798 applespi->backlight_info.default_trigger = "kbd-backlight"; in applespi_probe()
1799 applespi->backlight_info.brightness_set = applespi_set_bl_level; in applespi_probe()
1801 sts = devm_led_classdev_register(&spi->dev, &applespi->backlight_info); in applespi_probe()
1803 dev_warn(&applespi->spi->dev, in applespi_probe()
1804 "Unable to register keyboard backlight class dev (%d)\n", in applespi_probe()
1808 applespi->debugfs_root = debugfs_create_dir("applespi", NULL); in applespi_probe()
1810 debugfs_create_bool("enable_tp_dim", 0600, applespi->debugfs_root, in applespi_probe()
1811 &applespi->debug_tp_dim); in applespi_probe()
1813 debugfs_create_file("tp_dim", 0400, applespi->debugfs_root, applespi, in applespi_probe()
1823 spin_lock_irqsave(&applespi->cmd_msg_lock, flags); in applespi_drain_writes()
1825 applespi->drain = true; in applespi_drain_writes()
1826 wait_event_lock_irq(applespi->drain_complete, !applespi->write_active, in applespi_drain_writes()
1827 applespi->cmd_msg_lock); in applespi_drain_writes()
1829 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags); in applespi_drain_writes()
1836 spin_lock_irqsave(&applespi->cmd_msg_lock, flags); in applespi_drain_reads()
1838 wait_event_lock_irq(applespi->drain_complete, !applespi->read_active, in applespi_drain_reads()
1839 applespi->cmd_msg_lock); in applespi_drain_reads()
1841 applespi->suspended = true; in applespi_drain_reads()
1843 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags); in applespi_drain_reads()
1852 acpi_disable_gpe(NULL, applespi->gpe); in applespi_remove()
1853 acpi_remove_gpe_handler(NULL, applespi->gpe, applespi_notify); in applespi_remove()
1854 device_wakeup_disable(&spi->dev); in applespi_remove()
1858 debugfs_remove_recursive(applespi->debugfs_root); in applespi_remove()
1867 applespi_save_bl_level(applespi, applespi->have_bl_level); in applespi_shutdown()
1875 applespi_save_bl_level(applespi, applespi->have_bl_level); in applespi_poweroff_late()
1887 /* turn off caps-lock - it'll stay on otherwise */ in applespi_suspend()
1890 dev_warn(&applespi->spi->dev, in applespi_suspend()
1891 "Failed to turn off caps-lock led (%d)\n", sts); in applespi_suspend()
1896 acpi_sts = acpi_disable_gpe(NULL, applespi->gpe); in applespi_suspend()
1898 dev_err(&applespi->spi->dev, in applespi_suspend()
1900 applespi->gpe, acpi_format_exception(acpi_sts)); in applespi_suspend()
1915 spin_lock_irqsave(&applespi->cmd_msg_lock, flags); in applespi_resume()
1917 applespi->drain = false; in applespi_resume()
1918 applespi->have_cl_led_on = false; in applespi_resume()
1919 applespi->have_bl_level = 0; in applespi_resume()
1920 applespi->cmd_msg_queued = 0; in applespi_resume()
1921 applespi->read_active = false; in applespi_resume()
1922 applespi->write_active = false; in applespi_resume()
1924 applespi->suspended = false; in applespi_resume()
1926 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags); in applespi_resume()
1931 /* re-enable the interrupt */ in applespi_resume()
1932 acpi_sts = acpi_enable_gpe(NULL, applespi->gpe); in applespi_resume()
1934 dev_err(&applespi->spi->dev, in applespi_resume()
1935 "Failed to re-enable GPE handler for GPE %d: %s\n", in applespi_resume()
1936 applespi->gpe, acpi_format_exception(acpi_sts)); in applespi_resume()