static void send_accdet_status_event(int cable_type, int status)
664 {
665 switch (cable_type) {
666 case HEADSET_NO_MIC:
667 input_report_switch(kpd_accdet_dev, SW_HEADPHONE_INSERT, status);
668 input_report_switch(kpd_accdet_dev, SW_JACK_PHYSICAL_INSERT, status);
669 input_sync(kpd_accdet_dev);
670 ACCDET_DEBUG("[Accdet]HEADSET_NO_MIC(3-pole) %s\n", status?"PlugIn":"PlugOut");
671 break;
672 case HEADSET_MIC:
673 input_report_switch(kpd_accdet_dev, SW_HEADPHONE_INSERT, status);
674 input_report_switch(kpd_accdet_dev, SW_MICROPHONE_INSERT, status);
675 input_report_switch(kpd_accdet_dev, SW_JACK_PHYSICAL_INSERT, status);
676 input_sync(kpd_accdet_dev);
677 ACCDET_DEBUG("[Accdet]HEADSET_MIC(4-pole) %s\n", status?"PlugIn":"PlugOut");
678 break;
679 default:
680 ACCDET_DEBUG("[Accdet]Invalid cableType\n");
681 }
682 }
683
684 static void send_key_event(int keycode, int flag)
685 {
686 switch (keycode) {
687 case DW_KEY:
688 input_report_key(kpd_accdet_dev, KEY_VOLUMEDOWN, flag);
689 input_sync(kpd_accdet_dev);
690 ACCDET_DEBUG("[accdet]KEY_VOLUMEDOWN %d\n", flag);
691 break;
692 case UP_KEY:
693 input_report_key(kpd_accdet_dev, KEY_VOLUMEUP, flag);
694 input_sync(kpd_accdet_dev);
695 ACCDET_DEBUG("[accdet]KEY_VOLUMEUP %d\n", flag);
696 break;
697 case MD_KEY:
698 input_report_key(kpd_accdet_dev, KEY_PLAYPAUSE, flag);
699 input_sync(kpd_accdet_dev);
700 ACCDET_DEBUG("[accdet]KEY_PLAYPAUSE %d\n", flag);
701 break;
702 case AS_KEY:
703 input_report_key(kpd_accdet_dev, KEY_VOICECOMMAND, flag);
704 input_sync(kpd_accdet_dev);
705 ACCDET_DEBUG("[accdet]KEY_VOICECOMMAND %d\n", flag);
706 break;
707 }
708 }
709
710 static void multi_key_detection(int current_status)
711 {
712 int m_key = 0;
713 int cali_voltage = 0;
714
715 if (0 == current_status) {
716 cali_voltage = Accdet_PMIC_IMM_GetOneChannelValue(1);
717 /*ACCDET_DEBUG("[Accdet]adc cali_voltage1 = %d mv\n", cali_voltage);*/
718 m_key = cur_key = key_check(cali_voltage);
719 }
720 mdelay(30);
721 #ifdef CONFIG_ACCDET_EINT_IRQ
722 if (((pmic_pwrap_read(ACCDET_IRQ_STS) & EINT_IRQ_STATUS_BIT) != EINT_IRQ_STATUS_BIT) || eint_accdet_sync_flag) {
723 #else /* ifdef CONFIG_ACCDET_EINT */
724 if (((pmic_pwrap_read(ACCDET_IRQ_STS) & IRQ_STATUS_BIT) != IRQ_STATUS_BIT) || eint_accdet_sync_flag) {
725 #endif
726 send_key_event(cur_key, !current_status);
727 } else {
728 ACCDET_DEBUG("[Accdet]plug out side effect key press, do not report key = %d\n", cur_key);
729 cur_key = NO_KEY;
730 }
731 if (current_status)
732 cur_key = NO_KEY;
733 }
734 #endif
735 static void accdet_workqueue_func(void)
736 {
737 int ret;
738
739 ret = queue_work(accdet_workqueue, &accdet_work);
740 if (!ret)
741 ACCDET_DEBUG("[Accdet]accdet_work return:%d!\n", ret);
742 }
743
744 int accdet_irq_handler(void)
745 {
746 u64 cur_time = 0;
747
748 cur_time = accdet_get_current_time();
749
750 #ifdef CONFIG_ACCDET_EINT_IRQ
751 ACCDET_DEBUG("[Accdet accdet_irq_handler]clear_accdet_eint_interrupt: ACCDET_IRQ_STS = 0x%x\n",
752 pmic_pwrap_read(ACCDET_IRQ_STS));
753 if ((pmic_pwrap_read(ACCDET_IRQ_STS) & IRQ_STATUS_BIT)
754 && ((pmic_pwrap_read(ACCDET_IRQ_STS) & EINT_IRQ_STATUS_BIT) != EINT_IRQ_STATUS_BIT)) {
755 clear_accdet_interrupt();
756 if (accdet_status == MIC_BIAS) {
757 /*accdet_auxadc_switch(1);*/
758 pmic_pwrap_write(ACCDET_PWM_WIDTH, REGISTER_VALUE(cust_headset_settings->pwm_width));
759 pmic_pwrap_write(ACCDET_PWM_THRESH, REGISTER_VALUE(cust_headset_settings->pwm_width));
760 }
761 accdet_workqueue_func();
762 while (((pmic_pwrap_read(ACCDET_IRQ_STS) & IRQ_STATUS_BIT)
763 && (accdet_timeout_ns(cur_time, ACCDET_TIME_OUT))))
764 ;
765 } else if ((pmic_pwrap_read(ACCDET_IRQ_STS) & EINT_IRQ_STATUS_BIT) == EINT_IRQ_STATUS_BIT) {
766 if (cur_eint_state == EINT_PIN_PLUG_IN) {
767 if (accdet_eint_type == IRQ_TYPE_LEVEL_HIGH)
768 pmic_pwrap_write(ACCDET_IRQ_STS, pmic_pwrap_read(ACCDET_IRQ_STS) | EINT_IRQ_POL_HIGH);
769 else
770 pmic_pwrap_write(ACCDET_IRQ_STS, pmic_pwrap_read(ACCDET_IRQ_STS) & ~EINT_IRQ_POL_LOW);
771 } else {
772 if (accdet_eint_type == IRQ_TYPE_LEVEL_HIGH)
773 pmic_pwrap_write(ACCDET_IRQ_STS, pmic_pwrap_read(ACCDET_IRQ_STS) & ~EINT_IRQ_POL_LOW);
774 else
775 pmic_pwrap_write(ACCDET_IRQ_STS, pmic_pwrap_read(ACCDET_IRQ_STS) | EINT_IRQ_POL_HIGH);
776 }
777 clear_accdet_eint_interrupt();
778 while (((pmic_pwrap_read(ACCDET_IRQ_STS) & EINT_IRQ_STATUS_BIT)
779 && (accdet_timeout_ns(cur_time, ACCDET_TIME_OUT))))
780 ;
781 accdet_eint_func(accdet_irq, NULL);
782 } else {
783 ACCDET_DEBUG("ACCDET IRQ and EINT IRQ don't be triggerred!!\n");
784 }
785 #else
786 if ((pmic_pwrap_read(ACCDET_IRQ_STS) & IRQ_STATUS_BIT))
787 clear_accdet_interrupt();
788 if (accdet_status == MIC_BIAS) {
789 /*accdet_auxadc_switch(1);*/
790 pmic_pwrap_write(ACCDET_PWM_WIDTH, REGISTER_VALUE(cust_headset_settings->pwm_width));
791 pmic_pwrap_write(ACCDET_PWM_THRESH, REGISTER_VALUE(cust_headset_settings->pwm_width));
792 }
793 accdet_workqueue_func();
794 while (((pmic_pwrap_read(ACCDET_IRQ_STS) & IRQ_STATUS_BIT)
795 && (accdet_timeout_ns(cur_time, ACCDET_TIME_OUT))))
796 ;
797 #endif
798 #ifdef ACCDET_NEGV_IRQ
799 cur_time = accdet_get_current_time();
800 if ((pmic_pwrap_read(ACCDET_IRQ_STS) & NEGV_IRQ_STATUS_BIT) == NEGV_IRQ_STATUS_BIT) {
801 ACCDET_DEBUG("[ACCDET NEGV detect]plug in a error Headset\n\r");
802 pmic_pwrap_write(ACCDET_IRQ_STS, (IRQ_NEGV_CLR_BIT));
803 while (((pmic_pwrap_read(ACCDET_IRQ_STS) & NEGV_IRQ_STATUS_BIT)
804 && (accdet_timeout_ns(cur_time, ACCDET_TIME_OUT))))
805 ;
806 pmic_pwrap_write(ACCDET_IRQ_STS, (pmic_pwrap_read(ACCDET_IRQ_STS) & (~IRQ_NEGV_CLR_BIT)));
807 }
808 #endif
809
810 return 1;
811 }
最新发布