2 * Copyright (C) 2010 MediaTek, Inc.
4 * Author: Terry Chang <terry.chang@mediatek.com>
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.
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.
18 /*kpd.h file path: ALPS/mediatek/kernel/include/linux */
19 #include <linux/kpd.h>
22 #include <linux/of_address.h>
23 #include <linux/of_irq.h>
26 #define KPD_NAME "mtk-kpd"
27 #define MTK_KP_WAKESOURCE /* this is for auto set wake up source */
30 void __iomem
*kp_base
;
31 static unsigned int kp_irqnr
;
33 struct input_dev
*kpd_input_dev
;
34 static bool kpd_suspend
= false;
35 static int kpd_show_hw_keycode
= 1;
36 static int kpd_show_register
= 1;
37 static volatile int call_status
= 0;
39 /*for kpd_memory_setting() function*/
40 static u16 kpd_keymap
[KPD_NUM_KEYS
];
41 static u16 kpd_keymap_state
[KPD_NUM_MEMS
];
42 /***********************************/
44 /* for slide QWERTY */
45 #if KPD_HAS_SLIDE_QWERTY
46 static void kpd_slide_handler(unsigned long data
);
47 static DECLARE_TASKLET(kpd_slide_tasklet
, kpd_slide_handler
, 0);
48 static u8 kpd_slide_state
= !KPD_SLIDE_POLARITY
;
51 /* for Power key using EINT */
52 #if KPD_PWRKEY_USE_EINT
53 static void kpd_pwrkey_handler(unsigned long data
);
54 static DECLARE_TASKLET(kpd_pwrkey_tasklet
, kpd_pwrkey_handler
, 0);
57 /* for keymap handling */
58 static void kpd_keymap_handler(unsigned long data
);
59 static DECLARE_TASKLET(kpd_keymap_tasklet
, kpd_keymap_handler
, 0);
61 /*********************************************************************/
62 static void kpd_memory_setting(void);
64 /*********************************************************************/
65 static int kpd_pdrv_probe(struct platform_device
*pdev
);
66 static int kpd_pdrv_remove(struct platform_device
*pdev
);
67 #ifndef USE_EARLY_SUSPEND
68 static int kpd_pdrv_suspend(struct platform_device
*pdev
, pm_message_t state
);
69 static int kpd_pdrv_resume(struct platform_device
*pdev
);
73 static const struct of_device_id kpd_of_match
[] = {
74 { .compatible
= "mediatek,KP", },
79 static struct platform_driver kpd_pdrv
= {
80 .probe
= kpd_pdrv_probe
,
81 .remove
= kpd_pdrv_remove
,
82 #ifndef USE_EARLY_SUSPEND
83 .suspend
= kpd_pdrv_suspend
,
84 .resume
= kpd_pdrv_resume
,
90 .of_match_table
= kpd_of_match
,
95 /********************************************************************/
96 static void kpd_memory_setting(void)
98 kpd_init_keymap(kpd_keymap
);
99 kpd_init_keymap_state(kpd_keymap_state
);
104 /*****************for kpd auto set wake up source*************************/
106 static ssize_t
kpd_store_call_state(struct device_driver
*ddri
, const char *buf
, size_t count
)
108 if (sscanf(buf
, "%u", &call_status
) != 1) {
109 kpd_print("kpd call state: Invalid values\n");
113 switch (call_status
) {
115 kpd_print("kpd call state: Idle state!\n");
118 kpd_print("kpd call state: ringing state!\n");
121 kpd_print("kpd call state: active or hold state!\n");
125 kpd_print("kpd call state: Invalid values\n");
131 static ssize_t
kpd_show_call_state(struct device_driver
*ddri
, char *buf
)
134 res
= snprintf(buf
, PAGE_SIZE
, "%d\n", call_status
);
138 static DRIVER_ATTR(kpd_call_state
, S_IWUSR
| S_IRUGO
, kpd_show_call_state
, kpd_store_call_state
);
140 static struct driver_attribute
*kpd_attr_list
[] = {
141 &driver_attr_kpd_call_state
,
144 /*----------------------------------------------------------------------------*/
145 static int kpd_create_attr(struct device_driver
*driver
)
148 int num
= (int)(sizeof(kpd_attr_list
) / sizeof(kpd_attr_list
[0]));
149 if (driver
== NULL
) {
153 for (idx
= 0; idx
< num
; idx
++) {
154 if ((err
= driver_create_file(driver
, kpd_attr_list
[idx
]))) {
155 kpd_print("driver_create_file (%s) = %d\n", kpd_attr_list
[idx
]->attr
.name
,
163 /*----------------------------------------------------------------------------*/
164 static int kpd_delete_attr(struct device_driver
*driver
)
167 int num
= (int)(sizeof(kpd_attr_list
) / sizeof(kpd_attr_list
[0]));
172 for (idx
= 0; idx
< num
; idx
++) {
173 driver_remove_file(driver
, kpd_attr_list
[idx
]);
179 /*----------------------------------------------------------------------------*/
180 /********************************************************************************************/
181 /************************************************************************************************************************************************/
184 static const u16 kpd_auto_keymap
[] = {
187 KEY_CALL
, KEY_ENDCALL
,
188 KEY_VOLUMEUP
, KEY_VOLUMEDOWN
,
189 KEY_FOCUS
, KEY_CAMERA
,
192 /* for AEE manual dump */
193 #define AEE_VOLUMEUP_BIT 0
194 #define AEE_VOLUMEDOWN_BIT 1
195 #define AEE_DELAY_TIME 15
196 /* enable volup + voldown was pressed 5~15 s Trigger aee manual dump */
197 #define AEE_ENABLE_5_15 1
198 static struct hrtimer aee_timer
;
199 static unsigned long aee_pressed_keys
;
200 static bool aee_timer_started
;
203 #define AEE_DELAY_TIME_5S 5
204 static struct hrtimer aee_timer_5s
;
205 static bool aee_timer_5s_started
;
206 static bool flags_5s
;
209 static inline void kpd_update_aee_state(void)
211 if (aee_pressed_keys
== ((1 << AEE_VOLUMEUP_BIT
) | (1 << AEE_VOLUMEDOWN_BIT
))) {
212 /* if volumeup and volumedown was pressed the same time then start the time of ten seconds */
213 aee_timer_started
= true;
216 aee_timer_5s_started
= true;
217 hrtimer_start(&aee_timer_5s
, ktime_set(AEE_DELAY_TIME_5S
, 0), HRTIMER_MODE_REL
);
219 hrtimer_start(&aee_timer
, ktime_set(AEE_DELAY_TIME
, 0), HRTIMER_MODE_REL
);
220 kpd_print("aee_timer started\n");
222 if (aee_timer_started
) {
224 * hrtimer_cancel - cancel a timer and wait for the handler to finish.
226 * 0 when the timer was not active.
227 * 1 when the timer was active.
229 if (hrtimer_cancel(&aee_timer
)) {
230 kpd_print("try to cancel hrtimer\n");
234 ("Pressed Volup + Voldown5s~15s then trigger aee manual dump.\n");
235 aee_kernel_reminding("manual dump",
236 "Trigger Vol Up +Vol Down 5s");
244 aee_timer_started
= false;
245 kpd_print("aee_timer canceled\n");
248 if (aee_timer_5s_started
) {
250 * hrtimer_cancel - cancel a timer and wait for the handler to finish.
252 * 0 when the timer was not active.
253 * 1 when the timer was active.
255 if (hrtimer_cancel(&aee_timer_5s
)) {
256 kpd_print("try to cancel hrtimer (5s)\n");
258 aee_timer_5s_started
= false;
259 kpd_print("aee_timer canceled (5s)\n");
265 static void kpd_aee_handler(u32 keycode
, u16 pressed
)
268 if (keycode
== KEY_VOLUMEUP
) {
269 __set_bit(AEE_VOLUMEUP_BIT
, &aee_pressed_keys
);
270 } else if (keycode
== KEY_VOLUMEDOWN
) {
271 __set_bit(AEE_VOLUMEDOWN_BIT
, &aee_pressed_keys
);
275 kpd_update_aee_state();
277 if (keycode
== KEY_VOLUMEUP
) {
278 __clear_bit(AEE_VOLUMEUP_BIT
, &aee_pressed_keys
);
279 } else if (keycode
== KEY_VOLUMEDOWN
) {
280 __clear_bit(AEE_VOLUMEDOWN_BIT
, &aee_pressed_keys
);
284 kpd_update_aee_state();
288 static enum hrtimer_restart
aee_timer_func(struct hrtimer
*timer
)
290 /* printk("kpd: vol up+vol down AEE manual dump!\n"); */
291 /* aee_kernel_reminding("manual dump ", "Triggered by press KEY_VOLUMEUP+KEY_VOLUMEDOWN"); */
293 return HRTIMER_NORESTART
;
297 static enum hrtimer_restart
aee_timer_5s_func(struct hrtimer
*timer
)
300 /* printk("kpd: vol up+vol down AEE manual dump timer 5s !\n"); */
302 return HRTIMER_NORESTART
;
306 /************************************************************************************************************************************************/
308 #if KPD_HAS_SLIDE_QWERTY
309 static void kpd_slide_handler(unsigned long data
)
312 u8 old_state
= kpd_slide_state
;
314 kpd_slide_state
= !kpd_slide_state
;
315 slid
= (kpd_slide_state
== !!KPD_SLIDE_POLARITY
);
316 /* for SW_LID, 1: lid open => slid, 0: lid shut => closed */
317 input_report_switch(kpd_input_dev
, SW_LID
, slid
);
318 input_sync(kpd_input_dev
);
319 kpd_print("report QWERTY = %s\n", slid
? "slid" : "closed");
322 mt_set_gpio_pull_select(GPIO_QWERTYSLIDE_EINT_PIN
, 0);
324 mt_set_gpio_pull_select(GPIO_QWERTYSLIDE_EINT_PIN
, 1);
326 /* for detecting the return to old_state */
327 mt65xx_eint_set_polarity(KPD_SLIDE_EINT
, old_state
);
328 mt65xx_eint_unmask(KPD_SLIDE_EINT
);
331 static void kpd_slide_eint_handler(void)
333 tasklet_schedule(&kpd_slide_tasklet
);
337 #if KPD_PWRKEY_USE_EINT
338 static void kpd_pwrkey_handler(unsigned long data
)
340 kpd_pwrkey_handler_hal(data
);
343 static void kpd_pwrkey_eint_handler(void)
345 tasklet_schedule(&kpd_pwrkey_tasklet
);
348 /*********************************************************************/
350 /*********************************************************************/
351 #if KPD_PWRKEY_USE_PMIC
352 void kpd_pwrkey_pmic_handler(unsigned long pressed
)
354 printk(KPD_SAY
"Power Key generate, pressed=%ld\n", pressed
);
355 if (!kpd_input_dev
) {
356 printk("KPD input device not ready\n");
359 kpd_pmic_pwrkey_hal(pressed
);
364 void kpd_pmic_rstkey_handler(unsigned long pressed
)
366 printk(KPD_SAY
"PMIC reset Key generate, pressed=%ld\n", pressed
);
367 if (!kpd_input_dev
) {
368 printk("KPD input device not ready\n");
371 kpd_pmic_rstkey_hal(pressed
);
372 #ifdef KPD_PMIC_RSTKEY_MAP
373 kpd_aee_handler(KPD_PMIC_RSTKEY_MAP
, pressed
);
377 /*********************************************************************/
379 /*********************************************************************/
380 static void kpd_keymap_handler(unsigned long data
)
384 u16 new_state
[KPD_NUM_MEMS
], change
, mask
;
385 u16 hw_keycode
, linux_keycode
;
386 kpd_get_keymap_state(new_state
);
388 for (i
= 0; i
< KPD_NUM_MEMS
; i
++) {
389 change
= new_state
[i
] ^ kpd_keymap_state
[i
];
393 for (j
= 0; j
< 16; j
++) {
395 if (!(change
& mask
))
398 hw_keycode
= (i
<< 4) + j
;
399 /* bit is 1: not pressed, 0: pressed */
400 pressed
= !(new_state
[i
] & mask
);
401 if (kpd_show_hw_keycode
) {
402 printk(KPD_SAY
"(%s) HW keycode = %u\n",
403 pressed
? "pressed" : "released", hw_keycode
);
405 BUG_ON(hw_keycode
>= KPD_NUM_KEYS
);
406 linux_keycode
= kpd_keymap
[hw_keycode
];
407 if (unlikely(linux_keycode
== 0)) {
408 kpd_print("Linux keycode = 0\n");
411 kpd_aee_handler(linux_keycode
, pressed
);
413 kpd_backlight_handler(pressed
, linux_keycode
);
414 input_report_key(kpd_input_dev
, linux_keycode
, pressed
);
415 input_sync(kpd_input_dev
);
416 kpd_print("report Linux keycode = %u\n", linux_keycode
);
420 memcpy(kpd_keymap_state
, new_state
, sizeof(new_state
));
421 kpd_print("save new keymap state\n");
423 enable_irq(kp_irqnr
);
425 enable_irq(MT_KP_IRQ_ID
);
429 static irqreturn_t
kpd_irq_handler(int irq
, void *dev_id
)
431 /* use _nosync to avoid deadlock */
433 disable_irq_nosync(kp_irqnr
);
435 disable_irq_nosync(MT_KP_IRQ_ID
);
437 tasklet_schedule(&kpd_keymap_tasklet
);
441 /*********************************************************************/
443 /*****************************************************************************************/
444 long kpd_dev_ioctl(struct file
*file
, unsigned int cmd
, unsigned long arg
)
446 /* void __user *uarg = (void __user *)arg; */
450 case PRESS_OK_KEY
: /* KPD_AUTOTEST disable auto test setting to resolve CR ALPS00464496 */
451 if (test_bit(KEY_OK
, kpd_input_dev
->keybit
)) {
452 printk("[AUTOTEST] PRESS OK KEY!!\n");
453 input_report_key(kpd_input_dev
, KEY_OK
, 1);
454 input_sync(kpd_input_dev
);
456 printk("[AUTOTEST] Not Support OK KEY!!\n");
460 if (test_bit(KEY_OK
, kpd_input_dev
->keybit
)) {
461 printk("[AUTOTEST] RELEASE OK KEY!!\n");
462 input_report_key(kpd_input_dev
, KEY_OK
, 0);
463 input_sync(kpd_input_dev
);
465 printk("[AUTOTEST] Not Support OK KEY!!\n");
469 if (test_bit(KEY_MENU
, kpd_input_dev
->keybit
)) {
470 printk("[AUTOTEST] PRESS MENU KEY!!\n");
471 input_report_key(kpd_input_dev
, KEY_MENU
, 1);
472 input_sync(kpd_input_dev
);
474 printk("[AUTOTEST] Not Support MENU KEY!!\n");
477 case RELEASE_MENU_KEY
:
478 if (test_bit(KEY_MENU
, kpd_input_dev
->keybit
)) {
479 printk("[AUTOTEST] RELEASE MENU KEY!!\n");
480 input_report_key(kpd_input_dev
, KEY_MENU
, 0);
481 input_sync(kpd_input_dev
);
483 printk("[AUTOTEST] Not Support MENU KEY!!\n");
488 if (test_bit(KEY_UP
, kpd_input_dev
->keybit
)) {
489 printk("[AUTOTEST] PRESS UP KEY!!\n");
490 input_report_key(kpd_input_dev
, KEY_UP
, 1);
491 input_sync(kpd_input_dev
);
493 printk("[AUTOTEST] Not Support UP KEY!!\n");
497 if (test_bit(KEY_UP
, kpd_input_dev
->keybit
)) {
498 printk("[AUTOTEST] RELEASE UP KEY!!\n");
499 input_report_key(kpd_input_dev
, KEY_UP
, 0);
500 input_sync(kpd_input_dev
);
502 printk("[AUTOTEST] Not Support UP KEY!!\n");
506 if (test_bit(KEY_DOWN
, kpd_input_dev
->keybit
)) {
507 printk("[AUTOTEST] PRESS DOWN KEY!!\n");
508 input_report_key(kpd_input_dev
, KEY_DOWN
, 1);
509 input_sync(kpd_input_dev
);
511 printk("[AUTOTEST] Not Support DOWN KEY!!\n");
514 case RELEASE_DOWN_KEY
:
515 if (test_bit(KEY_DOWN
, kpd_input_dev
->keybit
)) {
516 printk("[AUTOTEST] RELEASE DOWN KEY!!\n");
517 input_report_key(kpd_input_dev
, KEY_DOWN
, 0);
518 input_sync(kpd_input_dev
);
520 printk("[AUTOTEST] Not Support DOWN KEY!!\n");
524 if (test_bit(KEY_LEFT
, kpd_input_dev
->keybit
)) {
525 printk("[AUTOTEST] PRESS LEFT KEY!!\n");
526 input_report_key(kpd_input_dev
, KEY_LEFT
, 1);
527 input_sync(kpd_input_dev
);
529 printk("[AUTOTEST] Not Support LEFT KEY!!\n");
532 case RELEASE_LEFT_KEY
:
533 if (test_bit(KEY_LEFT
, kpd_input_dev
->keybit
)) {
534 printk("[AUTOTEST] RELEASE LEFT KEY!!\n");
535 input_report_key(kpd_input_dev
, KEY_LEFT
, 0);
536 input_sync(kpd_input_dev
);
538 printk("[AUTOTEST] Not Support LEFT KEY!!\n");
542 case PRESS_RIGHT_KEY
:
543 if (test_bit(KEY_RIGHT
, kpd_input_dev
->keybit
)) {
544 printk("[AUTOTEST] PRESS RIGHT KEY!!\n");
545 input_report_key(kpd_input_dev
, KEY_RIGHT
, 1);
546 input_sync(kpd_input_dev
);
548 printk("[AUTOTEST] Not Support RIGHT KEY!!\n");
551 case RELEASE_RIGHT_KEY
:
552 if (test_bit(KEY_RIGHT
, kpd_input_dev
->keybit
)) {
553 printk("[AUTOTEST] RELEASE RIGHT KEY!!\n");
554 input_report_key(kpd_input_dev
, KEY_RIGHT
, 0);
555 input_sync(kpd_input_dev
);
557 printk("[AUTOTEST] Not Support RIGHT KEY!!\n");
561 if (test_bit(KEY_HOME
, kpd_input_dev
->keybit
)) {
562 printk("[AUTOTEST] PRESS HOME KEY!!\n");
563 input_report_key(kpd_input_dev
, KEY_HOME
, 1);
564 input_sync(kpd_input_dev
);
566 printk("[AUTOTEST] Not Support HOME KEY!!\n");
569 case RELEASE_HOME_KEY
:
570 if (test_bit(KEY_HOME
, kpd_input_dev
->keybit
)) {
571 printk("[AUTOTEST] RELEASE HOME KEY!!\n");
572 input_report_key(kpd_input_dev
, KEY_HOME
, 0);
573 input_sync(kpd_input_dev
);
575 printk("[AUTOTEST] Not Support HOME KEY!!\n");
579 if (test_bit(KEY_BACK
, kpd_input_dev
->keybit
)) {
580 printk("[AUTOTEST] PRESS BACK KEY!!\n");
581 input_report_key(kpd_input_dev
, KEY_BACK
, 1);
582 input_sync(kpd_input_dev
);
584 printk("[AUTOTEST] Not Support BACK KEY!!\n");
587 case RELEASE_BACK_KEY
:
588 if (test_bit(KEY_BACK
, kpd_input_dev
->keybit
)) {
589 printk("[AUTOTEST] RELEASE BACK KEY!!\n");
590 input_report_key(kpd_input_dev
, KEY_BACK
, 0);
591 input_sync(kpd_input_dev
);
593 printk("[AUTOTEST] Not Support BACK KEY!!\n");
597 if (test_bit(KEY_CALL
, kpd_input_dev
->keybit
)) {
598 printk("[AUTOTEST] PRESS CALL KEY!!\n");
599 input_report_key(kpd_input_dev
, KEY_CALL
, 1);
600 input_sync(kpd_input_dev
);
602 printk("[AUTOTEST] Not Support CALL KEY!!\n");
605 case RELEASE_CALL_KEY
:
606 if (test_bit(KEY_CALL
, kpd_input_dev
->keybit
)) {
607 printk("[AUTOTEST] RELEASE CALL KEY!!\n");
608 input_report_key(kpd_input_dev
, KEY_CALL
, 0);
609 input_sync(kpd_input_dev
);
611 printk("[AUTOTEST] Not Support CALL KEY!!\n");
615 case PRESS_ENDCALL_KEY
:
616 if (test_bit(KEY_ENDCALL
, kpd_input_dev
->keybit
)) {
617 printk("[AUTOTEST] PRESS ENDCALL KEY!!\n");
618 input_report_key(kpd_input_dev
, KEY_ENDCALL
, 1);
619 input_sync(kpd_input_dev
);
621 printk("[AUTOTEST] Not Support ENDCALL KEY!!\n");
624 case RELEASE_ENDCALL_KEY
:
625 if (test_bit(KEY_ENDCALL
, kpd_input_dev
->keybit
)) {
626 printk("[AUTOTEST] RELEASE ENDCALL KEY!!\n");
627 input_report_key(kpd_input_dev
, KEY_ENDCALL
, 0);
628 input_sync(kpd_input_dev
);
630 printk("[AUTOTEST] Not Support ENDCALL KEY!!\n");
634 if (test_bit(KEY_VOLUMEUP
, kpd_input_dev
->keybit
)) {
635 printk("[AUTOTEST] PRESS VOLUMEUP KEY!!\n");
636 input_report_key(kpd_input_dev
, KEY_VOLUMEUP
, 1);
637 input_sync(kpd_input_dev
);
639 printk("[AUTOTEST] Not Support VOLUMEUP KEY!!\n");
642 case RELEASE_VLUP_KEY
:
643 if (test_bit(KEY_VOLUMEUP
, kpd_input_dev
->keybit
)) {
644 printk("[AUTOTEST] RELEASE VOLUMEUP KEY!!\n");
645 input_report_key(kpd_input_dev
, KEY_VOLUMEUP
, 0);
646 input_sync(kpd_input_dev
);
648 printk("[AUTOTEST] Not Support VOLUMEUP KEY!!\n");
651 case PRESS_VLDOWN_KEY
:
652 if (test_bit(KEY_VOLUMEDOWN
, kpd_input_dev
->keybit
)) {
653 printk("[AUTOTEST] PRESS VOLUMEDOWN KEY!!\n");
654 input_report_key(kpd_input_dev
, KEY_VOLUMEDOWN
, 1);
655 input_sync(kpd_input_dev
);
657 printk("[AUTOTEST] Not Support VOLUMEDOWN KEY!!\n");
660 case RELEASE_VLDOWN_KEY
:
661 if (test_bit(KEY_VOLUMEDOWN
, kpd_input_dev
->keybit
)) {
662 printk("[AUTOTEST] RELEASE VOLUMEDOWN KEY!!\n");
663 input_report_key(kpd_input_dev
, KEY_VOLUMEDOWN
, 0);
664 input_sync(kpd_input_dev
);
666 printk("[AUTOTEST] Not Support VOLUMEDOWN KEY!!\n");
669 case PRESS_FOCUS_KEY
:
670 if (test_bit(KEY_FOCUS
, kpd_input_dev
->keybit
)) {
671 printk("[AUTOTEST] PRESS FOCUS KEY!!\n");
672 input_report_key(kpd_input_dev
, KEY_FOCUS
, 1);
673 input_sync(kpd_input_dev
);
675 printk("[AUTOTEST] Not Support FOCUS KEY!!\n");
678 case RELEASE_FOCUS_KEY
:
679 if (test_bit(KEY_FOCUS
, kpd_input_dev
->keybit
)) {
680 printk("[AUTOTEST] RELEASE FOCUS KEY!!\n");
681 input_report_key(kpd_input_dev
, KEY_FOCUS
, 0);
682 input_sync(kpd_input_dev
);
684 printk("[AUTOTEST] Not Support RELEASE KEY!!\n");
687 case PRESS_CAMERA_KEY
:
688 if (test_bit(KEY_CAMERA
, kpd_input_dev
->keybit
)) {
689 printk("[AUTOTEST] PRESS CAMERA KEY!!\n");
690 input_report_key(kpd_input_dev
, KEY_CAMERA
, 1);
691 input_sync(kpd_input_dev
);
693 printk("[AUTOTEST] Not Support CAMERA KEY!!\n");
696 case RELEASE_CAMERA_KEY
:
697 if (test_bit(KEY_CAMERA
, kpd_input_dev
->keybit
)) {
698 printk("[AUTOTEST] RELEASE CAMERA KEY!!\n");
699 input_report_key(kpd_input_dev
, KEY_CAMERA
, 0);
700 input_sync(kpd_input_dev
);
702 printk("[AUTOTEST] Not Support CAMERA KEY!!\n");
705 case PRESS_POWER_KEY
:
706 if (test_bit(KEY_POWER
, kpd_input_dev
->keybit
)) {
707 printk("[AUTOTEST] PRESS POWER KEY!!\n");
708 input_report_key(kpd_input_dev
, KEY_POWER
, 1);
709 input_sync(kpd_input_dev
);
711 printk("[AUTOTEST] Not Support POWER KEY!!\n");
714 case RELEASE_POWER_KEY
:
715 if (test_bit(KEY_POWER
, kpd_input_dev
->keybit
)) {
716 printk("[AUTOTEST] RELEASE POWER KEY!!\n");
717 input_report_key(kpd_input_dev
, KEY_POWER
, 0);
718 input_sync(kpd_input_dev
);
720 printk("[AUTOTEST] Not Support POWER KEY!!\n");
726 kpd_auto_test_for_factorymode(); /* API 3 for kpd factory mode auto-test */
727 printk("[kpd_auto_test_for_factorymode] test performed!!\n");
737 int kpd_dev_open(struct inode
*inode
, struct file
*file
)
742 static struct file_operations kpd_dev_fops
= {
743 .owner
= THIS_MODULE
,
744 .unlocked_ioctl
= kpd_dev_ioctl
,
745 .open
= kpd_dev_open
,
748 /*********************************************************************/
749 static struct miscdevice kpd_dev
= {
750 .minor
= MISC_DYNAMIC_MINOR
,
752 .fops
= &kpd_dev_fops
,
755 static int kpd_open(struct input_dev
*dev
)
757 kpd_slide_qwerty_init(); /* API 1 for kpd slide qwerty init settings */
762 static int kpd_pdrv_probe(struct platform_device
*pdev
)
769 kp_base
= of_iomap(pdev
->dev
.of_node
, 0);
771 pr_warn(KPD_SAY
"KP iomap failed\n");
775 kp_irqnr
= irq_of_parse_and_map(pdev
->dev
.of_node
, 0);
777 pr_warn(KPD_SAY
"KP get irqnr failed\n");
780 pr_warn(KPD_SAY
"kp base: 0x%p, addr:0x%p, kp irq: %d\n", kp_base
,&kp_base
, kp_irqnr
);
783 kpd_ldvt_test_init(); /* API 2 for kpd LFVT test enviroment settings */
785 /* initialize and register input device (/dev/input/eventX) */
786 kpd_input_dev
= input_allocate_device();
790 kpd_input_dev
->name
= KPD_NAME
;
791 kpd_input_dev
->id
.bustype
= BUS_HOST
;
792 kpd_input_dev
->id
.vendor
= 0x2454;
793 kpd_input_dev
->id
.product
= 0x6500;
794 kpd_input_dev
->id
.version
= 0x0010;
795 kpd_input_dev
->open
= kpd_open
;
797 /* fulfill custom settings */
798 kpd_memory_setting();
800 __set_bit(EV_KEY
, kpd_input_dev
->evbit
);
802 #if (KPD_PWRKEY_USE_EINT || KPD_PWRKEY_USE_PMIC)
803 __set_bit(KPD_PWRKEY_MAP
, kpd_input_dev
->keybit
);
807 #if !KPD_USE_EXTEND_TYPE
808 for (i
= 17; i
< KPD_NUM_KEYS
; i
+= 9) /* only [8] works for Power key */
812 for (i
= 0; i
< KPD_NUM_KEYS
; i
++) {
813 if (kpd_keymap
[i
] != 0)
814 __set_bit(kpd_keymap
[i
], kpd_input_dev
->keybit
);
818 for (i
= 0; i
< ARRAY_SIZE(kpd_auto_keymap
); i
++)
819 __set_bit(kpd_auto_keymap
[i
], kpd_input_dev
->keybit
);
822 #if KPD_HAS_SLIDE_QWERTY
823 __set_bit(EV_SW
, kpd_input_dev
->evbit
);
824 __set_bit(SW_LID
, kpd_input_dev
->swbit
);
827 #ifdef KPD_PMIC_RSTKEY_MAP
828 __set_bit(KPD_PMIC_RSTKEY_MAP
, kpd_input_dev
->keybit
);
832 __set_bit(KPD_KEY_MAP
, kpd_input_dev
->keybit
);
835 kpd_input_dev
->dev
.parent
= &pdev
->dev
;
836 r
= input_register_device(kpd_input_dev
);
838 printk(KPD_SAY
"register input device failed (%d)\n", r
);
839 input_free_device(kpd_input_dev
);
843 /* register device (/dev/mt6575-kpd) */
844 kpd_dev
.parent
= &pdev
->dev
;
845 r
= misc_register(&kpd_dev
);
847 printk(KPD_SAY
"register device failed (%d)\n", r
);
848 input_unregister_device(kpd_input_dev
);
852 /* register IRQ and EINT */
853 kpd_set_debounce(KPD_KEY_DEBOUNCE
);
855 r
= request_irq(kp_irqnr
, kpd_irq_handler
, IRQF_TRIGGER_NONE
, KPD_NAME
, NULL
);
857 r
= request_irq(MT_KP_IRQ_ID
, kpd_irq_handler
, IRQF_TRIGGER_FALLING
, KPD_NAME
, NULL
);
860 printk(KPD_SAY
"register IRQ failed (%d)\n", r
);
861 misc_deregister(&kpd_dev
);
862 input_unregister_device(kpd_input_dev
);
867 #ifndef KPD_EARLY_PORTING /*add for avoid early porting build err the macro is defined in custom file */
868 long_press_reboot_function_setting(); /* /API 4 for kpd long press reboot function setting */
870 hrtimer_init(&aee_timer
, CLOCK_MONOTONIC
, HRTIMER_MODE_REL
);
871 aee_timer
.function
= aee_timer_func
;
874 hrtimer_init(&aee_timer_5s
, CLOCK_MONOTONIC
, HRTIMER_MODE_REL
);
875 aee_timer_5s
.function
= aee_timer_5s_func
;
878 if ((err
= kpd_create_attr(&kpd_pdrv
.driver
))) {
879 kpd_print("create attr file fail\n");
880 kpd_delete_attr(&kpd_pdrv
.driver
);
883 pr_warn(KPD_SAY
"%s Done\n", __FUNCTION__
);
887 /* should never be called */
888 static int kpd_pdrv_remove(struct platform_device
*pdev
)
893 #ifndef USE_EARLY_SUSPEND
894 static int kpd_pdrv_suspend(struct platform_device
*pdev
, pm_message_t state
)
897 #ifdef MTK_KP_WAKESOURCE
898 if (call_status
== 2) {
899 kpd_print("kpd_early_suspend wake up source enable!! (%d)\n", kpd_suspend
);
901 kpd_wakeup_src_setting(0);
902 kpd_print("kpd_early_suspend wake up source disable!! (%d)\n", kpd_suspend
);
905 kpd_disable_backlight();
906 kpd_print("suspend!! (%d)\n", kpd_suspend
);
910 static int kpd_pdrv_resume(struct platform_device
*pdev
)
913 #ifdef MTK_KP_WAKESOURCE
914 if (call_status
== 2) {
915 kpd_print("kpd_early_suspend wake up source enable!! (%d)\n", kpd_suspend
);
917 kpd_print("kpd_early_suspend wake up source resume!! (%d)\n", kpd_suspend
);
918 kpd_wakeup_src_setting(1);
921 kpd_print("resume!! (%d)\n", kpd_suspend
);
925 #define kpd_pdrv_suspend NULL
926 #define kpd_pdrv_resume NULL
930 #ifdef USE_EARLY_SUSPEND
931 static void kpd_early_suspend(struct early_suspend
*h
)
934 #ifdef MTK_KP_WAKESOURCE
935 if (call_status
== 2) {
936 kpd_print("kpd_early_suspend wake up source enable!! (%d)\n", kpd_suspend
);
938 /* kpd_wakeup_src_setting(0); */
939 kpd_print("kpd_early_suspend wake up source disable!! (%d)\n", kpd_suspend
);
942 kpd_disable_backlight();
943 kpd_print("early suspend!! (%d)\n", kpd_suspend
);
946 static void kpd_early_resume(struct early_suspend
*h
)
949 #ifdef MTK_KP_WAKESOURCE
950 if (call_status
== 2) {
951 kpd_print("kpd_early_resume wake up source resume!! (%d)\n", kpd_suspend
);
953 kpd_print("kpd_early_resume wake up source enable!! (%d)\n", kpd_suspend
);
954 /* kpd_wakeup_src_setting(1); */
957 kpd_print("early resume!! (%d)\n", kpd_suspend
);
960 static struct early_suspend kpd_early_suspend_desc
= {
961 .level
= EARLY_SUSPEND_LEVEL_BLANK_SCREEN
+ 1,
962 .suspend
= kpd_early_suspend
,
963 .resume
= kpd_early_resume
,
967 #ifdef CONFIG_MTK_SMARTBOOK_SUPPORT
968 #ifdef CONFIG_HAS_SBSUSPEND
969 static struct sb_handler kpd_sb_handler_desc
= {
970 .level
= SB_LEVEL_DISABLE_KEYPAD
,
971 .plug_in
= sb_kpd_enable
,
972 .plug_out
= sb_kpd_disable
,
977 static int __init
kpd_mod_init(void)
981 r
= platform_driver_register(&kpd_pdrv
);
983 printk(KPD_SAY
"register driver failed (%d)\n", r
);
986 #ifdef USE_EARLY_SUSPEND
987 register_early_suspend(&kpd_early_suspend_desc
);
990 #ifdef CONFIG_MTK_SMARTBOOK_SUPPORT
991 #ifdef CONFIG_HAS_SBSUSPEND
992 register_sb_handler(&kpd_sb_handler_desc
);
999 /* should never be called */
1000 static void __exit
kpd_mod_exit(void)
1003 module_init(kpd_mod_init
);
1004 module_exit(kpd_mod_exit
);
1006 module_param(kpd_show_hw_keycode
, int, 0644);
1007 module_param(kpd_show_register
, int, 0644);
1009 MODULE_AUTHOR("yucong.xiong <yucong.xiong@mediatek.com>");
1010 MODULE_DESCRIPTION("MTK Keypad (KPD) Driver v0.4");
1011 MODULE_LICENSE("GPL");