Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * MacBook (Pro) SPI keyboard and touchpad driver
4 *
5 * Copyright (c) 2015-2018 Federico Lorenzi
6 * Copyright (c) 2017-2018 Ronald Tschalär
7 */
8
9/*
10 * The keyboard and touchpad controller on the MacBookAir6, MacBookPro12,
11 * MacBook8 and newer can be driven either by USB or SPI. However the USB
12 * pins are only connected on the MacBookAir6 and 7 and the MacBookPro12.
13 * All others need this driver. The interface is selected using ACPI methods:
14 *
15 * * UIEN ("USB Interface Enable"): If invoked with argument 1, disables SPI
16 * and enables USB. If invoked with argument 0, disables USB.
17 * * UIST ("USB Interface Status"): Returns 1 if USB is enabled, 0 otherwise.
18 * * SIEN ("SPI Interface Enable"): If invoked with argument 1, disables USB
19 * and enables SPI. If invoked with argument 0, disables SPI.
20 * * SIST ("SPI Interface Status"): Returns 1 if SPI is enabled, 0 otherwise.
21 * * ISOL: Resets the four GPIO pins used for SPI. Intended to be invoked with
22 * argument 1, then once more with argument 0.
23 *
24 * UIEN and UIST are only provided on models where the USB pins are connected.
25 *
26 * SPI-based Protocol
27 * ------------------
28 *
29 * The device and driver exchange messages (struct message); each message is
30 * encapsulated in one or more packets (struct spi_packet). There are two types
31 * of exchanges: reads, and writes. A read is signaled by a GPE, upon which one
32 * message can be read from the device. A write exchange consists of writing a
33 * command message, immediately reading a short status packet, and then, upon
34 * receiving a GPE, reading the response message. Write exchanges cannot be
35 * interleaved, i.e. a new write exchange must not be started till the previous
36 * write exchange is complete. Whether a received message is part of a read or
37 * write exchange is indicated in the encapsulating packet's flags field.
38 *
39 * A single message may be too large to fit in a single packet (which has a
40 * fixed, 256-byte size). In that case it will be split over multiple,
41 * consecutive packets.
42 */
43
44#include <linux/acpi.h>
45#include <linux/crc16.h>
46#include <linux/debugfs.h>
47#include <linux/delay.h>
48#include <linux/efi.h>
49#include <linux/input.h>
50#include <linux/input/mt.h>
51#include <linux/leds.h>
52#include <linux/module.h>
53#include <linux/spinlock.h>
54#include <linux/spi/spi.h>
55#include <linux/wait.h>
56#include <linux/workqueue.h>
57
58#include <asm/barrier.h>
59#include <asm/unaligned.h>
60
61#define CREATE_TRACE_POINTS
62#include "applespi.h"
63#include "applespi_trace.h"
64
65#define APPLESPI_PACKET_SIZE 256
66#define APPLESPI_STATUS_SIZE 4
67
68#define PACKET_TYPE_READ 0x20
69#define PACKET_TYPE_WRITE 0x40
70#define PACKET_DEV_KEYB 0x01
71#define PACKET_DEV_TPAD 0x02
72#define PACKET_DEV_INFO 0xd0
73
74#define MAX_ROLLOVER 6
75
76#define MAX_FINGERS 11
77#define MAX_FINGER_ORIENTATION 16384
78#define MAX_PKTS_PER_MSG 2
79
80#define KBD_BL_LEVEL_MIN 32U
81#define KBD_BL_LEVEL_MAX 255U
82#define KBD_BL_LEVEL_SCALE 1000000U
83#define KBD_BL_LEVEL_ADJ \
84 ((KBD_BL_LEVEL_MAX - KBD_BL_LEVEL_MIN) * KBD_BL_LEVEL_SCALE / 255U)
85
86#define EFI_BL_LEVEL_NAME L"KeyboardBacklightLevel"
87#define EFI_BL_LEVEL_GUID EFI_GUID(0xa076d2af, 0x9678, 0x4386, 0x8b, 0x58, 0x1f, 0xc8, 0xef, 0x04, 0x16, 0x19)
88
89#define APPLE_FLAG_FKEY 0x01
90
91#define SPI_RW_CHG_DELAY_US 100 /* from experimentation, in µs */
92
93#define SYNAPTICS_VENDOR_ID 0x06cb
94
95static unsigned int fnmode = 1;
96module_param(fnmode, uint, 0644);
97MODULE_PARM_DESC(fnmode, "Mode of Fn key on Apple keyboards (0 = disabled, [1] = fkeyslast, 2 = fkeysfirst)");
98
99static unsigned int fnremap;
100module_param(fnremap, uint, 0644);
101MODULE_PARM_DESC(fnremap, "Remap Fn key ([0] = no-remap; 1 = left-ctrl, 2 = left-shift, 3 = left-alt, 4 = left-meta, 6 = right-shift, 7 = right-alt, 8 = right-meta)");
102
103static bool iso_layout;
104module_param(iso_layout, bool, 0644);
105MODULE_PARM_DESC(iso_layout, "Enable/Disable hardcoded ISO-layout of the keyboard. ([0] = disabled, 1 = enabled)");
106
107static char touchpad_dimensions[40];
108module_param_string(touchpad_dimensions, touchpad_dimensions,
109 sizeof(touchpad_dimensions), 0444);
110MODULE_PARM_DESC(touchpad_dimensions, "The pixel dimensions of the touchpad, as XxY+W+H .");
111
112/**
113 * struct keyboard_protocol - keyboard message.
114 * message.type = 0x0110, message.length = 0x000a
115 *
116 * @unknown1: unknown
117 * @modifiers: bit-set of modifier/control keys pressed
118 * @unknown2: unknown
119 * @keys_pressed: the (non-modifier) keys currently pressed
120 * @fn_pressed: whether the fn key is currently pressed
121 * @crc16: crc over the whole message struct (message header +
122 * this struct) minus this @crc16 field
123 */
124struct keyboard_protocol {
125 u8 unknown1;
126 u8 modifiers;
127 u8 unknown2;
128 u8 keys_pressed[MAX_ROLLOVER];
129 u8 fn_pressed;
130 __le16 crc16;
131};
132
133/**
134 * struct tp_finger - single trackpad finger structure, le16-aligned
135 *
136 * @origin: zero when switching track finger
137 * @abs_x: absolute x coordinate
138 * @abs_y: absolute y coordinate
139 * @rel_x: relative x coordinate
140 * @rel_y: relative y coordinate
141 * @tool_major: tool area, major axis
142 * @tool_minor: tool area, minor axis
143 * @orientation: 16384 when point, else 15 bit angle
144 * @touch_major: touch area, major axis
145 * @touch_minor: touch area, minor axis
146 * @unused: zeros
147 * @pressure: pressure on forcetouch touchpad
148 * @multi: one finger: varies, more fingers: constant
149 * @crc16: on last finger: crc over the whole message struct
150 * (i.e. message header + this struct) minus the last
151 * @crc16 field; unknown on all other fingers.
152 */
153struct tp_finger {
154 __le16 origin;
155 __le16 abs_x;
156 __le16 abs_y;
157 __le16 rel_x;
158 __le16 rel_y;
159 __le16 tool_major;
160 __le16 tool_minor;
161 __le16 orientation;
162 __le16 touch_major;
163 __le16 touch_minor;
164 __le16 unused[2];
165 __le16 pressure;
166 __le16 multi;
167 __le16 crc16;
168};
169
170/**
171 * struct touchpad_protocol - touchpad message.
172 * message.type = 0x0210
173 *
174 * @unknown1: unknown
175 * @clicked: 1 if a button-click was detected, 0 otherwise
176 * @unknown2: unknown
177 * @number_of_fingers: the number of fingers being reported in @fingers
178 * @clicked2: same as @clicked
179 * @unknown3: unknown
180 * @fingers: the data for each finger
181 */
182struct touchpad_protocol {
183 u8 unknown1[1];
184 u8 clicked;
185 u8 unknown2[28];
186 u8 number_of_fingers;
187 u8 clicked2;
188 u8 unknown3[16];
189 struct tp_finger fingers[];
190};
191
192/**
193 * struct command_protocol_tp_info - get touchpad info.
194 * message.type = 0x1020, message.length = 0x0000
195 *
196 * @crc16: crc over the whole message struct (message header +
197 * this struct) minus this @crc16 field
198 */
199struct command_protocol_tp_info {
200 __le16 crc16;
201};
202
203/**
204 * struct touchpad_info - touchpad info response.
205 * message.type = 0x1020, message.length = 0x006e
206 *
207 * @unknown1: unknown
208 * @model_flags: flags (vary by model number, but significance otherwise
209 * unknown)
210 * @model_no: the touchpad model number
211 * @unknown2: unknown
212 * @crc16: crc over the whole message struct (message header +
213 * this struct) minus this @crc16 field
214 */
215struct touchpad_info_protocol {
216 u8 unknown1[105];
217 u8 model_flags;
218 u8 model_no;
219 u8 unknown2[3];
220 __le16 crc16;
221};
222
223/**
224 * struct command_protocol_mt_init - initialize multitouch.
225 * message.type = 0x0252, message.length = 0x0002
226 *
227 * @cmd: value: 0x0102
228 * @crc16: crc over the whole message struct (message header +
229 * this struct) minus this @crc16 field
230 */
231struct command_protocol_mt_init {
232 __le16 cmd;
233 __le16 crc16;
234};
235
236/**
237 * struct command_protocol_capsl - toggle caps-lock led
238 * message.type = 0x0151, message.length = 0x0002
239 *
240 * @unknown: value: 0x01 (length?)
241 * @led: 0 off, 2 on
242 * @crc16: crc over the whole message struct (message header +
243 * this struct) minus this @crc16 field
244 */
245struct command_protocol_capsl {
246 u8 unknown;
247 u8 led;
248 __le16 crc16;
249};
250
251/**
252 * struct command_protocol_bl - set keyboard backlight brightness
253 * message.type = 0xB051, message.length = 0x0006
254 *
255 * @const1: value: 0x01B0
256 * @level: the brightness level to set
257 * @const2: value: 0x0001 (backlight off), 0x01F4 (backlight on)
258 * @crc16: crc over the whole message struct (message header +
259 * this struct) minus this @crc16 field
260 */
261struct command_protocol_bl {
262 __le16 const1;
263 __le16 level;
264 __le16 const2;
265 __le16 crc16;
266};
267
268/**
269 * struct message - a complete spi message.
270 *
271 * Each message begins with fixed header, followed by a message-type specific
272 * payload, and ends with a 16-bit crc. Because of the varying lengths of the
273 * payload, the crc is defined at the end of each payload struct, rather than
274 * in this struct.
275 *
276 * @type: the message type
277 * @zero: always 0
278 * @counter: incremented on each message, rolls over after 255; there is a
279 * separate counter for each message type.
280 * @rsp_buf_len:response buffer length (the exact nature of this field is quite
281 * speculative). On a request/write this is often the same as
282 * @length, though in some cases it has been seen to be much larger
283 * (e.g. 0x400); on a response/read this the same as on the
284 * request; for reads that are not responses it is 0.
285 * @length: length of the remainder of the data in the whole message
286 * structure (after re-assembly in case of being split over
287 * multiple spi-packets), minus the trailing crc. The total size
288 * of the message struct is therefore @length + 10.
289 *
290 * @keyboard: Keyboard message
291 * @touchpad: Touchpad message
292 * @tp_info: Touchpad info (response)
293 * @tp_info_command: Touchpad info (CRC)
294 * @init_mt_command: Initialise Multitouch
295 * @capsl_command: Toggle caps-lock LED
296 * @bl_command: Keyboard brightness
297 * @data: Buffer data
298 */
299struct message {
300 __le16 type;
301 u8 zero;
302 u8 counter;
303 __le16 rsp_buf_len;
304 __le16 length;
305 union {
306 struct keyboard_protocol keyboard;
307 struct touchpad_protocol touchpad;
308 struct touchpad_info_protocol tp_info;
309 struct command_protocol_tp_info tp_info_command;
310 struct command_protocol_mt_init init_mt_command;
311 struct command_protocol_capsl capsl_command;
312 struct command_protocol_bl bl_command;
313 u8 data[0];
314 };
315};
316
317/* type + zero + counter + rsp_buf_len + length */
318#define MSG_HEADER_SIZE 8
319
320/**
321 * struct spi_packet - a complete spi packet; always 256 bytes. This carries
322 * the (parts of the) message in the data. But note that this does not
323 * necessarily contain a complete message, as in some cases (e.g. many
324 * fingers pressed) the message is split over multiple packets (see the
325 * @offset, @remaining, and @length fields). In general the data parts in
326 * spi_packet's are concatenated until @remaining is 0, and the result is an
327 * message.
328 *
329 * @flags: 0x40 = write (to device), 0x20 = read (from device); note that
330 * the response to a write still has 0x40.
331 * @device: 1 = keyboard, 2 = touchpad
332 * @offset: specifies the offset of this packet's data in the complete
333 * message; i.e. > 0 indicates this is a continuation packet (in
334 * the second packet for a message split over multiple packets
335 * this would then be the same as the @length in the first packet)
336 * @remaining: number of message bytes remaining in subsequents packets (in
337 * the first packet of a message split over two packets this would
338 * then be the same as the @length in the second packet)
339 * @length: length of the valid data in the @data in this packet
340 * @data: all or part of a message
341 * @crc16: crc over this whole structure minus this @crc16 field. This
342 * covers just this packet, even on multi-packet messages (in
343 * contrast to the crc in the message).
344 */
345struct spi_packet {
346 u8 flags;
347 u8 device;
348 __le16 offset;
349 __le16 remaining;
350 __le16 length;
351 u8 data[246];
352 __le16 crc16;
353};
354
355struct spi_settings {
356 u64 spi_cs_delay; /* cs-to-clk delay in us */
357 u64 reset_a2r_usec; /* active-to-receive delay? */
358 u64 reset_rec_usec; /* ? (cur val: 10) */
359};
360
361/* this mimics struct drm_rect */
362struct applespi_tp_info {
363 int x_min;
364 int y_min;
365 int x_max;
366 int y_max;
367};
368
369struct applespi_data {
370 struct spi_device *spi;
371 struct spi_settings spi_settings;
372 struct input_dev *keyboard_input_dev;
373 struct input_dev *touchpad_input_dev;
374
375 u8 *tx_buffer;
376 u8 *tx_status;
377 u8 *rx_buffer;
378
379 u8 *msg_buf;
380 unsigned int saved_msg_len;
381
382 struct applespi_tp_info tp_info;
383
384 u8 last_keys_pressed[MAX_ROLLOVER];
385 u8 last_keys_fn_pressed[MAX_ROLLOVER];
386 u8 last_fn_pressed;
387 struct input_mt_pos pos[MAX_FINGERS];
388 int slots[MAX_FINGERS];
389 int gpe;
390 acpi_handle sien;
391 acpi_handle sist;
392
393 struct spi_transfer dl_t;
394 struct spi_transfer rd_t;
395 struct spi_message rd_m;
396
397 struct spi_transfer ww_t;
398 struct spi_transfer wd_t;
399 struct spi_transfer wr_t;
400 struct spi_transfer st_t;
401 struct spi_message wr_m;
402
403 bool want_tp_info_cmd;
404 bool want_mt_init_cmd;
405 bool want_cl_led_on;
406 bool have_cl_led_on;
407 unsigned int want_bl_level;
408 unsigned int have_bl_level;
409 unsigned int cmd_msg_cntr;
410 /* lock to protect the above parameters and flags below */
411 spinlock_t cmd_msg_lock;
412 bool cmd_msg_queued;
413 enum applespi_evt_type cmd_evt_type;
414
415 struct led_classdev backlight_info;
416
417 bool suspended;
418 bool drain;
419 wait_queue_head_t drain_complete;
420 bool read_active;
421 bool write_active;
422
423 struct work_struct work;
424 struct touchpad_info_protocol rcvd_tp_info;
425
426 struct dentry *debugfs_root;
427 bool debug_tp_dim;
428 char tp_dim_val[40];
429 int tp_dim_min_x;
430 int tp_dim_max_x;
431 int tp_dim_min_y;
432 int tp_dim_max_y;
433};
434
435static const unsigned char applespi_scancodes[] = {
436 0, 0, 0, 0,
437 KEY_A, KEY_B, KEY_C, KEY_D, KEY_E, KEY_F, KEY_G, KEY_H, KEY_I, KEY_J,
438 KEY_K, KEY_L, KEY_M, KEY_N, KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T,
439 KEY_U, KEY_V, KEY_W, KEY_X, KEY_Y, KEY_Z,
440 KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0,
441 KEY_ENTER, KEY_ESC, KEY_BACKSPACE, KEY_TAB, KEY_SPACE, KEY_MINUS,
442 KEY_EQUAL, KEY_LEFTBRACE, KEY_RIGHTBRACE, KEY_BACKSLASH, 0,
443 KEY_SEMICOLON, KEY_APOSTROPHE, KEY_GRAVE, KEY_COMMA, KEY_DOT, KEY_SLASH,
444 KEY_CAPSLOCK,
445 KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9,
446 KEY_F10, KEY_F11, KEY_F12, 0, 0, 0, 0, 0, 0, 0, 0, 0,
447 KEY_RIGHT, KEY_LEFT, KEY_DOWN, KEY_UP,
448 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, KEY_102ND,
449 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
450 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, KEY_RO, 0, KEY_YEN, 0, 0, 0, 0, 0,
451 0, KEY_KATAKANAHIRAGANA, KEY_MUHENKAN
452};
453
454/*
455 * This must have exactly as many entries as there are bits in
456 * struct keyboard_protocol.modifiers .
457 */
458static const unsigned char applespi_controlcodes[] = {
459 KEY_LEFTCTRL,
460 KEY_LEFTSHIFT,
461 KEY_LEFTALT,
462 KEY_LEFTMETA,
463 0,
464 KEY_RIGHTSHIFT,
465 KEY_RIGHTALT,
466 KEY_RIGHTMETA
467};
468
469struct applespi_key_translation {
470 u16 from;
471 u16 to;
472 u8 flags;
473};
474
475static const struct applespi_key_translation applespi_fn_codes[] = {
476 { KEY_BACKSPACE, KEY_DELETE },
477 { KEY_ENTER, KEY_INSERT },
478 { KEY_F1, KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY },
479 { KEY_F2, KEY_BRIGHTNESSUP, APPLE_FLAG_FKEY },
480 { KEY_F3, KEY_SCALE, APPLE_FLAG_FKEY },
481 { KEY_F4, KEY_DASHBOARD, APPLE_FLAG_FKEY },
482 { KEY_F5, KEY_KBDILLUMDOWN, APPLE_FLAG_FKEY },
483 { KEY_F6, KEY_KBDILLUMUP, APPLE_FLAG_FKEY },
484 { KEY_F7, KEY_PREVIOUSSONG, APPLE_FLAG_FKEY },
485 { KEY_F8, KEY_PLAYPAUSE, APPLE_FLAG_FKEY },
486 { KEY_F9, KEY_NEXTSONG, APPLE_FLAG_FKEY },
487 { KEY_F10, KEY_MUTE, APPLE_FLAG_FKEY },
488 { KEY_F11, KEY_VOLUMEDOWN, APPLE_FLAG_FKEY },
489 { KEY_F12, KEY_VOLUMEUP, APPLE_FLAG_FKEY },
490 { KEY_RIGHT, KEY_END },
491 { KEY_LEFT, KEY_HOME },
492 { KEY_DOWN, KEY_PAGEDOWN },
493 { KEY_UP, KEY_PAGEUP },
494 { }
495};
496
497static const struct applespi_key_translation apple_iso_keyboard[] = {
498 { KEY_GRAVE, KEY_102ND },
499 { KEY_102ND, KEY_GRAVE },
500 { }
501};
502
503struct applespi_tp_model_info {
504 u16 model;
505 struct applespi_tp_info tp_info;
506};
507
508static const struct applespi_tp_model_info applespi_tp_models[] = {
509 {
510 .model = 0x04, /* MB8 MB9 MB10 */
511 .tp_info = { -5087, -182, 5579, 6089 },
512 },
513 {
514 .model = 0x05, /* MBP13,1 MBP13,2 MBP14,1 MBP14,2 */
515 .tp_info = { -6243, -170, 6749, 7685 },
516 },
517 {
518 .model = 0x06, /* MBP13,3 MBP14,3 */
519 .tp_info = { -7456, -163, 7976, 9283 },
520 },
521 {}
522};
523
524typedef void (*applespi_trace_fun)(enum applespi_evt_type,
525 enum applespi_pkt_type, u8 *, size_t);
526
527static applespi_trace_fun applespi_get_trace_fun(enum applespi_evt_type type)
528{
529 switch (type) {
530 case ET_CMD_TP_INI:
531 return trace_applespi_tp_ini_cmd;
532 case ET_CMD_BL:
533 return trace_applespi_backlight_cmd;
534 case ET_CMD_CL:
535 return trace_applespi_caps_lock_cmd;
536 case ET_RD_KEYB:
537 return trace_applespi_keyboard_data;
538 case ET_RD_TPAD:
539 return trace_applespi_touchpad_data;
540 case ET_RD_UNKN:
541 return trace_applespi_unknown_data;
542 default:
543 WARN_ONCE(1, "Unknown msg type %d", type);
544 return trace_applespi_unknown_data;
545 }
546}
547
548static void applespi_setup_read_txfrs(struct applespi_data *applespi)
549{
550 struct spi_message *msg = &applespi->rd_m;
551 struct spi_transfer *dl_t = &applespi->dl_t;
552 struct spi_transfer *rd_t = &applespi->rd_t;
553
554 memset(dl_t, 0, sizeof(*dl_t));
555 memset(rd_t, 0, sizeof(*rd_t));
556
557 dl_t->delay.value = applespi->spi_settings.spi_cs_delay;
558 dl_t->delay.unit = SPI_DELAY_UNIT_USECS;
559
560 rd_t->rx_buf = applespi->rx_buffer;
561 rd_t->len = APPLESPI_PACKET_SIZE;
562
563 spi_message_init(msg);
564 spi_message_add_tail(dl_t, msg);
565 spi_message_add_tail(rd_t, msg);
566}
567
568static void applespi_setup_write_txfrs(struct applespi_data *applespi)
569{
570 struct spi_message *msg = &applespi->wr_m;
571 struct spi_transfer *wt_t = &applespi->ww_t;
572 struct spi_transfer *dl_t = &applespi->wd_t;
573 struct spi_transfer *wr_t = &applespi->wr_t;
574 struct spi_transfer *st_t = &applespi->st_t;
575
576 memset(wt_t, 0, sizeof(*wt_t));
577 memset(dl_t, 0, sizeof(*dl_t));
578 memset(wr_t, 0, sizeof(*wr_t));
579 memset(st_t, 0, sizeof(*st_t));
580
581 /*
582 * All we need here is a delay at the beginning of the message before
583 * asserting cs. But the current spi API doesn't support this, so we
584 * end up with an extra unnecessary (but harmless) cs assertion and
585 * deassertion.
586 */
587 wt_t->delay.value = SPI_RW_CHG_DELAY_US;
588 wt_t->delay.unit = SPI_DELAY_UNIT_USECS;
589 wt_t->cs_change = 1;
590
591 dl_t->delay.value = applespi->spi_settings.spi_cs_delay;
592 dl_t->delay.unit = SPI_DELAY_UNIT_USECS;
593
594 wr_t->tx_buf = applespi->tx_buffer;
595 wr_t->len = APPLESPI_PACKET_SIZE;
596 wr_t->delay.value = SPI_RW_CHG_DELAY_US;
597 wr_t->delay.unit = SPI_DELAY_UNIT_USECS;
598
599 st_t->rx_buf = applespi->tx_status;
600 st_t->len = APPLESPI_STATUS_SIZE;
601
602 spi_message_init(msg);
603 spi_message_add_tail(wt_t, msg);
604 spi_message_add_tail(dl_t, msg);
605 spi_message_add_tail(wr_t, msg);
606 spi_message_add_tail(st_t, msg);
607}
608
609static int applespi_async(struct applespi_data *applespi,
610 struct spi_message *message, void (*complete)(void *))
611{
612 message->complete = complete;
613 message->context = applespi;
614
615 return spi_async(applespi->spi, message);
616}
617
618static inline bool applespi_check_write_status(struct applespi_data *applespi,
619 int sts)
620{
621 static u8 status_ok[] = { 0xac, 0x27, 0x68, 0xd5 };
622
623 if (sts < 0) {
624 dev_warn(&applespi->spi->dev, "Error writing to device: %d\n",
625 sts);
626 return false;
627 }
628
629 if (memcmp(applespi->tx_status, status_ok, APPLESPI_STATUS_SIZE)) {
630 dev_warn(&applespi->spi->dev, "Error writing to device: %*ph\n",
631 APPLESPI_STATUS_SIZE, applespi->tx_status);
632 return false;
633 }
634
635 return true;
636}
637
638static int applespi_get_spi_settings(struct applespi_data *applespi)
639{
640 struct acpi_device *adev = ACPI_COMPANION(&applespi->spi->dev);
641 const union acpi_object *o;
642 struct spi_settings *settings = &applespi->spi_settings;
643
644 if (!acpi_dev_get_property(adev, "spiCSDelay", ACPI_TYPE_BUFFER, &o))
645 settings->spi_cs_delay = *(u64 *)o->buffer.pointer;
646 else
647 dev_warn(&applespi->spi->dev,
648 "Property spiCSDelay not found\n");
649
650 if (!acpi_dev_get_property(adev, "resetA2RUsec", ACPI_TYPE_BUFFER, &o))
651 settings->reset_a2r_usec = *(u64 *)o->buffer.pointer;
652 else
653 dev_warn(&applespi->spi->dev,
654 "Property resetA2RUsec not found\n");
655
656 if (!acpi_dev_get_property(adev, "resetRecUsec", ACPI_TYPE_BUFFER, &o))
657 settings->reset_rec_usec = *(u64 *)o->buffer.pointer;
658 else
659 dev_warn(&applespi->spi->dev,
660 "Property resetRecUsec not found\n");
661
662 dev_dbg(&applespi->spi->dev,
663 "SPI settings: spi_cs_delay=%llu reset_a2r_usec=%llu reset_rec_usec=%llu\n",
664 settings->spi_cs_delay, settings->reset_a2r_usec,
665 settings->reset_rec_usec);
666
667 return 0;
668}
669
670static int applespi_setup_spi(struct applespi_data *applespi)
671{
672 int sts;
673
674 sts = applespi_get_spi_settings(applespi);
675 if (sts)
676 return sts;
677
678 spin_lock_init(&applespi->cmd_msg_lock);
679 init_waitqueue_head(&applespi->drain_complete);
680
681 return 0;
682}
683
684static int applespi_enable_spi(struct applespi_data *applespi)
685{
686 acpi_status acpi_sts;
687 unsigned long long spi_status;
688
689 /* check if SPI is already enabled, so we can skip the delay below */
690 acpi_sts = acpi_evaluate_integer(applespi->sist, NULL, NULL,
691 &spi_status);
692 if (ACPI_SUCCESS(acpi_sts) && spi_status)
693 return 0;
694
695 /* SIEN(1) will enable SPI communication */
696 acpi_sts = acpi_execute_simple_method(applespi->sien, NULL, 1);
697 if (ACPI_FAILURE(acpi_sts)) {
698 dev_err(&applespi->spi->dev, "SIEN failed: %s\n",
699 acpi_format_exception(acpi_sts));
700 return -ENODEV;
701 }
702
703 /*
704 * Allow the SPI interface to come up before returning. Without this
705 * delay, the SPI commands to enable multitouch mode may not reach
706 * the trackpad controller, causing pointer movement to break upon
707 * resume from sleep.
708 */
709 msleep(50);
710
711 return 0;
712}
713
714static int applespi_send_cmd_msg(struct applespi_data *applespi);
715
716static void applespi_msg_complete(struct applespi_data *applespi,
717 bool is_write_msg, bool is_read_compl)
718{
719 unsigned long flags;
720
721 spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
722
723 if (is_read_compl)
724 applespi->read_active = false;
725 if (is_write_msg)
726 applespi->write_active = false;
727
728 if (applespi->drain && !applespi->write_active)
729 wake_up_all(&applespi->drain_complete);
730
731 if (is_write_msg) {
732 applespi->cmd_msg_queued = false;
733 applespi_send_cmd_msg(applespi);
734 }
735
736 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
737}
738
739static void applespi_async_write_complete(void *context)
740{
741 struct applespi_data *applespi = context;
742 enum applespi_evt_type evt_type = applespi->cmd_evt_type;
743
744 applespi_get_trace_fun(evt_type)(evt_type, PT_WRITE,
745 applespi->tx_buffer,
746 APPLESPI_PACKET_SIZE);
747 applespi_get_trace_fun(evt_type)(evt_type, PT_STATUS,
748 applespi->tx_status,
749 APPLESPI_STATUS_SIZE);
750
751 if (!applespi_check_write_status(applespi, applespi->wr_m.status)) {
752 /*
753 * If we got an error, we presumably won't get the expected
754 * response message either.
755 */
756 applespi_msg_complete(applespi, true, false);
757 }
758}
759
760static int applespi_send_cmd_msg(struct applespi_data *applespi)
761{
762 u16 crc;
763 int sts;
764 struct spi_packet *packet = (struct spi_packet *)applespi->tx_buffer;
765 struct message *message = (struct message *)packet->data;
766 u16 msg_len;
767 u8 device;
768
769 /* check if draining */
770 if (applespi->drain)
771 return 0;
772
773 /* check whether send is in progress */
774 if (applespi->cmd_msg_queued)
775 return 0;
776
777 /* set up packet */
778 memset(packet, 0, APPLESPI_PACKET_SIZE);
779
780 /* are we processing init commands? */
781 if (applespi->want_tp_info_cmd) {
782 applespi->want_tp_info_cmd = false;
783 applespi->want_mt_init_cmd = true;
784 applespi->cmd_evt_type = ET_CMD_TP_INI;
785
786 /* build init command */
787 device = PACKET_DEV_INFO;
788
789 message->type = cpu_to_le16(0x1020);
790 msg_len = sizeof(message->tp_info_command);
791
792 message->zero = 0x02;
793 message->rsp_buf_len = cpu_to_le16(0x0200);
794
795 } else if (applespi->want_mt_init_cmd) {
796 applespi->want_mt_init_cmd = false;
797 applespi->cmd_evt_type = ET_CMD_TP_INI;
798
799 /* build init command */
800 device = PACKET_DEV_TPAD;
801
802 message->type = cpu_to_le16(0x0252);
803 msg_len = sizeof(message->init_mt_command);
804
805 message->init_mt_command.cmd = cpu_to_le16(0x0102);
806
807 /* do we need caps-lock command? */
808 } else if (applespi->want_cl_led_on != applespi->have_cl_led_on) {
809 applespi->have_cl_led_on = applespi->want_cl_led_on;
810 applespi->cmd_evt_type = ET_CMD_CL;
811
812 /* build led command */
813 device = PACKET_DEV_KEYB;
814
815 message->type = cpu_to_le16(0x0151);
816 msg_len = sizeof(message->capsl_command);
817
818 message->capsl_command.unknown = 0x01;
819 message->capsl_command.led = applespi->have_cl_led_on ? 2 : 0;
820
821 /* do we need backlight command? */
822 } else if (applespi->want_bl_level != applespi->have_bl_level) {
823 applespi->have_bl_level = applespi->want_bl_level;
824 applespi->cmd_evt_type = ET_CMD_BL;
825
826 /* build command buffer */
827 device = PACKET_DEV_KEYB;
828
829 message->type = cpu_to_le16(0xB051);
830 msg_len = sizeof(message->bl_command);
831
832 message->bl_command.const1 = cpu_to_le16(0x01B0);
833 message->bl_command.level =
834 cpu_to_le16(applespi->have_bl_level);
835
836 if (applespi->have_bl_level > 0)
837 message->bl_command.const2 = cpu_to_le16(0x01F4);
838 else
839 message->bl_command.const2 = cpu_to_le16(0x0001);
840
841 /* everything's up-to-date */
842 } else {
843 return 0;
844 }
845
846 /* finalize packet */
847 packet->flags = PACKET_TYPE_WRITE;
848 packet->device = device;
849 packet->length = cpu_to_le16(MSG_HEADER_SIZE + msg_len);
850
851 message->counter = applespi->cmd_msg_cntr++ % (U8_MAX + 1);
852
853 message->length = cpu_to_le16(msg_len - 2);
854 if (!message->rsp_buf_len)
855 message->rsp_buf_len = message->length;
856
857 crc = crc16(0, (u8 *)message, le16_to_cpu(packet->length) - 2);
858 put_unaligned_le16(crc, &message->data[msg_len - 2]);
859
860 crc = crc16(0, (u8 *)packet, sizeof(*packet) - 2);
861 packet->crc16 = cpu_to_le16(crc);
862
863 /* send command */
864 sts = applespi_async(applespi, &applespi->wr_m,
865 applespi_async_write_complete);
866 if (sts) {
867 dev_warn(&applespi->spi->dev,
868 "Error queueing async write to device: %d\n", sts);
869 return sts;
870 }
871
872 applespi->cmd_msg_queued = true;
873 applespi->write_active = true;
874
875 return 0;
876}
877
878static void applespi_init(struct applespi_data *applespi, bool is_resume)
879{
880 unsigned long flags;
881
882 spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
883
884 if (is_resume)
885 applespi->want_mt_init_cmd = true;
886 else
887 applespi->want_tp_info_cmd = true;
888 applespi_send_cmd_msg(applespi);
889
890 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
891}
892
893static int applespi_set_capsl_led(struct applespi_data *applespi,
894 bool capslock_on)
895{
896 unsigned long flags;
897 int sts;
898
899 spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
900
901 applespi->want_cl_led_on = capslock_on;
902 sts = applespi_send_cmd_msg(applespi);
903
904 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
905
906 return sts;
907}
908
909static void applespi_set_bl_level(struct led_classdev *led_cdev,
910 enum led_brightness value)
911{
912 struct applespi_data *applespi =
913 container_of(led_cdev, struct applespi_data, backlight_info);
914 unsigned long flags;
915
916 spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
917
918 if (value == 0) {
919 applespi->want_bl_level = value;
920 } else {
921 /*
922 * The backlight does not turn on till level 32, so we scale
923 * the range here so that from a user's perspective it turns
924 * on at 1.
925 */
926 applespi->want_bl_level =
927 ((value * KBD_BL_LEVEL_ADJ) / KBD_BL_LEVEL_SCALE +
928 KBD_BL_LEVEL_MIN);
929 }
930
931 applespi_send_cmd_msg(applespi);
932
933 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
934}
935
936static int applespi_event(struct input_dev *dev, unsigned int type,
937 unsigned int code, int value)
938{
939 struct applespi_data *applespi = input_get_drvdata(dev);
940
941 switch (type) {
942 case EV_LED:
943 applespi_set_capsl_led(applespi, !!test_bit(LED_CAPSL, dev->led));
944 return 0;
945 }
946
947 return -EINVAL;
948}
949
950/* lifted from the BCM5974 driver and renamed from raw2int */
951/* convert 16-bit little endian to signed integer */
952static inline int le16_to_int(__le16 x)
953{
954 return (signed short)le16_to_cpu(x);
955}
956
957static void applespi_debug_update_dimensions(struct applespi_data *applespi,
958 const struct tp_finger *f)
959{
960 applespi->tp_dim_min_x = min(applespi->tp_dim_min_x,
961 le16_to_int(f->abs_x));
962 applespi->tp_dim_max_x = max(applespi->tp_dim_max_x,
963 le16_to_int(f->abs_x));
964 applespi->tp_dim_min_y = min(applespi->tp_dim_min_y,
965 le16_to_int(f->abs_y));
966 applespi->tp_dim_max_y = max(applespi->tp_dim_max_y,
967 le16_to_int(f->abs_y));
968}
969
970static int applespi_tp_dim_open(struct inode *inode, struct file *file)
971{
972 struct applespi_data *applespi = inode->i_private;
973
974 file->private_data = applespi;
975
976 snprintf(applespi->tp_dim_val, sizeof(applespi->tp_dim_val),
977 "0x%.4x %dx%d+%u+%u\n",
978 applespi->touchpad_input_dev->id.product,
979 applespi->tp_dim_min_x, applespi->tp_dim_min_y,
980 applespi->tp_dim_max_x - applespi->tp_dim_min_x,
981 applespi->tp_dim_max_y - applespi->tp_dim_min_y);
982
983 return nonseekable_open(inode, file);
984}
985
986static ssize_t applespi_tp_dim_read(struct file *file, char __user *buf,
987 size_t len, loff_t *off)
988{
989 struct applespi_data *applespi = file->private_data;
990
991 return simple_read_from_buffer(buf, len, off, applespi->tp_dim_val,
992 strlen(applespi->tp_dim_val));
993}
994
995static const struct file_operations applespi_tp_dim_fops = {
996 .owner = THIS_MODULE,
997 .open = applespi_tp_dim_open,
998 .read = applespi_tp_dim_read,
999 .llseek = no_llseek,
1000};
1001
1002static void report_finger_data(struct input_dev *input, int slot,
1003 const struct input_mt_pos *pos,
1004 const struct tp_finger *f)
1005{
1006 input_mt_slot(input, slot);
1007 input_mt_report_slot_state(input, MT_TOOL_FINGER, true);
1008
1009 input_report_abs(input, ABS_MT_TOUCH_MAJOR,
1010 le16_to_int(f->touch_major) << 1);
1011 input_report_abs(input, ABS_MT_TOUCH_MINOR,
1012 le16_to_int(f->touch_minor) << 1);
1013 input_report_abs(input, ABS_MT_WIDTH_MAJOR,
1014 le16_to_int(f->tool_major) << 1);
1015 input_report_abs(input, ABS_MT_WIDTH_MINOR,
1016 le16_to_int(f->tool_minor) << 1);
1017 input_report_abs(input, ABS_MT_ORIENTATION,
1018 MAX_FINGER_ORIENTATION - le16_to_int(f->orientation));
1019 input_report_abs(input, ABS_MT_POSITION_X, pos->x);
1020 input_report_abs(input, ABS_MT_POSITION_Y, pos->y);
1021}
1022
1023static void report_tp_state(struct applespi_data *applespi,
1024 struct touchpad_protocol *t)
1025{
1026 const struct tp_finger *f;
1027 struct input_dev *input;
1028 const struct applespi_tp_info *tp_info = &applespi->tp_info;
1029 int i, n;
1030
1031 /* touchpad_input_dev is set async in worker */
1032 input = smp_load_acquire(&applespi->touchpad_input_dev);
1033 if (!input)
1034 return; /* touchpad isn't initialized yet */
1035
1036 n = 0;
1037
1038 for (i = 0; i < t->number_of_fingers; i++) {
1039 f = &t->fingers[i];
1040 if (le16_to_int(f->touch_major) == 0)
1041 continue;
1042 applespi->pos[n].x = le16_to_int(f->abs_x);
1043 applespi->pos[n].y = tp_info->y_min + tp_info->y_max -
1044 le16_to_int(f->abs_y);
1045 n++;
1046
1047 if (applespi->debug_tp_dim)
1048 applespi_debug_update_dimensions(applespi, f);
1049 }
1050
1051 input_mt_assign_slots(input, applespi->slots, applespi->pos, n, 0);
1052
1053 for (i = 0; i < n; i++)
1054 report_finger_data(input, applespi->slots[i],
1055 &applespi->pos[i], &t->fingers[i]);
1056
1057 input_mt_sync_frame(input);
1058 input_report_key(input, BTN_LEFT, t->clicked);
1059
1060 input_sync(input);
1061}
1062
1063static const struct applespi_key_translation *
1064applespi_find_translation(const struct applespi_key_translation *table, u16 key)
1065{
1066 const struct applespi_key_translation *trans;
1067
1068 for (trans = table; trans->from; trans++)
1069 if (trans->from == key)
1070 return trans;
1071
1072 return NULL;
1073}
1074
1075static unsigned int applespi_translate_fn_key(unsigned int key, int fn_pressed)
1076{
1077 const struct applespi_key_translation *trans;
1078 int do_translate;
1079
1080 trans = applespi_find_translation(applespi_fn_codes, key);
1081 if (trans) {
1082 if (trans->flags & APPLE_FLAG_FKEY)
1083 do_translate = (fnmode == 2 && fn_pressed) ||
1084 (fnmode == 1 && !fn_pressed);
1085 else
1086 do_translate = fn_pressed;
1087
1088 if (do_translate)
1089 key = trans->to;
1090 }
1091
1092 return key;
1093}
1094
1095static unsigned int applespi_translate_iso_layout(unsigned int key)
1096{
1097 const struct applespi_key_translation *trans;
1098
1099 trans = applespi_find_translation(apple_iso_keyboard, key);
1100 if (trans)
1101 key = trans->to;
1102
1103 return key;
1104}
1105
1106static unsigned int applespi_code_to_key(u8 code, int fn_pressed)
1107{
1108 unsigned int key = applespi_scancodes[code];
1109
1110 if (fnmode)
1111 key = applespi_translate_fn_key(key, fn_pressed);
1112 if (iso_layout)
1113 key = applespi_translate_iso_layout(key);
1114 return key;
1115}
1116
1117static void
1118applespi_remap_fn_key(struct keyboard_protocol *keyboard_protocol)
1119{
1120 unsigned char tmp;
1121 u8 bit = BIT((fnremap - 1) & 0x07);
1122
1123 if (!fnremap || fnremap > ARRAY_SIZE(applespi_controlcodes) ||
1124 !applespi_controlcodes[fnremap - 1])
1125 return;
1126
1127 tmp = keyboard_protocol->fn_pressed;
1128 keyboard_protocol->fn_pressed = !!(keyboard_protocol->modifiers & bit);
1129 if (tmp)
1130 keyboard_protocol->modifiers |= bit;
1131 else
1132 keyboard_protocol->modifiers &= ~bit;
1133}
1134
1135static void
1136applespi_handle_keyboard_event(struct applespi_data *applespi,
1137 struct keyboard_protocol *keyboard_protocol)
1138{
1139 unsigned int key;
1140 int i;
1141
1142 compiletime_assert(ARRAY_SIZE(applespi_controlcodes) ==
1143 sizeof_field(struct keyboard_protocol, modifiers) * 8,
1144 "applespi_controlcodes has wrong number of entries");
1145
1146 /* check for rollover overflow, which is signalled by all keys == 1 */
1147 if (!memchr_inv(keyboard_protocol->keys_pressed, 1, MAX_ROLLOVER))
1148 return;
1149
1150 /* remap fn key if desired */
1151 applespi_remap_fn_key(keyboard_protocol);
1152
1153 /* check released keys */
1154 for (i = 0; i < MAX_ROLLOVER; i++) {
1155 if (memchr(keyboard_protocol->keys_pressed,
1156 applespi->last_keys_pressed[i], MAX_ROLLOVER))
1157 continue; /* key is still pressed */
1158
1159 key = applespi_code_to_key(applespi->last_keys_pressed[i],
1160 applespi->last_keys_fn_pressed[i]);
1161 input_report_key(applespi->keyboard_input_dev, key, 0);
1162 applespi->last_keys_fn_pressed[i] = 0;
1163 }
1164
1165 /* check pressed keys */
1166 for (i = 0; i < MAX_ROLLOVER; i++) {
1167 if (keyboard_protocol->keys_pressed[i] <
1168 ARRAY_SIZE(applespi_scancodes) &&
1169 keyboard_protocol->keys_pressed[i] > 0) {
1170 key = applespi_code_to_key(
1171 keyboard_protocol->keys_pressed[i],
1172 keyboard_protocol->fn_pressed);
1173 input_report_key(applespi->keyboard_input_dev, key, 1);
1174 applespi->last_keys_fn_pressed[i] =
1175 keyboard_protocol->fn_pressed;
1176 }
1177 }
1178
1179 /* check control keys */
1180 for (i = 0; i < ARRAY_SIZE(applespi_controlcodes); i++) {
1181 if (keyboard_protocol->modifiers & BIT(i))
1182 input_report_key(applespi->keyboard_input_dev,
1183 applespi_controlcodes[i], 1);
1184 else
1185 input_report_key(applespi->keyboard_input_dev,
1186 applespi_controlcodes[i], 0);
1187 }
1188
1189 /* check function key */
1190 if (keyboard_protocol->fn_pressed && !applespi->last_fn_pressed)
1191 input_report_key(applespi->keyboard_input_dev, KEY_FN, 1);
1192 else if (!keyboard_protocol->fn_pressed && applespi->last_fn_pressed)
1193 input_report_key(applespi->keyboard_input_dev, KEY_FN, 0);
1194 applespi->last_fn_pressed = keyboard_protocol->fn_pressed;
1195
1196 /* done */
1197 input_sync(applespi->keyboard_input_dev);
1198 memcpy(&applespi->last_keys_pressed, keyboard_protocol->keys_pressed,
1199 sizeof(applespi->last_keys_pressed));
1200}
1201
1202static const struct applespi_tp_info *applespi_find_touchpad_info(u8 model)
1203{
1204 const struct applespi_tp_model_info *info;
1205
1206 for (info = applespi_tp_models; info->model; info++) {
1207 if (info->model == model)
1208 return &info->tp_info;
1209 }
1210
1211 return NULL;
1212}
1213
1214static int
1215applespi_register_touchpad_device(struct applespi_data *applespi,
1216 struct touchpad_info_protocol *rcvd_tp_info)
1217{
1218 const struct applespi_tp_info *tp_info;
1219 struct input_dev *touchpad_input_dev;
1220 int sts;
1221
1222 /* set up touchpad dimensions */
1223 tp_info = applespi_find_touchpad_info(rcvd_tp_info->model_no);
1224 if (!tp_info) {
1225 dev_warn(&applespi->spi->dev,
1226 "Unknown touchpad model %x - falling back to MB8 touchpad\n",
1227 rcvd_tp_info->model_no);
1228 tp_info = &applespi_tp_models[0].tp_info;
1229 }
1230
1231 applespi->tp_info = *tp_info;
1232
1233 if (touchpad_dimensions[0]) {
1234 int x, y, w, h;
1235
1236 sts = sscanf(touchpad_dimensions, "%dx%d+%u+%u", &x, &y, &w, &h);
1237 if (sts == 4) {
1238 dev_info(&applespi->spi->dev,
1239 "Overriding touchpad dimensions from module param\n");
1240 applespi->tp_info.x_min = x;
1241 applespi->tp_info.y_min = y;
1242 applespi->tp_info.x_max = x + w;
1243 applespi->tp_info.y_max = y + h;
1244 } else {
1245 dev_warn(&applespi->spi->dev,
1246 "Invalid touchpad dimensions '%s': must be in the form XxY+W+H\n",
1247 touchpad_dimensions);
1248 touchpad_dimensions[0] = '\0';
1249 }
1250 }
1251 if (!touchpad_dimensions[0]) {
1252 snprintf(touchpad_dimensions, sizeof(touchpad_dimensions),
1253 "%dx%d+%u+%u",
1254 applespi->tp_info.x_min,
1255 applespi->tp_info.y_min,
1256 applespi->tp_info.x_max - applespi->tp_info.x_min,
1257 applespi->tp_info.y_max - applespi->tp_info.y_min);
1258 }
1259
1260 /* create touchpad input device */
1261 touchpad_input_dev = devm_input_allocate_device(&applespi->spi->dev);
1262 if (!touchpad_input_dev) {
1263 dev_err(&applespi->spi->dev,
1264 "Failed to allocate touchpad input device\n");
1265 return -ENOMEM;
1266 }
1267
1268 touchpad_input_dev->name = "Apple SPI Touchpad";
1269 touchpad_input_dev->phys = "applespi/input1";
1270 touchpad_input_dev->dev.parent = &applespi->spi->dev;
1271 touchpad_input_dev->id.bustype = BUS_SPI;
1272 touchpad_input_dev->id.vendor = SYNAPTICS_VENDOR_ID;
1273 touchpad_input_dev->id.product =
1274 rcvd_tp_info->model_no << 8 | rcvd_tp_info->model_flags;
1275
1276 /* basic properties */
1277 input_set_capability(touchpad_input_dev, EV_REL, REL_X);
1278 input_set_capability(touchpad_input_dev, EV_REL, REL_Y);
1279
1280 __set_bit(INPUT_PROP_POINTER, touchpad_input_dev->propbit);
1281 __set_bit(INPUT_PROP_BUTTONPAD, touchpad_input_dev->propbit);
1282
1283 /* finger touch area */
1284 input_set_abs_params(touchpad_input_dev, ABS_MT_TOUCH_MAJOR,
1285 0, 5000, 0, 0);
1286 input_set_abs_params(touchpad_input_dev, ABS_MT_TOUCH_MINOR,
1287 0, 5000, 0, 0);
1288
1289 /* finger approach area */
1290 input_set_abs_params(touchpad_input_dev, ABS_MT_WIDTH_MAJOR,
1291 0, 5000, 0, 0);
1292 input_set_abs_params(touchpad_input_dev, ABS_MT_WIDTH_MINOR,
1293 0, 5000, 0, 0);
1294
1295 /* finger orientation */
1296 input_set_abs_params(touchpad_input_dev, ABS_MT_ORIENTATION,
1297 -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION,
1298 0, 0);
1299
1300 /* finger position */
1301 input_set_abs_params(touchpad_input_dev, ABS_MT_POSITION_X,
1302 applespi->tp_info.x_min, applespi->tp_info.x_max,
1303 0, 0);
1304 input_set_abs_params(touchpad_input_dev, ABS_MT_POSITION_Y,
1305 applespi->tp_info.y_min, applespi->tp_info.y_max,
1306 0, 0);
1307
1308 /* touchpad button */
1309 input_set_capability(touchpad_input_dev, EV_KEY, BTN_LEFT);
1310
1311 /* multitouch */
1312 sts = input_mt_init_slots(touchpad_input_dev, MAX_FINGERS,
1313 INPUT_MT_POINTER | INPUT_MT_DROP_UNUSED |
1314 INPUT_MT_TRACK);
1315 if (sts) {
1316 dev_err(&applespi->spi->dev,
1317 "failed to initialize slots: %d", sts);
1318 return sts;
1319 }
1320
1321 /* register input device */
1322 sts = input_register_device(touchpad_input_dev);
1323 if (sts) {
1324 dev_err(&applespi->spi->dev,
1325 "Unable to register touchpad input device (%d)\n", sts);
1326 return sts;
1327 }
1328
1329 /* touchpad_input_dev is read async in spi callback */
1330 smp_store_release(&applespi->touchpad_input_dev, touchpad_input_dev);
1331
1332 return 0;
1333}
1334
1335static void applespi_worker(struct work_struct *work)
1336{
1337 struct applespi_data *applespi =
1338 container_of(work, struct applespi_data, work);
1339
1340 applespi_register_touchpad_device(applespi, &applespi->rcvd_tp_info);
1341}
1342
1343static void applespi_handle_cmd_response(struct applespi_data *applespi,
1344 struct spi_packet *packet,
1345 struct message *message)
1346{
1347 if (packet->device == PACKET_DEV_INFO &&
1348 le16_to_cpu(message->type) == 0x1020) {
1349 /*
1350 * We're not allowed to sleep here, but registering an input
1351 * device can sleep.
1352 */
1353 applespi->rcvd_tp_info = message->tp_info;
1354 schedule_work(&applespi->work);
1355 return;
1356 }
1357
1358 if (le16_to_cpu(message->length) != 0x0000) {
1359 dev_warn_ratelimited(&applespi->spi->dev,
1360 "Received unexpected write response: length=%x\n",
1361 le16_to_cpu(message->length));
1362 return;
1363 }
1364
1365 if (packet->device == PACKET_DEV_TPAD &&
1366 le16_to_cpu(message->type) == 0x0252 &&
1367 le16_to_cpu(message->rsp_buf_len) == 0x0002)
1368 dev_info(&applespi->spi->dev, "modeswitch done.\n");
1369}
1370
1371static bool applespi_verify_crc(struct applespi_data *applespi, u8 *buffer,
1372 size_t buflen)
1373{
1374 u16 crc;
1375
1376 crc = crc16(0, buffer, buflen);
1377 if (crc) {
1378 dev_warn_ratelimited(&applespi->spi->dev,
1379 "Received corrupted packet (crc mismatch)\n");
1380 trace_applespi_bad_crc(ET_RD_CRC, READ, buffer, buflen);
1381
1382 return false;
1383 }
1384
1385 return true;
1386}
1387
1388static void applespi_debug_print_read_packet(struct applespi_data *applespi,
1389 struct spi_packet *packet)
1390{
1391 unsigned int evt_type;
1392
1393 if (packet->flags == PACKET_TYPE_READ &&
1394 packet->device == PACKET_DEV_KEYB)
1395 evt_type = ET_RD_KEYB;
1396 else if (packet->flags == PACKET_TYPE_READ &&
1397 packet->device == PACKET_DEV_TPAD)
1398 evt_type = ET_RD_TPAD;
1399 else if (packet->flags == PACKET_TYPE_WRITE)
1400 evt_type = applespi->cmd_evt_type;
1401 else
1402 evt_type = ET_RD_UNKN;
1403
1404 applespi_get_trace_fun(evt_type)(evt_type, PT_READ, applespi->rx_buffer,
1405 APPLESPI_PACKET_SIZE);
1406}
1407
1408static void applespi_got_data(struct applespi_data *applespi)
1409{
1410 struct spi_packet *packet;
1411 struct message *message;
1412 unsigned int msg_len;
1413 unsigned int off;
1414 unsigned int rem;
1415 unsigned int len;
1416
1417 /* process packet header */
1418 if (!applespi_verify_crc(applespi, applespi->rx_buffer,
1419 APPLESPI_PACKET_SIZE)) {
1420 unsigned long flags;
1421
1422 spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
1423
1424 if (applespi->drain) {
1425 applespi->read_active = false;
1426 applespi->write_active = false;
1427
1428 wake_up_all(&applespi->drain_complete);
1429 }
1430
1431 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
1432
1433 return;
1434 }
1435
1436 packet = (struct spi_packet *)applespi->rx_buffer;
1437
1438 applespi_debug_print_read_packet(applespi, packet);
1439
1440 off = le16_to_cpu(packet->offset);
1441 rem = le16_to_cpu(packet->remaining);
1442 len = le16_to_cpu(packet->length);
1443
1444 if (len > sizeof(packet->data)) {
1445 dev_warn_ratelimited(&applespi->spi->dev,
1446 "Received corrupted packet (invalid packet length %u)\n",
1447 len);
1448 goto msg_complete;
1449 }
1450
1451 /* handle multi-packet messages */
1452 if (rem > 0 || off > 0) {
1453 if (off != applespi->saved_msg_len) {
1454 dev_warn_ratelimited(&applespi->spi->dev,
1455 "Received unexpected offset (got %u, expected %u)\n",
1456 off, applespi->saved_msg_len);
1457 goto msg_complete;
1458 }
1459
1460 if (off + rem > MAX_PKTS_PER_MSG * APPLESPI_PACKET_SIZE) {
1461 dev_warn_ratelimited(&applespi->spi->dev,
1462 "Received message too large (size %u)\n",
1463 off + rem);
1464 goto msg_complete;
1465 }
1466
1467 if (off + len > MAX_PKTS_PER_MSG * APPLESPI_PACKET_SIZE) {
1468 dev_warn_ratelimited(&applespi->spi->dev,
1469 "Received message too large (size %u)\n",
1470 off + len);
1471 goto msg_complete;
1472 }
1473
1474 memcpy(applespi->msg_buf + off, &packet->data, len);
1475 applespi->saved_msg_len += len;
1476
1477 if (rem > 0)
1478 return;
1479
1480 message = (struct message *)applespi->msg_buf;
1481 msg_len = applespi->saved_msg_len;
1482 } else {
1483 message = (struct message *)&packet->data;
1484 msg_len = len;
1485 }
1486
1487 /* got complete message - verify */
1488 if (!applespi_verify_crc(applespi, (u8 *)message, msg_len))
1489 goto msg_complete;
1490
1491 if (le16_to_cpu(message->length) != msg_len - MSG_HEADER_SIZE - 2) {
1492 dev_warn_ratelimited(&applespi->spi->dev,
1493 "Received corrupted packet (invalid message length %u - expected %u)\n",
1494 le16_to_cpu(message->length),
1495 msg_len - MSG_HEADER_SIZE - 2);
1496 goto msg_complete;
1497 }
1498
1499 /* handle message */
1500 if (packet->flags == PACKET_TYPE_READ &&
1501 packet->device == PACKET_DEV_KEYB) {
1502 applespi_handle_keyboard_event(applespi, &message->keyboard);
1503
1504 } else if (packet->flags == PACKET_TYPE_READ &&
1505 packet->device == PACKET_DEV_TPAD) {
1506 struct touchpad_protocol *tp;
1507 size_t tp_len;
1508
1509 tp = &message->touchpad;
1510 tp_len = struct_size(tp, fingers, tp->number_of_fingers);
1511
1512 if (le16_to_cpu(message->length) + 2 != tp_len) {
1513 dev_warn_ratelimited(&applespi->spi->dev,
1514 "Received corrupted packet (invalid message length %u - num-fingers %u, tp-len %zu)\n",
1515 le16_to_cpu(message->length),
1516 tp->number_of_fingers, tp_len);
1517 goto msg_complete;
1518 }
1519
1520 if (tp->number_of_fingers > MAX_FINGERS) {
1521 dev_warn_ratelimited(&applespi->spi->dev,
1522 "Number of reported fingers (%u) exceeds max (%u))\n",
1523 tp->number_of_fingers,
1524 MAX_FINGERS);
1525 tp->number_of_fingers = MAX_FINGERS;
1526 }
1527
1528 report_tp_state(applespi, tp);
1529
1530 } else if (packet->flags == PACKET_TYPE_WRITE) {
1531 applespi_handle_cmd_response(applespi, packet, message);
1532 }
1533
1534msg_complete:
1535 applespi->saved_msg_len = 0;
1536
1537 applespi_msg_complete(applespi, packet->flags == PACKET_TYPE_WRITE,
1538 true);
1539}
1540
1541static void applespi_async_read_complete(void *context)
1542{
1543 struct applespi_data *applespi = context;
1544
1545 if (applespi->rd_m.status < 0) {
1546 dev_warn(&applespi->spi->dev, "Error reading from device: %d\n",
1547 applespi->rd_m.status);
1548 /*
1549 * We don't actually know if this was a pure read, or a response
1550 * to a write. But this is a rare error condition that should
1551 * never occur, so clearing both flags to avoid deadlock.
1552 */
1553 applespi_msg_complete(applespi, true, true);
1554 } else {
1555 applespi_got_data(applespi);
1556 }
1557
1558 acpi_finish_gpe(NULL, applespi->gpe);
1559}
1560
1561static u32 applespi_notify(acpi_handle gpe_device, u32 gpe, void *context)
1562{
1563 struct applespi_data *applespi = context;
1564 int sts;
1565 unsigned long flags;
1566
1567 trace_applespi_irq_received(ET_RD_IRQ, PT_READ);
1568
1569 spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
1570
1571 if (!applespi->suspended) {
1572 sts = applespi_async(applespi, &applespi->rd_m,
1573 applespi_async_read_complete);
1574 if (sts)
1575 dev_warn(&applespi->spi->dev,
1576 "Error queueing async read to device: %d\n",
1577 sts);
1578 else
1579 applespi->read_active = true;
1580 }
1581
1582 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
1583
1584 return ACPI_INTERRUPT_HANDLED;
1585}
1586
1587static int applespi_get_saved_bl_level(struct applespi_data *applespi)
1588{
1589 struct efivar_entry *efivar_entry;
1590 u16 efi_data = 0;
1591 unsigned long efi_data_len;
1592 int sts;
1593
1594 efivar_entry = kmalloc(sizeof(*efivar_entry), GFP_KERNEL);
1595 if (!efivar_entry)
1596 return -ENOMEM;
1597
1598 memcpy(efivar_entry->var.VariableName, EFI_BL_LEVEL_NAME,
1599 sizeof(EFI_BL_LEVEL_NAME));
1600 efivar_entry->var.VendorGuid = EFI_BL_LEVEL_GUID;
1601 efi_data_len = sizeof(efi_data);
1602
1603 sts = efivar_entry_get(efivar_entry, NULL, &efi_data_len, &efi_data);
1604 if (sts && sts != -ENOENT)
1605 dev_warn(&applespi->spi->dev,
1606 "Error getting backlight level from EFI vars: %d\n",
1607 sts);
1608
1609 kfree(efivar_entry);
1610
1611 return sts ? sts : efi_data;
1612}
1613
1614static void applespi_save_bl_level(struct applespi_data *applespi,
1615 unsigned int level)
1616{
1617 efi_guid_t efi_guid;
1618 u32 efi_attr;
1619 unsigned long efi_data_len;
1620 u16 efi_data;
1621 int sts;
1622
1623 /* Save keyboard backlight level */
1624 efi_guid = EFI_BL_LEVEL_GUID;
1625 efi_data = (u16)level;
1626 efi_data_len = sizeof(efi_data);
1627 efi_attr = EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS |
1628 EFI_VARIABLE_RUNTIME_ACCESS;
1629
1630 sts = efivar_entry_set_safe((efi_char16_t *)EFI_BL_LEVEL_NAME, efi_guid,
1631 efi_attr, true, efi_data_len, &efi_data);
1632 if (sts)
1633 dev_warn(&applespi->spi->dev,
1634 "Error saving backlight level to EFI vars: %d\n", sts);
1635}
1636
1637static int applespi_probe(struct spi_device *spi)
1638{
1639 struct applespi_data *applespi;
1640 acpi_handle spi_handle = ACPI_HANDLE(&spi->dev);
1641 acpi_status acpi_sts;
1642 int sts, i;
1643 unsigned long long gpe, usb_status;
1644
1645 /* check if the USB interface is present and enabled already */
1646 acpi_sts = acpi_evaluate_integer(spi_handle, "UIST", NULL, &usb_status);
1647 if (ACPI_SUCCESS(acpi_sts) && usb_status) {
1648 /* let the USB driver take over instead */
1649 dev_info(&spi->dev, "USB interface already enabled\n");
1650 return -ENODEV;
1651 }
1652
1653 /* allocate driver data */
1654 applespi = devm_kzalloc(&spi->dev, sizeof(*applespi), GFP_KERNEL);
1655 if (!applespi)
1656 return -ENOMEM;
1657
1658 applespi->spi = spi;
1659
1660 INIT_WORK(&applespi->work, applespi_worker);
1661
1662 /* store the driver data */
1663 spi_set_drvdata(spi, applespi);
1664
1665 /* create our buffers */
1666 applespi->tx_buffer = devm_kmalloc(&spi->dev, APPLESPI_PACKET_SIZE,
1667 GFP_KERNEL);
1668 applespi->tx_status = devm_kmalloc(&spi->dev, APPLESPI_STATUS_SIZE,
1669 GFP_KERNEL);
1670 applespi->rx_buffer = devm_kmalloc(&spi->dev, APPLESPI_PACKET_SIZE,
1671 GFP_KERNEL);
1672 applespi->msg_buf = devm_kmalloc_array(&spi->dev, MAX_PKTS_PER_MSG,
1673 APPLESPI_PACKET_SIZE,
1674 GFP_KERNEL);
1675
1676 if (!applespi->tx_buffer || !applespi->tx_status ||
1677 !applespi->rx_buffer || !applespi->msg_buf)
1678 return -ENOMEM;
1679
1680 /* set up our spi messages */
1681 applespi_setup_read_txfrs(applespi);
1682 applespi_setup_write_txfrs(applespi);
1683
1684 /* cache ACPI method handles */
1685 acpi_sts = acpi_get_handle(spi_handle, "SIEN", &applespi->sien);
1686 if (ACPI_FAILURE(acpi_sts)) {
1687 dev_err(&applespi->spi->dev,
1688 "Failed to get SIEN ACPI method handle: %s\n",
1689 acpi_format_exception(acpi_sts));
1690 return -ENODEV;
1691 }
1692
1693 acpi_sts = acpi_get_handle(spi_handle, "SIST", &applespi->sist);
1694 if (ACPI_FAILURE(acpi_sts)) {
1695 dev_err(&applespi->spi->dev,
1696 "Failed to get SIST ACPI method handle: %s\n",
1697 acpi_format_exception(acpi_sts));
1698 return -ENODEV;
1699 }
1700
1701 /* switch on the SPI interface */
1702 sts = applespi_setup_spi(applespi);
1703 if (sts)
1704 return sts;
1705
1706 sts = applespi_enable_spi(applespi);
1707 if (sts)
1708 return sts;
1709
1710 /* setup the keyboard input dev */
1711 applespi->keyboard_input_dev = devm_input_allocate_device(&spi->dev);
1712
1713 if (!applespi->keyboard_input_dev)
1714 return -ENOMEM;
1715
1716 applespi->keyboard_input_dev->name = "Apple SPI Keyboard";
1717 applespi->keyboard_input_dev->phys = "applespi/input0";
1718 applespi->keyboard_input_dev->dev.parent = &spi->dev;
1719 applespi->keyboard_input_dev->id.bustype = BUS_SPI;
1720
1721 applespi->keyboard_input_dev->evbit[0] =
1722 BIT_MASK(EV_KEY) | BIT_MASK(EV_LED) | BIT_MASK(EV_REP);
1723 applespi->keyboard_input_dev->ledbit[0] = BIT_MASK(LED_CAPSL);
1724
1725 input_set_drvdata(applespi->keyboard_input_dev, applespi);
1726 applespi->keyboard_input_dev->event = applespi_event;
1727
1728 for (i = 0; i < ARRAY_SIZE(applespi_scancodes); i++)
1729 if (applespi_scancodes[i])
1730 input_set_capability(applespi->keyboard_input_dev,
1731 EV_KEY, applespi_scancodes[i]);
1732
1733 for (i = 0; i < ARRAY_SIZE(applespi_controlcodes); i++)
1734 if (applespi_controlcodes[i])
1735 input_set_capability(applespi->keyboard_input_dev,
1736 EV_KEY, applespi_controlcodes[i]);
1737
1738 for (i = 0; i < ARRAY_SIZE(applespi_fn_codes); i++)
1739 if (applespi_fn_codes[i].to)
1740 input_set_capability(applespi->keyboard_input_dev,
1741 EV_KEY, applespi_fn_codes[i].to);
1742
1743 input_set_capability(applespi->keyboard_input_dev, EV_KEY, KEY_FN);
1744
1745 sts = input_register_device(applespi->keyboard_input_dev);
1746 if (sts) {
1747 dev_err(&applespi->spi->dev,
1748 "Unable to register keyboard input device (%d)\n", sts);
1749 return -ENODEV;
1750 }
1751
1752 /*
1753 * The applespi device doesn't send interrupts normally (as is described
1754 * in its DSDT), but rather seems to use ACPI GPEs.
1755 */
1756 acpi_sts = acpi_evaluate_integer(spi_handle, "_GPE", NULL, &gpe);
1757 if (ACPI_FAILURE(acpi_sts)) {
1758 dev_err(&applespi->spi->dev,
1759 "Failed to obtain GPE for SPI slave device: %s\n",
1760 acpi_format_exception(acpi_sts));
1761 return -ENODEV;
1762 }
1763 applespi->gpe = (int)gpe;
1764
1765 acpi_sts = acpi_install_gpe_handler(NULL, applespi->gpe,
1766 ACPI_GPE_LEVEL_TRIGGERED,
1767 applespi_notify, applespi);
1768 if (ACPI_FAILURE(acpi_sts)) {
1769 dev_err(&applespi->spi->dev,
1770 "Failed to install GPE handler for GPE %d: %s\n",
1771 applespi->gpe, acpi_format_exception(acpi_sts));
1772 return -ENODEV;
1773 }
1774
1775 applespi->suspended = false;
1776
1777 acpi_sts = acpi_enable_gpe(NULL, applespi->gpe);
1778 if (ACPI_FAILURE(acpi_sts)) {
1779 dev_err(&applespi->spi->dev,
1780 "Failed to enable GPE handler for GPE %d: %s\n",
1781 applespi->gpe, acpi_format_exception(acpi_sts));
1782 acpi_remove_gpe_handler(NULL, applespi->gpe, applespi_notify);
1783 return -ENODEV;
1784 }
1785
1786 /* trigger touchpad setup */
1787 applespi_init(applespi, false);
1788
1789 /*
1790 * By default this device is not enabled for wakeup; but USB keyboards
1791 * generally are, so the expectation is that by default the keyboard
1792 * will wake the system.
1793 */
1794 device_wakeup_enable(&spi->dev);
1795
1796 /* set up keyboard-backlight */
1797 sts = applespi_get_saved_bl_level(applespi);
1798 if (sts >= 0)
1799 applespi_set_bl_level(&applespi->backlight_info, sts);
1800
1801 applespi->backlight_info.name = "spi::kbd_backlight";
1802 applespi->backlight_info.default_trigger = "kbd-backlight";
1803 applespi->backlight_info.brightness_set = applespi_set_bl_level;
1804
1805 sts = devm_led_classdev_register(&spi->dev, &applespi->backlight_info);
1806 if (sts)
1807 dev_warn(&applespi->spi->dev,
1808 "Unable to register keyboard backlight class dev (%d)\n",
1809 sts);
1810
1811 /* set up debugfs entries for touchpad dimensions logging */
1812 applespi->debugfs_root = debugfs_create_dir("applespi", NULL);
1813
1814 debugfs_create_bool("enable_tp_dim", 0600, applespi->debugfs_root,
1815 &applespi->debug_tp_dim);
1816
1817 debugfs_create_file("tp_dim", 0400, applespi->debugfs_root, applespi,
1818 &applespi_tp_dim_fops);
1819
1820 return 0;
1821}
1822
1823static void applespi_drain_writes(struct applespi_data *applespi)
1824{
1825 unsigned long flags;
1826
1827 spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
1828
1829 applespi->drain = true;
1830 wait_event_lock_irq(applespi->drain_complete, !applespi->write_active,
1831 applespi->cmd_msg_lock);
1832
1833 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
1834}
1835
1836static void applespi_drain_reads(struct applespi_data *applespi)
1837{
1838 unsigned long flags;
1839
1840 spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
1841
1842 wait_event_lock_irq(applespi->drain_complete, !applespi->read_active,
1843 applespi->cmd_msg_lock);
1844
1845 applespi->suspended = true;
1846
1847 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
1848}
1849
1850static int applespi_remove(struct spi_device *spi)
1851{
1852 struct applespi_data *applespi = spi_get_drvdata(spi);
1853
1854 applespi_drain_writes(applespi);
1855
1856 acpi_disable_gpe(NULL, applespi->gpe);
1857 acpi_remove_gpe_handler(NULL, applespi->gpe, applespi_notify);
1858 device_wakeup_disable(&spi->dev);
1859
1860 applespi_drain_reads(applespi);
1861
1862 debugfs_remove_recursive(applespi->debugfs_root);
1863
1864 return 0;
1865}
1866
1867static void applespi_shutdown(struct spi_device *spi)
1868{
1869 struct applespi_data *applespi = spi_get_drvdata(spi);
1870
1871 applespi_save_bl_level(applespi, applespi->have_bl_level);
1872}
1873
1874static int applespi_poweroff_late(struct device *dev)
1875{
1876 struct spi_device *spi = to_spi_device(dev);
1877 struct applespi_data *applespi = spi_get_drvdata(spi);
1878
1879 applespi_save_bl_level(applespi, applespi->have_bl_level);
1880
1881 return 0;
1882}
1883
1884static int __maybe_unused applespi_suspend(struct device *dev)
1885{
1886 struct spi_device *spi = to_spi_device(dev);
1887 struct applespi_data *applespi = spi_get_drvdata(spi);
1888 acpi_status acpi_sts;
1889 int sts;
1890
1891 /* turn off caps-lock - it'll stay on otherwise */
1892 sts = applespi_set_capsl_led(applespi, false);
1893 if (sts)
1894 dev_warn(&applespi->spi->dev,
1895 "Failed to turn off caps-lock led (%d)\n", sts);
1896
1897 applespi_drain_writes(applespi);
1898
1899 /* disable the interrupt */
1900 acpi_sts = acpi_disable_gpe(NULL, applespi->gpe);
1901 if (ACPI_FAILURE(acpi_sts))
1902 dev_err(&applespi->spi->dev,
1903 "Failed to disable GPE handler for GPE %d: %s\n",
1904 applespi->gpe, acpi_format_exception(acpi_sts));
1905
1906 applespi_drain_reads(applespi);
1907
1908 return 0;
1909}
1910
1911static int __maybe_unused applespi_resume(struct device *dev)
1912{
1913 struct spi_device *spi = to_spi_device(dev);
1914 struct applespi_data *applespi = spi_get_drvdata(spi);
1915 acpi_status acpi_sts;
1916 unsigned long flags;
1917
1918 /* ensure our flags and state reflect a newly resumed device */
1919 spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
1920
1921 applespi->drain = false;
1922 applespi->have_cl_led_on = false;
1923 applespi->have_bl_level = 0;
1924 applespi->cmd_msg_queued = false;
1925 applespi->read_active = false;
1926 applespi->write_active = false;
1927
1928 applespi->suspended = false;
1929
1930 spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
1931
1932 /* switch on the SPI interface */
1933 applespi_enable_spi(applespi);
1934
1935 /* re-enable the interrupt */
1936 acpi_sts = acpi_enable_gpe(NULL, applespi->gpe);
1937 if (ACPI_FAILURE(acpi_sts))
1938 dev_err(&applespi->spi->dev,
1939 "Failed to re-enable GPE handler for GPE %d: %s\n",
1940 applespi->gpe, acpi_format_exception(acpi_sts));
1941
1942 /* switch the touchpad into multitouch mode */
1943 applespi_init(applespi, true);
1944
1945 return 0;
1946}
1947
1948static const struct acpi_device_id applespi_acpi_match[] = {
1949 { "APP000D", 0 },
1950 { }
1951};
1952MODULE_DEVICE_TABLE(acpi, applespi_acpi_match);
1953
1954static const struct dev_pm_ops applespi_pm_ops = {
1955 SET_SYSTEM_SLEEP_PM_OPS(applespi_suspend, applespi_resume)
1956 .poweroff_late = applespi_poweroff_late,
1957};
1958
1959static struct spi_driver applespi_driver = {
1960 .driver = {
1961 .name = "applespi",
1962 .acpi_match_table = applespi_acpi_match,
1963 .pm = &applespi_pm_ops,
1964 },
1965 .probe = applespi_probe,
1966 .remove = applespi_remove,
1967 .shutdown = applespi_shutdown,
1968};
1969
1970module_spi_driver(applespi_driver)
1971
1972MODULE_LICENSE("GPL v2");
1973MODULE_DESCRIPTION("MacBook(Pro) SPI Keyboard/Touchpad driver");
1974MODULE_AUTHOR("Federico Lorenzi");
1975MODULE_AUTHOR("Ronald Tschalär");