Lines Matching refs:applespi

63 #include "applespi.h"
540 static void applespi_setup_read_txfrs(struct applespi_data *applespi)
542 struct spi_message *msg = &applespi->rd_m;
543 struct spi_transfer *dl_t = &applespi->dl_t;
544 struct spi_transfer *rd_t = &applespi->rd_t;
549 dl_t->delay_usecs = applespi->spi_settings.spi_cs_delay;
551 rd_t->rx_buf = applespi->rx_buffer;
559 static void applespi_setup_write_txfrs(struct applespi_data *applespi)
561 struct spi_message *msg = &applespi->wr_m;
562 struct spi_transfer *wt_t = &applespi->ww_t;
563 struct spi_transfer *dl_t = &applespi->wd_t;
564 struct spi_transfer *wr_t = &applespi->wr_t;
565 struct spi_transfer *st_t = &applespi->st_t;
581 dl_t->delay_usecs = applespi->spi_settings.spi_cs_delay;
583 wr_t->tx_buf = applespi->tx_buffer;
587 st_t->rx_buf = applespi->tx_status;
597 static int applespi_async(struct applespi_data *applespi,
601 message->context = applespi;
603 return spi_async(applespi->spi, message);
606 static inline bool applespi_check_write_status(struct applespi_data *applespi,
612 dev_warn(&applespi->spi->dev, "Error writing to device: %d\n",
617 if (memcmp(applespi->tx_status, status_ok, APPLESPI_STATUS_SIZE)) {
618 dev_warn(&applespi->spi->dev, "Error writing to device: %*ph\n",
619 APPLESPI_STATUS_SIZE, applespi->tx_status);
626 static int applespi_get_spi_settings(struct applespi_data *applespi)
628 struct acpi_device *adev = ACPI_COMPANION(&applespi->spi->dev);
630 struct spi_settings *settings = &applespi->spi_settings;
635 dev_warn(&applespi->spi->dev,
641 dev_warn(&applespi->spi->dev,
647 dev_warn(&applespi->spi->dev,
650 dev_dbg(&applespi->spi->dev,
658 static int applespi_setup_spi(struct applespi_data *applespi)
662 sts = applespi_get_spi_settings(applespi);
666 spin_lock_init(&applespi->cmd_msg_lock);
667 init_waitqueue_head(&applespi->drain_complete);
672 static int applespi_enable_spi(struct applespi_data *applespi)
678 acpi_sts = acpi_evaluate_integer(applespi->sist, NULL, NULL,
684 acpi_sts = acpi_execute_simple_method(applespi->sien, NULL, 1);
686 dev_err(&applespi->spi->dev, "SIEN failed: %s\n",
702 static int applespi_send_cmd_msg(struct applespi_data *applespi);
704 static void applespi_msg_complete(struct applespi_data *applespi,
709 spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
712 applespi->read_active = false;
714 applespi->write_active = false;
716 if (applespi->drain && !applespi->write_active)
717 wake_up_all(&applespi->drain_complete);
720 applespi->cmd_msg_queued = 0;
721 applespi_send_cmd_msg(applespi);
724 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
729 struct applespi_data *applespi = context;
730 enum applespi_evt_type evt_type = applespi->cmd_evt_type;
733 applespi->tx_buffer,
736 applespi->tx_status,
739 if (!applespi_check_write_status(applespi, applespi->wr_m.status)) {
744 applespi_msg_complete(applespi, true, false);
748 static int applespi_send_cmd_msg(struct applespi_data *applespi)
752 struct spi_packet *packet = (struct spi_packet *)applespi->tx_buffer;
758 if (applespi->drain)
762 if (applespi->cmd_msg_queued) {
763 if (ktime_ms_delta(ktime_get(), applespi->cmd_msg_queued) < 1000)
766 dev_warn(&applespi->spi->dev, "Command %d timed out\n",
767 applespi->cmd_evt_type);
769 applespi->cmd_msg_queued = 0;
770 applespi->write_active = false;
777 if (applespi->want_tp_info_cmd) {
778 applespi->want_tp_info_cmd = false;
779 applespi->want_mt_init_cmd = true;
780 applespi->cmd_evt_type = ET_CMD_TP_INI;
791 } else if (applespi->want_mt_init_cmd) {
792 applespi->want_mt_init_cmd = false;
793 applespi->cmd_evt_type = ET_CMD_TP_INI;
804 } else if (applespi->want_cl_led_on != applespi->have_cl_led_on) {
805 applespi->have_cl_led_on = applespi->want_cl_led_on;
806 applespi->cmd_evt_type = ET_CMD_CL;
815 message->capsl_command.led = applespi->have_cl_led_on ? 2 : 0;
818 } else if (applespi->want_bl_level != applespi->have_bl_level) {
819 applespi->have_bl_level = applespi->want_bl_level;
820 applespi->cmd_evt_type = ET_CMD_BL;
830 cpu_to_le16(applespi->have_bl_level);
832 if (applespi->have_bl_level > 0)
847 message->counter = applespi->cmd_msg_cntr++ % (U8_MAX + 1);
860 sts = applespi_async(applespi, &applespi->wr_m,
863 dev_warn(&applespi->spi->dev,
868 applespi->cmd_msg_queued = ktime_get_coarse();
869 applespi->write_active = true;
874 static void applespi_init(struct applespi_data *applespi, bool is_resume)
878 spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
881 applespi->want_mt_init_cmd = true;
883 applespi->want_tp_info_cmd = true;
884 applespi_send_cmd_msg(applespi);
886 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
889 static int applespi_set_capsl_led(struct applespi_data *applespi,
895 spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
897 applespi->want_cl_led_on = capslock_on;
898 sts = applespi_send_cmd_msg(applespi);
900 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
908 struct applespi_data *applespi =
912 spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
915 applespi->want_bl_level = value;
922 applespi->want_bl_level =
927 applespi_send_cmd_msg(applespi);
929 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
935 struct applespi_data *applespi = input_get_drvdata(dev);
939 applespi_set_capsl_led(applespi, !!test_bit(LED_CAPSL, dev->led));
953 static void applespi_debug_update_dimensions(struct applespi_data *applespi,
956 applespi->tp_dim_min_x = min(applespi->tp_dim_min_x,
958 applespi->tp_dim_max_x = max(applespi->tp_dim_max_x,
960 applespi->tp_dim_min_y = min(applespi->tp_dim_min_y,
962 applespi->tp_dim_max_y = max(applespi->tp_dim_max_y,
968 struct applespi_data *applespi = inode->i_private;
970 file->private_data = applespi;
972 snprintf(applespi->tp_dim_val, sizeof(applespi->tp_dim_val),
974 applespi->touchpad_input_dev->id.product,
975 applespi->tp_dim_min_x, applespi->tp_dim_min_y,
976 applespi->tp_dim_max_x - applespi->tp_dim_min_x,
977 applespi->tp_dim_max_y - applespi->tp_dim_min_y);
985 struct applespi_data *applespi = file->private_data;
987 return simple_read_from_buffer(buf, len, off, applespi->tp_dim_val,
988 strlen(applespi->tp_dim_val));
1019 static void report_tp_state(struct applespi_data *applespi,
1024 const struct applespi_tp_info *tp_info = &applespi->tp_info;
1028 input = smp_load_acquire(&applespi->touchpad_input_dev);
1038 applespi->pos[n].x = le16_to_int(f->abs_x);
1039 applespi->pos[n].y = tp_info->y_min + tp_info->y_max -
1043 if (applespi->debug_tp_dim)
1044 applespi_debug_update_dimensions(applespi, f);
1047 input_mt_assign_slots(input, applespi->slots, applespi->pos, n, 0);
1050 report_finger_data(input, applespi->slots[i],
1051 &applespi->pos[i], &t->fingers[i]);
1132 applespi_handle_keyboard_event(struct applespi_data *applespi,
1152 applespi->last_keys_pressed[i], MAX_ROLLOVER))
1155 key = applespi_code_to_key(applespi->last_keys_pressed[i],
1156 applespi->last_keys_fn_pressed[i]);
1157 input_report_key(applespi->keyboard_input_dev, key, 0);
1158 applespi->last_keys_fn_pressed[i] = 0;
1169 input_report_key(applespi->keyboard_input_dev, key, 1);
1170 applespi->last_keys_fn_pressed[i] =
1178 input_report_key(applespi->keyboard_input_dev,
1181 input_report_key(applespi->keyboard_input_dev,
1186 if (keyboard_protocol->fn_pressed && !applespi->last_fn_pressed)
1187 input_report_key(applespi->keyboard_input_dev, KEY_FN, 1);
1188 else if (!keyboard_protocol->fn_pressed && applespi->last_fn_pressed)
1189 input_report_key(applespi->keyboard_input_dev, KEY_FN, 0);
1190 applespi->last_fn_pressed = keyboard_protocol->fn_pressed;
1193 input_sync(applespi->keyboard_input_dev);
1194 memcpy(&applespi->last_keys_pressed, keyboard_protocol->keys_pressed,
1195 sizeof(applespi->last_keys_pressed));
1211 applespi_register_touchpad_device(struct applespi_data *applespi,
1221 dev_warn(&applespi->spi->dev,
1227 applespi->tp_info = *tp_info;
1234 dev_info(&applespi->spi->dev,
1236 applespi->tp_info.x_min = x;
1237 applespi->tp_info.y_min = y;
1238 applespi->tp_info.x_max = x + w;
1239 applespi->tp_info.y_max = y + h;
1241 dev_warn(&applespi->spi->dev,
1250 applespi->tp_info.x_min,
1251 applespi->tp_info.y_min,
1252 applespi->tp_info.x_max - applespi->tp_info.x_min,
1253 applespi->tp_info.y_max - applespi->tp_info.y_min);
1257 touchpad_input_dev = devm_input_allocate_device(&applespi->spi->dev);
1259 dev_err(&applespi->spi->dev,
1265 touchpad_input_dev->phys = "applespi/input1";
1266 touchpad_input_dev->dev.parent = &applespi->spi->dev;
1298 applespi->tp_info.x_min, applespi->tp_info.x_max,
1301 applespi->tp_info.y_min, applespi->tp_info.y_max,
1312 dev_err(&applespi->spi->dev,
1320 dev_err(&applespi->spi->dev,
1326 smp_store_release(&applespi->touchpad_input_dev, touchpad_input_dev);
1333 struct applespi_data *applespi =
1336 applespi_register_touchpad_device(applespi, &applespi->rcvd_tp_info);
1339 static void applespi_handle_cmd_response(struct applespi_data *applespi,
1349 applespi->rcvd_tp_info = message->tp_info;
1350 schedule_work(&applespi->work);
1355 dev_warn_ratelimited(&applespi->spi->dev,
1364 dev_info(&applespi->spi->dev, "modeswitch done.\n");
1367 static bool applespi_verify_crc(struct applespi_data *applespi, u8 *buffer,
1374 dev_warn_ratelimited(&applespi->spi->dev,
1384 static void applespi_debug_print_read_packet(struct applespi_data *applespi,
1396 evt_type = applespi->cmd_evt_type;
1400 applespi_get_trace_fun(evt_type)(evt_type, PT_READ, applespi->rx_buffer,
1404 static void applespi_got_data(struct applespi_data *applespi)
1414 if (!applespi_verify_crc(applespi, applespi->rx_buffer,
1418 spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
1420 if (applespi->drain) {
1421 applespi->read_active = false;
1422 applespi->write_active = false;
1424 wake_up_all(&applespi->drain_complete);
1427 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
1432 packet = (struct spi_packet *)applespi->rx_buffer;
1434 applespi_debug_print_read_packet(applespi, packet);
1441 dev_warn_ratelimited(&applespi->spi->dev,
1449 if (off != applespi->saved_msg_len) {
1450 dev_warn_ratelimited(&applespi->spi->dev,
1452 off, applespi->saved_msg_len);
1457 dev_warn_ratelimited(&applespi->spi->dev,
1464 dev_warn_ratelimited(&applespi->spi->dev,
1470 memcpy(applespi->msg_buf + off, &packet->data, len);
1471 applespi->saved_msg_len += len;
1476 message = (struct message *)applespi->msg_buf;
1477 msg_len = applespi->saved_msg_len;
1484 if (!applespi_verify_crc(applespi, (u8 *)message, msg_len))
1488 dev_warn_ratelimited(&applespi->spi->dev,
1498 applespi_handle_keyboard_event(applespi, &message->keyboard);
1509 dev_warn_ratelimited(&applespi->spi->dev,
1517 dev_warn_ratelimited(&applespi->spi->dev,
1524 report_tp_state(applespi, tp);
1527 applespi_handle_cmd_response(applespi, packet, message);
1531 applespi->saved_msg_len = 0;
1533 applespi_msg_complete(applespi, packet->flags == PACKET_TYPE_WRITE,
1539 struct applespi_data *applespi = context;
1541 if (applespi->rd_m.status < 0) {
1542 dev_warn(&applespi->spi->dev, "Error reading from device: %d\n",
1543 applespi->rd_m.status);
1549 applespi_msg_complete(applespi, true, true);
1551 applespi_got_data(applespi);
1554 acpi_finish_gpe(NULL, applespi->gpe);
1559 struct applespi_data *applespi = context;
1565 spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
1567 if (!applespi->suspended) {
1568 sts = applespi_async(applespi, &applespi->rd_m,
1571 dev_warn(&applespi->spi->dev,
1575 applespi->read_active = true;
1578 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
1583 static int applespi_get_saved_bl_level(struct applespi_data *applespi)
1601 dev_warn(&applespi->spi->dev,
1610 static void applespi_save_bl_level(struct applespi_data *applespi,
1629 dev_warn(&applespi->spi->dev,
1635 struct applespi_data *applespi;
1650 applespi = devm_kzalloc(&spi->dev, sizeof(*applespi), GFP_KERNEL);
1651 if (!applespi)
1654 applespi->spi = spi;
1656 INIT_WORK(&applespi->work, applespi_worker);
1659 spi_set_drvdata(spi, applespi);
1662 applespi->tx_buffer = devm_kmalloc(&spi->dev, APPLESPI_PACKET_SIZE,
1664 applespi->tx_status = devm_kmalloc(&spi->dev, APPLESPI_STATUS_SIZE,
1666 applespi->rx_buffer = devm_kmalloc(&spi->dev, APPLESPI_PACKET_SIZE,
1668 applespi->msg_buf = devm_kmalloc_array(&spi->dev, MAX_PKTS_PER_MSG,
1672 if (!applespi->tx_buffer || !applespi->tx_status ||
1673 !applespi->rx_buffer || !applespi->msg_buf)
1677 applespi_setup_read_txfrs(applespi);
1678 applespi_setup_write_txfrs(applespi);
1681 acpi_sts = acpi_get_handle(spi_handle, "SIEN", &applespi->sien);
1683 dev_err(&applespi->spi->dev,
1689 acpi_sts = acpi_get_handle(spi_handle, "SIST", &applespi->sist);
1691 dev_err(&applespi->spi->dev,
1698 sts = applespi_setup_spi(applespi);
1702 sts = applespi_enable_spi(applespi);
1707 applespi->keyboard_input_dev = devm_input_allocate_device(&spi->dev);
1709 if (!applespi->keyboard_input_dev)
1712 applespi->keyboard_input_dev->name = "Apple SPI Keyboard";
1713 applespi->keyboard_input_dev->phys = "applespi/input0";
1714 applespi->keyboard_input_dev->dev.parent = &spi->dev;
1715 applespi->keyboard_input_dev->id.bustype = BUS_SPI;
1717 applespi->keyboard_input_dev->evbit[0] =
1719 applespi->keyboard_input_dev->ledbit[0] = BIT_MASK(LED_CAPSL);
1721 input_set_drvdata(applespi->keyboard_input_dev, applespi);
1722 applespi->keyboard_input_dev->event = applespi_event;
1726 input_set_capability(applespi->keyboard_input_dev,
1731 input_set_capability(applespi->keyboard_input_dev,
1736 input_set_capability(applespi->keyboard_input_dev,
1739 input_set_capability(applespi->keyboard_input_dev, EV_KEY, KEY_FN);
1741 sts = input_register_device(applespi->keyboard_input_dev);
1743 dev_err(&applespi->spi->dev,
1749 * The applespi device doesn't send interrupts normally (as is described
1754 dev_err(&applespi->spi->dev,
1759 applespi->gpe = (int)gpe;
1761 acpi_sts = acpi_install_gpe_handler(NULL, applespi->gpe,
1763 applespi_notify, applespi);
1765 dev_err(&applespi->spi->dev,
1767 applespi->gpe, acpi_format_exception(acpi_sts));
1771 applespi->suspended = false;
1773 acpi_sts = acpi_enable_gpe(NULL, applespi->gpe);
1775 dev_err(&applespi->spi->dev,
1777 applespi->gpe, acpi_format_exception(acpi_sts));
1778 acpi_remove_gpe_handler(NULL, applespi->gpe, applespi_notify);
1783 applespi_init(applespi, false);
1793 sts = applespi_get_saved_bl_level(applespi);
1795 applespi_set_bl_level(&applespi->backlight_info, sts);
1797 applespi->backlight_info.name = "spi::kbd_backlight";
1798 applespi->backlight_info.default_trigger = "kbd-backlight";
1799 applespi->backlight_info.brightness_set = applespi_set_bl_level;
1801 sts = devm_led_classdev_register(&spi->dev, &applespi->backlight_info);
1803 dev_warn(&applespi->spi->dev,
1808 applespi->debugfs_root = debugfs_create_dir("applespi", NULL);
1810 debugfs_create_bool("enable_tp_dim", 0600, applespi->debugfs_root,
1811 &applespi->debug_tp_dim);
1813 debugfs_create_file("tp_dim", 0400, applespi->debugfs_root, applespi,
1819 static void applespi_drain_writes(struct applespi_data *applespi)
1823 spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
1825 applespi->drain = true;
1826 wait_event_lock_irq(applespi->drain_complete, !applespi->write_active,
1827 applespi->cmd_msg_lock);
1829 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
1832 static void applespi_drain_reads(struct applespi_data *applespi)
1836 spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
1838 wait_event_lock_irq(applespi->drain_complete, !applespi->read_active,
1839 applespi->cmd_msg_lock);
1841 applespi->suspended = true;
1843 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
1848 struct applespi_data *applespi = spi_get_drvdata(spi);
1850 applespi_drain_writes(applespi);
1852 acpi_disable_gpe(NULL, applespi->gpe);
1853 acpi_remove_gpe_handler(NULL, applespi->gpe, applespi_notify);
1856 applespi_drain_reads(applespi);
1858 debugfs_remove_recursive(applespi->debugfs_root);
1865 struct applespi_data *applespi = spi_get_drvdata(spi);
1867 applespi_save_bl_level(applespi, applespi->have_bl_level);
1873 struct applespi_data *applespi = spi_get_drvdata(spi);
1875 applespi_save_bl_level(applespi, applespi->have_bl_level);
1883 struct applespi_data *applespi = spi_get_drvdata(spi);
1888 sts = applespi_set_capsl_led(applespi, false);
1890 dev_warn(&applespi->spi->dev,
1893 applespi_drain_writes(applespi);
1896 acpi_sts = acpi_disable_gpe(NULL, applespi->gpe);
1898 dev_err(&applespi->spi->dev,
1900 applespi->gpe, acpi_format_exception(acpi_sts));
1902 applespi_drain_reads(applespi);
1910 struct applespi_data *applespi = spi_get_drvdata(spi);
1915 spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
1917 applespi->drain = false;
1918 applespi->have_cl_led_on = false;
1919 applespi->have_bl_level = 0;
1920 applespi->cmd_msg_queued = 0;
1921 applespi->read_active = false;
1922 applespi->write_active = false;
1924 applespi->suspended = false;
1926 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
1929 applespi_enable_spi(applespi);
1932 acpi_sts = acpi_enable_gpe(NULL, applespi->gpe);
1934 dev_err(&applespi->spi->dev,
1936 applespi->gpe, acpi_format_exception(acpi_sts));
1939 applespi_init(applespi, true);
1957 .name = "applespi",