Lines Matching full:z2

3  * Apple Z2 touchscreen driver
30 #define CAL_PROP_NAME "apple,z2-cal-blob"
82 static void apple_z2_parse_touches(struct apple_z2 *z2, in apple_z2_parse_touches() argument
96 slot = input_mt_get_slot_by_key(z2->input_dev, fingers[i].finger); in apple_z2_parse_touches()
98 dev_warn(&z2->spidev->dev, "unable to get slot for finger\n"); in apple_z2_parse_touches()
103 input_mt_slot(z2->input_dev, slot); in apple_z2_parse_touches()
104 if (!input_mt_report_slot_state(z2->input_dev, MT_TOOL_FINGER, slot_valid)) in apple_z2_parse_touches()
106 touchscreen_report_pos(z2->input_dev, &z2->props, in apple_z2_parse_touches()
110 input_report_abs(z2->input_dev, ABS_MT_WIDTH_MAJOR, in apple_z2_parse_touches()
112 input_report_abs(z2->input_dev, ABS_MT_WIDTH_MINOR, in apple_z2_parse_touches()
114 input_report_abs(z2->input_dev, ABS_MT_ORIENTATION, in apple_z2_parse_touches()
116 input_report_abs(z2->input_dev, ABS_MT_TOUCH_MAJOR, in apple_z2_parse_touches()
118 input_report_abs(z2->input_dev, ABS_MT_TOUCH_MINOR, in apple_z2_parse_touches()
121 input_mt_sync_frame(z2->input_dev); in apple_z2_parse_touches()
122 input_sync(z2->input_dev); in apple_z2_parse_touches()
125 static int apple_z2_read_packet(struct apple_z2 *z2) in apple_z2_read_packet() argument
127 struct apple_z2_read_interrupt_cmd *len_cmd = (void *)z2->tx_buf; in apple_z2_read_packet()
134 len_cmd->counter = z2->index_parity + 1; in apple_z2_read_packet()
137 z2->index_parity = !z2->index_parity; in apple_z2_read_packet()
138 xfer.tx_buf = z2->tx_buf; in apple_z2_read_packet()
139 xfer.rx_buf = z2->rx_buf; in apple_z2_read_packet()
142 error = spi_sync_transfer(z2->spidev, &xfer, 1); in apple_z2_read_packet()
146 if (z2->rx_buf[0] != APPLE_Z2_REPLY_INTERRUPT_DATA) in apple_z2_read_packet()
149 pkt_len = (get_unaligned_le16(z2->rx_buf + 1) + 8) & 0xfffffffc; in apple_z2_read_packet()
151 error = spi_read(z2->spidev, z2->rx_buf, pkt_len); in apple_z2_read_packet()
155 apple_z2_parse_touches(z2, z2->rx_buf + 5, pkt_len - 5); in apple_z2_read_packet()
162 struct apple_z2 *z2 = data; in apple_z2_irq() local
164 if (unlikely(!z2->booted)) in apple_z2_irq()
165 complete(&z2->boot_irq); in apple_z2_irq()
167 apple_z2_read_packet(z2); in apple_z2_irq()
173 static const u8 *apple_z2_build_cal_blob(struct apple_z2 *z2, in apple_z2_build_cal_blob() argument
185 if (!device_property_present(&z2->spidev->dev, CAL_PROP_NAME)) in apple_z2_build_cal_blob()
188 cal_size = device_property_count_u8(&z2->spidev->dev, CAL_PROP_NAME); in apple_z2_build_cal_blob()
208 error = device_property_read_u8_array(&z2->spidev->dev, CAL_PROP_NAME, in apple_z2_build_cal_blob()
222 static int apple_z2_send_firmware_blob(struct apple_z2 *z2, const u8 *data, in apple_z2_send_firmware_blob() argument
229 z2->tx_buf[0] = 0x1a; in apple_z2_send_firmware_blob()
230 z2->tx_buf[1] = 0xa1; in apple_z2_send_firmware_blob()
241 ack_xfer.tx_buf = z2->tx_buf; in apple_z2_send_firmware_blob()
245 reinit_completion(&z2->boot_irq); in apple_z2_send_firmware_blob()
246 error = spi_sync(z2->spidev, &msg); in apple_z2_send_firmware_blob()
251 wait_for_completion_timeout(&z2->boot_irq, msecs_to_jiffies(20)); in apple_z2_send_firmware_blob()
256 static int apple_z2_upload_firmware(struct apple_z2 *z2) in apple_z2_upload_firmware() argument
267 error = request_firmware(&fw, z2->fw_name, &z2->spidev->dev); in apple_z2_upload_firmware()
269 dev_err(&z2->spidev->dev, "unable to load firmware\n"); in apple_z2_upload_firmware()
275 dev_err(&z2->spidev->dev, "invalid firmware header\n"); in apple_z2_upload_firmware()
286 dev_err(&z2->spidev->dev, "firmware malformed\n"); in apple_z2_upload_firmware()
296 dev_err(&z2->spidev->dev, "firmware malformed\n"); in apple_z2_upload_firmware()
300 error = apple_z2_send_firmware_blob(z2, fw->data + fw_idx, in apple_z2_upload_firmware()
310 apple_z2_build_cal_blob(z2, address, &size); in apple_z2_upload_firmware()
315 error = apple_z2_send_firmware_blob(z2, data, size, false); in apple_z2_upload_firmware()
320 dev_err(&z2->spidev->dev, "firmware malformed\n"); in apple_z2_upload_firmware()
327 z2->booted = true; in apple_z2_upload_firmware()
328 apple_z2_read_packet(z2); in apple_z2_upload_firmware()
332 static int apple_z2_boot(struct apple_z2 *z2) in apple_z2_boot() argument
336 reinit_completion(&z2->boot_irq); in apple_z2_boot()
337 enable_irq(z2->spidev->irq); in apple_z2_boot()
338 gpiod_set_value(z2->reset_gpio, 0); in apple_z2_boot()
339 if (!wait_for_completion_timeout(&z2->boot_irq, msecs_to_jiffies(20))) in apple_z2_boot()
342 error = apple_z2_upload_firmware(z2); in apple_z2_boot()
344 gpiod_set_value(z2->reset_gpio, 1); in apple_z2_boot()
345 disable_irq(z2->spidev->irq); in apple_z2_boot()
355 struct apple_z2 *z2; in apple_z2_probe() local
358 z2 = devm_kzalloc(dev, sizeof(*z2), GFP_KERNEL); in apple_z2_probe()
359 if (!z2) in apple_z2_probe()
362 z2->tx_buf = devm_kzalloc(dev, sizeof(struct apple_z2_read_interrupt_cmd), GFP_KERNEL); in apple_z2_probe()
363 if (!z2->tx_buf) in apple_z2_probe()
366 z2->rx_buf = devm_kzalloc(dev, 4000, GFP_KERNEL); in apple_z2_probe()
367 if (!z2->rx_buf) in apple_z2_probe()
370 z2->spidev = spi; in apple_z2_probe()
371 init_completion(&z2->boot_irq); in apple_z2_probe()
372 spi_set_drvdata(spi, z2); in apple_z2_probe()
375 z2->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH); in apple_z2_probe()
376 if (IS_ERR(z2->reset_gpio)) in apple_z2_probe()
377 return dev_err_probe(dev, PTR_ERR(z2->reset_gpio), "unable to get reset\n"); in apple_z2_probe()
379 error = devm_request_threaded_irq(dev, z2->spidev->irq, NULL, apple_z2_irq, in apple_z2_probe()
381 "apple-z2-irq", z2); in apple_z2_probe()
385 error = device_property_read_string(dev, "firmware-name", &z2->fw_name); in apple_z2_probe()
389 z2->input_dev = devm_input_allocate_device(dev); in apple_z2_probe()
390 if (!z2->input_dev) in apple_z2_probe()
393 z2->input_dev->name = (char *)spi_get_device_id(spi)->driver_data; in apple_z2_probe()
394 z2->input_dev->phys = "apple_z2"; in apple_z2_probe()
395 z2->input_dev->id.bustype = BUS_SPI; in apple_z2_probe()
398 input_set_abs_params(z2->input_dev, ABS_MT_POSITION_X, 0, 0, 0, 0); in apple_z2_probe()
399 input_set_abs_params(z2->input_dev, ABS_MT_POSITION_Y, 0, 0, 0, 0); in apple_z2_probe()
400 touchscreen_parse_properties(z2->input_dev, true, &z2->props); in apple_z2_probe()
401 input_abs_set_res(z2->input_dev, ABS_MT_POSITION_X, 100); in apple_z2_probe()
402 input_abs_set_res(z2->input_dev, ABS_MT_POSITION_Y, 100); in apple_z2_probe()
403 input_set_abs_params(z2->input_dev, ABS_MT_WIDTH_MAJOR, 0, 65535, 0, 0); in apple_z2_probe()
404 input_set_abs_params(z2->input_dev, ABS_MT_WIDTH_MINOR, 0, 65535, 0, 0); in apple_z2_probe()
405 input_set_abs_params(z2->input_dev, ABS_MT_TOUCH_MAJOR, 0, 65535, 0, 0); in apple_z2_probe()
406 input_set_abs_params(z2->input_dev, ABS_MT_TOUCH_MINOR, 0, 65535, 0, 0); in apple_z2_probe()
407 input_set_abs_params(z2->input_dev, ABS_MT_ORIENTATION, -32768, 32767, 0, 0); in apple_z2_probe()
409 error = input_mt_init_slots(z2->input_dev, 256, INPUT_MT_DIRECT); in apple_z2_probe()
413 error = input_register_device(z2->input_dev); in apple_z2_probe()
419 error = apple_z2_boot(z2); in apple_z2_probe()
428 struct apple_z2 *z2 = spi_get_drvdata(spi); in apple_z2_shutdown() local
430 disable_irq(z2->spidev->irq); in apple_z2_shutdown()
431 gpiod_direction_output(z2->reset_gpio, 1); in apple_z2_shutdown()
432 z2->booted = false; in apple_z2_shutdown()
444 struct apple_z2 *z2 = spi_get_drvdata(to_spi_device(dev)); in apple_z2_resume() local
446 return apple_z2_boot(z2); in apple_z2_resume()
467 .name = "apple-z2",
481 MODULE_DESCRIPTION("Apple Z2 touchscreens driver");