| .. | .. |
|---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-only */ |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Elan I2C/SMBus Touchpad driver |
|---|
| 3 | 4 | * |
|---|
| .. | .. |
|---|
| 8 | 9 | * Based on cyapa driver: |
|---|
| 9 | 10 | * copyright (c) 2011-2012 Cypress Semiconductor, Inc. |
|---|
| 10 | 11 | * copyright (c) 2011-2012 Google, Inc. |
|---|
| 11 | | - * |
|---|
| 12 | | - * This program is free software; you can redistribute it and/or modify it |
|---|
| 13 | | - * under the terms of the GNU General Public License version 2 as published |
|---|
| 14 | | - * by the Free Software Foundation. |
|---|
| 15 | 12 | * |
|---|
| 16 | 13 | * Trademarks are the property of their respective owners. |
|---|
| 17 | 14 | */ |
|---|
| .. | .. |
|---|
| 29 | 26 | |
|---|
| 30 | 27 | #define ETP_CALIBRATE_MAX_LEN 3 |
|---|
| 31 | 28 | |
|---|
| 29 | +#define ETP_FEATURE_REPORT_MK BIT(0) |
|---|
| 30 | + |
|---|
| 31 | +#define ETP_REPORT_ID 0x5D |
|---|
| 32 | +#define ETP_TP_REPORT_ID 0x5E |
|---|
| 33 | +#define ETP_TP_REPORT_ID2 0x5F |
|---|
| 34 | +#define ETP_REPORT_ID2 0x60 /* High precision report */ |
|---|
| 35 | + |
|---|
| 36 | +#define ETP_REPORT_ID_OFFSET 2 |
|---|
| 37 | +#define ETP_TOUCH_INFO_OFFSET 3 |
|---|
| 38 | +#define ETP_FINGER_DATA_OFFSET 4 |
|---|
| 39 | +#define ETP_HOVER_INFO_OFFSET 30 |
|---|
| 40 | +#define ETP_MK_DATA_OFFSET 33 /* For high precision reports */ |
|---|
| 41 | + |
|---|
| 42 | +#define ETP_MAX_REPORT_LEN 39 |
|---|
| 43 | + |
|---|
| 44 | +#define ETP_MAX_FINGERS 5 |
|---|
| 45 | +#define ETP_FINGER_DATA_LEN 5 |
|---|
| 46 | + |
|---|
| 32 | 47 | /* IAP Firmware handling */ |
|---|
| 33 | 48 | #define ETP_PRODUCT_ID_FORMAT_STRING "%d.0" |
|---|
| 34 | 49 | #define ETP_FW_NAME "elan_i2c_" ETP_PRODUCT_ID_FORMAT_STRING ".bin" |
|---|
| .. | .. |
|---|
| 36 | 51 | #define ETP_FW_IAP_PAGE_ERR (1 << 5) |
|---|
| 37 | 52 | #define ETP_FW_IAP_INTF_ERR (1 << 4) |
|---|
| 38 | 53 | #define ETP_FW_PAGE_SIZE 64 |
|---|
| 54 | +#define ETP_FW_PAGE_SIZE_128 128 |
|---|
| 55 | +#define ETP_FW_PAGE_SIZE_512 512 |
|---|
| 39 | 56 | #define ETP_FW_SIGNATURE_SIZE 6 |
|---|
| 40 | 57 | |
|---|
| 41 | 58 | struct i2c_client; |
|---|
| .. | .. |
|---|
| 58 | 75 | int (*get_baseline_data)(struct i2c_client *client, |
|---|
| 59 | 76 | bool max_baseliune, u8 *value); |
|---|
| 60 | 77 | |
|---|
| 61 | | - int (*get_version)(struct i2c_client *client, bool iap, u8 *version); |
|---|
| 62 | | - int (*get_sm_version)(struct i2c_client *client, |
|---|
| 78 | + int (*get_version)(struct i2c_client *client, u8 pattern, bool iap, |
|---|
| 79 | + u8 *version); |
|---|
| 80 | + int (*get_sm_version)(struct i2c_client *client, u8 pattern, |
|---|
| 63 | 81 | u16 *ic_type, u8 *version, u8 *clickpad); |
|---|
| 64 | 82 | int (*get_checksum)(struct i2c_client *client, bool iap, u16 *csum); |
|---|
| 65 | 83 | int (*get_product_id)(struct i2c_client *client, u16 *id); |
|---|
| .. | .. |
|---|
| 75 | 93 | int (*iap_get_mode)(struct i2c_client *client, enum tp_mode *mode); |
|---|
| 76 | 94 | int (*iap_reset)(struct i2c_client *client); |
|---|
| 77 | 95 | |
|---|
| 78 | | - int (*prepare_fw_update)(struct i2c_client *client); |
|---|
| 79 | | - int (*write_fw_block)(struct i2c_client *client, |
|---|
| 96 | + int (*prepare_fw_update)(struct i2c_client *client, u16 ic_type, |
|---|
| 97 | + u8 iap_version, u16 fw_page_size); |
|---|
| 98 | + int (*write_fw_block)(struct i2c_client *client, u16 fw_page_size, |
|---|
| 80 | 99 | const u8 *page, u16 checksum, int idx); |
|---|
| 81 | 100 | int (*finish_fw_update)(struct i2c_client *client, |
|---|
| 82 | 101 | struct completion *reset_done); |
|---|
| 83 | 102 | |
|---|
| 84 | | - int (*get_report)(struct i2c_client *client, u8 *report); |
|---|
| 103 | + int (*get_report_features)(struct i2c_client *client, u8 pattern, |
|---|
| 104 | + unsigned int *features, |
|---|
| 105 | + unsigned int *report_len); |
|---|
| 106 | + int (*get_report)(struct i2c_client *client, u8 *report, |
|---|
| 107 | + unsigned int report_len); |
|---|
| 85 | 108 | int (*get_pressure_adjustment)(struct i2c_client *client, |
|---|
| 86 | 109 | int *adjustment); |
|---|
| 87 | 110 | int (*get_pattern)(struct i2c_client *client, u8 *pattern); |
|---|