1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 26696777cSDuson Lin /* 36696777cSDuson Lin * Elan I2C/SMBus Touchpad driver 46696777cSDuson Lin * 56696777cSDuson Lin * Copyright (c) 2013 ELAN Microelectronics Corp. 66696777cSDuson Lin * 76696777cSDuson Lin * Author: 林政維 (Duson Lin) <dusonlin@emc.com.tw> 86696777cSDuson Lin * 96696777cSDuson Lin * Based on cyapa driver: 106696777cSDuson Lin * copyright (c) 2011-2012 Cypress Semiconductor, Inc. 116696777cSDuson Lin * copyright (c) 2011-2012 Google, Inc. 126696777cSDuson Lin * 136696777cSDuson Lin * Trademarks are the property of their respective owners. 146696777cSDuson Lin */ 156696777cSDuson Lin 166696777cSDuson Lin #ifndef _ELAN_I2C_H 1761c797d5SNicolas Iooss #define _ELAN_I2C_H 186696777cSDuson Lin 196696777cSDuson Lin #include <linux/types.h> 206696777cSDuson Lin 216696777cSDuson Lin #define ETP_ENABLE_ABS 0x0001 226696777cSDuson Lin #define ETP_ENABLE_CALIBRATE 0x0002 236696777cSDuson Lin #define ETP_DISABLE_CALIBRATE 0x0000 246696777cSDuson Lin #define ETP_DISABLE_POWER 0x0001 25b9bced0eSduson #define ETP_PRESSURE_OFFSET 25 266696777cSDuson Lin 2750fc7b61SBen Hutchings #define ETP_CALIBRATE_MAX_LEN 3 2850fc7b61SBen Hutchings 2904d5ce62SJingle Wu #define ETP_FEATURE_REPORT_MK BIT(0) 3004d5ce62SJingle Wu 31056115daSJingle Wu #define ETP_REPORT_ID 0x5D 32056115daSJingle Wu #define ETP_TP_REPORT_ID 0x5E 33056115daSJingle Wu #define ETP_TP_REPORT_ID2 0x5F 34056115daSJingle Wu #define ETP_REPORT_ID2 0x60 /* High precision report */ 35056115daSJingle Wu 36056115daSJingle Wu #define ETP_REPORT_ID_OFFSET 2 37056115daSJingle Wu #define ETP_TOUCH_INFO_OFFSET 3 38056115daSJingle Wu #define ETP_FINGER_DATA_OFFSET 4 39056115daSJingle Wu #define ETP_HOVER_INFO_OFFSET 30 40056115daSJingle Wu #define ETP_MK_DATA_OFFSET 33 /* For high precision reports */ 41056115daSJingle Wu 42056115daSJingle Wu #define ETP_MAX_REPORT_LEN 39 43056115daSJingle Wu 44056115daSJingle Wu #define ETP_MAX_FINGERS 5 45056115daSJingle Wu #define ETP_FINGER_DATA_LEN 5 46056115daSJingle Wu 476696777cSDuson Lin /* IAP Firmware handling */ 487b9f1830SCharlie Mooney #define ETP_PRODUCT_ID_FORMAT_STRING "%d.0" 497b9f1830SCharlie Mooney #define ETP_FW_NAME "elan_i2c_" ETP_PRODUCT_ID_FORMAT_STRING ".bin" 506696777cSDuson Lin #define ETP_IAP_START_ADDR 0x0083 516696777cSDuson Lin #define ETP_FW_IAP_PAGE_ERR (1 << 5) 526696777cSDuson Lin #define ETP_FW_IAP_INTF_ERR (1 << 4) 536696777cSDuson Lin #define ETP_FW_PAGE_SIZE 64 54059d6c2dSJingle Wu #define ETP_FW_PAGE_SIZE_128 128 55059d6c2dSJingle Wu #define ETP_FW_PAGE_SIZE_512 512 56bb03bf3fSDuson Lin #define ETP_FW_SIGNATURE_SIZE 6 576696777cSDuson Lin 58*d198b827Sjingle.wu #define ETP_PRODUCT_ID_WHITEBOX 0x00B8 59ea16ef96SJingle Wu #define ETP_PRODUCT_ID_VOXEL 0x00BF 60*d198b827Sjingle.wu #define ETP_PRODUCT_ID_DELBIN 0x00C2 61ea16ef96SJingle Wu #define ETP_PRODUCT_ID_MAGPIE 0x0120 62ea16ef96SJingle Wu #define ETP_PRODUCT_ID_BOBBA 0x0121 63ea16ef96SJingle Wu 646696777cSDuson Lin struct i2c_client; 656696777cSDuson Lin struct completion; 666696777cSDuson Lin 676696777cSDuson Lin enum tp_mode { 686696777cSDuson Lin IAP_MODE = 1, 696696777cSDuson Lin MAIN_MODE 706696777cSDuson Lin }; 716696777cSDuson Lin 726696777cSDuson Lin struct elan_transport_ops { 736696777cSDuson Lin int (*initialize)(struct i2c_client *client); 746696777cSDuson Lin int (*sleep_control)(struct i2c_client *, bool sleep); 756696777cSDuson Lin int (*power_control)(struct i2c_client *, bool enable); 766696777cSDuson Lin int (*set_mode)(struct i2c_client *client, u8 mode); 776696777cSDuson Lin 786696777cSDuson Lin int (*calibrate)(struct i2c_client *client); 796696777cSDuson Lin int (*calibrate_result)(struct i2c_client *client, u8 *val); 806696777cSDuson Lin 816696777cSDuson Lin int (*get_baseline_data)(struct i2c_client *client, 82bfcf3d48SNikolai Kostrigin bool max_baseline, u8 *value); 836696777cSDuson Lin 843d712af6SDmitry Torokhov int (*get_version)(struct i2c_client *client, u8 pattern, bool iap, 853d712af6SDmitry Torokhov u8 *version); 863d712af6SDmitry Torokhov int (*get_sm_version)(struct i2c_client *client, u8 pattern, 8799136881SKT Liao u16 *ic_type, u8 *version, u8 *clickpad); 886696777cSDuson Lin int (*get_checksum)(struct i2c_client *client, bool iap, u16 *csum); 89ed75a14eSDuson Lin int (*get_product_id)(struct i2c_client *client, u16 *id); 906696777cSDuson Lin 916696777cSDuson Lin int (*get_max)(struct i2c_client *client, 926696777cSDuson Lin unsigned int *max_x, unsigned int *max_y); 936696777cSDuson Lin int (*get_resolution)(struct i2c_client *client, 946696777cSDuson Lin u8 *hw_res_x, u8 *hw_res_y); 956696777cSDuson Lin int (*get_num_traces)(struct i2c_client *client, 966696777cSDuson Lin unsigned int *x_tracenum, 976696777cSDuson Lin unsigned int *y_tracenum); 986696777cSDuson Lin 996696777cSDuson Lin int (*iap_get_mode)(struct i2c_client *client, enum tp_mode *mode); 1006696777cSDuson Lin int (*iap_reset)(struct i2c_client *client); 1016696777cSDuson Lin 102bfd9b92bSJingle Wu int (*prepare_fw_update)(struct i2c_client *client, u16 ic_type, 103ae3d6083Sjingle.wu u8 iap_version, u16 fw_page_size); 104059d6c2dSJingle Wu int (*write_fw_block)(struct i2c_client *client, u16 fw_page_size, 1056696777cSDuson Lin const u8 *page, u16 checksum, int idx); 1066696777cSDuson Lin int (*finish_fw_update)(struct i2c_client *client, 1076696777cSDuson Lin struct completion *reset_done); 1086696777cSDuson Lin 10904d5ce62SJingle Wu int (*get_report_features)(struct i2c_client *client, u8 pattern, 11004d5ce62SJingle Wu unsigned int *features, 11104d5ce62SJingle Wu unsigned int *report_len); 11204d5ce62SJingle Wu int (*get_report)(struct i2c_client *client, u8 *report, 11304d5ce62SJingle Wu unsigned int report_len); 114b9bced0eSduson int (*get_pressure_adjustment)(struct i2c_client *client, 115b9bced0eSduson int *adjustment); 116a2eaf299SKT Liao int (*get_pattern)(struct i2c_client *client, u8 *pattern); 1176696777cSDuson Lin }; 1186696777cSDuson Lin 1196696777cSDuson Lin extern const struct elan_transport_ops elan_smbus_ops, elan_i2c_ops; 1206696777cSDuson Lin 1216696777cSDuson Lin #endif /* _ELAN_I2C_H */ 122