kpd.c 29 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033
  1. /*
  2. * Copyright (C) 2010 MediaTek, Inc.
  3. *
  4. * Author: Terry Chang <terry.chang@mediatek.com>
  5. *
  6. * This software is licensed under the terms of the GNU General Public
  7. * License version 2, as published by the Free Software Foundation, and
  8. * may be copied, distributed, and modified under those terms.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. */
  16. #include "kpd.h"
  17. #include <linux/wakelock.h>
  18. #include <linux/of.h>
  19. #include <linux/of_address.h>
  20. #include <linux/of_irq.h>
  21. #include <linux/clk.h>
  22. #define KPD_NAME "mtk-kpd"
  23. #define MTK_KP_WAKESOURCE /* this is for auto set wake up source */
  24. void __iomem *kp_base;
  25. static unsigned int kp_irqnr;
  26. struct input_dev *kpd_input_dev;
  27. static bool kpd_suspend;
  28. static int kpd_show_hw_keycode = 1;
  29. static int kpd_show_register = 1;
  30. static char call_status;
  31. struct wake_lock kpd_suspend_lock; /* For suspend usage */
  32. /*for kpd_memory_setting() function*/
  33. static u16 kpd_keymap[KPD_NUM_KEYS];
  34. static u16 kpd_keymap_state[KPD_NUM_MEMS];
  35. #ifdef CONFIG_ARCH_MT8173
  36. static struct wake_lock pwrkey_lock;
  37. #endif
  38. /***********************************/
  39. /* for slide QWERTY */
  40. #if KPD_HAS_SLIDE_QWERTY
  41. static void kpd_slide_handler(unsigned long data);
  42. static DECLARE_TASKLET(kpd_slide_tasklet, kpd_slide_handler, 0);
  43. static u8 kpd_slide_state = !KPD_SLIDE_POLARITY;
  44. #endif
  45. struct keypad_dts_data kpd_dts_data;
  46. /* for Power key using EINT */
  47. #ifdef CONFIG_KPD_PWRKEY_USE_EINT
  48. static void kpd_pwrkey_handler(unsigned long data);
  49. static DECLARE_TASKLET(kpd_pwrkey_tasklet, kpd_pwrkey_handler, 0);
  50. #endif
  51. /* for keymap handling */
  52. static void kpd_keymap_handler(unsigned long data);
  53. static DECLARE_TASKLET(kpd_keymap_tasklet, kpd_keymap_handler, 0);
  54. /*********************************************************************/
  55. static void kpd_memory_setting(void);
  56. /*********************************************************************/
  57. static int kpd_pdrv_probe(struct platform_device *pdev);
  58. static int kpd_pdrv_remove(struct platform_device *pdev);
  59. #ifndef USE_EARLY_SUSPEND
  60. static int kpd_pdrv_suspend(struct platform_device *pdev, pm_message_t state);
  61. static int kpd_pdrv_resume(struct platform_device *pdev);
  62. #endif
  63. static const struct of_device_id kpd_of_match[] = {
  64. {.compatible = "mediatek,mt6580-keypad"},
  65. {.compatible = "mediatek,mt6735-keypad"},
  66. {.compatible = "mediatek,mt6755-keypad"},
  67. {.compatible = "mediatek,mt8173-keypad"},
  68. {.compatible = "mediatek,mt6797-keypad"},
  69. {.compatible = "mediatek,mt8163-keypad"},
  70. {},
  71. };
  72. static struct platform_driver kpd_pdrv = {
  73. .probe = kpd_pdrv_probe,
  74. .remove = kpd_pdrv_remove,
  75. #ifndef USE_EARLY_SUSPEND
  76. .suspend = kpd_pdrv_suspend,
  77. .resume = kpd_pdrv_resume,
  78. #endif
  79. .driver = {
  80. .name = KPD_NAME,
  81. .owner = THIS_MODULE,
  82. .of_match_table = kpd_of_match,
  83. },
  84. };
  85. /********************************************************************/
  86. static void kpd_memory_setting(void)
  87. {
  88. kpd_init_keymap(kpd_keymap);
  89. kpd_init_keymap_state(kpd_keymap_state);
  90. }
  91. /*****************for kpd auto set wake up source*************************/
  92. static ssize_t kpd_store_call_state(struct device_driver *ddri, const char *buf, size_t count)
  93. {
  94. int ret;
  95. ret = sscanf(buf, "%s", &call_status);
  96. if (ret != 1) {
  97. kpd_print("kpd call state: Invalid values\n");
  98. return -EINVAL;
  99. }
  100. switch (call_status) {
  101. case 1:
  102. kpd_print("kpd call state: Idle state!\n");
  103. break;
  104. case 2:
  105. kpd_print("kpd call state: ringing state!\n");
  106. break;
  107. case 3:
  108. kpd_print("kpd call state: active or hold state!\n");
  109. break;
  110. default:
  111. kpd_print("kpd call state: Invalid values\n");
  112. break;
  113. }
  114. return count;
  115. }
  116. static ssize_t kpd_show_call_state(struct device_driver *ddri, char *buf)
  117. {
  118. ssize_t res;
  119. res = snprintf(buf, PAGE_SIZE, "%d\n", call_status);
  120. return res;
  121. }
  122. static DRIVER_ATTR(kpd_call_state, S_IWUSR | S_IRUGO, kpd_show_call_state, kpd_store_call_state);
  123. static struct driver_attribute *kpd_attr_list[] = {
  124. &driver_attr_kpd_call_state,
  125. };
  126. /*----------------------------------------------------------------------------*/
  127. static int kpd_create_attr(struct device_driver *driver)
  128. {
  129. int idx, err = 0;
  130. int num = (int)(sizeof(kpd_attr_list) / sizeof(kpd_attr_list[0]));
  131. if (driver == NULL)
  132. return -EINVAL;
  133. for (idx = 0; idx < num; idx++) {
  134. err = driver_create_file(driver, kpd_attr_list[idx]);
  135. if (err) {
  136. kpd_info("driver_create_file (%s) = %d\n", kpd_attr_list[idx]->attr.name, err);
  137. break;
  138. }
  139. }
  140. return err;
  141. }
  142. /*----------------------------------------------------------------------------*/
  143. static int kpd_delete_attr(struct device_driver *driver)
  144. {
  145. int idx, err = 0;
  146. int num = (int)(sizeof(kpd_attr_list) / sizeof(kpd_attr_list[0]));
  147. if (!driver)
  148. return -EINVAL;
  149. for (idx = 0; idx < num; idx++)
  150. driver_remove_file(driver, kpd_attr_list[idx]);
  151. return err;
  152. }
  153. /*----------------------------------------------------------------------------*/
  154. /********************************************************************************************/
  155. /************************************************************************************************************************************************/
  156. /* for autotest */
  157. #if KPD_AUTOTEST
  158. static const u16 kpd_auto_keymap[] = {
  159. KEY_MENU,
  160. KEY_HOME, KEY_BACK,
  161. KEY_CALL, KEY_ENDCALL,
  162. KEY_VOLUMEUP, KEY_VOLUMEDOWN,
  163. KEY_FOCUS, KEY_CAMERA,
  164. };
  165. #endif
  166. /* for AEE manual dump */
  167. #define AEE_VOLUMEUP_BIT 0
  168. #define AEE_VOLUMEDOWN_BIT 1
  169. #define AEE_DELAY_TIME 15
  170. /* enable volup + voldown was pressed 5~15 s Trigger aee manual dump */
  171. #define AEE_ENABLE_5_15 1
  172. static struct hrtimer aee_timer;
  173. static unsigned long aee_pressed_keys;
  174. static bool aee_timer_started;
  175. #if AEE_ENABLE_5_15
  176. #define AEE_DELAY_TIME_5S 5
  177. static struct hrtimer aee_timer_5s;
  178. static bool aee_timer_5s_started;
  179. static bool flags_5s;
  180. #endif
  181. static inline void kpd_update_aee_state(void)
  182. {
  183. if (aee_pressed_keys == ((1 << AEE_VOLUMEUP_BIT) | (1 << AEE_VOLUMEDOWN_BIT))) {
  184. /* if volumeup and volumedown was pressed the same time then start the time of ten seconds */
  185. aee_timer_started = true;
  186. #if AEE_ENABLE_5_15
  187. aee_timer_5s_started = true;
  188. hrtimer_start(&aee_timer_5s, ktime_set(AEE_DELAY_TIME_5S, 0), HRTIMER_MODE_REL);
  189. #endif
  190. hrtimer_start(&aee_timer, ktime_set(AEE_DELAY_TIME, 0), HRTIMER_MODE_REL);
  191. kpd_print("aee_timer started\n");
  192. } else {
  193. /*
  194. * hrtimer_cancel - cancel a timer and wait for the handler to finish.
  195. * Returns:
  196. * 0 when the timer was not active.
  197. * 1 when the timer was active.
  198. */
  199. if (aee_timer_started) {
  200. if (hrtimer_cancel(&aee_timer)) {
  201. kpd_print("try to cancel hrtimer\n");
  202. #if AEE_ENABLE_5_15
  203. if (flags_5s) {
  204. kpd_print("Pressed Volup + Voldown5s~15s then trigger aee manual dump.\n");
  205. /*ZH CHEN*/
  206. /*aee_kernel_reminding("manual dump", "Trigger Vol Up +Vol Down 5s");*/
  207. }
  208. #endif
  209. }
  210. #if AEE_ENABLE_5_15
  211. flags_5s = false;
  212. #endif
  213. aee_timer_started = false;
  214. kpd_print("aee_timer canceled\n");
  215. }
  216. #if AEE_ENABLE_5_15
  217. /*
  218. * hrtimer_cancel - cancel a timer and wait for the handler to finish.
  219. * Returns:
  220. * 0 when the timer was not active.
  221. * 1 when the timer was active.
  222. */
  223. if (aee_timer_5s_started) {
  224. if (hrtimer_cancel(&aee_timer_5s))
  225. kpd_print("try to cancel hrtimer (5s)\n");
  226. aee_timer_5s_started = false;
  227. kpd_print("aee_timer canceled (5s)\n");
  228. }
  229. #endif
  230. }
  231. }
  232. static void kpd_aee_handler(u32 keycode, u16 pressed)
  233. {
  234. if (pressed) {
  235. if (keycode == KEY_VOLUMEUP)
  236. __set_bit(AEE_VOLUMEUP_BIT, &aee_pressed_keys);
  237. else if (keycode == KEY_VOLUMEDOWN)
  238. __set_bit(AEE_VOLUMEDOWN_BIT, &aee_pressed_keys);
  239. else
  240. return;
  241. kpd_update_aee_state();
  242. } else {
  243. if (keycode == KEY_VOLUMEUP)
  244. __clear_bit(AEE_VOLUMEUP_BIT, &aee_pressed_keys);
  245. else if (keycode == KEY_VOLUMEDOWN)
  246. __clear_bit(AEE_VOLUMEDOWN_BIT, &aee_pressed_keys);
  247. else
  248. return;
  249. kpd_update_aee_state();
  250. }
  251. }
  252. static enum hrtimer_restart aee_timer_func(struct hrtimer *timer)
  253. {
  254. /* kpd_info("kpd: vol up+vol down AEE manual dump!\n"); */
  255. /* aee_kernel_reminding("manual dump ", "Triggered by press KEY_VOLUMEUP+KEY_VOLUMEDOWN"); */
  256. /*ZH CHEN*/
  257. /*aee_trigger_kdb();*/
  258. return HRTIMER_NORESTART;
  259. }
  260. #if AEE_ENABLE_5_15
  261. static enum hrtimer_restart aee_timer_5s_func(struct hrtimer *timer)
  262. {
  263. /* kpd_info("kpd: vol up+vol down AEE manual dump timer 5s !\n"); */
  264. flags_5s = true;
  265. return HRTIMER_NORESTART;
  266. }
  267. #endif
  268. /************************************************************************/
  269. #if KPD_HAS_SLIDE_QWERTY
  270. static void kpd_slide_handler(unsigned long data)
  271. {
  272. bool slid;
  273. u8 old_state = kpd_slide_state;
  274. kpd_slide_state = !kpd_slide_state;
  275. slid = (kpd_slide_state == !!KPD_SLIDE_POLARITY);
  276. /* for SW_LID, 1: lid open => slid, 0: lid shut => closed */
  277. input_report_switch(kpd_input_dev, SW_LID, slid);
  278. input_sync(kpd_input_dev);
  279. kpd_print("report QWERTY = %s\n", slid ? "slid" : "closed");
  280. if (old_state)
  281. mt_set_gpio_pull_select(GPIO_QWERTYSLIDE_EINT_PIN, 0);
  282. else
  283. mt_set_gpio_pull_select(GPIO_QWERTYSLIDE_EINT_PIN, 1);
  284. /* for detecting the return to old_state */
  285. mt65xx_eint_set_polarity(KPD_SLIDE_EINT, old_state);
  286. mt65xx_eint_unmask(KPD_SLIDE_EINT);
  287. }
  288. static void kpd_slide_eint_handler(void)
  289. {
  290. tasklet_schedule(&kpd_slide_tasklet);
  291. }
  292. #endif
  293. #ifdef CONFIG_KPD_PWRKEY_USE_EINT
  294. static void kpd_pwrkey_handler(unsigned long data)
  295. {
  296. kpd_pwrkey_handler_hal(data);
  297. }
  298. static void kpd_pwrkey_eint_handler(void)
  299. {
  300. tasklet_schedule(&kpd_pwrkey_tasklet);
  301. }
  302. #endif
  303. /*********************************************************************/
  304. /*********************************************************************/
  305. #ifdef CONFIG_KPD_PWRKEY_USE_PMIC
  306. void kpd_pwrkey_pmic_handler(unsigned long pressed)
  307. {
  308. kpd_print("Power Key generate, pressed=%ld\n", pressed);
  309. if (!kpd_input_dev) {
  310. kpd_print("KPD input device not ready\n");
  311. return;
  312. }
  313. kpd_pmic_pwrkey_hal(pressed);
  314. #ifdef CONFIG_ARCH_MT8173
  315. if (pressed) /* keep the lock while the button in held pushed */
  316. wake_lock(&pwrkey_lock);
  317. else /* keep the lock for extra 500ms after the button is released */
  318. wake_lock_timeout(&pwrkey_lock, HZ/2);
  319. #endif
  320. }
  321. #endif
  322. void kpd_pmic_rstkey_handler(unsigned long pressed)
  323. {
  324. kpd_print("PMIC reset Key generate, pressed=%ld\n", pressed);
  325. if (!kpd_input_dev) {
  326. kpd_print("KPD input device not ready\n");
  327. return;
  328. }
  329. kpd_pmic_rstkey_hal(pressed);
  330. #ifdef KPD_PMIC_RSTKEY_MAP
  331. kpd_aee_handler(KPD_PMIC_RSTKEY_MAP, pressed);
  332. #endif
  333. }
  334. /*********************************************************************/
  335. /*********************************************************************/
  336. static void kpd_keymap_handler(unsigned long data)
  337. {
  338. int i, j;
  339. bool pressed;
  340. u16 new_state[KPD_NUM_MEMS], change, mask;
  341. u16 hw_keycode, linux_keycode;
  342. kpd_get_keymap_state(new_state);
  343. wake_lock_timeout(&kpd_suspend_lock, HZ / 2);
  344. for (i = 0; i < KPD_NUM_MEMS; i++) {
  345. change = new_state[i] ^ kpd_keymap_state[i];
  346. if (!change)
  347. continue;
  348. for (j = 0; j < 16; j++) {
  349. mask = 1U << j;
  350. if (!(change & mask))
  351. continue;
  352. hw_keycode = (i << 4) + j;
  353. /* bit is 1: not pressed, 0: pressed */
  354. pressed = !(new_state[i] & mask);
  355. if (kpd_show_hw_keycode)
  356. kpd_print("(%s) HW keycode = %u\n", pressed ? "pressed" : "released", hw_keycode);
  357. BUG_ON(hw_keycode >= KPD_NUM_KEYS);
  358. linux_keycode = kpd_keymap[hw_keycode];
  359. if (unlikely(linux_keycode == 0)) {
  360. kpd_print("Linux keycode = 0\n");
  361. continue;
  362. }
  363. kpd_aee_handler(linux_keycode, pressed);
  364. input_report_key(kpd_input_dev, linux_keycode, pressed);
  365. input_sync(kpd_input_dev);
  366. kpd_print("report Linux keycode = %u\n", linux_keycode);
  367. }
  368. }
  369. memcpy(kpd_keymap_state, new_state, sizeof(new_state));
  370. kpd_print("save new keymap state\n");
  371. enable_irq(kp_irqnr);
  372. }
  373. static irqreturn_t kpd_irq_handler(int irq, void *dev_id)
  374. {
  375. /* use _nosync to avoid deadlock */
  376. disable_irq_nosync(kp_irqnr);
  377. tasklet_schedule(&kpd_keymap_tasklet);
  378. return IRQ_HANDLED;
  379. }
  380. /*********************************************************************/
  381. /*****************************************************************************************/
  382. long kpd_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  383. {
  384. /* void __user *uarg = (void __user *)arg; */
  385. switch (cmd) {
  386. #if KPD_AUTOTEST
  387. case PRESS_OK_KEY: /* KPD_AUTOTEST disable auto test setting to resolve CR ALPS00464496 */
  388. if (test_bit(KEY_OK, kpd_input_dev->keybit)) {
  389. kpd_print("[AUTOTEST] PRESS OK KEY!!\n");
  390. input_report_key(kpd_input_dev, KEY_OK, 1);
  391. input_sync(kpd_input_dev);
  392. } else {
  393. kpd_print("[AUTOTEST] Not Support OK KEY!!\n");
  394. }
  395. break;
  396. case RELEASE_OK_KEY:
  397. if (test_bit(KEY_OK, kpd_input_dev->keybit)) {
  398. kpd_print("[AUTOTEST] RELEASE OK KEY!!\n");
  399. input_report_key(kpd_input_dev, KEY_OK, 0);
  400. input_sync(kpd_input_dev);
  401. } else {
  402. kpd_print("[AUTOTEST] Not Support OK KEY!!\n");
  403. }
  404. break;
  405. case PRESS_MENU_KEY:
  406. if (test_bit(KEY_MENU, kpd_input_dev->keybit)) {
  407. kpd_print("[AUTOTEST] PRESS MENU KEY!!\n");
  408. input_report_key(kpd_input_dev, KEY_MENU, 1);
  409. input_sync(kpd_input_dev);
  410. } else {
  411. kpd_print("[AUTOTEST] Not Support MENU KEY!!\n");
  412. }
  413. break;
  414. case RELEASE_MENU_KEY:
  415. if (test_bit(KEY_MENU, kpd_input_dev->keybit)) {
  416. kpd_print("[AUTOTEST] RELEASE MENU KEY!!\n");
  417. input_report_key(kpd_input_dev, KEY_MENU, 0);
  418. input_sync(kpd_input_dev);
  419. } else {
  420. kpd_print("[AUTOTEST] Not Support MENU KEY!!\n");
  421. }
  422. break;
  423. case PRESS_UP_KEY:
  424. if (test_bit(KEY_UP, kpd_input_dev->keybit)) {
  425. kpd_print("[AUTOTEST] PRESS UP KEY!!\n");
  426. input_report_key(kpd_input_dev, KEY_UP, 1);
  427. input_sync(kpd_input_dev);
  428. } else {
  429. kpd_print("[AUTOTEST] Not Support UP KEY!!\n");
  430. }
  431. break;
  432. case RELEASE_UP_KEY:
  433. if (test_bit(KEY_UP, kpd_input_dev->keybit)) {
  434. kpd_print("[AUTOTEST] RELEASE UP KEY!!\n");
  435. input_report_key(kpd_input_dev, KEY_UP, 0);
  436. input_sync(kpd_input_dev);
  437. } else {
  438. kpd_print("[AUTOTEST] Not Support UP KEY!!\n");
  439. }
  440. break;
  441. case PRESS_DOWN_KEY:
  442. if (test_bit(KEY_DOWN, kpd_input_dev->keybit)) {
  443. kpd_print("[AUTOTEST] PRESS DOWN KEY!!\n");
  444. input_report_key(kpd_input_dev, KEY_DOWN, 1);
  445. input_sync(kpd_input_dev);
  446. } else {
  447. kpd_print("[AUTOTEST] Not Support DOWN KEY!!\n");
  448. }
  449. break;
  450. case RELEASE_DOWN_KEY:
  451. if (test_bit(KEY_DOWN, kpd_input_dev->keybit)) {
  452. kpd_print("[AUTOTEST] RELEASE DOWN KEY!!\n");
  453. input_report_key(kpd_input_dev, KEY_DOWN, 0);
  454. input_sync(kpd_input_dev);
  455. } else {
  456. kpd_print("[AUTOTEST] Not Support DOWN KEY!!\n");
  457. }
  458. break;
  459. case PRESS_LEFT_KEY:
  460. if (test_bit(KEY_LEFT, kpd_input_dev->keybit)) {
  461. kpd_print("[AUTOTEST] PRESS LEFT KEY!!\n");
  462. input_report_key(kpd_input_dev, KEY_LEFT, 1);
  463. input_sync(kpd_input_dev);
  464. } else {
  465. kpd_print("[AUTOTEST] Not Support LEFT KEY!!\n");
  466. }
  467. break;
  468. case RELEASE_LEFT_KEY:
  469. if (test_bit(KEY_LEFT, kpd_input_dev->keybit)) {
  470. kpd_print("[AUTOTEST] RELEASE LEFT KEY!!\n");
  471. input_report_key(kpd_input_dev, KEY_LEFT, 0);
  472. input_sync(kpd_input_dev);
  473. } else {
  474. kpd_print("[AUTOTEST] Not Support LEFT KEY!!\n");
  475. }
  476. break;
  477. case PRESS_RIGHT_KEY:
  478. if (test_bit(KEY_RIGHT, kpd_input_dev->keybit)) {
  479. kpd_print("[AUTOTEST] PRESS RIGHT KEY!!\n");
  480. input_report_key(kpd_input_dev, KEY_RIGHT, 1);
  481. input_sync(kpd_input_dev);
  482. } else {
  483. kpd_print("[AUTOTEST] Not Support RIGHT KEY!!\n");
  484. }
  485. break;
  486. case RELEASE_RIGHT_KEY:
  487. if (test_bit(KEY_RIGHT, kpd_input_dev->keybit)) {
  488. kpd_print("[AUTOTEST] RELEASE RIGHT KEY!!\n");
  489. input_report_key(kpd_input_dev, KEY_RIGHT, 0);
  490. input_sync(kpd_input_dev);
  491. } else {
  492. kpd_print("[AUTOTEST] Not Support RIGHT KEY!!\n");
  493. }
  494. break;
  495. case PRESS_HOME_KEY:
  496. if (test_bit(KEY_HOME, kpd_input_dev->keybit)) {
  497. kpd_print("[AUTOTEST] PRESS HOME KEY!!\n");
  498. input_report_key(kpd_input_dev, KEY_HOME, 1);
  499. input_sync(kpd_input_dev);
  500. } else {
  501. kpd_print("[AUTOTEST] Not Support HOME KEY!!\n");
  502. }
  503. break;
  504. case RELEASE_HOME_KEY:
  505. if (test_bit(KEY_HOME, kpd_input_dev->keybit)) {
  506. kpd_print("[AUTOTEST] RELEASE HOME KEY!!\n");
  507. input_report_key(kpd_input_dev, KEY_HOME, 0);
  508. input_sync(kpd_input_dev);
  509. } else {
  510. kpd_print("[AUTOTEST] Not Support HOME KEY!!\n");
  511. }
  512. break;
  513. case PRESS_BACK_KEY:
  514. if (test_bit(KEY_BACK, kpd_input_dev->keybit)) {
  515. kpd_print("[AUTOTEST] PRESS BACK KEY!!\n");
  516. input_report_key(kpd_input_dev, KEY_BACK, 1);
  517. input_sync(kpd_input_dev);
  518. } else {
  519. kpd_print("[AUTOTEST] Not Support BACK KEY!!\n");
  520. }
  521. break;
  522. case RELEASE_BACK_KEY:
  523. if (test_bit(KEY_BACK, kpd_input_dev->keybit)) {
  524. kpd_print("[AUTOTEST] RELEASE BACK KEY!!\n");
  525. input_report_key(kpd_input_dev, KEY_BACK, 0);
  526. input_sync(kpd_input_dev);
  527. } else {
  528. kpd_print("[AUTOTEST] Not Support BACK KEY!!\n");
  529. }
  530. break;
  531. case PRESS_CALL_KEY:
  532. if (test_bit(KEY_CALL, kpd_input_dev->keybit)) {
  533. kpd_print("[AUTOTEST] PRESS CALL KEY!!\n");
  534. input_report_key(kpd_input_dev, KEY_CALL, 1);
  535. input_sync(kpd_input_dev);
  536. } else {
  537. kpd_print("[AUTOTEST] Not Support CALL KEY!!\n");
  538. }
  539. break;
  540. case RELEASE_CALL_KEY:
  541. if (test_bit(KEY_CALL, kpd_input_dev->keybit)) {
  542. kpd_print("[AUTOTEST] RELEASE CALL KEY!!\n");
  543. input_report_key(kpd_input_dev, KEY_CALL, 0);
  544. input_sync(kpd_input_dev);
  545. } else {
  546. kpd_print("[AUTOTEST] Not Support CALL KEY!!\n");
  547. }
  548. break;
  549. case PRESS_ENDCALL_KEY:
  550. if (test_bit(KEY_ENDCALL, kpd_input_dev->keybit)) {
  551. kpd_print("[AUTOTEST] PRESS ENDCALL KEY!!\n");
  552. input_report_key(kpd_input_dev, KEY_ENDCALL, 1);
  553. input_sync(kpd_input_dev);
  554. } else {
  555. kpd_print("[AUTOTEST] Not Support ENDCALL KEY!!\n");
  556. }
  557. break;
  558. case RELEASE_ENDCALL_KEY:
  559. if (test_bit(KEY_ENDCALL, kpd_input_dev->keybit)) {
  560. kpd_print("[AUTOTEST] RELEASE ENDCALL KEY!!\n");
  561. input_report_key(kpd_input_dev, KEY_ENDCALL, 0);
  562. input_sync(kpd_input_dev);
  563. } else {
  564. kpd_print("[AUTOTEST] Not Support ENDCALL KEY!!\n");
  565. }
  566. break;
  567. case PRESS_VLUP_KEY:
  568. if (test_bit(KEY_VOLUMEUP, kpd_input_dev->keybit)) {
  569. kpd_print("[AUTOTEST] PRESS VOLUMEUP KEY!!\n");
  570. input_report_key(kpd_input_dev, KEY_VOLUMEUP, 1);
  571. input_sync(kpd_input_dev);
  572. } else {
  573. kpd_print("[AUTOTEST] Not Support VOLUMEUP KEY!!\n");
  574. }
  575. break;
  576. case RELEASE_VLUP_KEY:
  577. if (test_bit(KEY_VOLUMEUP, kpd_input_dev->keybit)) {
  578. kpd_print("[AUTOTEST] RELEASE VOLUMEUP KEY!!\n");
  579. input_report_key(kpd_input_dev, KEY_VOLUMEUP, 0);
  580. input_sync(kpd_input_dev);
  581. } else {
  582. kpd_print("[AUTOTEST] Not Support VOLUMEUP KEY!!\n");
  583. }
  584. break;
  585. case PRESS_VLDOWN_KEY:
  586. if (test_bit(KEY_VOLUMEDOWN, kpd_input_dev->keybit)) {
  587. kpd_print("[AUTOTEST] PRESS VOLUMEDOWN KEY!!\n");
  588. input_report_key(kpd_input_dev, KEY_VOLUMEDOWN, 1);
  589. input_sync(kpd_input_dev);
  590. } else {
  591. kpd_print("[AUTOTEST] Not Support VOLUMEDOWN KEY!!\n");
  592. }
  593. break;
  594. case RELEASE_VLDOWN_KEY:
  595. if (test_bit(KEY_VOLUMEDOWN, kpd_input_dev->keybit)) {
  596. kpd_print("[AUTOTEST] RELEASE VOLUMEDOWN KEY!!\n");
  597. input_report_key(kpd_input_dev, KEY_VOLUMEDOWN, 0);
  598. input_sync(kpd_input_dev);
  599. } else {
  600. kpd_print("[AUTOTEST] Not Support VOLUMEDOWN KEY!!\n");
  601. }
  602. break;
  603. case PRESS_FOCUS_KEY:
  604. if (test_bit(KEY_FOCUS, kpd_input_dev->keybit)) {
  605. kpd_print("[AUTOTEST] PRESS FOCUS KEY!!\n");
  606. input_report_key(kpd_input_dev, KEY_FOCUS, 1);
  607. input_sync(kpd_input_dev);
  608. } else {
  609. kpd_print("[AUTOTEST] Not Support FOCUS KEY!!\n");
  610. }
  611. break;
  612. case RELEASE_FOCUS_KEY:
  613. if (test_bit(KEY_FOCUS, kpd_input_dev->keybit)) {
  614. kpd_print("[AUTOTEST] RELEASE FOCUS KEY!!\n");
  615. input_report_key(kpd_input_dev, KEY_FOCUS, 0);
  616. input_sync(kpd_input_dev);
  617. } else {
  618. kpd_print("[AUTOTEST] Not Support RELEASE KEY!!\n");
  619. }
  620. break;
  621. case PRESS_CAMERA_KEY:
  622. if (test_bit(KEY_CAMERA, kpd_input_dev->keybit)) {
  623. kpd_print("[AUTOTEST] PRESS CAMERA KEY!!\n");
  624. input_report_key(kpd_input_dev, KEY_CAMERA, 1);
  625. input_sync(kpd_input_dev);
  626. } else {
  627. kpd_print("[AUTOTEST] Not Support CAMERA KEY!!\n");
  628. }
  629. break;
  630. case RELEASE_CAMERA_KEY:
  631. if (test_bit(KEY_CAMERA, kpd_input_dev->keybit)) {
  632. kpd_print("[AUTOTEST] RELEASE CAMERA KEY!!\n");
  633. input_report_key(kpd_input_dev, KEY_CAMERA, 0);
  634. input_sync(kpd_input_dev);
  635. } else {
  636. kpd_print("[AUTOTEST] Not Support CAMERA KEY!!\n");
  637. }
  638. break;
  639. case PRESS_POWER_KEY:
  640. if (test_bit(KEY_POWER, kpd_input_dev->keybit)) {
  641. kpd_print("[AUTOTEST] PRESS POWER KEY!!\n");
  642. input_report_key(kpd_input_dev, KEY_POWER, 1);
  643. input_sync(kpd_input_dev);
  644. } else {
  645. kpd_print("[AUTOTEST] Not Support POWER KEY!!\n");
  646. }
  647. break;
  648. case RELEASE_POWER_KEY:
  649. if (test_bit(KEY_POWER, kpd_input_dev->keybit)) {
  650. kpd_print("[AUTOTEST] RELEASE POWER KEY!!\n");
  651. input_report_key(kpd_input_dev, KEY_POWER, 0);
  652. input_sync(kpd_input_dev);
  653. } else {
  654. kpd_print("[AUTOTEST] Not Support POWER KEY!!\n");
  655. }
  656. break;
  657. #endif
  658. case SET_KPD_KCOL:
  659. kpd_auto_test_for_factorymode(); /* API 3 for kpd factory mode auto-test */
  660. kpd_print("[kpd_auto_test_for_factorymode] test performed!!\n");
  661. break;
  662. default:
  663. return -EINVAL;
  664. }
  665. return 0;
  666. }
  667. int kpd_dev_open(struct inode *inode, struct file *file)
  668. {
  669. return 0;
  670. }
  671. static const struct file_operations kpd_dev_fops = {
  672. .owner = THIS_MODULE,
  673. .unlocked_ioctl = kpd_dev_ioctl,
  674. .open = kpd_dev_open,
  675. };
  676. /*********************************************************************/
  677. static struct miscdevice kpd_dev = {
  678. .minor = MISC_DYNAMIC_MINOR,
  679. .name = KPD_NAME,
  680. .fops = &kpd_dev_fops,
  681. };
  682. static int kpd_open(struct input_dev *dev)
  683. {
  684. kpd_slide_qwerty_init(); /* API 1 for kpd slide qwerty init settings */
  685. return 0;
  686. }
  687. void kpd_get_dts_info(struct device_node *node)
  688. {
  689. of_property_read_u32(node, "mediatek,kpd-key-debounce", &kpd_dts_data.kpd_key_debounce);
  690. of_property_read_u32(node, "mediatek,kpd-sw-pwrkey", &kpd_dts_data.kpd_sw_pwrkey);
  691. of_property_read_u32(node, "mediatek,kpd-hw-pwrkey", &kpd_dts_data.kpd_hw_pwrkey);
  692. of_property_read_u32(node, "mediatek,kpd-sw-rstkey", &kpd_dts_data.kpd_sw_rstkey);
  693. of_property_read_u32(node, "mediatek,kpd-hw-rstkey", &kpd_dts_data.kpd_hw_rstkey);
  694. of_property_read_u32(node, "mediatek,kpd-use-extend-type", &kpd_dts_data.kpd_use_extend_type);
  695. of_property_read_u32(node, "mediatek,kpd-pwrkey-eint-gpio", &kpd_dts_data.kpd_pwrkey_eint_gpio);
  696. of_property_read_u32(node, "mediatek,kpd-pwrkey-gpio-din", &kpd_dts_data.kpd_pwrkey_gpio_din);
  697. of_property_read_u32(node, "mediatek,kpd-hw-dl-key1", &kpd_dts_data.kpd_hw_dl_key1);
  698. of_property_read_u32(node, "mediatek,kpd-hw-dl-key2", &kpd_dts_data.kpd_hw_dl_key2);
  699. of_property_read_u32(node, "mediatek,kpd-hw-dl-key3", &kpd_dts_data.kpd_hw_dl_key3);
  700. of_property_read_u32(node, "mediatek,kpd-hw-recovery-key", &kpd_dts_data.kpd_hw_recovery_key);
  701. of_property_read_u32(node, "mediatek,kpd-hw-factory-key", &kpd_dts_data.kpd_hw_factory_key);
  702. of_property_read_u32(node, "mediatek,kpd-hw-map-num", &kpd_dts_data.kpd_hw_map_num);
  703. of_property_read_u32_array(node, "mediatek,kpd-hw-init-map", kpd_dts_data.kpd_hw_init_map,
  704. kpd_dts_data.kpd_hw_map_num);
  705. kpd_print("key-debounce = %d, sw-pwrkey = %d, hw-pwrkey = %d, hw-rstkey = %d, sw-rstkey = %d\n",
  706. kpd_dts_data.kpd_key_debounce, kpd_dts_data.kpd_sw_pwrkey, kpd_dts_data.kpd_hw_pwrkey,
  707. kpd_dts_data.kpd_hw_rstkey, kpd_dts_data.kpd_sw_rstkey);
  708. }
  709. static int kpd_pdrv_probe(struct platform_device *pdev)
  710. {
  711. int i, r;
  712. int err = 0;
  713. struct clk *kpd_clk = NULL;
  714. kpd_info("Keypad probe start!!!\n");
  715. /*kpd-clk should be control by kpd driver, not depend on default clock state*/
  716. kpd_clk = devm_clk_get(&pdev->dev, "kpd-clk");
  717. if (!IS_ERR(kpd_clk)) {
  718. clk_prepare(kpd_clk);
  719. clk_enable(kpd_clk);
  720. } else {
  721. kpd_print("get kpd-clk fail, but not return, maybe kpd-clk is set by ccf.\n");
  722. }
  723. kp_base = of_iomap(pdev->dev.of_node, 0);
  724. if (!kp_base) {
  725. kpd_info("KP iomap failed\n");
  726. return -ENODEV;
  727. };
  728. kp_irqnr = irq_of_parse_and_map(pdev->dev.of_node, 0);
  729. if (!kp_irqnr) {
  730. kpd_info("KP get irqnr failed\n");
  731. return -ENODEV;
  732. }
  733. kpd_info("kp base: 0x%p, addr:0x%p, kp irq: %d\n", kp_base, &kp_base, kp_irqnr);
  734. /* initialize and register input device (/dev/input/eventX) */
  735. kpd_input_dev = input_allocate_device();
  736. if (!kpd_input_dev) {
  737. kpd_print("input allocate device fail.\n");
  738. return -ENOMEM;
  739. }
  740. kpd_input_dev->name = KPD_NAME;
  741. kpd_input_dev->id.bustype = BUS_HOST;
  742. kpd_input_dev->id.vendor = 0x2454;
  743. kpd_input_dev->id.product = 0x6500;
  744. kpd_input_dev->id.version = 0x0010;
  745. kpd_input_dev->open = kpd_open;
  746. kpd_get_dts_info(pdev->dev.of_node);
  747. #ifdef CONFIG_ARCH_MT8173
  748. wake_lock_init(&pwrkey_lock, WAKE_LOCK_SUSPEND, "PWRKEY");
  749. #endif
  750. /* fulfill custom settings */
  751. kpd_memory_setting();
  752. __set_bit(EV_KEY, kpd_input_dev->evbit);
  753. #if defined(CONFIG_KPD_PWRKEY_USE_EINT) || defined(CONFIG_KPD_PWRKEY_USE_PMIC)
  754. __set_bit(kpd_dts_data.kpd_sw_pwrkey, kpd_input_dev->keybit);
  755. kpd_keymap[8] = 0;
  756. #endif
  757. if (!kpd_dts_data.kpd_use_extend_type) {
  758. for (i = 17; i < KPD_NUM_KEYS; i += 9) /* only [8] works for Power key */
  759. kpd_keymap[i] = 0;
  760. }
  761. for (i = 0; i < KPD_NUM_KEYS; i++) {
  762. if (kpd_keymap[i] != 0)
  763. __set_bit(kpd_keymap[i], kpd_input_dev->keybit);
  764. }
  765. #if KPD_AUTOTEST
  766. for (i = 0; i < ARRAY_SIZE(kpd_auto_keymap); i++)
  767. __set_bit(kpd_auto_keymap[i], kpd_input_dev->keybit);
  768. #endif
  769. #if KPD_HAS_SLIDE_QWERTY
  770. __set_bit(EV_SW, kpd_input_dev->evbit);
  771. __set_bit(SW_LID, kpd_input_dev->swbit);
  772. #endif
  773. if (kpd_dts_data.kpd_sw_rstkey)
  774. __set_bit(kpd_dts_data.kpd_sw_rstkey, kpd_input_dev->keybit);
  775. #ifdef KPD_KEY_MAP
  776. __set_bit(KPD_KEY_MAP, kpd_input_dev->keybit);
  777. #endif
  778. #ifdef CONFIG_MTK_MRDUMP_KEY
  779. __set_bit(KEY_RESTART, kpd_input_dev->keybit);
  780. #endif
  781. kpd_input_dev->dev.parent = &pdev->dev;
  782. r = input_register_device(kpd_input_dev);
  783. if (r) {
  784. kpd_info("register input device failed (%d)\n", r);
  785. input_free_device(kpd_input_dev);
  786. return r;
  787. }
  788. /* register device (/dev/mt6575-kpd) */
  789. kpd_dev.parent = &pdev->dev;
  790. r = misc_register(&kpd_dev);
  791. if (r) {
  792. kpd_info("register device failed (%d)\n", r);
  793. input_unregister_device(kpd_input_dev);
  794. return r;
  795. }
  796. wake_lock_init(&kpd_suspend_lock, WAKE_LOCK_SUSPEND, "kpd wakelock");
  797. /* register IRQ and EINT */
  798. kpd_set_debounce(kpd_dts_data.kpd_key_debounce);
  799. r = request_irq(kp_irqnr, kpd_irq_handler, IRQF_TRIGGER_NONE, KPD_NAME, NULL);
  800. if (r) {
  801. kpd_info("register IRQ failed (%d)\n", r);
  802. misc_deregister(&kpd_dev);
  803. input_unregister_device(kpd_input_dev);
  804. return r;
  805. }
  806. mt_eint_register();
  807. #ifndef KPD_EARLY_PORTING /*add for avoid early porting build err the macro is defined in custom file */
  808. long_press_reboot_function_setting(); /* /API 4 for kpd long press reboot function setting */
  809. #endif
  810. hrtimer_init(&aee_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
  811. aee_timer.function = aee_timer_func;
  812. #if AEE_ENABLE_5_15
  813. hrtimer_init(&aee_timer_5s, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
  814. aee_timer_5s.function = aee_timer_5s_func;
  815. #endif
  816. err = kpd_create_attr(&kpd_pdrv.driver);
  817. if (err) {
  818. kpd_info("create attr file fail\n");
  819. kpd_delete_attr(&kpd_pdrv.driver);
  820. return err;
  821. }
  822. kpd_info("%s Done\n", __func__);
  823. return 0;
  824. }
  825. /* should never be called */
  826. static int kpd_pdrv_remove(struct platform_device *pdev)
  827. {
  828. return 0;
  829. }
  830. #ifndef USE_EARLY_SUSPEND
  831. static int kpd_pdrv_suspend(struct platform_device *pdev, pm_message_t state)
  832. {
  833. kpd_suspend = true;
  834. #ifdef MTK_KP_WAKESOURCE
  835. if (call_status == 2) {
  836. kpd_print("kpd_early_suspend wake up source enable!! (%d)\n", kpd_suspend);
  837. } else {
  838. kpd_wakeup_src_setting(0);
  839. kpd_print("kpd_early_suspend wake up source disable!! (%d)\n", kpd_suspend);
  840. }
  841. #endif
  842. kpd_print("suspend!! (%d)\n", kpd_suspend);
  843. return 0;
  844. }
  845. static int kpd_pdrv_resume(struct platform_device *pdev)
  846. {
  847. kpd_suspend = false;
  848. #ifdef MTK_KP_WAKESOURCE
  849. if (call_status == 2) {
  850. kpd_print("kpd_early_suspend wake up source enable!! (%d)\n", kpd_suspend);
  851. } else {
  852. kpd_print("kpd_early_suspend wake up source resume!! (%d)\n", kpd_suspend);
  853. kpd_wakeup_src_setting(1);
  854. }
  855. #endif
  856. kpd_print("resume!! (%d)\n", kpd_suspend);
  857. return 0;
  858. }
  859. #else
  860. #define kpd_pdrv_suspend NULL
  861. #define kpd_pdrv_resume NULL
  862. #endif
  863. #ifdef USE_EARLY_SUSPEND
  864. static void kpd_early_suspend(struct early_suspend *h)
  865. {
  866. kpd_suspend = true;
  867. #ifdef MTK_KP_WAKESOURCE
  868. if (call_status == 2) {
  869. kpd_print("kpd_early_suspend wake up source enable!! (%d)\n", kpd_suspend);
  870. } else {
  871. /* kpd_wakeup_src_setting(0); */
  872. kpd_print("kpd_early_suspend wake up source disable!! (%d)\n", kpd_suspend);
  873. }
  874. #endif
  875. kpd_print("early suspend!! (%d)\n", kpd_suspend);
  876. }
  877. static void kpd_early_resume(struct early_suspend *h)
  878. {
  879. kpd_suspend = false;
  880. #ifdef MTK_KP_WAKESOURCE
  881. if (call_status == 2) {
  882. kpd_print("kpd_early_resume wake up source resume!! (%d)\n", kpd_suspend);
  883. } else {
  884. kpd_print("kpd_early_resume wake up source enable!! (%d)\n", kpd_suspend);
  885. /* kpd_wakeup_src_setting(1); */
  886. }
  887. #endif
  888. kpd_print("early resume!! (%d)\n", kpd_suspend);
  889. }
  890. static struct early_suspend kpd_early_suspend_desc = {
  891. .level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1,
  892. .suspend = kpd_early_suspend,
  893. .resume = kpd_early_resume,
  894. };
  895. #endif
  896. #ifdef CONFIG_MTK_SMARTBOOK_SUPPORT
  897. #ifdef CONFIG_HAS_SBSUSPEND
  898. static struct sb_handler kpd_sb_handler_desc = {
  899. .level = SB_LEVEL_DISABLE_KEYPAD,
  900. .plug_in = sb_kpd_enable,
  901. .plug_out = sb_kpd_disable,
  902. };
  903. #endif
  904. #endif
  905. static int __init kpd_mod_init(void)
  906. {
  907. int r;
  908. r = platform_driver_register(&kpd_pdrv);
  909. if (r) {
  910. kpd_info("register driver failed (%d)\n", r);
  911. return r;
  912. }
  913. #ifdef USE_EARLY_SUSPEND
  914. register_early_suspend(&kpd_early_suspend_desc);
  915. #endif
  916. #ifdef CONFIG_MTK_SMARTBOOK_SUPPORT
  917. #ifdef CONFIG_HAS_SBSUSPEND
  918. register_sb_handler(&kpd_sb_handler_desc);
  919. #endif
  920. #endif
  921. return 0;
  922. }
  923. /* should never be called */
  924. static void __exit kpd_mod_exit(void)
  925. {
  926. }
  927. module_init(kpd_mod_init);
  928. module_exit(kpd_mod_exit);
  929. module_param(kpd_show_hw_keycode, int, 0644);
  930. module_param(kpd_show_register, int, 0644);
  931. MODULE_AUTHOR("yucong.xiong <yucong.xiong@mediatek.com>");
  932. MODULE_DESCRIPTION("MTK Keypad (KPD) Driver v0.4");
  933. MODULE_LICENSE("GPL");