.. | .. |
---|
| 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); |
---|