int oem_gpio_set_irq_type(int gpio, unsigned int type) { int irq, level; irq = oem_gpio_to_irq(gpio); if(irq < 0){ return irq; } level = oem_gpio_get_value(gpio); if(type == IRQ_TYPE_EDGE_BOTH){ if(level){ type = IRQ_TYPE_EDGE_FALLING; }else{ type = IRQ_TYPE_EDGE_RISING; } } if(type == IRQ_TYPE_LEVEL_MASK){ if(level){ type = IRQ_TYPE_LEVEL_LOW; }else{ type = IRQ_TYPE_LEVEL_HIGH; } } mt65xx_eint_set_hw_debounce(irq, 3); switch(type){ case IRQ_TYPE_EDGE_RISING: mt65xx_eint_set_sens(irq, MT65xx_EDGE_SENSITIVE); mt65xx_eint_set_polarity(irq, MT65xx_POLARITY_HIGH); break; case IRQ_TYPE_EDGE_FALLING: mt65xx_eint_set_sens(irq, MT65xx_EDGE_SENSITIVE); mt65xx_eint_set_polarity(irq, MT65xx_POLARITY_LOW); break; case IRQ_TYPE_LEVEL_HIGH: mt65xx_eint_set_sens(irq, MT65xx_LEVEL_SENSITIVE); mt65xx_eint_set_polarity(irq, MT65xx_POLARITY_HIGH); break; case IRQ_TYPE_LEVEL_LOW: mt65xx_eint_set_sens(irq, MT65xx_LEVEL_SENSITIVE); mt65xx_eint_set_polarity(irq, MT65xx_POLARITY_LOW); break; default: return -EINVAL; } return 0; }
static void hall_init_hw(void) { mt_set_gpio_mode(GPIO_MHALL_EINT_PIN, GPIO_MHALL_EINT_PIN_M_EINT); mt_set_gpio_dir(GPIO_MHALL_EINT_PIN, GPIO_DIR_IN); mt_set_gpio_pull_enable(GPIO_MHALL_EINT_PIN, GPIO_PULL_DISABLE); mt_set_gpio_ies(GPIO_MHALL_EINT_PIN, GPIO_IES_ENABLE); mt65xx_eint_set_sens(CUST_EINT_MHALL_NUM, CUST_EINT_MHALL_SENSITIVE); mt65xx_eint_set_polarity(CUST_EINT_MHALL_NUM, CUST_EINT_MHALL_POLARITY); mt65xx_eint_set_hw_debounce(CUST_EINT_MHALL_NUM, CUST_EINT_MHALL_DEBOUNCE_CN); mt65xx_eint_registration(CUST_EINT_MHALL_NUM, CUST_EINT_MHALL_DEBOUNCE_EN, CUST_EINT_MHALL_POLARITY, hall_cover_eint_handler, 0); mt65xx_eint_unmask(CUST_EINT_MHALL_NUM); }
static void kpd_slide_handler(unsigned long data) { bool slid; u8 old_state = kpd_slide_state; kpd_slide_state = !kpd_slide_state; slid = (kpd_slide_state == !!KPD_SLIDE_POLARITY); /* for SW_LID, 1: lid open => slid, 0: lid shut => closed */ input_report_switch(kpd_input_dev, SW_LID, slid); input_sync(kpd_input_dev); kpd_print("report QWERTY = %s\n", slid ? "slid" : "closed"); if (old_state) mt_set_gpio_pull_select(GPIO_QWERTYSLIDE_EINT_PIN, 0); else mt_set_gpio_pull_select(GPIO_QWERTYSLIDE_EINT_PIN, 1); /* for detecting the return to old_state */ mt65xx_eint_set_polarity(KPD_SLIDE_EINT, old_state); mt65xx_eint_unmask(KPD_SLIDE_EINT); }
static void hall_eint_work_callback(struct work_struct *work) { bool cover; u8 old_state = hall_cover_state; mt65xx_eint_mask(CUST_EINT_MHALL_NUM); DOCK_DEBUG("[hall] hall_cover_state = %d\n", hall_cover_state ); hall_cover_state = !mt_get_gpio_in(GPIO_MHALL_EINT_PIN); if ( old_state == hall_cover_state ) { DOCK_ERR("[hall] no hall state changed!!!\n"); //mt65xx_eint_unmask(CUST_EINT_MHALL_NUM); //return; } switch_set_state((struct switch_dev *)&hall_data, hall_cover_state); //input_report_switch(kpd_input_dev, SW_LID, hall_cover_state); //input_sync(kpd_input_dev); mt65xx_eint_set_polarity(CUST_EINT_MHALL_NUM, !old_state); mt65xx_eint_unmask(CUST_EINT_MHALL_NUM); }