xref: /OK3568_Linux_fs/kernel/drivers/input/touchscreen/cyttsp5/cyttsp5_regs.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * cyttsp5_regs.h
3*4882a593Smuzhiyun  * Parade TrueTouch(TM) Standard Product V5 Registers.
4*4882a593Smuzhiyun  * For use with Parade touchscreen controllers.
5*4882a593Smuzhiyun  * Supported parts include:
6*4882a593Smuzhiyun  * CYTMA5XX
7*4882a593Smuzhiyun  * CYTMA448
8*4882a593Smuzhiyun  * CYTMA445A
9*4882a593Smuzhiyun  * CYTT21XXX
10*4882a593Smuzhiyun  * CYTT31XXX
11*4882a593Smuzhiyun  *
12*4882a593Smuzhiyun  * Copyright (C) 2015 Parade Technologies
13*4882a593Smuzhiyun  * Copyright (C) 2012-2015 Cypress Semiconductor
14*4882a593Smuzhiyun  *
15*4882a593Smuzhiyun  * This program is free software; you can redistribute it and/or
16*4882a593Smuzhiyun  * modify it under the terms of the GNU General Public License
17*4882a593Smuzhiyun  * version 2, and only version 2, as published by the
18*4882a593Smuzhiyun  * Free Software Foundation.
19*4882a593Smuzhiyun  *
20*4882a593Smuzhiyun  * This program is distributed in the hope that it will be useful,
21*4882a593Smuzhiyun  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22*4882a593Smuzhiyun  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23*4882a593Smuzhiyun  * GNU General Public License for more details.
24*4882a593Smuzhiyun  *
25*4882a593Smuzhiyun  * Contact Parade Technologies at www.paradetech.com <ttdrivers@paradetech.com>
26*4882a593Smuzhiyun  *
27*4882a593Smuzhiyun  */
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun #ifndef _CYTTSP5_REGS_H
30*4882a593Smuzhiyun #define _CYTTSP5_REGS_H
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #include <linux/device.h>
33*4882a593Smuzhiyun #ifdef CONFIG_HAS_EARLYSUSPEND
34*4882a593Smuzhiyun #include <linux/earlysuspend.h>
35*4882a593Smuzhiyun #elif defined(CONFIG_FB)
36*4882a593Smuzhiyun #include <linux/notifier.h>
37*4882a593Smuzhiyun #include <linux/fb.h>
38*4882a593Smuzhiyun #endif
39*4882a593Smuzhiyun #include <asm/unaligned.h>
40*4882a593Smuzhiyun #include <linux/debugfs.h>
41*4882a593Smuzhiyun #include <linux/delay.h>
42*4882a593Smuzhiyun #include <linux/err.h>
43*4882a593Smuzhiyun #include <linux/gpio.h>
44*4882a593Smuzhiyun #include <linux/hid.h>
45*4882a593Smuzhiyun #include <linux/input.h>
46*4882a593Smuzhiyun #include <linux/interrupt.h>
47*4882a593Smuzhiyun #include <linux/irq.h>
48*4882a593Smuzhiyun #include <linux/kernel.h>
49*4882a593Smuzhiyun #include <linux/limits.h>
50*4882a593Smuzhiyun #include <linux/module.h>
51*4882a593Smuzhiyun #include <linux/of_device.h>
52*4882a593Smuzhiyun #include <linux/of.h>
53*4882a593Smuzhiyun #include <linux/pm_runtime.h>
54*4882a593Smuzhiyun #include <linux/sched.h>
55*4882a593Smuzhiyun #include <linux/slab.h>
56*4882a593Smuzhiyun #include <linux/suspend.h>
57*4882a593Smuzhiyun #include <linux/stringify.h>
58*4882a593Smuzhiyun #include <linux/types.h>
59*4882a593Smuzhiyun #include <linux/uaccess.h>
60*4882a593Smuzhiyun #include <linux/workqueue.h>
61*4882a593Smuzhiyun #include <linux/version.h>
62*4882a593Smuzhiyun #include <linux/i2c.h>
63*4882a593Smuzhiyun #include <linux/timer.h>
64*4882a593Smuzhiyun #include <linux/timex.h>
65*4882a593Smuzhiyun #include <linux/rtc.h>
66*4882a593Smuzhiyun #include "../tp_suspend.h"
67*4882a593Smuzhiyun #include "cyttsp5_core.h"
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun //2019-03-22
70*4882a593Smuzhiyun //this may cause system hang on mod_timer_pending during call cyttsp5_parse_input,
71*4882a593Smuzhiyun //maybe there are some troubles when working on linux 4.19.
72*4882a593Smuzhiyun //#define CYTTSP_WATCHDOG_DELAY_ENBALE
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun /* #define EASYWAKE_TSG6 */
75*4882a593Smuzhiyun //2018-12-19 ttconfig upgrade
76*4882a593Smuzhiyun #define CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_PLATFORM_TTCONFIG_UPGRADE
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun #define CY_FW_FILE_PREFIX	"cyttsp5_fw"
79*4882a593Smuzhiyun #define CY_FW_FILE_SUFFIX	".bin"
80*4882a593Smuzhiyun #define CY_FW_FILE_NAME		"cyttsp5_fw.bin"
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun #ifdef TTHE_TUNER_SUPPORT
83*4882a593Smuzhiyun #define CYTTSP5_TTHE_TUNER_FILE_NAME "tthe_tuner"
84*4882a593Smuzhiyun #endif
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun #define CY_MAX_PRBUF_SIZE           PIPE_BUF
87*4882a593Smuzhiyun #define CY_PR_TRUNCATED             " truncated..."
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun #define CY_DEFAULT_CORE_ID          "cyttsp5_core0"
90*4882a593Smuzhiyun #define CY_MAX_NUM_CORE_DEVS        5
91*4882a593Smuzhiyun #define CY_IRQ_ASSERTED_VALUE	0
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun #ifdef CY_ENABLE_MAX_ELEN
95*4882a593Smuzhiyun #define CY_MAX_ELEN 100
96*4882a593Smuzhiyun #endif
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun enum PARADE_DEBUG_LEVEL {
99*4882a593Smuzhiyun 	DEBUG_LEVEL_0,/*no debug info*/
100*4882a593Smuzhiyun 	DEBUG_LEVEL_1,/*only print dev_dbg info*/
101*4882a593Smuzhiyun 	DEBUG_LEVEL_2,/*print dev_dbg and dev_vdbg info*/
102*4882a593Smuzhiyun 	DEBUG_LEVEL_NUM
103*4882a593Smuzhiyun };
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun #define CY_INITIAL_DEBUG_LEVEL 0
106*4882a593Smuzhiyun #define CY_INITIAL_SHOW_TIME_STAMP 0
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun /*
109*4882a593Smuzhiyun * those current debug level smaller than setted debug level
110*4882a593Smuzhiyun * will be printed out
111*4882a593Smuzhiyun */
112*4882a593Smuzhiyun #define parade_debug(dev, dlevel, format, arg...)	 \
113*4882a593Smuzhiyun 	do { \
114*4882a593Smuzhiyun 		struct cyttsp5_core_data *cd_tmp = dev_get_drvdata(dev);\
115*4882a593Smuzhiyun 		if (cd_tmp->debug_level >= dlevel) {\
116*4882a593Smuzhiyun 			dev_info(dev, format, ##arg);\
117*4882a593Smuzhiyun 		} \
118*4882a593Smuzhiyun 	} while (0)
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun /* HID */
121*4882a593Smuzhiyun #define HID_CYVENDOR		0xff010000
122*4882a593Smuzhiyun #define CY_HID_VENDOR_ID	0x04B4
123*4882a593Smuzhiyun #define CY_HID_BL_PRODUCT_ID	0xC100
124*4882a593Smuzhiyun #define CY_HID_APP_PRODUCT_ID	0xC101
125*4882a593Smuzhiyun #define CY_HID_VERSION		0x0100
126*4882a593Smuzhiyun #define CY_HID_APP_REPORT_ID	0xF7
127*4882a593Smuzhiyun #define CY_HID_BL_REPORT_ID	0xFF
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun #define HID_INVALID_REPORT_ID		0x0
130*4882a593Smuzhiyun #define HID_TOUCH_REPORT_ID		0x1
131*4882a593Smuzhiyun #define HID_BTN_REPORT_ID		0x3
132*4882a593Smuzhiyun #define HID_WAKEUP_REPORT_ID		0x4
133*4882a593Smuzhiyun #define HID_NOISE_METRIC_REPORT_ID	0x5
134*4882a593Smuzhiyun #define HID_TRACKING_HEATMAP_REPOR_ID	0xE
135*4882a593Smuzhiyun #define HID_SENSOR_DATA_REPORT_ID	0xF
136*4882a593Smuzhiyun #define HID_APP_RESPONSE_REPORT_ID	0x1F
137*4882a593Smuzhiyun #define HID_APP_OUTPUT_REPORT_ID	0x2F
138*4882a593Smuzhiyun #define HID_BL_RESPONSE_REPORT_ID	0x30
139*4882a593Smuzhiyun #define HID_BL_OUTPUT_REPORT_ID		0x40
140*4882a593Smuzhiyun #define HID_RESPONSE_REPORT_ID		0xF0
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun #define HID_OUTPUT_RESPONSE_REPORT_OFFSET	2
143*4882a593Smuzhiyun #define HID_OUTPUT_RESPONSE_CMD_OFFSET		4
144*4882a593Smuzhiyun #define HID_OUTPUT_RESPONSE_CMD_MASK		0x7F
145*4882a593Smuzhiyun #define HID_OUTPUT_CMD_OFFSET			6
146*4882a593Smuzhiyun #define HID_OUTPUT_CMD_MASK			0x7F
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun #define HID_SYSINFO_CYDATA_OFFSET	5
149*4882a593Smuzhiyun #define HID_SYSINFO_SENSING_OFFSET	33
150*4882a593Smuzhiyun #define HID_SYSINFO_BTN_OFFSET		48
151*4882a593Smuzhiyun #define HID_SYSINFO_BTN_MASK		0xFF
152*4882a593Smuzhiyun #define HID_SYSINFO_MAX_BTN		8
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun #define HID_POWER_ON			0x0
155*4882a593Smuzhiyun #define HID_POWER_SLEEP			0x1
156*4882a593Smuzhiyun #define HID_LENGTH_BYTES		2
157*4882a593Smuzhiyun #define HID_LENGTH_AND_REPORT_ID_BYTES	3
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun /*  Timeout in ms */
160*4882a593Smuzhiyun #define CY_REQUEST_EXCLUSIVE_TIMEOUT		8000
161*4882a593Smuzhiyun #define CY_WATCHDOG_TIMEOUT			1000
162*4882a593Smuzhiyun #define CY_HID_RESET_TIMEOUT			5000
163*4882a593Smuzhiyun #define CY_HID_AUTO_CALI_CPLT_TIMEOUT          2500
164*4882a593Smuzhiyun /* HID_DESCRIPTOR_TIMEOUT value based on FW spec (CAL_OS) */
165*4882a593Smuzhiyun #define CY_HID_GET_HID_DESCRIPTOR_TIMEOUT	4000
166*4882a593Smuzhiyun #define CY_HID_GET_REPORT_DESCRIPTOR_TIMEOUT	500
167*4882a593Smuzhiyun #define CY_HID_SET_POWER_TIMEOUT		500
168*4882a593Smuzhiyun #ifdef VERBOSE_DEBUG
169*4882a593Smuzhiyun #define CY_HID_OUTPUT_TIMEOUT			2000
170*4882a593Smuzhiyun #else
171*4882a593Smuzhiyun #define CY_HID_OUTPUT_TIMEOUT			200
172*4882a593Smuzhiyun #endif
173*4882a593Smuzhiyun #define CY_HID_OUTPUT_START_BOOTLOADER_TIMEOUT	2000
174*4882a593Smuzhiyun #define CY_HID_OUTPUT_USER_TIMEOUT		8000
175*4882a593Smuzhiyun #define CY_HID_OUTPUT_GET_SYSINFO_TIMEOUT	3000
176*4882a593Smuzhiyun #define CY_HID_OUTPUT_CALIBRATE_IDAC_TIMEOUT	5000
177*4882a593Smuzhiyun #define CY_HID_OUTPUT_WRITE_CONF_BLOCK_TIMEOUT	400
178*4882a593Smuzhiyun #define CY_HID_OUTPUT_RUN_SELF_TEST_TIMEOUT	10000
179*4882a593Smuzhiyun #define CY_HID_OUTPUT_BL_INITIATE_BL_TIMEOUT	20000
180*4882a593Smuzhiyun #define CY_HID_OUTPUT_BL_PROGRAM_AND_VERIFY_TIMEOUT	400
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun #define CY_WATCHDOG_RETRY_COUNT			60
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun /* maximum number of concurrent tracks */
185*4882a593Smuzhiyun #define TOUCH_REPORT_SIZE           10
186*4882a593Smuzhiyun #define TOUCH_INPUT_HEADER_SIZE     7
187*4882a593Smuzhiyun #define TOUCH_COUNT_BYTE_OFFSET     5
188*4882a593Smuzhiyun #define BTN_REPORT_SIZE             9
189*4882a593Smuzhiyun #define BTN_INPUT_HEADER_SIZE       5
190*4882a593Smuzhiyun #define SENSOR_REPORT_SIZE          150
191*4882a593Smuzhiyun #define SENSOR_HEADER_SIZE          4
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun /* helpers */
194*4882a593Smuzhiyun #define GET_NUM_TOUCHES(x)          ((x) & 0x1F)
195*4882a593Smuzhiyun #define IS_LARGE_AREA(x)            ((x) & 0x20)
196*4882a593Smuzhiyun #define IS_BAD_PKT(x)               ((x) & 0x20)
197*4882a593Smuzhiyun #define IS_TMO(t)                   ((t) == 0)
198*4882a593Smuzhiyun #define HI_BYTE(x)                  (u8)(((x) >> 8) & 0xFF)
199*4882a593Smuzhiyun #define LOW_BYTE(x)                 (u8)((x) & 0xFF)
200*4882a593Smuzhiyun #define SET_CMD_LOW(byte, bits)	\
201*4882a593Smuzhiyun 	((byte) = (((byte) & 0xF0) | ((bits) & 0x0F)))
202*4882a593Smuzhiyun #define SET_CMD_HIGH(byte, bits)\
203*4882a593Smuzhiyun 	((byte) = (((byte) & 0x0F) | ((bits) & 0xF0)))
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun #define GET_MASK(length) \
206*4882a593Smuzhiyun 	((1 << length) - 1)
207*4882a593Smuzhiyun #define GET_FIELD(name, length, shift) \
208*4882a593Smuzhiyun 	((name >> shift) & GET_MASK(length))
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun #define HID_ITEM_SIZE_MASK	0x03
211*4882a593Smuzhiyun #define HID_ITEM_TYPE_MASK	0x0C
212*4882a593Smuzhiyun #define HID_ITEM_TAG_MASK	0xF0
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun #define HID_ITEM_SIZE_SHIFT	0
215*4882a593Smuzhiyun #define HID_ITEM_TYPE_SHIFT	2
216*4882a593Smuzhiyun #define HID_ITEM_TAG_SHIFT	4
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun #define HID_GET_ITEM_SIZE(x)  \
219*4882a593Smuzhiyun 	((x & HID_ITEM_SIZE_MASK) >> HID_ITEM_SIZE_SHIFT)
220*4882a593Smuzhiyun #define HID_GET_ITEM_TYPE(x) \
221*4882a593Smuzhiyun 	((x & HID_ITEM_TYPE_MASK) >> HID_ITEM_TYPE_SHIFT)
222*4882a593Smuzhiyun #define HID_GET_ITEM_TAG(x) \
223*4882a593Smuzhiyun 	((x & HID_ITEM_TAG_MASK) >> HID_ITEM_TAG_SHIFT)
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun #define IS_DEEP_SLEEP_CONFIGURED(x) \
226*4882a593Smuzhiyun 		((x) == 0 || (x) == 0xFF)
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun #define IS_PIP_VER_GE(p, maj, min) \
229*4882a593Smuzhiyun 		((p)->cydata.pip_ver_major < (maj) ? \
230*4882a593Smuzhiyun 			0 : \
231*4882a593Smuzhiyun 			((p)->cydata.pip_ver_minor < (min) ? \
232*4882a593Smuzhiyun 				0 : \
233*4882a593Smuzhiyun 				1))
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun /* drv_debug commands */
236*4882a593Smuzhiyun #define CY_DBG_SUSPEND                  4
237*4882a593Smuzhiyun #define CY_DBG_RESUME                   5
238*4882a593Smuzhiyun #define CY_DBG_SOFT_RESET               97
239*4882a593Smuzhiyun #define CY_DBG_RESET                    98
240*4882a593Smuzhiyun #define CY_DBG_HID_RESET                50
241*4882a593Smuzhiyun #define CY_DBG_HID_GET_REPORT           51
242*4882a593Smuzhiyun #define CY_DBG_HID_SET_REPORT           52
243*4882a593Smuzhiyun #define CY_DBG_HID_SET_POWER_ON         53
244*4882a593Smuzhiyun #define CY_DBG_HID_SET_POWER_SLEEP      54
245*4882a593Smuzhiyun #define CY_DBG_HID_NULL                 100
246*4882a593Smuzhiyun #define CY_DBG_HID_ENTER_BL             101
247*4882a593Smuzhiyun #define CY_DBG_HID_SYSINFO              102
248*4882a593Smuzhiyun #define CY_DBG_HID_SUSPEND_SCAN         103
249*4882a593Smuzhiyun #define CY_DBG_HID_RESUME_SCAN          104
250*4882a593Smuzhiyun #define CY_DBG_HID_STOP_WD              105
251*4882a593Smuzhiyun #define CY_DBG_HID_START_WD             106
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun #define CY_TTHE_TUNER_EXIT              107
254*4882a593Smuzhiyun #define	CY_TTHE_BUF_CLEAN               108
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun /*
257*4882a593Smuzhiyun  * Commands that require additional parameters
258*4882a593Smuzhiyun  * will be in the 200 range. Commands that do not
259*4882a593Smuzhiyun  * require additional parameters remain below 200.
260*4882a593Smuzhiyun  */
261*4882a593Smuzhiyun #define CY_DBG_REPORT_LEVEL				200
262*4882a593Smuzhiyun #define CY_DBG_WATCHDOG_INTERVAL		201
263*4882a593Smuzhiyun #define CY_DBG_SHOW_TIMESTAMP           202
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun /* Recognized usages */
266*4882a593Smuzhiyun /* undef them first for possible redefinition in Linux */
267*4882a593Smuzhiyun #undef HID_DI_PRESSURE
268*4882a593Smuzhiyun #undef HID_DI_TIP
269*4882a593Smuzhiyun #undef HID_DI_CONTACTID
270*4882a593Smuzhiyun #undef HID_DI_CONTACTCOUNT
271*4882a593Smuzhiyun #undef HID_DI_SCANTIME
272*4882a593Smuzhiyun #define HID_DI_PRESSURE		0x000d0030
273*4882a593Smuzhiyun #define HID_DI_TIP		0x000d0042
274*4882a593Smuzhiyun #define HID_DI_CONTACTID	0x000d0051
275*4882a593Smuzhiyun #define HID_DI_CONTACTCOUNT	0x000d0054
276*4882a593Smuzhiyun #define HID_DI_SCANTIME		0x000d0056
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun /* Parade vendor specific usages */
279*4882a593Smuzhiyun #define HID_CY_UNDEFINED	0xff010000
280*4882a593Smuzhiyun #define HID_CY_BOOTLOADER	0xff010001
281*4882a593Smuzhiyun #define HID_CY_TOUCHAPPLICATION	0xff010002
282*4882a593Smuzhiyun #define HID_CY_BUTTONS		0xff010020
283*4882a593Smuzhiyun #define HID_CY_GENERICITEM	0xff010030
284*4882a593Smuzhiyun #define HID_CY_LARGEOBJECT	0xff010040
285*4882a593Smuzhiyun #define HID_CY_NOISEEFFECTS	0xff010041
286*4882a593Smuzhiyun #define HID_CY_REPORTCOUNTER	0xff010042
287*4882a593Smuzhiyun #define HID_CY_TOUCHTYPE	0xff010060
288*4882a593Smuzhiyun #define HID_CY_EVENTID		0xff010061
289*4882a593Smuzhiyun #define HID_CY_MAJORAXISLENGTH	0xff010062
290*4882a593Smuzhiyun #define HID_CY_MINORAXISLENGTH	0xff010063
291*4882a593Smuzhiyun #define HID_CY_ORIENTATION	0xff010064
292*4882a593Smuzhiyun #define HID_CY_BUTTONSIGNAL	0xff010065
293*4882a593Smuzhiyun #define HID_CY_MAJOR_CONTACT_AXIS_LENGTH	0xff010066
294*4882a593Smuzhiyun #define HID_CY_MINOR_CONTACT_AXIS_LENGTH	0xff010067
295*4882a593Smuzhiyun #define HID_CY_TCH_COL_USAGE_PG 0x000D0022
296*4882a593Smuzhiyun #define HID_CY_BTN_COL_USAGE_PG 0xFF010020
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun #define PANEL_ID_NOT_ENABLED	0xFF
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun #ifdef EASYWAKE_TSG6
301*4882a593Smuzhiyun #define GESTURE_DOUBLE_TAP         (1)
302*4882a593Smuzhiyun #define GESTURE_TWO_FINGERS_SLIDE  (2)
303*4882a593Smuzhiyun #define GESTURE_TOUCH_DETECTED     (3)
304*4882a593Smuzhiyun #define GESTURE_PUSH_BUTTON        (4)
305*4882a593Smuzhiyun #define GESTURE_SINGLE_SLIDE_DE_TX (5)
306*4882a593Smuzhiyun #define GESTURE_SINGLE_SLIDE_IN_TX (6)
307*4882a593Smuzhiyun #define GESTURE_SINGLE_SLIDE_DE_RX (7)
308*4882a593Smuzhiyun #define GESTURE_SINGLE_SLIDE_IN_RX (8)
309*4882a593Smuzhiyun #endif
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun /* FW RAM parameters */
312*4882a593Smuzhiyun #define CY_RAM_ID_TOUCHMODE_ENABLED	0x02
313*4882a593Smuzhiyun #define CY_RAM_ID_PROXIMITY_ENABLE	0x20
314*4882a593Smuzhiyun #define CY_RAM_ID_TOUCHMODE_ENABLED_SIZE	1
315*4882a593Smuzhiyun #define CY_RAM_ID_PROXIMITY_ENABLE_SIZE	1
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun /* abs signal capabilities offsets in the frameworks array */
318*4882a593Smuzhiyun enum cyttsp5_sig_caps {
319*4882a593Smuzhiyun 	CY_SIGNAL_OST,
320*4882a593Smuzhiyun 	CY_MIN_OST,
321*4882a593Smuzhiyun 	CY_MAX_OST,
322*4882a593Smuzhiyun 	CY_FUZZ_OST,
323*4882a593Smuzhiyun 	CY_FLAT_OST,
324*4882a593Smuzhiyun 	CY_NUM_ABS_SET	/* number of signal capability fields */
325*4882a593Smuzhiyun };
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun /* helpers */
328*4882a593Smuzhiyun #define NUM_SIGNALS(frmwrk)		((frmwrk)->size / CY_NUM_ABS_SET)
329*4882a593Smuzhiyun #define PARAM(frmwrk, sig_ost, cap_ost) \
330*4882a593Smuzhiyun 		((frmwrk)->abs[((sig_ost) * CY_NUM_ABS_SET) + (cap_ost)])
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun #define PARAM_SIGNAL(frmwrk, sig_ost)	PARAM(frmwrk, sig_ost, CY_SIGNAL_OST)
333*4882a593Smuzhiyun #define PARAM_MIN(frmwrk, sig_ost)	PARAM(frmwrk, sig_ost, CY_MIN_OST)
334*4882a593Smuzhiyun #define PARAM_MAX(frmwrk, sig_ost)	PARAM(frmwrk, sig_ost, CY_MAX_OST)
335*4882a593Smuzhiyun #define PARAM_FUZZ(frmwrk, sig_ost)	PARAM(frmwrk, sig_ost, CY_FUZZ_OST)
336*4882a593Smuzhiyun #define PARAM_FLAT(frmwrk, sig_ost)	PARAM(frmwrk, sig_ost, CY_FLAT_OST)
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun /* abs axis signal offsets in the framworks array  */
339*4882a593Smuzhiyun enum cyttsp5_sig_ost {
340*4882a593Smuzhiyun 	CY_ABS_X_OST,
341*4882a593Smuzhiyun 	CY_ABS_Y_OST,
342*4882a593Smuzhiyun 	CY_ABS_P_OST,
343*4882a593Smuzhiyun 	CY_ABS_W_OST,
344*4882a593Smuzhiyun 	CY_ABS_ID_OST,
345*4882a593Smuzhiyun 	CY_ABS_MAJ_OST,
346*4882a593Smuzhiyun 	CY_ABS_MIN_OST,
347*4882a593Smuzhiyun 	CY_ABS_OR_OST,
348*4882a593Smuzhiyun 	CY_ABS_TOOL_OST,
349*4882a593Smuzhiyun 	CY_ABS_D_OST,
350*4882a593Smuzhiyun 	CY_NUM_ABS_OST	/* number of abs signals */
351*4882a593Smuzhiyun };
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun enum hid_command {
354*4882a593Smuzhiyun 	HID_CMD_RESERVED,
355*4882a593Smuzhiyun 	HID_CMD_RESET,
356*4882a593Smuzhiyun 	HID_CMD_GET_REPORT,
357*4882a593Smuzhiyun 	HID_CMD_SET_REPORT,
358*4882a593Smuzhiyun 	HID_CMD_GET_IDLE,
359*4882a593Smuzhiyun 	HID_CMD_SET_IDLE,
360*4882a593Smuzhiyun 	HID_CMD_GET_PROTOCOL,
361*4882a593Smuzhiyun 	HID_CMD_SET_PROTOCOL,
362*4882a593Smuzhiyun 	HID_CMD_SET_POWER,
363*4882a593Smuzhiyun 	HID_CMD_VENDOR = 0xE,
364*4882a593Smuzhiyun };
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun enum hid_output_cmd_type {
367*4882a593Smuzhiyun 	HID_OUTPUT_CMD_APP,
368*4882a593Smuzhiyun 	HID_OUTPUT_CMD_BL,
369*4882a593Smuzhiyun };
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun enum hid_output {
372*4882a593Smuzhiyun 	HID_OUTPUT_NULL,
373*4882a593Smuzhiyun 	HID_OUTPUT_START_BOOTLOADER,
374*4882a593Smuzhiyun 	HID_OUTPUT_GET_SYSINFO,
375*4882a593Smuzhiyun 	HID_OUTPUT_SUSPEND_SCANNING,
376*4882a593Smuzhiyun 	HID_OUTPUT_RESUME_SCANNING,
377*4882a593Smuzhiyun 	HID_OUTPUT_GET_PARAM,
378*4882a593Smuzhiyun 	HID_OUTPUT_SET_PARAM,
379*4882a593Smuzhiyun 	HID_OUTPUT_GET_NOISE_METRICS,
380*4882a593Smuzhiyun 	HID_OUTPUT_RESERVED,
381*4882a593Smuzhiyun 	HID_OUTPUT_ENTER_EASYWAKE_STATE,
382*4882a593Smuzhiyun 	HID_OUTPUT_VERIFY_CONFIG_BLOCK_CRC = 0x20,
383*4882a593Smuzhiyun 	HID_OUTPUT_GET_CONFIG_ROW_SIZE,
384*4882a593Smuzhiyun 	HID_OUTPUT_READ_CONF_BLOCK,
385*4882a593Smuzhiyun 	HID_OUTPUT_WRITE_CONF_BLOCK,
386*4882a593Smuzhiyun 	HID_OUTPUT_GET_DATA_STRUCTURE,
387*4882a593Smuzhiyun 	HID_OUTPUT_LOAD_SELF_TEST_PARAM,
388*4882a593Smuzhiyun 	HID_OUTPUT_RUN_SELF_TEST,
389*4882a593Smuzhiyun 	HID_OUTPUT_GET_SELF_TEST_RESULT,
390*4882a593Smuzhiyun 	HID_OUTPUT_CALIBRATE_IDACS,
391*4882a593Smuzhiyun 	HID_OUTPUT_INITIALIZE_BASELINES,
392*4882a593Smuzhiyun 	HID_OUTPUT_EXEC_PANEL_SCAN,
393*4882a593Smuzhiyun 	HID_OUTPUT_RETRIEVE_PANEL_SCAN,
394*4882a593Smuzhiyun 	HID_OUTPUT_START_SENSOR_DATA_MODE,
395*4882a593Smuzhiyun 	HID_OUTPUT_STOP_SENSOR_DATA_MODE,
396*4882a593Smuzhiyun 	HID_OUTPUT_START_TRACKING_HEATMAP_MODE,
397*4882a593Smuzhiyun 	HID_OUTPUT_INT_PIN_OVERRIDE = 0x40,
398*4882a593Smuzhiyun 	HID_OUTPUT_STORE_PANEL_SCAN = 0x60,
399*4882a593Smuzhiyun 	HID_OUTPUT_PROCESS_PANEL_SCAN,
400*4882a593Smuzhiyun 	HID_OUTPUT_DISCARD_INPUT_REPORT,
401*4882a593Smuzhiyun 	HID_OUTPUT_LAST,
402*4882a593Smuzhiyun 	HID_OUTPUT_USER_CMD,
403*4882a593Smuzhiyun };
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun enum hid_output_bl {
406*4882a593Smuzhiyun 	HID_OUTPUT_BL_VERIFY_APP_INTEGRITY = 0x31,
407*4882a593Smuzhiyun 	HID_OUTPUT_BL_GET_INFO = 0x38,
408*4882a593Smuzhiyun 	HID_OUTPUT_BL_PROGRAM_AND_VERIFY,
409*4882a593Smuzhiyun 	HID_OUTPUT_BL_LAUNCH_APP = 0x3B,
410*4882a593Smuzhiyun 	HID_OUTPUT_BL_GET_PANEL_ID = 0x3E,
411*4882a593Smuzhiyun 	HID_OUTPUT_BL_INITIATE_BL = 0x48,
412*4882a593Smuzhiyun 	HID_OUTPUT_BL_LAST,
413*4882a593Smuzhiyun };
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun #define HID_OUTPUT_BL_SOP	0x1
416*4882a593Smuzhiyun #define HID_OUTPUT_BL_EOP	0x17
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun enum hid_output_bl_status {
419*4882a593Smuzhiyun 	ERROR_SUCCESS,
420*4882a593Smuzhiyun 	ERROR_KEY,
421*4882a593Smuzhiyun 	ERROR_VERIFICATION,
422*4882a593Smuzhiyun 	ERROR_LENGTH,
423*4882a593Smuzhiyun 	ERROR_DATA,
424*4882a593Smuzhiyun 	ERROR_COMMAND,
425*4882a593Smuzhiyun 	ERROR_CRC = 8,
426*4882a593Smuzhiyun 	ERROR_FLASH_ARRAY,
427*4882a593Smuzhiyun 	ERROR_FLASH_ROW,
428*4882a593Smuzhiyun 	ERROR_FLASH_PROTECTION,
429*4882a593Smuzhiyun 	ERROR_UKNOWN = 15,
430*4882a593Smuzhiyun 	ERROR_INVALID,
431*4882a593Smuzhiyun };
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun enum cyttsp5_mode {
434*4882a593Smuzhiyun 	CY_MODE_UNKNOWN,
435*4882a593Smuzhiyun 	CY_MODE_BOOTLOADER,
436*4882a593Smuzhiyun 	CY_MODE_OPERATIONAL,
437*4882a593Smuzhiyun };
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun enum cyttsp5_cmd_status {
440*4882a593Smuzhiyun 	CY_CMD_STATUS_SUCCESS,
441*4882a593Smuzhiyun 	CY_CMD_STATUS_FAILURE,
442*4882a593Smuzhiyun };
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun enum {
445*4882a593Smuzhiyun 	CY_IC_GRPNUM_RESERVED,
446*4882a593Smuzhiyun 	CY_IC_GRPNUM_CMD_REGS,
447*4882a593Smuzhiyun 	CY_IC_GRPNUM_TCH_REP,
448*4882a593Smuzhiyun 	CY_IC_GRPNUM_DATA_REC,
449*4882a593Smuzhiyun 	CY_IC_GRPNUM_TEST_REC,
450*4882a593Smuzhiyun 	CY_IC_GRPNUM_PCFG_REC,
451*4882a593Smuzhiyun 	CY_IC_GRPNUM_TCH_PARM_VAL,
452*4882a593Smuzhiyun 	CY_IC_GRPNUM_TCH_PARM_SIZE,
453*4882a593Smuzhiyun 	CY_IC_GRPNUM_RESERVED1,
454*4882a593Smuzhiyun 	CY_IC_GRPNUM_RESERVED2,
455*4882a593Smuzhiyun 	CY_IC_GRPNUM_OPCFG_REC,
456*4882a593Smuzhiyun 	CY_IC_GRPNUM_DDATA_REC,
457*4882a593Smuzhiyun 	CY_IC_GRPNUM_MDATA_REC,
458*4882a593Smuzhiyun 	CY_IC_GRPNUM_TEST_REGS,
459*4882a593Smuzhiyun 	CY_IC_GRPNUM_BTN_KEYS,
460*4882a593Smuzhiyun 	CY_IC_GRPNUM_TTHE_REGS,
461*4882a593Smuzhiyun 	CY_IC_GRPNUM_SENSING_CONF,
462*4882a593Smuzhiyun 	CY_IC_GRPNUM_NUM,
463*4882a593Smuzhiyun };
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun enum cyttsp5_event_id {
466*4882a593Smuzhiyun 	CY_EV_NO_EVENT,
467*4882a593Smuzhiyun 	CY_EV_TOUCHDOWN,
468*4882a593Smuzhiyun 	CY_EV_MOVE,		/* significant displacement (> act dist) */
469*4882a593Smuzhiyun 	CY_EV_LIFTOFF,		/* record reports last position */
470*4882a593Smuzhiyun };
471*4882a593Smuzhiyun 
472*4882a593Smuzhiyun enum cyttsp5_object_id {
473*4882a593Smuzhiyun 	CY_OBJ_STANDARD_FINGER,
474*4882a593Smuzhiyun 	CY_OBJ_PROXIMITY,
475*4882a593Smuzhiyun 	CY_OBJ_STYLUS,
476*4882a593Smuzhiyun 	CY_OBJ_HOVER,
477*4882a593Smuzhiyun 	CY_OBJ_GLOVE,
478*4882a593Smuzhiyun };
479*4882a593Smuzhiyun 
480*4882a593Smuzhiyun enum cyttsp5_self_test_result {
481*4882a593Smuzhiyun 	CY_ST_RESULT_PASS,
482*4882a593Smuzhiyun 	CY_ST_RESULT_FAIL,
483*4882a593Smuzhiyun 	CY_ST_RESULT_HOST_MUST_INTERPRET = 0xFF,
484*4882a593Smuzhiyun };
485*4882a593Smuzhiyun 
486*4882a593Smuzhiyun enum cyttsp5_self_test_id {
487*4882a593Smuzhiyun 	CY_ST_ID_NULL,
488*4882a593Smuzhiyun 	CY_ST_ID_BIST,
489*4882a593Smuzhiyun 	CY_ST_ID_SHORTS,
490*4882a593Smuzhiyun 	CY_ST_ID_OPENS,
491*4882a593Smuzhiyun 	CY_ST_ID_AUTOSHORTS,
492*4882a593Smuzhiyun 	CY_ST_ID_CM_PANEL,
493*4882a593Smuzhiyun 	CY_ST_ID_CP_PANEL,
494*4882a593Smuzhiyun 	CY_ST_ID_CM_BUTTON,
495*4882a593Smuzhiyun 	CY_ST_ID_CP_BUTTON,
496*4882a593Smuzhiyun };
497*4882a593Smuzhiyun 
498*4882a593Smuzhiyun #define CY_NUM_MFGID                8
499*4882a593Smuzhiyun 
500*4882a593Smuzhiyun /* System Information interface definitions */
501*4882a593Smuzhiyun struct cyttsp5_cydata_dev {
502*4882a593Smuzhiyun 	u8 pip_ver_major;
503*4882a593Smuzhiyun 	u8 pip_ver_minor;
504*4882a593Smuzhiyun 	__le16 fw_pid;
505*4882a593Smuzhiyun 	u8 fw_ver_major;
506*4882a593Smuzhiyun 	u8 fw_ver_minor;
507*4882a593Smuzhiyun 	__le32 revctrl;
508*4882a593Smuzhiyun 	__le16 fw_ver_conf;
509*4882a593Smuzhiyun 	u8 bl_ver_major;
510*4882a593Smuzhiyun 	u8 bl_ver_minor;
511*4882a593Smuzhiyun 	__le16 jtag_si_id_l;
512*4882a593Smuzhiyun 	__le16 jtag_si_id_h;
513*4882a593Smuzhiyun 	u8 mfg_id[CY_NUM_MFGID];
514*4882a593Smuzhiyun 	__le16 post_code;
515*4882a593Smuzhiyun } __packed;
516*4882a593Smuzhiyun 
517*4882a593Smuzhiyun struct cyttsp5_sensing_conf_data_dev {
518*4882a593Smuzhiyun 	u8 electrodes_x;
519*4882a593Smuzhiyun 	u8 electrodes_y;
520*4882a593Smuzhiyun 	__le16 len_x;
521*4882a593Smuzhiyun 	__le16 len_y;
522*4882a593Smuzhiyun 	__le16 res_x;
523*4882a593Smuzhiyun 	__le16 res_y;
524*4882a593Smuzhiyun 	__le16 max_z;
525*4882a593Smuzhiyun 	u8 origin_x;
526*4882a593Smuzhiyun 	u8 origin_y;
527*4882a593Smuzhiyun 	u8 panel_id;
528*4882a593Smuzhiyun 	u8 btn;
529*4882a593Smuzhiyun 	u8 scan_mode;
530*4882a593Smuzhiyun 	u8 max_num_of_tch_per_refresh_cycle;
531*4882a593Smuzhiyun } __packed;
532*4882a593Smuzhiyun 
533*4882a593Smuzhiyun struct cyttsp5_cydata {
534*4882a593Smuzhiyun 	u8 pip_ver_major;
535*4882a593Smuzhiyun 	u8 pip_ver_minor;
536*4882a593Smuzhiyun 	u8 bl_ver_major;
537*4882a593Smuzhiyun 	u8 bl_ver_minor;
538*4882a593Smuzhiyun 	u8 fw_ver_major;
539*4882a593Smuzhiyun 	u8 fw_ver_minor;
540*4882a593Smuzhiyun 	u16 fw_pid;
541*4882a593Smuzhiyun 	u16 fw_ver_conf;
542*4882a593Smuzhiyun 	u16 post_code;
543*4882a593Smuzhiyun 	u32 revctrl;
544*4882a593Smuzhiyun 	u16 jtag_id_l;
545*4882a593Smuzhiyun 	u16 jtag_id_h;
546*4882a593Smuzhiyun 	u8 mfg_id[CY_NUM_MFGID];
547*4882a593Smuzhiyun };
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun struct cyttsp5_sensing_conf_data {
550*4882a593Smuzhiyun 	u16 res_x;
551*4882a593Smuzhiyun 	u16 res_y;
552*4882a593Smuzhiyun 	u16 max_z;
553*4882a593Smuzhiyun 	u16 len_x;
554*4882a593Smuzhiyun 	u16 len_y;
555*4882a593Smuzhiyun 	u8 electrodes_x;
556*4882a593Smuzhiyun 	u8 electrodes_y;
557*4882a593Smuzhiyun 	u8 origin_x;
558*4882a593Smuzhiyun 	u8 origin_y;
559*4882a593Smuzhiyun 	u8 panel_id;
560*4882a593Smuzhiyun 	u8 btn;
561*4882a593Smuzhiyun 	u8 scan_mode;
562*4882a593Smuzhiyun 	u8 max_tch;
563*4882a593Smuzhiyun 	u8 rx_num;
564*4882a593Smuzhiyun 	u8 tx_num;
565*4882a593Smuzhiyun };
566*4882a593Smuzhiyun 
567*4882a593Smuzhiyun enum cyttsp5_tch_abs {	/* for ordering within the extracted touch data array */
568*4882a593Smuzhiyun 	CY_TCH_X,	/* X */
569*4882a593Smuzhiyun 	CY_TCH_Y,	/* Y */
570*4882a593Smuzhiyun 	CY_TCH_P,	/* P (Z) */
571*4882a593Smuzhiyun 	CY_TCH_T,	/* TOUCH ID */
572*4882a593Smuzhiyun 	CY_TCH_E,	/* EVENT ID */
573*4882a593Smuzhiyun 	CY_TCH_O,	/* OBJECT ID */
574*4882a593Smuzhiyun 	CY_TCH_TIP,	/* OBJECT ID */
575*4882a593Smuzhiyun 	CY_TCH_MAJ,	/* TOUCH_MAJOR */
576*4882a593Smuzhiyun 	CY_TCH_MIN,	/* TOUCH_MINOR */
577*4882a593Smuzhiyun 	CY_TCH_OR,	/* ORIENTATION */
578*4882a593Smuzhiyun 	CY_TCH_NUM_ABS,
579*4882a593Smuzhiyun };
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun enum cyttsp5_tch_hdr {
582*4882a593Smuzhiyun 	CY_TCH_TIME,	/* SCAN TIME */
583*4882a593Smuzhiyun 	CY_TCH_NUM,	/* NUMBER OF RECORDS */
584*4882a593Smuzhiyun 	CY_TCH_LO,	/* LARGE OBJECT */
585*4882a593Smuzhiyun 	CY_TCH_NOISE,	/* NOISE EFFECT */
586*4882a593Smuzhiyun 	CY_TCH_COUNTER,	/* REPORT_COUNTER */
587*4882a593Smuzhiyun 	CY_TCH_NUM_HDR,
588*4882a593Smuzhiyun };
589*4882a593Smuzhiyun 
590*4882a593Smuzhiyun static const char * const cyttsp5_tch_abs_string[] = {
591*4882a593Smuzhiyun 	[CY_TCH_X]	= "X",
592*4882a593Smuzhiyun 	[CY_TCH_Y]	= "Y",
593*4882a593Smuzhiyun 	[CY_TCH_P]	= "P",
594*4882a593Smuzhiyun 	[CY_TCH_T]	= "T",
595*4882a593Smuzhiyun 	[CY_TCH_E]	= "E",
596*4882a593Smuzhiyun 	[CY_TCH_O]	= "O",
597*4882a593Smuzhiyun 	[CY_TCH_TIP]	= "TIP",
598*4882a593Smuzhiyun 	[CY_TCH_MAJ]	= "MAJ",
599*4882a593Smuzhiyun 	[CY_TCH_MIN]	= "MIN",
600*4882a593Smuzhiyun 	[CY_TCH_OR]	= "OR",
601*4882a593Smuzhiyun 	[CY_TCH_NUM_ABS] = "INVALID",
602*4882a593Smuzhiyun };
603*4882a593Smuzhiyun 
604*4882a593Smuzhiyun static const char * const cyttsp5_tch_hdr_string[] = {
605*4882a593Smuzhiyun 	[CY_TCH_TIME]	= "SCAN TIME",
606*4882a593Smuzhiyun 	[CY_TCH_NUM]	= "NUMBER OF RECORDS",
607*4882a593Smuzhiyun 	[CY_TCH_LO]	= "LARGE OBJECT",
608*4882a593Smuzhiyun 	[CY_TCH_NOISE]	= "NOISE EFFECT",
609*4882a593Smuzhiyun 	[CY_TCH_COUNTER] = "REPORT_COUNTER",
610*4882a593Smuzhiyun 	[CY_TCH_NUM_HDR] = "INVALID",
611*4882a593Smuzhiyun };
612*4882a593Smuzhiyun 
613*4882a593Smuzhiyun static const int cyttsp5_tch_abs_field_map[] = {
614*4882a593Smuzhiyun 	[CY_TCH_X]	= 0x00010030 /* HID_GD_X */,
615*4882a593Smuzhiyun 	[CY_TCH_Y]	= 0x00010031 /* HID_GD_Y */,
616*4882a593Smuzhiyun 	[CY_TCH_P]	= HID_DI_PRESSURE,
617*4882a593Smuzhiyun 	[CY_TCH_T]	= HID_DI_CONTACTID,
618*4882a593Smuzhiyun 	[CY_TCH_E]	= HID_CY_EVENTID,
619*4882a593Smuzhiyun 	[CY_TCH_O]	= HID_CY_TOUCHTYPE,
620*4882a593Smuzhiyun 	[CY_TCH_TIP]	= HID_DI_TIP,
621*4882a593Smuzhiyun 	[CY_TCH_MAJ]	= HID_CY_MAJORAXISLENGTH,
622*4882a593Smuzhiyun 	[CY_TCH_MIN]	= HID_CY_MINORAXISLENGTH,
623*4882a593Smuzhiyun 	[CY_TCH_OR]	= HID_CY_ORIENTATION,
624*4882a593Smuzhiyun 	[CY_TCH_NUM_ABS] = 0,
625*4882a593Smuzhiyun };
626*4882a593Smuzhiyun 
627*4882a593Smuzhiyun static const int cyttsp5_tch_hdr_field_map[] = {
628*4882a593Smuzhiyun 	[CY_TCH_TIME]	= HID_DI_SCANTIME,
629*4882a593Smuzhiyun 	[CY_TCH_NUM]	= HID_DI_CONTACTCOUNT,
630*4882a593Smuzhiyun 	[CY_TCH_LO]	= HID_CY_LARGEOBJECT,
631*4882a593Smuzhiyun 	[CY_TCH_NOISE]	= HID_CY_NOISEEFFECTS,
632*4882a593Smuzhiyun 	[CY_TCH_COUNTER] = HID_CY_REPORTCOUNTER,
633*4882a593Smuzhiyun 	[CY_TCH_NUM_HDR] = 0,
634*4882a593Smuzhiyun };
635*4882a593Smuzhiyun 
636*4882a593Smuzhiyun #define CY_NUM_EXT_TCH_FIELDS   3
637*4882a593Smuzhiyun 
638*4882a593Smuzhiyun struct cyttsp5_tch_abs_params {
639*4882a593Smuzhiyun 	size_t ofs;	/* abs byte offset */
640*4882a593Smuzhiyun 	size_t size;	/* size in bits */
641*4882a593Smuzhiyun 	size_t min;	/* min value */
642*4882a593Smuzhiyun 	size_t max;	/* max value */
643*4882a593Smuzhiyun 	size_t bofs;	/* bit offset */
644*4882a593Smuzhiyun 	u8 report;
645*4882a593Smuzhiyun };
646*4882a593Smuzhiyun 
647*4882a593Smuzhiyun struct cyttsp5_touch {
648*4882a593Smuzhiyun 	int hdr[CY_TCH_NUM_HDR];
649*4882a593Smuzhiyun 	int abs[CY_TCH_NUM_ABS];
650*4882a593Smuzhiyun };
651*4882a593Smuzhiyun 
652*4882a593Smuzhiyun /* button to keycode support */
653*4882a593Smuzhiyun #define CY_BITS_PER_BTN		1
654*4882a593Smuzhiyun #define CY_NUM_BTN_EVENT_ID	((1 << CY_BITS_PER_BTN) - 1)
655*4882a593Smuzhiyun 
656*4882a593Smuzhiyun enum cyttsp5_btn_state {
657*4882a593Smuzhiyun 	CY_BTN_RELEASED = 0,
658*4882a593Smuzhiyun 	CY_BTN_PRESSED = 1,
659*4882a593Smuzhiyun 	CY_BTN_NUM_STATE
660*4882a593Smuzhiyun };
661*4882a593Smuzhiyun 
662*4882a593Smuzhiyun struct cyttsp5_btn {
663*4882a593Smuzhiyun 	bool enabled;
664*4882a593Smuzhiyun 	int state;	/* CY_BTN_PRESSED, CY_BTN_RELEASED */
665*4882a593Smuzhiyun 	int key_code;
666*4882a593Smuzhiyun };
667*4882a593Smuzhiyun 
668*4882a593Smuzhiyun enum cyttsp5_ic_ebid {
669*4882a593Smuzhiyun 	CY_TCH_PARM_EBID,
670*4882a593Smuzhiyun 	CY_MDATA_EBID,
671*4882a593Smuzhiyun 	CY_DDATA_EBID,
672*4882a593Smuzhiyun };
673*4882a593Smuzhiyun 
674*4882a593Smuzhiyun /* ttconfig block */
675*4882a593Smuzhiyun #define CY_TTCONFIG_VERSION_OFFSET	8
676*4882a593Smuzhiyun #define CY_TTCONFIG_VERSION_SIZE	2
677*4882a593Smuzhiyun #define CY_TTCONFIG_VERSION_ROW		0
678*4882a593Smuzhiyun 
679*4882a593Smuzhiyun struct cyttsp5_ttconfig {
680*4882a593Smuzhiyun 	u16 version;
681*4882a593Smuzhiyun 	u16 crc;
682*4882a593Smuzhiyun };
683*4882a593Smuzhiyun 
684*4882a593Smuzhiyun struct cyttsp5_report_desc_data {
685*4882a593Smuzhiyun 	u16 tch_report_id;
686*4882a593Smuzhiyun 	u16 tch_record_size;
687*4882a593Smuzhiyun 	u16 tch_header_size;
688*4882a593Smuzhiyun 	u16 btn_report_id;
689*4882a593Smuzhiyun };
690*4882a593Smuzhiyun 
691*4882a593Smuzhiyun struct cyttsp5_sysinfo {
692*4882a593Smuzhiyun 	bool ready;
693*4882a593Smuzhiyun 	struct cyttsp5_cydata cydata;
694*4882a593Smuzhiyun 	struct cyttsp5_sensing_conf_data sensing_conf_data;
695*4882a593Smuzhiyun 	struct cyttsp5_report_desc_data desc;
696*4882a593Smuzhiyun 	int num_btns;
697*4882a593Smuzhiyun 	struct cyttsp5_btn *btn;
698*4882a593Smuzhiyun 	struct cyttsp5_ttconfig ttconfig;
699*4882a593Smuzhiyun 	struct cyttsp5_tch_abs_params tch_hdr[CY_TCH_NUM_HDR];
700*4882a593Smuzhiyun 	struct cyttsp5_tch_abs_params tch_abs[CY_TCH_NUM_ABS];
701*4882a593Smuzhiyun 	u8 *xy_mode;
702*4882a593Smuzhiyun 	u8 *xy_data;
703*4882a593Smuzhiyun };
704*4882a593Smuzhiyun 
705*4882a593Smuzhiyun enum cyttsp5_atten_type {
706*4882a593Smuzhiyun 	CY_ATTEN_IRQ,
707*4882a593Smuzhiyun 	CY_ATTEN_STARTUP,
708*4882a593Smuzhiyun 	CY_ATTEN_EXCLUSIVE,
709*4882a593Smuzhiyun 	CY_ATTEN_WAKE,
710*4882a593Smuzhiyun 	CY_ATTEN_LOADER,
711*4882a593Smuzhiyun 	CY_ATTEN_SUSPEND,
712*4882a593Smuzhiyun 	CY_ATTEN_RESUME,
713*4882a593Smuzhiyun 	CY_ATTEN_NUM_ATTEN,
714*4882a593Smuzhiyun };
715*4882a593Smuzhiyun 
716*4882a593Smuzhiyun enum cyttsp5_sleep_state {
717*4882a593Smuzhiyun 	SS_SLEEP_OFF,
718*4882a593Smuzhiyun 	SS_SLEEP_ON,
719*4882a593Smuzhiyun 	SS_SLEEPING,
720*4882a593Smuzhiyun 	SS_WAKING,
721*4882a593Smuzhiyun };
722*4882a593Smuzhiyun 
723*4882a593Smuzhiyun enum cyttsp5_fb_state {
724*4882a593Smuzhiyun 	FB_ON,
725*4882a593Smuzhiyun 	FB_OFF,
726*4882a593Smuzhiyun };
727*4882a593Smuzhiyun 
728*4882a593Smuzhiyun enum cyttsp5_startup_state {
729*4882a593Smuzhiyun 	STARTUP_NONE,
730*4882a593Smuzhiyun 	STARTUP_QUEUED,
731*4882a593Smuzhiyun 	STARTUP_RUNNING,
732*4882a593Smuzhiyun 	STARTUP_ILLEGAL,
733*4882a593Smuzhiyun };
734*4882a593Smuzhiyun 
735*4882a593Smuzhiyun struct cyttsp5_hid_desc {
736*4882a593Smuzhiyun 	__le16 hid_desc_len;
737*4882a593Smuzhiyun 	u8 packet_id;
738*4882a593Smuzhiyun 	u8 reserved_byte;
739*4882a593Smuzhiyun 	__le16 bcd_version;
740*4882a593Smuzhiyun 	__le16 report_desc_len;
741*4882a593Smuzhiyun 	__le16 report_desc_register;
742*4882a593Smuzhiyun 	__le16 input_register;
743*4882a593Smuzhiyun 	__le16 max_input_len;
744*4882a593Smuzhiyun 	__le16 output_register;
745*4882a593Smuzhiyun 	__le16 max_output_len;
746*4882a593Smuzhiyun 	__le16 command_register;
747*4882a593Smuzhiyun 	__le16 data_register;
748*4882a593Smuzhiyun 	__le16 vendor_id;
749*4882a593Smuzhiyun 	__le16 product_id;
750*4882a593Smuzhiyun 	__le16 version_id;
751*4882a593Smuzhiyun 	u8 reserved[4];
752*4882a593Smuzhiyun } __packed;
753*4882a593Smuzhiyun 
754*4882a593Smuzhiyun struct cyttsp5_hid_core {
755*4882a593Smuzhiyun 	u16 hid_vendor_id;
756*4882a593Smuzhiyun 	u16 hid_product_id;
757*4882a593Smuzhiyun 	__le16 hid_desc_register;
758*4882a593Smuzhiyun 	u16 hid_report_desc_len;
759*4882a593Smuzhiyun 	u16 hid_max_input_len;
760*4882a593Smuzhiyun 	u16 hid_max_output_len;
761*4882a593Smuzhiyun };
762*4882a593Smuzhiyun 
763*4882a593Smuzhiyun #define CY_HID_MAX_REPORTS		8
764*4882a593Smuzhiyun #define CY_HID_MAX_FIELDS		128
765*4882a593Smuzhiyun #define CY_HID_MAX_COLLECTIONS		3
766*4882a593Smuzhiyun #define CY_HID_MAX_NESTED_COLLECTIONS	CY_HID_MAX_COLLECTIONS
767*4882a593Smuzhiyun 
768*4882a593Smuzhiyun #define CY_MAX_INPUT		512
769*4882a593Smuzhiyun #define CY_PIP_1P7_EMPTY_BUF    0xFF00
770*4882a593Smuzhiyun 
771*4882a593Smuzhiyun enum cyttsp5_module_id {
772*4882a593Smuzhiyun 	CY_MODULE_MT,
773*4882a593Smuzhiyun 	CY_MODULE_BTN,
774*4882a593Smuzhiyun 	CY_MODULE_PROX,
775*4882a593Smuzhiyun 	CY_MODULE_LAST,
776*4882a593Smuzhiyun };
777*4882a593Smuzhiyun 
778*4882a593Smuzhiyun struct cyttsp5_mt_data;
779*4882a593Smuzhiyun struct cyttsp5_mt_function {
780*4882a593Smuzhiyun 	int (*mt_release)(struct device *dev);
781*4882a593Smuzhiyun 	int (*mt_probe)(struct device *dev, struct cyttsp5_mt_data *md);
782*4882a593Smuzhiyun 	void (*report_slot_liftoff)(struct cyttsp5_mt_data *md, int max_slots);
783*4882a593Smuzhiyun 	void (*input_sync)(struct input_dev *input);
784*4882a593Smuzhiyun 	void (*input_report)(struct input_dev *input, int sig, int t, int type);
785*4882a593Smuzhiyun 	void (*final_sync)(struct input_dev *input, int max_slots,
786*4882a593Smuzhiyun 			int mt_sync_count, unsigned long *ids);
787*4882a593Smuzhiyun 	int (*input_register_device)(struct input_dev *input, int max_slots);
788*4882a593Smuzhiyun };
789*4882a593Smuzhiyun 
790*4882a593Smuzhiyun struct cyttsp5_mt_data {
791*4882a593Smuzhiyun 	struct device *dev;
792*4882a593Smuzhiyun 	struct cyttsp5_mt_platform_data *pdata;
793*4882a593Smuzhiyun 	struct cyttsp5_sysinfo *si;
794*4882a593Smuzhiyun 	struct input_dev *input;
795*4882a593Smuzhiyun 	struct cyttsp5_mt_function mt_function;
796*4882a593Smuzhiyun 	struct mutex mt_lock;
797*4882a593Smuzhiyun 	bool is_suspended;
798*4882a593Smuzhiyun 	bool input_device_registered;
799*4882a593Smuzhiyun 	char phys[NAME_MAX];
800*4882a593Smuzhiyun 	int num_prv_rec;
801*4882a593Smuzhiyun 	int or_min;
802*4882a593Smuzhiyun 	int or_max;
803*4882a593Smuzhiyun 	int t_min;
804*4882a593Smuzhiyun 	int t_max;
805*4882a593Smuzhiyun };
806*4882a593Smuzhiyun 
807*4882a593Smuzhiyun struct cyttsp5_btn_data {
808*4882a593Smuzhiyun 	struct device *dev;
809*4882a593Smuzhiyun 	struct cyttsp5_btn_platform_data *pdata;
810*4882a593Smuzhiyun 	struct cyttsp5_sysinfo *si;
811*4882a593Smuzhiyun 	struct input_dev *input;
812*4882a593Smuzhiyun 	struct mutex btn_lock;
813*4882a593Smuzhiyun 	bool is_suspended;
814*4882a593Smuzhiyun 	bool input_device_registered;
815*4882a593Smuzhiyun 	char phys[NAME_MAX];
816*4882a593Smuzhiyun };
817*4882a593Smuzhiyun 
818*4882a593Smuzhiyun struct cyttsp5_proximity_data {
819*4882a593Smuzhiyun 	struct device *dev;
820*4882a593Smuzhiyun 	struct cyttsp5_proximity_platform_data *pdata;
821*4882a593Smuzhiyun 	struct cyttsp5_sysinfo *si;
822*4882a593Smuzhiyun 	struct input_dev *input;
823*4882a593Smuzhiyun 	struct mutex prox_lock;
824*4882a593Smuzhiyun 	struct mutex sysfs_lock;
825*4882a593Smuzhiyun 	int enable_count;
826*4882a593Smuzhiyun 	bool input_device_registered;
827*4882a593Smuzhiyun 	char phys[NAME_MAX];
828*4882a593Smuzhiyun };
829*4882a593Smuzhiyun 
830*4882a593Smuzhiyun enum cyttsp5_calibrate_idacs_sensing_mode {
831*4882a593Smuzhiyun 	CY_CI_SM_MUTCAP_FINE,
832*4882a593Smuzhiyun 	CY_CI_SM_MUTCAP_BUTTON,
833*4882a593Smuzhiyun 	CY_CI_SM_SELFCAP,
834*4882a593Smuzhiyun };
835*4882a593Smuzhiyun 
836*4882a593Smuzhiyun enum cyttsp5_initialize_baselines_sensing_mode {
837*4882a593Smuzhiyun 	CY_IB_SM_MUTCAP = 1,
838*4882a593Smuzhiyun 	CY_IB_SM_BUTTON = 2,
839*4882a593Smuzhiyun 	CY_IB_SM_SELFCAP = 4,
840*4882a593Smuzhiyun 	CY_IB_SM_BALANCED = 8,
841*4882a593Smuzhiyun };
842*4882a593Smuzhiyun 
843*4882a593Smuzhiyun struct cyttsp5_core_nonhid_cmd {
844*4882a593Smuzhiyun 	int (*start_bl)(struct device *dev, int protect);
845*4882a593Smuzhiyun 	int (*suspend_scanning)(struct device *dev, int protect);
846*4882a593Smuzhiyun 	int (*resume_scanning)(struct device *dev, int protect);
847*4882a593Smuzhiyun 	int (*get_param)(struct device *dev, int protect, u8 param_id,
848*4882a593Smuzhiyun 			u32 *value);
849*4882a593Smuzhiyun 	int (*set_param)(struct device *dev, int protect, u8 param_id,
850*4882a593Smuzhiyun 			u32 value, u8 size);
851*4882a593Smuzhiyun 	int (*verify_config_block_crc)(struct device *dev, int protect,
852*4882a593Smuzhiyun 			u8 ebid, u8 *status, u16 *calculated_crc,
853*4882a593Smuzhiyun 			u16 *stored_crc);
854*4882a593Smuzhiyun 	int (*get_config_row_size)(struct device *dev, int protect,
855*4882a593Smuzhiyun 			u16 *row_size);
856*4882a593Smuzhiyun 	int (*get_data_structure)(struct device *dev, int protect,
857*4882a593Smuzhiyun 			u16 read_offset, u16 read_length, u8 data_id,
858*4882a593Smuzhiyun 			u8 *status, u8 *data_format, u16 *actual_read_len,
859*4882a593Smuzhiyun 			u8 *data);
860*4882a593Smuzhiyun 	int (*run_selftest)(struct device *dev, int protect, u8 test_id,
861*4882a593Smuzhiyun 		u8 write_idacs_to_flash, u8 *status, u8 *summary_result,
862*4882a593Smuzhiyun 		u8 *results_available);
863*4882a593Smuzhiyun 	int (*get_selftest_result)(struct device *dev, int protect,
864*4882a593Smuzhiyun 		u16 read_offset, u16 read_length, u8 test_id, u8 *status,
865*4882a593Smuzhiyun 		u16 *actual_read_len, u8 *data);
866*4882a593Smuzhiyun 	int (*calibrate_idacs)(struct device *dev, int protect, u8 mode,
867*4882a593Smuzhiyun 			u8 *status);
868*4882a593Smuzhiyun 	int (*initialize_baselines)(struct device *dev, int protect,
869*4882a593Smuzhiyun 			u8 test_id, u8 *status);
870*4882a593Smuzhiyun 	int (*exec_panel_scan)(struct device *dev, int protect);
871*4882a593Smuzhiyun 	int (*retrieve_panel_scan)(struct device *dev, int protect,
872*4882a593Smuzhiyun 			u16 read_offset, u16 read_count, u8 data_id,
873*4882a593Smuzhiyun 			u8 *response, u8 *config, u16 *actual_read_len,
874*4882a593Smuzhiyun 			u8 *read_buf);
875*4882a593Smuzhiyun 	int (*write_conf_block)(struct device *dev, int protect,
876*4882a593Smuzhiyun 			u16 row_number, u16 write_length, u8 ebid,
877*4882a593Smuzhiyun 			u8 *write_buf, u8 *security_key, u16 *actual_write_len);
878*4882a593Smuzhiyun 	int (*user_cmd)(struct device *dev, int protect, u16 read_len,
879*4882a593Smuzhiyun 			u8 *read_buf, u16 write_len, u8 *write_buf,
880*4882a593Smuzhiyun 			u16 *actual_read_len);
881*4882a593Smuzhiyun 	int (*get_bl_info)(struct device *dev, int protect, u8 *return_data);
882*4882a593Smuzhiyun 	int (*initiate_bl)(struct device *dev, int protect, u16 key_size,
883*4882a593Smuzhiyun 			u8 *key_buf, u16 row_size, u8 *metadata_row_buf);
884*4882a593Smuzhiyun 	int (*launch_app)(struct device *dev, int protect);
885*4882a593Smuzhiyun 	int (*prog_and_verify)(struct device *dev, int protect, u16 data_len,
886*4882a593Smuzhiyun 			u8 *data_buf);
887*4882a593Smuzhiyun 	int (*verify_app_integrity)(struct device *dev, int protect,
888*4882a593Smuzhiyun 			u8 *result);
889*4882a593Smuzhiyun 	int (*get_panel_id)(struct device *dev, int protect, u8 *panel_id);
890*4882a593Smuzhiyun };
891*4882a593Smuzhiyun 
892*4882a593Smuzhiyun typedef int (*cyttsp5_atten_func) (struct device *);
893*4882a593Smuzhiyun 
894*4882a593Smuzhiyun struct cyttsp5_core_commands {
895*4882a593Smuzhiyun 	int (*subscribe_attention)(struct device *dev,
896*4882a593Smuzhiyun 			enum cyttsp5_atten_type type, char *id,
897*4882a593Smuzhiyun 			cyttsp5_atten_func func, int flags);
898*4882a593Smuzhiyun 	int (*unsubscribe_attention)(struct device *dev,
899*4882a593Smuzhiyun 			enum cyttsp5_atten_type type, char *id,
900*4882a593Smuzhiyun 			cyttsp5_atten_func func, int flags);
901*4882a593Smuzhiyun 	int (*request_exclusive)(struct device *dev, int timeout_ms);
902*4882a593Smuzhiyun 	int (*release_exclusive)(struct device *dev);
903*4882a593Smuzhiyun 	int (*request_reset)(struct device *dev);
904*4882a593Smuzhiyun 	int (*request_restart)(struct device *dev, bool wait);
905*4882a593Smuzhiyun 	struct cyttsp5_sysinfo * (*request_sysinfo)(struct device *dev);
906*4882a593Smuzhiyun 	struct cyttsp5_loader_platform_data
907*4882a593Smuzhiyun 		*(*request_loader_pdata)(struct device *dev);
908*4882a593Smuzhiyun 	int (*request_stop_wd)(struct device *dev);
909*4882a593Smuzhiyun 	int (*request_start_wd)(struct device *dev);
910*4882a593Smuzhiyun 	int (*request_get_hid_desc)(struct device *dev, int protect);
911*4882a593Smuzhiyun 	int (*request_get_mode)(struct device *dev, int protect, u8 *mode);
912*4882a593Smuzhiyun 	int (*request_enable_scan_type)(struct device *dev, u8 scan_type);
913*4882a593Smuzhiyun 	int (*request_disable_scan_type)(struct device *dev, u8 scan_type);
914*4882a593Smuzhiyun 	struct cyttsp5_core_nonhid_cmd *nonhid_cmd;
915*4882a593Smuzhiyun #ifdef TTHE_TUNER_SUPPORT
916*4882a593Smuzhiyun 	int (*request_tthe_print)(struct device *dev, u8 *buf, int buf_len,
917*4882a593Smuzhiyun 			const u8 *data_name);
918*4882a593Smuzhiyun #endif
919*4882a593Smuzhiyun };
920*4882a593Smuzhiyun 
921*4882a593Smuzhiyun struct cyttsp5_features {
922*4882a593Smuzhiyun 	uint8_t easywake;
923*4882a593Smuzhiyun 	uint8_t noise_metric;
924*4882a593Smuzhiyun 	uint8_t tracking_heatmap;
925*4882a593Smuzhiyun 	uint8_t sensor_data;
926*4882a593Smuzhiyun };
927*4882a593Smuzhiyun /*
928*4882a593Smuzhiyun #define NEED_SUSPEND_NOTIFIER \
929*4882a593Smuzhiyun 	((LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0)) \
930*4882a593Smuzhiyun 	&& defined(CONFIG_PM_SLEEP) && defined(CONFIG_PM_RUNTIME))
931*4882a593Smuzhiyun */
932*4882a593Smuzhiyun #define NEED_SUSPEND_NOTIFIER 0
933*4882a593Smuzhiyun 
934*4882a593Smuzhiyun struct cyttsp5_module {
935*4882a593Smuzhiyun 	struct list_head node;
936*4882a593Smuzhiyun 	char *name;
937*4882a593Smuzhiyun 	int (*probe)(struct device *dev, void **data);
938*4882a593Smuzhiyun 	void (*release)(struct device *dev, void *data);
939*4882a593Smuzhiyun };
940*4882a593Smuzhiyun 
941*4882a593Smuzhiyun struct cyttsp5_core_data {
942*4882a593Smuzhiyun 	struct list_head node;
943*4882a593Smuzhiyun 	struct list_head module_list; /* List of probed modules */
944*4882a593Smuzhiyun 	char core_id[20];
945*4882a593Smuzhiyun 	struct device *dev;
946*4882a593Smuzhiyun 	struct list_head atten_list[CY_ATTEN_NUM_ATTEN];
947*4882a593Smuzhiyun 	struct list_head param_list;
948*4882a593Smuzhiyun 	struct mutex module_list_lock;
949*4882a593Smuzhiyun 	struct mutex system_lock;
950*4882a593Smuzhiyun 	struct mutex adap_lock;
951*4882a593Smuzhiyun 	struct mutex hid_report_lock;
952*4882a593Smuzhiyun 	enum cyttsp5_mode mode;
953*4882a593Smuzhiyun 	spinlock_t spinlock;
954*4882a593Smuzhiyun 	struct cyttsp5_mt_data md;
955*4882a593Smuzhiyun 	struct cyttsp5_btn_data bd;
956*4882a593Smuzhiyun 	struct cyttsp5_proximity_data pd;
957*4882a593Smuzhiyun 	int phys_num;
958*4882a593Smuzhiyun 	int number_of_open_input_device;
959*4882a593Smuzhiyun 	int pm_runtime_usage_count;
960*4882a593Smuzhiyun 	void *cyttsp5_dynamic_data[CY_MODULE_LAST];
961*4882a593Smuzhiyun 	struct cyttsp5_platform_data *pdata;
962*4882a593Smuzhiyun 	struct cyttsp5_core_platform_data *cpdata;
963*4882a593Smuzhiyun 	const struct cyttsp5_bus_ops *bus_ops;
964*4882a593Smuzhiyun 	wait_queue_head_t wait_q;
965*4882a593Smuzhiyun 	enum cyttsp5_sleep_state sleep_state;
966*4882a593Smuzhiyun 	enum cyttsp5_startup_state startup_state;
967*4882a593Smuzhiyun 	int irq;
968*4882a593Smuzhiyun 	bool irq_enabled;
969*4882a593Smuzhiyun 	bool irq_wake;
970*4882a593Smuzhiyun 	bool irq_disabled;
971*4882a593Smuzhiyun 	u8 easy_wakeup_gesture;
972*4882a593Smuzhiyun #ifdef EASYWAKE_TSG6
973*4882a593Smuzhiyun 	u8 gesture_id;
974*4882a593Smuzhiyun 	u8 gesture_data_length;
975*4882a593Smuzhiyun 	u8 gesture_data[80];
976*4882a593Smuzhiyun #endif
977*4882a593Smuzhiyun 	bool wake_initiated_by_device;
978*4882a593Smuzhiyun 	bool wait_until_wake;
979*4882a593Smuzhiyun 	u8 panel_id;
980*4882a593Smuzhiyun #if NEED_SUSPEND_NOTIFIER
981*4882a593Smuzhiyun 	/*
982*4882a593Smuzhiyun 	 * This notifier is used to receive suspend prepare events
983*4882a593Smuzhiyun 	 * When device is PM runtime suspended, pm_generic_suspend()
984*4882a593Smuzhiyun 	 * does not call our PM suspend callback for kernels with
985*4882a593Smuzhiyun 	 * version less than 3.3.0.
986*4882a593Smuzhiyun 	 */
987*4882a593Smuzhiyun 	struct notifier_block pm_notifier;
988*4882a593Smuzhiyun #endif
989*4882a593Smuzhiyun 	struct work_struct startup_work;
990*4882a593Smuzhiyun 	struct cyttsp5_sysinfo sysinfo;
991*4882a593Smuzhiyun 	void *exclusive_dev;
992*4882a593Smuzhiyun 	int exclusive_waits;
993*4882a593Smuzhiyun 	struct work_struct watchdog_work;
994*4882a593Smuzhiyun 	struct timer_list watchdog_timer;
995*4882a593Smuzhiyun 	u16 startup_retry_count;
996*4882a593Smuzhiyun 	struct cyttsp5_hid_core hid_core;
997*4882a593Smuzhiyun 	int hid_cmd_state;
998*4882a593Smuzhiyun 	int hid_reset_cmd_state; /* reset can happen any time */
999*4882a593Smuzhiyun 	struct cyttsp5_hid_desc hid_desc;
1000*4882a593Smuzhiyun 	struct cyttsp5_hid_report *hid_reports[CY_HID_MAX_REPORTS];
1001*4882a593Smuzhiyun 	int num_hid_reports;
1002*4882a593Smuzhiyun 	struct cyttsp5_features features;
1003*4882a593Smuzhiyun #define CYTTSP5_PREALLOCATED_CMD_BUFFER 32
1004*4882a593Smuzhiyun 	u8 cmd_buf[CYTTSP5_PREALLOCATED_CMD_BUFFER];
1005*4882a593Smuzhiyun 	u8 input_buf[CY_MAX_INPUT];
1006*4882a593Smuzhiyun 	u8 response_buf[CY_MAX_INPUT];
1007*4882a593Smuzhiyun #ifdef CONFIG_HAS_EARLYSUSPEND
1008*4882a593Smuzhiyun 	struct early_suspend es;
1009*4882a593Smuzhiyun #elif defined(CONFIG_FB)
1010*4882a593Smuzhiyun 	struct notifier_block fb_notifier;
1011*4882a593Smuzhiyun 	enum cyttsp5_fb_state fb_state;
1012*4882a593Smuzhiyun #endif
1013*4882a593Smuzhiyun #ifdef TTHE_TUNER_SUPPORT
1014*4882a593Smuzhiyun 	struct dentry *tthe_debugfs;
1015*4882a593Smuzhiyun 	u8 *tthe_buf;
1016*4882a593Smuzhiyun 	u32 tthe_buf_len;
1017*4882a593Smuzhiyun 	struct mutex tthe_lock;
1018*4882a593Smuzhiyun 	u8 tthe_exit;
1019*4882a593Smuzhiyun #endif
1020*4882a593Smuzhiyun #ifdef VERBOSE_DEBUG
1021*4882a593Smuzhiyun 	u8 pr_buf[CY_MAX_PRBUF_SIZE];
1022*4882a593Smuzhiyun #endif
1023*4882a593Smuzhiyun 	u8 debug_level;
1024*4882a593Smuzhiyun 	u32 watchdog_interval;
1025*4882a593Smuzhiyun 	u8 show_timestamp;
1026*4882a593Smuzhiyun 	struct regulator *supply;
1027*4882a593Smuzhiyun 	struct tp_device tp;
1028*4882a593Smuzhiyun 	u32 is_suspend;
1029*4882a593Smuzhiyun 
1030*4882a593Smuzhiyun 	//2019-03-22 add delayedwork modify watchdog time
1031*4882a593Smuzhiyun #ifdef CYTTSP_WATCHDOG_DELAY_ENBALE
1032*4882a593Smuzhiyun 	struct delayed_work watchdog_enable_work;
1033*4882a593Smuzhiyun #endif
1034*4882a593Smuzhiyun 
1035*4882a593Smuzhiyun 
1036*4882a593Smuzhiyun };
1037*4882a593Smuzhiyun struct gd_sensor {
1038*4882a593Smuzhiyun 	int32_t cm_min;
1039*4882a593Smuzhiyun 	int32_t cm_max;
1040*4882a593Smuzhiyun 	int32_t cm_ave;
1041*4882a593Smuzhiyun 	int32_t cm_min_exclude_edge;
1042*4882a593Smuzhiyun 	int32_t cm_max_exclude_edge;
1043*4882a593Smuzhiyun 	int32_t cm_ave_exclude_edge;
1044*4882a593Smuzhiyun 	int32_t gradient_val;
1045*4882a593Smuzhiyun };
1046*4882a593Smuzhiyun 
1047*4882a593Smuzhiyun #ifdef TTHE_TUNER_SUPPORT
1048*4882a593Smuzhiyun #define CY_CMD_RET_PANEL_IN_DATA_OFFSET	0
1049*4882a593Smuzhiyun #define CY_CMD_RET_PANEL_ELMNT_SZ_MASK	0x07
1050*4882a593Smuzhiyun #define CY_CMD_RET_PANEL_HDR		0x0A
1051*4882a593Smuzhiyun #define CY_CMD_RET_PANEL_ELMNT_SZ_MAX	0x2
1052*4882a593Smuzhiyun 
1053*4882a593Smuzhiyun enum scan_data_type_list {
1054*4882a593Smuzhiyun 	CY_MUT_RAW,
1055*4882a593Smuzhiyun 	CY_MUT_BASE,
1056*4882a593Smuzhiyun 	CY_MUT_DIFF,
1057*4882a593Smuzhiyun 	CY_SELF_RAW,
1058*4882a593Smuzhiyun 	CY_SELF_BASE,
1059*4882a593Smuzhiyun 	CY_SELF_DIFF,
1060*4882a593Smuzhiyun 	CY_BAL_RAW,
1061*4882a593Smuzhiyun 	CY_BAL_BASE,
1062*4882a593Smuzhiyun 	CY_BAL_DIFF,
1063*4882a593Smuzhiyun };
1064*4882a593Smuzhiyun #endif
1065*4882a593Smuzhiyun 
1066*4882a593Smuzhiyun struct cyttsp5_bus_ops {
1067*4882a593Smuzhiyun 	u16 bustype;
1068*4882a593Smuzhiyun 
1069*4882a593Smuzhiyun 	int (*read_default)(struct device *dev, void *buf, int size);
1070*4882a593Smuzhiyun 	int (*read_default_nosize)(struct device *dev, u8 *buf, u32 max);
1071*4882a593Smuzhiyun 	int (*write_read_specific)(struct device *dev, u8 write_len,
1072*4882a593Smuzhiyun 			u8 *write_buf, u8 *read_buf);
1073*4882a593Smuzhiyun };
1074*4882a593Smuzhiyun 
cyttsp5_adap_read_default(struct cyttsp5_core_data * cd,void * buf,int size)1075*4882a593Smuzhiyun static inline int cyttsp5_adap_read_default(struct cyttsp5_core_data *cd,
1076*4882a593Smuzhiyun 		void *buf, int size)
1077*4882a593Smuzhiyun {
1078*4882a593Smuzhiyun 	return cd->bus_ops->read_default(cd->dev, buf, size);
1079*4882a593Smuzhiyun }
1080*4882a593Smuzhiyun 
cyttsp5_adap_read_default_nosize(struct cyttsp5_core_data * cd,void * buf,int max)1081*4882a593Smuzhiyun static inline int cyttsp5_adap_read_default_nosize(struct cyttsp5_core_data *cd,
1082*4882a593Smuzhiyun 		void *buf, int max)
1083*4882a593Smuzhiyun {
1084*4882a593Smuzhiyun 	return cd->bus_ops->read_default_nosize(cd->dev, buf, max);
1085*4882a593Smuzhiyun }
1086*4882a593Smuzhiyun 
cyttsp5_adap_write_read_specific(struct cyttsp5_core_data * cd,u8 write_len,u8 * write_buf,u8 * read_buf)1087*4882a593Smuzhiyun static inline int cyttsp5_adap_write_read_specific(struct cyttsp5_core_data *cd,
1088*4882a593Smuzhiyun 		u8 write_len, u8 *write_buf, u8 *read_buf)
1089*4882a593Smuzhiyun {
1090*4882a593Smuzhiyun 	return cd->bus_ops->write_read_specific(cd->dev, write_len, write_buf,
1091*4882a593Smuzhiyun 			read_buf);
1092*4882a593Smuzhiyun }
1093*4882a593Smuzhiyun 
cyttsp5_get_dynamic_data(struct device * dev,int id)1094*4882a593Smuzhiyun static inline void *cyttsp5_get_dynamic_data(struct device *dev, int id)
1095*4882a593Smuzhiyun {
1096*4882a593Smuzhiyun 	struct cyttsp5_core_data *cd = dev_get_drvdata(dev);
1097*4882a593Smuzhiyun 
1098*4882a593Smuzhiyun 	return cd->cyttsp5_dynamic_data[id];
1099*4882a593Smuzhiyun }
1100*4882a593Smuzhiyun 
1101*4882a593Smuzhiyun int request_exclusive(struct cyttsp5_core_data *cd, void *ownptr,
1102*4882a593Smuzhiyun 		int timeout_ms);
1103*4882a593Smuzhiyun int release_exclusive(struct cyttsp5_core_data *cd, void *ownptr);
1104*4882a593Smuzhiyun int _cyttsp5_request_hid_output_get_param(struct device *dev,
1105*4882a593Smuzhiyun 		int protect, u8 param_id, u32 *value);
1106*4882a593Smuzhiyun int _cyttsp5_request_hid_output_set_param(struct device *dev,
1107*4882a593Smuzhiyun 		int protect, u8 param_id, u32 value, u8 size);
1108*4882a593Smuzhiyun 
cyttsp5_request_exclusive(struct device * dev,int timeout_ms)1109*4882a593Smuzhiyun static inline int cyttsp5_request_exclusive(struct device *dev, int timeout_ms)
1110*4882a593Smuzhiyun {
1111*4882a593Smuzhiyun 	struct cyttsp5_core_data *cd = dev_get_drvdata(dev);
1112*4882a593Smuzhiyun 
1113*4882a593Smuzhiyun 	return request_exclusive(cd, dev, timeout_ms);
1114*4882a593Smuzhiyun }
1115*4882a593Smuzhiyun 
cyttsp5_release_exclusive(struct device * dev)1116*4882a593Smuzhiyun static inline int cyttsp5_release_exclusive(struct device *dev)
1117*4882a593Smuzhiyun {
1118*4882a593Smuzhiyun 	struct cyttsp5_core_data *cd = dev_get_drvdata(dev);
1119*4882a593Smuzhiyun 
1120*4882a593Smuzhiyun 	return release_exclusive(cd, dev);
1121*4882a593Smuzhiyun }
1122*4882a593Smuzhiyun 
cyttsp5_request_nonhid_get_param(struct device * dev,int protect,u8 param_id,u32 * value)1123*4882a593Smuzhiyun static inline int cyttsp5_request_nonhid_get_param(struct device *dev,
1124*4882a593Smuzhiyun 		int protect, u8 param_id, u32 *value)
1125*4882a593Smuzhiyun {
1126*4882a593Smuzhiyun 	return _cyttsp5_request_hid_output_get_param(dev, protect, param_id,
1127*4882a593Smuzhiyun 			value);
1128*4882a593Smuzhiyun }
1129*4882a593Smuzhiyun 
cyttsp5_request_nonhid_set_param(struct device * dev,int protect,u8 param_id,u32 value,u8 size)1130*4882a593Smuzhiyun static inline int cyttsp5_request_nonhid_set_param(struct device *dev,
1131*4882a593Smuzhiyun 		int protect, u8 param_id, u32 value, u8 size)
1132*4882a593Smuzhiyun {
1133*4882a593Smuzhiyun 	return _cyttsp5_request_hid_output_set_param(dev, protect, param_id,
1134*4882a593Smuzhiyun 			value, size);
1135*4882a593Smuzhiyun }
1136*4882a593Smuzhiyun 
1137*4882a593Smuzhiyun #ifdef VERBOSE_DEBUG
1138*4882a593Smuzhiyun void cyttsp5_pr_buf(struct device *dev, u8 *dptr, int size,
1139*4882a593Smuzhiyun 		const char *data_name);
1140*4882a593Smuzhiyun #else
1141*4882a593Smuzhiyun #define cyttsp5_pr_buf(a, b, c, d) do { } while (0)
1142*4882a593Smuzhiyun #endif
1143*4882a593Smuzhiyun 
1144*4882a593Smuzhiyun #ifdef CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_DEVICETREE_SUPPORT
1145*4882a593Smuzhiyun int cyttsp5_devtree_create_and_get_pdata(struct device *adap_dev);
1146*4882a593Smuzhiyun int cyttsp5_devtree_clean_pdata(struct device *adap_dev);
1147*4882a593Smuzhiyun #else
cyttsp5_devtree_create_and_get_pdata(struct device * adap_dev)1148*4882a593Smuzhiyun static inline int cyttsp5_devtree_create_and_get_pdata(struct device *adap_dev)
1149*4882a593Smuzhiyun {
1150*4882a593Smuzhiyun 	return 0;
1151*4882a593Smuzhiyun }
1152*4882a593Smuzhiyun 
cyttsp5_devtree_clean_pdata(struct device * adap_dev)1153*4882a593Smuzhiyun static inline int cyttsp5_devtree_clean_pdata(struct device *adap_dev)
1154*4882a593Smuzhiyun {
1155*4882a593Smuzhiyun 	return 0;
1156*4882a593Smuzhiyun }
1157*4882a593Smuzhiyun #endif
1158*4882a593Smuzhiyun 
1159*4882a593Smuzhiyun int cyttsp5_probe(const struct cyttsp5_bus_ops *ops, struct device *dev,
1160*4882a593Smuzhiyun 		u16 irq, size_t xfer_buf_size);
1161*4882a593Smuzhiyun int cyttsp5_release(struct cyttsp5_core_data *cd);
1162*4882a593Smuzhiyun 
1163*4882a593Smuzhiyun struct cyttsp5_core_commands *cyttsp5_get_commands(void);
1164*4882a593Smuzhiyun struct cyttsp5_core_data *cyttsp5_get_core_data(char *id);
1165*4882a593Smuzhiyun 
1166*4882a593Smuzhiyun int cyttsp5_mt_release(struct device *dev);
1167*4882a593Smuzhiyun int cyttsp5_mt_probe(struct device *dev);
1168*4882a593Smuzhiyun 
1169*4882a593Smuzhiyun #ifdef CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_BUTTON
1170*4882a593Smuzhiyun int cyttsp5_btn_probe(struct device *dev);
1171*4882a593Smuzhiyun int cyttsp5_btn_release(struct device *dev);
1172*4882a593Smuzhiyun #else
cyttsp5_btn_probe(struct device * dev)1173*4882a593Smuzhiyun static inline int cyttsp5_btn_probe(struct device *dev) { return 0; }
cyttsp5_btn_release(struct device * dev)1174*4882a593Smuzhiyun static inline int cyttsp5_btn_release(struct device *dev) { return 0; }
1175*4882a593Smuzhiyun #endif
1176*4882a593Smuzhiyun 
1177*4882a593Smuzhiyun #ifdef CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_PROXIMITY
1178*4882a593Smuzhiyun int cyttsp5_proximity_probe(struct device *dev);
1179*4882a593Smuzhiyun int cyttsp5_proximity_release(struct device *dev);
1180*4882a593Smuzhiyun #else
cyttsp5_proximity_probe(struct device * dev)1181*4882a593Smuzhiyun static inline int cyttsp5_proximity_probe(struct device *dev) { return 0; }
cyttsp5_proximity_release(struct device * dev)1182*4882a593Smuzhiyun static inline int cyttsp5_proximity_release(struct device *dev) { return 0; }
1183*4882a593Smuzhiyun #endif
1184*4882a593Smuzhiyun 
1185*4882a593Smuzhiyun void cyttsp5_init_function_ptrs(struct cyttsp5_mt_data *md);
1186*4882a593Smuzhiyun int _cyttsp5_subscribe_attention(struct device *dev,
1187*4882a593Smuzhiyun 	enum cyttsp5_atten_type type, char *id, int (*func)(struct device *),
1188*4882a593Smuzhiyun 	int mode);
1189*4882a593Smuzhiyun int _cyttsp5_unsubscribe_attention(struct device *dev,
1190*4882a593Smuzhiyun 	enum cyttsp5_atten_type type, char *id, int (*func)(struct device *),
1191*4882a593Smuzhiyun 	int mode);
1192*4882a593Smuzhiyun struct cyttsp5_sysinfo *_cyttsp5_request_sysinfo(struct device *dev);
1193*4882a593Smuzhiyun 
1194*4882a593Smuzhiyun extern const struct dev_pm_ops cyttsp5_pm_ops;
1195*4882a593Smuzhiyun 
1196*4882a593Smuzhiyun int cyttsp5_register_module(struct cyttsp5_module *module);
1197*4882a593Smuzhiyun void cyttsp5_unregister_module(struct cyttsp5_module *module);
1198*4882a593Smuzhiyun 
1199*4882a593Smuzhiyun void *cyttsp5_get_module_data(struct device *dev,
1200*4882a593Smuzhiyun 		struct cyttsp5_module *module);
1201*4882a593Smuzhiyun 
1202*4882a593Smuzhiyun #endif /* _CYTTSP5_REGS_H */
1203