enable_irq_wake(IRQ_EINT1) 与 enable_irq(IRQ_EINT1)的区别

static irqreturn_t accdet_eint_func(int irq, void *data) 500 { 501 int ret = 0; 502 503 ACCDET_DEBUG("[Accdet]Enter accdet_eint_func !!!!!!\n"); 504 if (cur_eint_state == EINT_PIN_PLUG_IN) { 505 /* 506 To trigger EINT when the headset was plugged in 507 We set the polarity back as we initialed. 508 */ 509 #ifndef CONFIG_ACCDET_EINT_IRQ 510 if (accdet_eint_type == IRQ_TYPE_LEVEL_HIGH) 511 irq_set_irq_type(accdet_irq, IRQ_TYPE_LEVEL_HIGH); 512 else 513 irq_set_irq_type(accdet_irq, IRQ_TYPE_LEVEL_LOW); 514 #endif 515 #ifdef CONFIG_ACCDET_EINT_IRQ 516 pmic_pwrap_write(ACCDET_EINT_CTL, pmic_pwrap_read(ACCDET_EINT_CTL) & (~(7 << 4))); 517 /*debounce=256ms*/ 518 pmic_pwrap_write(ACCDET_EINT_CTL, pmic_pwrap_read(ACCDET_EINT_CTL) | EINT_IRQ_DE_IN); 519 pmic_pwrap_write(ACCDET_DEBOUNCE3, cust_headset_settings->debounce3); 520 521 #else 522 gpio_set_debounce(gpiopin, headsetdebounce); 523 #endif 524 525 /* update the eint status */ 526 cur_eint_state = EINT_PIN_PLUG_OUT; 527 } else { 528 /* 529 To trigger EINT when the headset was plugged out 530 We set the opposite polarity to what we initialed. 531 */ 532 #ifndef CONFIG_ACCDET_EINT_IRQ 533 if (accdet_eint_type == IRQ_TYPE_LEVEL_HIGH) 534 irq_set_irq_type(accdet_irq, IRQ_TYPE_LEVEL_LOW); 535 else 536 irq_set_irq_type(accdet_irq, IRQ_TYPE_LEVEL_HIGH); 537 #endif 538 539 #ifdef CONFIG_ACCDET_EINT_IRQ 540 pmic_pwrap_write(ACCDET_EINT_CTL, pmic_pwrap_read(ACCDET_EINT_CTL) & (~(7 << 4))); 541 /*debounce=16ms*/ 542 pmic_pwrap_write(ACCDET_EINT_CTL, pmic_pwrap_read(ACCDET_EINT_CTL) | EINT_IRQ_DE_OUT); 543 #else 544 gpio_set_debounce(gpiopin, accdet_dts_data.accdet_plugout_debounce * 1000); 545 #endif 546 /* update the eint status */ 547 cur_eint_state = EINT_PIN_PLUG_IN; 548 549 mod_timer(&micbias_timer, jiffies + MICBIAS_DISABLE_TIMER); 550 } 551 #ifndef CONFIG_ACCDET_EINT_IRQ 552 disable_irq_nosync(accdet_irq); 553 #endif 554 ACCDET_DEBUG("[Accdet]accdet_eint_func after cur_eint_state=%d\n", cur_eint_state); 555 556 ret = queue_work(accdet_eint_workqueue, &accdet_eint_work); 557 return IRQ_HANDLED; 558 } 559 #ifndef CONFIG_ACCDET_EINT_IRQ 560 static inline int accdet_setup_eint(struct platform_device *accdet_device) 561 { 562 int ret; 563 u32 ints[2] = { 0, 0 }; 564 u32 ints1[2] = { 0, 0 }; 565 struct device_node *node = NULL; 566 struct pinctrl_state *pins_default; 567 568 /*configure to GPIO function, external interrupt */ 569 ACCDET_INFO("[Accdet]accdet_setup_eint\n"); 570 accdet_pinctrl1 = devm_pinctrl_get(&accdet_device->dev); 571 if (IS_ERR(accdet_pinctrl1)) { 572 ret = PTR_ERR(accdet_pinctrl1); 573 dev_err(&accdet_device->dev, "fwq Cannot find accdet accdet_pinctrl1!\n"); 574 return ret; 575 } 576 577 pins_default = pinctrl_lookup_state(accdet_pinctrl1, "default"); 578 if (IS_ERR(pins_default)) { 579 ret = PTR_ERR(pins_default); 580 /*dev_err(&accdet_device->dev, "fwq Cannot find accdet pinctrl default!\n");*/ 581 } 582 583 pins_eint_int = pinctrl_lookup_state(accdet_pinctrl1, "state_eint_as_int"); 584 if (IS_ERR(pins_eint_int)) { 585 ret = PTR_ERR(pins_eint_int); 586 dev_err(&accdet_device->dev, "fwq Cannot find accdet pinctrl state_eint_accdet!\n"); 587 return ret; 588 } 589 pinctrl_select_state(accdet_pinctrl1, pins_eint_int); 590 591 /*node = of_find_matching_node(node, accdet_of_match);*/ 592 node = of_find_matching_node(node, accdet_of_match); 593 if (node) { 594 of_property_read_u32_array(node, "debounce", ints, ARRAY_SIZE(ints)); 595 of_property_read_u32_array(node, "interrupts", ints1, ARRAY_SIZE(ints1)); 596 gpiopin = ints[0]; 597 headsetdebounce = ints[1]; 598 accdet_eint_type = ints1[1]; 599 gpio_set_debounce(gpiopin, headsetdebounce); 600 accdet_irq = irq_of_parse_and_map(node, 0); 601 ret = request_irq(accdet_irq, accdet_eint_func, IRQF_TRIGGER_NONE, "accdet-eint", NULL); 602 if (ret != 0) { 603 ACCDET_ERROR("[Accdet]EINT IRQ LINE NOT AVAILABLE\n"); 604 } else { 605 ACCDET_ERROR("[Accdet]accdet set EINT finished, accdet_irq=%d, headsetdebounce=%d\n", 606 accdet_irq, headsetdebounce); 607 } 608 } else { 609 ACCDET_ERROR("[Accdet]%s can't find compatible node\n", __func__); 610 } 611 return 0; 612 }
07-15
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 }
最新发布
07-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值