static void headset_timer_callback(unsigned long arg) { struct headset_priv *headset = (struct headset_priv *)(arg); struct rk_headset_pdata *pdata = headset->pdata; int level = 0; // printk("headset_timer_callback,headset->headset_status=%d\n",headset->headset_status); if(headset->headset_status == HEADSET_OUT) { printk("Headset is out\n"); goto out; } #ifdef CONFIG_SND_SOC_WM8994 if(wm8994_set_status() != 0) { // printk("wait wm8994 set the MICB2\n"); // headset_info->headset_timer.expires = jiffies + 500; headset_info->headset_timer.expires = jiffies + 10; add_timer(&headset_info->headset_timer); goto out; } #endif level = read_gpio(pdata->hook_gpio); if(level < 0) goto out; if((level > 0 && pdata->hook_down_type == HOOK_DOWN_LOW) || (level == 0 && pdata->hook_down_type == HOOK_DOWN_HIGH)) { headset->isMic = 1;//have mic DBG("enable headset_hook irq\n"); enable_irq(headset_info->irq[HOOK]); headset->isHook_irq = enable; headset_info->hook_status = HOOK_UP; if(pdata->hook_down_type == HOOK_DOWN_HIGH) irq_set_irq_type(headset_info->irq[HOOK],IRQF_TRIGGER_RISING); else irq_set_irq_type(headset_info->irq[HOOK],IRQF_TRIGGER_FALLING); } else headset->isMic= 0;//No microphone printk("headset->isMic = %d\n",headset->isMic); headset_info->cur_headset_status = headset_info->isMic ? 1:2;//BIT_HEADSET:BIT_HEADSET_NO_MIC;// #if defined(CONFIG_SND_RK_SOC_RK2928) || defined(CONFIG_SND_RK29_SOC_RK610) rk2928_codec_set_spk(HEADSET_IN); if(headset_info->cur_headset_status == 1) gpio_set_value(pdata->Sw_mic_gpio, pdata->Hp_mic_io_value); #endif // rk28_send_wakeup_key(); switch_set_state(&headset_info->sdev, headset_info->cur_headset_status); DBG("headset_info->cur_headset_status = %d\n",headset_info->cur_headset_status); out: return; }
static void Hp_mic_work(struct work_struct *work) { int level = 0; struct rk_headset_pdata *pdata = headset_info->pdata; printk("hp_mic_work---------\n"); mutex_lock(&headset_info->mutex_lock[MIC]); if(headset_info->headset_status == HEADSET_OUT) { printk("Headset is out\n"); goto out; } level = read_gpio(pdata->Hook_gpio); if(level < 0) goto out; if((level > 0 && pdata->Hook_down_type == HOOK_DOWN_LOW) || (level == 0 && pdata->Hook_down_type == HOOK_DOWN_HIGH)) { headset_info->isMic = 1;//have mic DBG("enable headset_hook irq\n"); enable_irq(headset_info->irq[HOOK]); headset_info->isHook_irq = enable; headset_info->hook_status = HOOK_UP; if(pdata->Hook_down_type == HOOK_DOWN_HIGH) irq_set_irq_type(headset_info->irq[HOOK],IRQF_TRIGGER_RISING); else irq_set_irq_type(headset_info->irq[HOOK],IRQF_TRIGGER_FALLING); Switch_Mic_Mode(HP_MIC); } else headset_info->isMic= 0;//No microphone printk("headset->isMic = %d\n",headset_info->isMic); headset_info->cur_headset_status = headset_info->isMic ? BIT_HEADSET:BIT_HEADSET_NO_MIC; #if defined(CONFIG_SND_RK_SOC_RK2928) rk2928_codec_set_spk(HEADSET_IN); #endif rk28_send_wakeup_key(); switch_set_state(&headset_info->sdev, headset_info->cur_headset_status); DBG("headset_info->cur_headset_status = %d\n",headset_info->cur_headset_status); out: mutex_unlock(&headset_info->mutex_lock[MIC]); return; }
static void headsetobserve_work(struct work_struct *work) { int level = 0; int level2 = 0; struct rk_headset_pdata *pdata = headset_info->pdata; static unsigned int old_status = 0; DBG("---headsetobserve_work---\n"); mutex_lock(&headset_info->mutex_lock[HEADSET]); level = read_gpio(pdata->headset_gpio); if(level < 0) goto out; msleep(100); level2 = read_gpio(pdata->headset_gpio); if(level2 < 0) goto out; if(level2 != level) goto out; old_status = headset_info->headset_status; if(pdata->headset_insert_type == HEADSET_IN_HIGH) headset_info->headset_status = level?HEADSET_IN:HEADSET_OUT; else headset_info->headset_status = level?HEADSET_OUT:HEADSET_IN; if(old_status == headset_info->headset_status) { DBG("old_status == headset_info->headset_status\n"); goto out; } DBG("(headset in is %s)headset status is %s\n", pdata->headset_insert_type?"high level":"low level", headset_info->headset_status?"in":"out"); if(headset_info->headset_status == HEADSET_IN) { headset_info->cur_headset_status = BIT_HEADSET_NO_MIC; if(pdata->headset_insert_type == HEADSET_IN_HIGH) irq_set_irq_type(headset_info->irq[HEADSET],IRQF_TRIGGER_FALLING); else irq_set_irq_type(headset_info->irq[HEADSET],IRQF_TRIGGER_RISING); if (pdata->hook_gpio) { del_timer(&headset_info->headset_timer);//Start the timer, wait for switch to the headphone channel headset_info->headset_timer.expires = jiffies + 100; add_timer(&headset_info->headset_timer); goto out; } } else if(headset_info->headset_status == HEADSET_OUT) { headset_info->hook_status = HOOK_UP; if(headset_info->isHook_irq == enable) { DBG("disable headset_hook irq\n"); headset_info->isHook_irq = disable; disable_irq(headset_info->irq[HOOK]); } headset_info->cur_headset_status = 0;//~(BIT_HEADSET|BIT_HEADSET_NO_MIC); //#if defined(CONFIG_SND_RK_SOC_RK2928) || defined(CONFIG_SOC_RK3028) //rk2928_codec_set_spk(HEADSET_OUT); //#endif if(pdata->headset_insert_type == HEADSET_IN_HIGH) irq_set_irq_type(headset_info->irq[HEADSET],IRQF_TRIGGER_RISING); else irq_set_irq_type(headset_info->irq[HEADSET],IRQF_TRIGGER_FALLING); } // rk28_send_wakeup_key(); switch_set_state(&headset_info->sdev, headset_info->cur_headset_status); #if defined(CONFIG_SND_RK_SOC_RK2928) || defined(CONFIG_SND_RK29_SOC_RK610) if (headset_info->headset_status == HEADSET_OUT) { mdelay(200); rk2928_codec_set_spk(HEADSET_OUT); gpio_set_value(pdata->Sw_mic_gpio, headset_info->pdata->Main_mic_io_value); } #endif DBG("headset_info->cur_headset_status = %d\n",headset_info->cur_headset_status); out: mutex_unlock(&headset_info->mutex_lock[HEADSET]); }