From 6a1e7103f60f9f61ceb031c52c920b5fe322dbc0 Mon Sep 17 00:00:00 2001 From: Vincent Huang Date: Thu, 31 Oct 2019 08:05:43 +0100 Subject: [PATCH] synaptics: Put sensor into lower power mode after closing --- libfprint/drivers/synaptics/bmkt_message.c | 3 ++ libfprint/drivers/synaptics/synaptics.c | 33 +++++++++++++++++----- tests/synaptics/custom.ioctl | 3 ++ 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/libfprint/drivers/synaptics/bmkt_message.c b/libfprint/drivers/synaptics/bmkt_message.c index fe0bebe..78dec26 100644 --- a/libfprint/drivers/synaptics/bmkt_message.c +++ b/libfprint/drivers/synaptics/bmkt_message.c @@ -405,6 +405,9 @@ int bmkt_parse_message_payload(bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) ret = parse_get_version_report(msg_resp, resp); resp->complete = 1; break; + case BMKT_RSP_POWER_DOWN_READY: + resp->complete = 1; + break; } return ret; diff --git a/libfprint/drivers/synaptics/synaptics.c b/libfprint/drivers/synaptics/synaptics.c index 8d08f0d..d5efa2a 100644 --- a/libfprint/drivers/synaptics/synaptics.c +++ b/libfprint/drivers/synaptics/synaptics.c @@ -1013,6 +1013,31 @@ fps_init_msg_cb(FpiDeviceSynaptics *self, fpi_device_error_new (FP_DEVICE_ERROR_GENERAL)); } } +static void +fps_deinit_cb(FpiDeviceSynaptics *self, + bmkt_response_t *resp, + GError *error) +{ + /* Release usb interface */ + g_usb_device_release_interface(fpi_device_get_usb_device(FP_DEVICE (self)), 0, 0, &error); + + g_clear_object (&self->interrupt_cancellable); + + if (!error) { + switch (resp->response_id) { + case BMKT_RSP_POWER_DOWN_READY: + fp_info("Fingerprint sensor ready to be powered down"); + break; + case BMKT_RSP_POWER_DOWN_FAIL: + fp_info("Failed to go to power down mode: %d", resp->result); + error = fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, + "Power down failed"); + + break; + } + } + fpi_device_close_complete(FP_DEVICE (self), error); +} static void dev_init (FpDevice *device) @@ -1043,16 +1068,10 @@ static void dev_exit(FpDevice *device) { FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS (device); - GError *error = NULL; G_DEBUG_HERE(); - /* Release usb interface */ - g_usb_device_release_interface(fpi_device_get_usb_device(device), 0, 0, &error); - - g_clear_object (&self->interrupt_cancellable); - - fpi_device_close_complete(device, error); + synaptics_sensor_cmd (self, 0, BMKT_CMD_POWER_DOWN_NOTIFY, NULL, 0, fps_deinit_cb); } static void diff --git a/tests/synaptics/custom.ioctl b/tests/synaptics/custom.ioctl index 4739bfc..370a8e0 100644 --- a/tests/synaptics/custom.ioctl +++ b/tests/synaptics/custom.ioctl @@ -181,3 +181,6 @@ USBDEVFS_REAPURBNDELAY 0 3 1 0 0 35 35 0 A7FE04651E4650312D30303030303030302D302 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 39 0 0000FE0468214F2B014650312D30303030303030302D302D30303030303030302D6E6F626F6479 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 36 36 0 A7FE05811F014650312D30303030303030302D302D30303030303030302D6E6F626F6479 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 37 0 0000FE05831F014650312D30303030303030302D302D30303030303030302D6E6F626F6479 +USBDEVFS_REAPURBNDELAY 0 3 1 0 0 5 5 0 A7FE06A100 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE06A200 +