touchkey_i2c.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. /*
  2. * cypress_touchkey.h - Platform data for cypress touchkey driver
  3. *
  4. * Copyright (C) 2011 Samsung Electronics
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License version 2 as
  8. * published by the Free Software Foundation.
  9. *
  10. */
  11. #ifndef __LINUX_CYPRESS_TOUCHKEY_H
  12. #define __LINUX_CYPRESS_TOUCHKEY_H
  13. extern struct class *sec_class;
  14. #ifdef CONFIG_SAMSUNG_LPM_MODE
  15. extern int poweroff_charging;
  16. #endif
  17. /* DVFS feature : TOUCH BOOSTER */
  18. #define TSP_BOOSTER
  19. #ifdef TSP_BOOSTER
  20. #include <linux/cpufreq.h>
  21. #define DVFS_STAGE_DUAL 2
  22. #define DVFS_STAGE_SINGLE 1
  23. #define DVFS_STAGE_NONE 0
  24. #define TOUCH_BOOSTER_OFF_TIME 500
  25. #define TOUCH_BOOSTER_CHG_TIME 500
  26. #endif
  27. #include <linux/input.h>
  28. #include <linux/earlysuspend.h>
  29. #include <linux/mutex.h>
  30. #include <linux/wakelock.h>
  31. #ifdef CONFIG_FB
  32. #include <linux/notifier.h>
  33. #endif
  34. #if defined(CONFIG_SEC_K_PROJECT)
  35. #define CYPRESS_SUPPORT_DUAL_INT_MODE
  36. #define CYPRESS_RECENT_BACK_REPORT_FW_VER 0x1D
  37. #define TK_CMD_INTERRUPT_SET_REG 0x00
  38. #define CYPRESS_DETECTION_FLAG 0x08
  39. #define TK_CMD_DUAL_DETECTION 0x01
  40. #define TK_BIT_DETECTION_CONFIRM 0xEE
  41. #elif defined(CONFIG_SEC_H_PROJECT)
  42. #define CYPRESS_SUPPORT_DUAL_INT_MODE
  43. #define CYPRESS_RECENT_BACK_REPORT_FW_VER 0x12
  44. #define TK_CMD_INTERRUPT_SET_REG 0x18
  45. #define CYPRESS_DETECTION_FLAG 0x1B
  46. #define TK_CMD_DUAL_DETECTION 0x01
  47. #define TK_BIT_DETECTION_CONFIRM 0xEE
  48. #elif defined(CONFIG_SEC_KLIMT_PROJECT)
  49. #define CYPRESS_SUPPORT_DUAL_INT_MODE
  50. #define CYPRESS_RECENT_BACK_REPORT_FW_VER 0x09
  51. #define TK_CMD_INTERRUPT_SET_REG 0x18
  52. #define CYPRESS_DETECTION_FLAG 0x1B
  53. #define TK_CMD_DUAL_DETECTION 0x01
  54. #define TK_BIT_DETECTION_CONFIRM 0xEE
  55. #define CRC_CHECK_DELAY
  56. #elif defined(CONFIG_MACH_JS01LTEDCM)
  57. #define CYPRESS_SUPPORT_DUAL_INT_MODE
  58. #define CYPRESS_RECENT_BACK_REPORT_FW_VER 0x09
  59. #define TK_CMD_INTERRUPT_SET_REG 0x18
  60. #define CYPRESS_DETECTION_FLAG 0x1B
  61. #define TK_CMD_DUAL_DETECTION 0x01
  62. #define TK_BIT_DETECTION_CONFIRM 0xEE
  63. #else
  64. #undef CYPRESS_SUPPORT_DUAL_INT_MODE
  65. #define CYPRESS_RECENT_BACK_REPORT_FW_VER 0xFF
  66. #endif
  67. #if defined(CONFIG_KEYBOARD_CYPRESS_TOUCHKEY)
  68. /* Touchkey Register */
  69. #define CYPRESS_GEN 0X00
  70. #define CYPRESS_OP_MODE 0X01
  71. #define CYPRESS_SP_REG 0X02
  72. #define CYPRESS_BUTTON_STATUS 0X03
  73. #define CYPRESS_FW_VER 0X04
  74. #define CYPRESS_MODULE_VER 0X05
  75. #define CYPRESS_DEVICE_VER 0X06
  76. #define CYPRESS_STATUS_FLAG 0X07
  77. #define CYPRESS_THRESHOLD 0X09
  78. #define CYPRESS_THRESHOLD2 0X0A
  79. #define CYPRESS_THRESHOLD3 0X0B
  80. #define CYPRESS_THRESHOLD4 0X0C
  81. #define CYPRESS_IDAC_MENU 0x0D
  82. #define CYPRESS_IDAC_MENU_INNER 0x0E
  83. #define CYPRESS_IDAC_BACK 0x0F
  84. #define CYPRESS_IDAC_BACK_INNER 0x10
  85. #define CYPRESS_COMPIDAC_MENU 0x11
  86. #define CYPRESS_COMPIDAC_MENU_INNER 0x12
  87. #define CYPRESS_COMPIDAC_BACK 0x13
  88. #define CYPRESS_COMPIDAC_BACK_INNER 0x14
  89. #define CYPRESS_DIFF_MENU 0x16
  90. #define CYPRESS_DIFF_MENU_INNER 0x18
  91. #define CYPRESS_DIFF_BACK 0x1A
  92. #define CYPRESS_DIFF_BACK_INNER 0x1C
  93. #define CYPRESS_RAW_DATA_MENU 0x1E
  94. #define CYPRESS_RAW_DATA_MENU_INNER 0x20
  95. #define CYPRESS_RAW_DATA_BACK 0x22
  96. #define CYPRESS_RAW_DATA_BACK_INNER 0x24
  97. #define CYPRESS_BASE_DATA_MENU 0x26
  98. #define CYPRESS_BASE_DATA_MENU_INNER 0x28
  99. #define CYPRESS_BASE_DATA_BACK 0x2A
  100. #define CYPRESS_BASE_DATA_BACK_INNER 0x2C
  101. #define CYPRESS_DATA_UPDATE 0X40
  102. #elif defined(CONFIG_KEYBOARD_CYPRESS_TOUCHKEY_H) || defined(CONFIG_KEYBOARD_CYPRESS_TOUCHKEY_C) || defined (CONFIG_KEYBOARD_CYPRESS_TOUCHKEY_HE)
  103. #define CYPRESS_GEN 0X00
  104. #define CYPRESS_FW_VER 0X01
  105. #define CYPRESS_MODULE_VER 0X02
  106. #define CYPRESS_2ND_HOST 0X03
  107. #define CYPRESS_THRESHOLD 0X04
  108. #define CYPRESS_AUTO_CAL_FLG 0X05
  109. #define CYPRESS_IDAC_MENU 0X07
  110. #define CYPRESS_IDAC_BACK 0X06
  111. #define CYPRESS_IDAC_HOME 0X08
  112. #define CYPRESS_DIFF_MENU 0x0C
  113. #define CYPRESS_DIFF_BACK 0x0A
  114. #define CYPRESS_DIFF_HOME 0x0E
  115. #define CYPRESS_RAW_DATA_MENU 0x10
  116. #define CYPRESS_RAW_DATA_BACK 0x0E
  117. #define CYPRESS_RAW_DATA_HOME 0x12
  118. #define CYPRESS_RAW_DATA_BACK_GOGH 0x14
  119. #define CYPRESS_DATA_UPDATE 0X40
  120. #define CYPRESS_AUTO_CAL 0X50
  121. #define CYPRESS_SLEEP 0X80
  122. #define CYPRESS_FW_ID_REG 0X05
  123. #define USE_OPEN_CLOSE
  124. #undef DO_NOT_USE_FUNC_PARAM
  125. #define KEYCODE_REG 0x00
  126. #endif
  127. /* OP MODE CMD */
  128. #define TK_BIT_CMD_LEDCONTROL 0x40 /* Owner for LED on/off control (0:host / 1:TouchIC) */
  129. #define TK_BIT_CMD_INSPECTION 0x20 /* Inspection mode */
  130. #define TK_BIT_CMD_1MM 0x10 /* 1mm stylus mode */
  131. #define TK_BIT_CMD_FLIP 0x08 /* flip mode */
  132. #define TK_BIT_CMD_GLOVE 0x04 /* glove mode */
  133. #define TK_BIT_CMD_TA_ON 0x02 /* Ta mode */
  134. #define TK_BIT_CMD_REGULAR 0x01 /* regular mode = normal mode */
  135. #define TK_BIT_WRITE_CONFIRM 0xAA
  136. /* STATUS FLAG */
  137. #if defined(CONFIG_KEYBOARD_CYPRESS_TOUCHKEY_H) || defined (CONFIG_KEYBOARD_CYPRESS_TOUCHKEY_C) || defined (CONFIG_KEYBOARD_CYPRESS_TOUCHKEY_HE)
  138. #define TK_BIT_AUTOCAL 0x80
  139. #define TK_BIT_GLOVE 0x40
  140. #define TK_BIT_TA_ON 0x10
  141. #define TK_BIT_FLIP 0x08
  142. #else
  143. #define TK_BIT_LEDCONTROL 0x40 /* Owner for LED on/off control (0:host / 1:TouchIC) */
  144. #define TK_BIT_1MM 0x20 /* 1mm stylus mode */
  145. #define TK_BIT_FLIP 0x10 /* flip mode */
  146. #define TK_BIT_GLOVE 0x08 /* glove mode */
  147. #define TK_BIT_TA_ON 0x04 /* Ta mode */
  148. #define TK_BIT_REGULAR 0x02 /* regular mode = normal mode */
  149. #define TK_BIT_LED_STATUS 0x01 /* LED status */
  150. #endif
  151. /* bit masks*/
  152. #define PRESS_BIT_MASK 0X08
  153. #define KEYCODE_BIT_MASK 0X07
  154. #define TK_CMD_LED_ON 0x10
  155. #define TK_CMD_LED_OFF 0x20
  156. /*
  157. #define TOUCHKEY_LOG(k, v) dev_notice(&info->client->dev, "key[%d] %d\n", k, v);
  158. #define FUNC_CALLED dev_notice(&info->client->dev, "%s: called.\n", __func__);
  159. */
  160. #define NUM_OF_RETRY_UPDATE 5
  161. /*#define NUM_OF_KEY 4*/
  162. #define USE_OPEN_CLOSE
  163. #undef DO_NOT_USE_FUNC_PARAM
  164. #define CONFIG_GLOVE_TOUCH
  165. #ifdef CONFIG_GLOVE_TOUCH
  166. #define TKEY_GLOVE_DWORK_TIME 300
  167. #endif
  168. /* Flip cover*/
  169. #define TKEY_FLIP_MODE
  170. /* 1MM stylus */
  171. #define TKEY_1MM_MODE
  172. //#define TK_INFORM_CHARGER
  173. #if defined(CONFIG_KEYBOARD_CYPRESS_TOUCHKEY) && \
  174. !defined(CONFIG_EXTCON)
  175. #define TK_INFORM_CHARGER
  176. #elif defined(CONFIG_KEYBOARD_CYPRESS_TOUCHKEY_H) || defined(CONFIG_KEYBOARD_CYPRESS_TOUCHKEY_C) || defined (CONFIG_KEYBOARD_CYPRESS_TOUCHKEY_HE)
  177. #undef TK_INFORM_CHARGER
  178. #endif
  179. #define CYPRESS_55_IC_MASK 0x20
  180. #define CYPRESS_65_IC_MASK 0x04
  181. #define NUM_OF_KEY 4
  182. #define TK_KEYPAD_ENABLE
  183. enum {
  184. CORERIVER_TOUCHKEY,
  185. CYPRESS_TOUCHKEY,
  186. };
  187. #ifdef TK_INFORM_CHARGER
  188. struct touchkey_callbacks {
  189. void (*inform_charger)(struct touchkey_callbacks *, bool);
  190. };
  191. #endif
  192. enum {
  193. UPDATE_NONE,
  194. DOWNLOADING,
  195. UPDATE_FAIL,
  196. UPDATE_PASS,
  197. };
  198. #define USE_TKEY_UPDATE_WORK
  199. #define TKEY_REQUEST_FW_UPDATE
  200. #ifdef TKEY_REQUEST_FW_UPDATE
  201. #define TKEY_FW_BUILTIN_PATH "tkey"
  202. #define TKEY_FW_IN_SDCARD_PATH "/sdcard/"
  203. #define TKEY_SEMCO_CYPRESS_FW_NAME "semco_cypress_tkey"
  204. #define TKEY_SEMCO02_CYPRESS_FW_NAME "semco02_cypress_tkey"
  205. #define TKEY_SEMCO04_CYPRESS_FW_NAME "semco04_cypress_tkey"
  206. #define TKEY_DTECH_CYPRESS_FW_NAME "dtech_cypress_tkey"
  207. #ifdef CONFIG_MACH_JS01LTEDCM
  208. #define TKEY_CORERIVER_FW_NAME "hltejs01_coreriver_tkey"
  209. #define TKEY_CYPRESS_FW_NAME "hltejs01_cypress_tkey"
  210. #else
  211. #define TKEY_CORERIVER_FW_NAME "hlte_coreriver_tkey"
  212. #if defined(CONFIG_SEC_BERLUTI_PROJECT)
  213. #define TKEY_CYPRESS_FW_NAME "berluti_cypress_tkey"
  214. #elif defined(CONFIG_SEC_KLIMT_PROJECT)
  215. #define TKEY_CYPRESS_FW_NAME "klimt_cypress_tkey"
  216. #else
  217. #define TKEY_CYPRESS_FW_NAME "hlte_cypress_tkey"
  218. #endif
  219. #endif
  220. enum {
  221. FW_BUILT_IN = 0,
  222. FW_IN_SDCARD,
  223. };
  224. struct fw_image {
  225. u8 hdr_ver;
  226. u8 hdr_len;
  227. u16 first_fw_ver;
  228. u16 second_fw_ver;
  229. u16 third_ver;
  230. u32 fw_len;
  231. #if defined(CONFIG_SEC_K_PROJECT) || defined(CONFIG_SEC_S_PROJECT) || defined(CONFIG_SEC_PATEK_PROJECT) || defined(CONFIG_SEC_KLIMT_PROJECT)
  232. u16 checksum;
  233. u16 alignment_dummy;
  234. #endif
  235. u8 data[0];
  236. } __attribute__ ((packed));
  237. #else
  238. #define BIN_FW_VERSION 0
  239. #endif
  240. /* Divide model */
  241. #if defined(CONFIG_SEC_KLIMT_PROJECT)
  242. #define USE_SW_I2C // only use sw i2c line
  243. #define ENABLE_FW_UPDATE //fw update after dtsi 02
  244. #endif
  245. struct cypress_touchkey_platform_data {
  246. unsigned gpio_led_en;
  247. u32 touchkey_keycode[4];
  248. int keycodes_size;
  249. void (*power_onoff) (int);
  250. bool skip_fw_update;
  251. bool touchkey_order;
  252. void (*register_cb)(void *);
  253. bool i2c_pull_up;
  254. bool vcc_flag;
  255. bool fw_update_flag;
  256. int gpio_int;
  257. u32 irq_gpio_flags;
  258. int gpio_sda;
  259. u32 sda_gpio_flags;
  260. int gpio_scl;
  261. u32 scl_gpio_flags;
  262. int gpio_touchkey_id;
  263. u32 gpio_touchkey_id_flags;
  264. int vdd_led;
  265. int vcc_en;
  266. };
  267. struct cypress_touchkey_info {
  268. struct i2c_client *client;
  269. struct cypress_touchkey_platform_data *pdata;
  270. struct input_dev *input_dev;
  271. struct early_suspend early_suspend;
  272. char phys[32];
  273. unsigned char keycode[NUM_OF_KEY];
  274. u8 sensitivity[NUM_OF_KEY];
  275. int irq;
  276. void (*power_onoff)(int);
  277. u8 touchkey_update_status;
  278. u8 ic_vendor;
  279. struct regulator *vcc_en;
  280. struct regulator *vdd_led;
  281. #ifdef CONFIG_GLOVE_TOUCH
  282. #if defined(CONFIG_KEYBOARD_CYPRESS_TOUCHKEY)
  283. struct delayed_work glove_work;
  284. struct mutex tkey_glove_lock;
  285. #else
  286. struct workqueue_struct *glove_wq;
  287. struct work_struct glove_work;
  288. #endif
  289. int glove_value;
  290. #endif
  291. #ifdef USE_TKEY_UPDATE_WORK
  292. struct workqueue_struct *fw_wq;
  293. struct work_struct update_work;
  294. #endif
  295. bool is_powering_on;
  296. bool enabled;
  297. bool done_ta_setting;
  298. #ifdef TKEY_FLIP_MODE
  299. bool enabled_flip;
  300. #endif
  301. #ifdef TKEY_1MM_MODE
  302. bool enabled_1mm;
  303. #endif
  304. #ifdef TSP_BOOSTER
  305. struct delayed_work work_dvfs_off;
  306. struct delayed_work work_dvfs_chg;
  307. struct mutex dvfs_lock;
  308. bool dvfs_lock_status;
  309. int dvfs_old_stauts;
  310. int dvfs_boost_mode;
  311. int dvfs_freq;
  312. #endif
  313. #ifdef TK_INFORM_CHARGER
  314. struct touchkey_callbacks callbacks;
  315. bool charging_mode;
  316. #endif
  317. #ifdef TKEY_REQUEST_FW_UPDATE
  318. const struct firmware *fw;
  319. struct fw_image *fw_img;
  320. u8 cur_fw_path;
  321. #endif
  322. int src_fw_ver;
  323. int ic_fw_ver;
  324. int module_ver;
  325. int device_ver;
  326. u32 fw_id;
  327. u8 touchkeyid;
  328. bool support_fw_update;
  329. #ifdef TK_KEYPAD_ENABLE
  330. atomic_t keypad_enable;
  331. #endif
  332. bool do_checksum;
  333. struct wake_lock fw_wakelock;
  334. #if defined(CONFIG_FB) && (defined(CONFIG_KEYBOARD_CYPRESS_TOUCHKEY) || defined(CONFIG_KEYBOARD_CYPRESS_TOUCHKEY_H))
  335. struct notifier_block fb_notif;
  336. #endif
  337. };
  338. #ifdef TK_INFORM_CHARGER
  339. void touchkey_charger_infom(bool en);
  340. #endif
  341. /* TKEY MODULE 0x6 */
  342. #if defined(CONFIG_MACH_KLTE_EUR) || defined(CONFIG_MACH_KWIFI_LDU)
  343. #define TKEY_MODULE_CHECK_REV 0xA
  344. #elif defined(CONFIG_MACH_KLTE_ATT) || defined(CONFIG_MACH_KLTE_AUS_TEL)
  345. #define TKEY_MODULE_CHECK_REV 0xE
  346. #elif defined(CONFIG_MACH_KLTE_CHN) || defined(CONFIG_MACH_KLTE_KOR) || defined(CONFIG_MACH_KLTE_JPN) \
  347. || defined(CONFIG_MACH_KLTE_SPR) || defined(CONFIG_MACH_KLTE_VZW) || defined(CONFIG_MACH_KLTE_LRA) \
  348. || defined(CONFIG_MACH_KLTE_TMO) || defined(CONFIG_MACH_KLTE_CAN) || defined(CONFIG_MACH_KLTE_MTR) \
  349. || defined(CONFIG_MACH_KLTE_USC) || defined(CONFIG_MACH_KLTE_ACG) || defined(CONFIG_MACH_K3GDUOS_CTC)
  350. #define TKEY_MODULE_CHECK_REV 0x9
  351. #else
  352. #define TKEY_MODULE_CHECK_REV 0xFF
  353. #endif
  354. extern int coreriver_fw_update(struct cypress_touchkey_info *info, bool force);
  355. #define PM8921_IRQ_BASE (NR_MSM_IRQS + NR_GPIO_IRQS)
  356. #if defined(CONFIG_KEYBOARD_CYPRESS_TOUCHKEY_C)
  357. #define GPIO_TOUCHKEY_SDA 22
  358. #define GPIO_TOUCHKEY_SCL 23
  359. #define PMIC_GPIO_TKEY_INT 49
  360. #elif defined(CONFIG_SEC_KLIMT_PROJECT)
  361. #define GPIO_TOUCHKEY_SDA 10
  362. #define GPIO_TOUCHKEY_SCL 11
  363. #define GPIO_TKEY_INT 144
  364. #else
  365. #define GPIO_TOUCHKEY_SDA 95
  366. #define GPIO_TOUCHKEY_SCL 96
  367. #define PMIC_GPIO_TKEY_INT 79
  368. #endif
  369. extern void cypress_power_onoff(struct cypress_touchkey_info *info, int onoff);
  370. #endif /* __LINUX_CYPRESS_TOUCHKEY_H */