static enum hrtimer_restart button_event_timer_func(struct hrtimer *data) { if ((gpio_get_value(MSM_GPIO_EAR_DET) != detect_type)) return HRTIMER_NORESTART; /* check again*/ if (hi->button_state != gpio_get_value(MSM_GPIO_EAR_SEND_END)) { pr_info("ERROR - button value : %d -> %d\n", hi->button_state, gpio_get_value(MSM_GPIO_EAR_SEND_END)); return HRTIMER_NORESTART; } /* butten active high*/ if (gpio_get_value(MSM_GPIO_EAR_SEND_END)) { headset_button_event(1); /* 10 ms */ hi->btn_debounce_time = ktime_set(0, 10000000); } else { headset_button_event(0); /* 150 ms */ hi->btn_debounce_time = ktime_set(0, 300000000); } return HRTIMER_NORESTART; }
static void button_35mm_work_func(struct work_struct *work) { int key; struct button_work *works; wake_lock_timeout(&hi->hs_wake_lock, HS_WAKE_LOCK_TIMEOUT); HS_DBG(); works = container_of(work, struct button_work, key_work.work); hi->key_level_flag = works->key_code; /*run one-wire button work function if the project support one-wire detection*/ if(hi->detect_type == HEADSET_1WIRE && hi->pdata.enable_1wire) button_1wire_work_func(); if (hi->hs_35mm_type == HEADSET_UNPLUG && hi->h2w_35mm_type == HEADSET_UNPLUG) { // kfree(works); works->key_code = NULL; HS_LOG("Ignore key event (HEADSET_UNPLUG)"); return; } if (hi->key_level_flag) { switch (hi->key_level_flag) { case 1: HS_LOG("3.5mm RC: Play Pressed"); key = HS_MGR_KEYCODE_MEDIA; break; case 2: HS_LOG("3.5mm RC: BACKWARD Pressed"); key = HS_MGR_KEYCODE_BACKWARD; break; case 3: HS_LOG("3.5mm RC: FORWARD Pressed"); key = HS_MGR_KEYCODE_FORWARD; break; default: HS_LOG("3.5mm RC: WRONG Button Pressed"); return; } headset_button_event(1, key); } else { /* key release */ if (atomic_read(&hi->btn_state)) headset_button_event(0, atomic_read(&hi->btn_state)); else HS_LOG("3.5mm RC: WRONG Button Release"); } // kfree(works); works->key_code = NULL; }
static void remove_headset(void) { unsigned long irq_flags; pr_info("remove_headset\n"); gpio_set_value(MSM_GPIO_EAR_MICBIAS_EN, 0); mutex_lock(&hi->mutex_lock); switch_set_state(&hi->sdev, switch_get_state(&hi->sdev) & ~(BIT_HEADSET | BIT_HEADSET_NO_MIC)); mutex_unlock(&hi->mutex_lock); if (hi->btn_11pin_35mm_flag) { irq_set_irq_wake(hi->irq_btn, 0); local_irq_save(irq_flags); disable_irq(hi->irq_btn); local_irq_restore(irq_flags); hi->btn_11pin_35mm_flag = 0; if (atomic_read(&hi->btn_state)) headset_button_event(0); } hi->debounce_time = ktime_set(0, 200000000); /* 100 ms */ hrtimer_cancel(&hi->btn_timer); hrtimer_cancel(&hi->irq_delay_timer); hi->btn_irq_available = 0; #ifdef CONFIG_MACH_RAY if (sec_jack_pm_qos) { pm_qos_update_request(&jack_qos_req, PM_QOS_DEFAULT_VALUE); sec_jack_pm_qos = 0; } #endif }
static void button_35mm_work_func(struct work_struct *work) { int key; struct button_work *works; wake_lock_timeout(&hi->hs_wake_lock, HS_WAKE_LOCK_TIMEOUT); HS_DBG(); works = container_of(work, struct button_work, key_work.work); hi->key_level_flag = works->key_code; if (!hi->is_ext_insert && !hi->h2w_35mm_type) { kfree(works); HS_LOG("3.5mm headset is plugged out, skip report key event"); return; } if (hi->key_level_flag) { switch (hi->key_level_flag) { case 1: HS_LOG("3.5mm RC: Play Pressed"); key = HS_MGR_KEYCODE_MEDIA; break; case 2: HS_LOG("3.5mm RC: BACKWARD Pressed"); key = HS_MGR_KEYCODE_BACKWARD; break; case 3: HS_LOG("3.5mm RC: FORWARD Pressed"); key = HS_MGR_KEYCODE_FORWARD; break; default: HS_LOG("3.5mm RC: WRONG Button Pressed"); return; } headset_button_event(1, key); } else { /* key release */ if (atomic_read(&hi->btn_state)) headset_button_event(0, atomic_read(&hi->btn_state)); else HS_LOG("3.5mm RC: WRONG Button Release"); } kfree(works); }
static void button_35mm_work_func(struct work_struct *work) { int key; struct button_work *works; wake_lock_timeout(&hi->hs_wake_lock, HS_WAKE_LOCK_TIMEOUT); HS_DBG(); works = container_of(work, struct button_work, key_work.work); hi->key_level_flag = works->key_code; if (hi->key_level_flag) { switch (hi->key_level_flag) { case 1: key = HS_MGR_KEYCODE_MEDIA; break; case 2: key = HS_MGR_KEYCODE_BACKWARD; break; case 3: key = HS_MGR_KEYCODE_FORWARD; break; default: HS_LOG("3.5mm RC: WRONG Button Pressed"); kfree(works); pre_key_work = NULL; return; } headset_button_event(1, key); } else { /* key release */ if (atomic_read(&hi->btn_state)) headset_button_event(0, atomic_read(&hi->btn_state)); else HS_LOG("3.5mm RC: WRONG Button Release"); } kfree(works); pre_key_work = NULL; }
static void button_35mm_do_work(struct work_struct *w) { int key; if (!hi->is_ext_insert && !hi->h2w_35mm_status) { H2WI("3.5mm headset is plugged out, skip report key event"); return; } if (hi->key_level_flag) { switch (hi->key_level_flag) { case 1: H2WI("3.5mm RC: Play Pressed"); key = KEY_MEDIA; break; case 2: H2WI("3.5mm RC: BACKWARD Pressed"); key = KEY_PREVIOUSSONG; break; case 3: H2WI("3.5mm RC: FORWARD Pressed"); key = KEY_NEXTSONG; break; default: H2WI("3.5mm RC: WRONG Button Pressed"); return; } headset_button_event(1, key); } else { /* key release */ if (atomic_read(&hi->btn_state)) headset_button_event(0, atomic_read(&hi->btn_state)); else H2WI("3.5mm RC: WRONG Button Release"); } if (hi->is_wake_lock_ready) wake_lock_timeout(&hi->headset_wake_lock, 1.5*HZ); }
void headset_ext_button(int headset_type, int key_code, int press) { HS_LOG("Headset %d, Key %d, Press %d", headset_type, key_code, press); headset_button_event(press, key_code); }