static int rt5501_headset_detect(int on) { if(!rt5501Connect) return 0; if(on) { pr_info("%s: headset in ++\n",__func__); cancel_delayed_work_sync(&rt5501_query.hs_imp_detec_work); mutex_lock(&rt5501_query.gpiolock); mutex_lock(&rt5501_query.mlock); rt5501_query.hs_qstatus = RT5501_QUERY_HEADSET; rt5501_query.headsetom = HEADSET_OM_UNDER_DETECT; if(rt5501_query.rt5501_status == RT5501_PLAYBACK) { if(high_imp) { rt5501_write_reg(1,0x7); rt5501_write_reg(0xb1,0x81); } else { rt5501_write_reg(1,0xc7); } last_spkamp_state = 0; pr_info("%s: OFF\n", __func__); rt5501_query.rt5501_status = RT5501_SUSPEND; } pr_info("%s: headset in --\n",__func__); mutex_unlock(&rt5501_query.mlock); mutex_unlock(&rt5501_query.gpiolock); queue_delayed_work(hs_wq,&rt5501_query.hs_imp_detec_work,msecs_to_jiffies(5)); pr_info("%s: headset in --2\n",__func__); } else { pr_info("%s: headset remove ++\n",__func__); cancel_delayed_work_sync(&rt5501_query.hs_imp_detec_work); flush_work_sync(&rt5501_query.volume_ramp_work.work); mutex_lock(&rt5501_query.gpiolock); mutex_lock(&rt5501_query.mlock); rt5501_query.hs_qstatus = RT5501_QUERY_OFF; rt5501_query.headsetom = HEADSET_OM_UNDER_DETECT; if(rt5501_query.regstatus == REG_AUTO_MODE) { set_rt5501_regulator(REG_PWM_MODE); rt5501_query.regstatus = REG_PWM_MODE; } if(rt5501_query.rt5501_status == RT5501_PLAYBACK) { if(high_imp) { rt5501_write_reg(1,0x7); rt5501_write_reg(0xb1,0x81); } else { rt5501_write_reg(1,0xc7); } last_spkamp_state = 0; pr_info("%s: OFF\n", __func__); rt5501_query.rt5501_status = RT5501_SUSPEND; } rt5501_query.curmode = RT5501_MODE_OFF; pr_info("%s: headset remove --1\n",__func__); mutex_unlock(&rt5501_query.mlock); mutex_unlock(&rt5501_query.gpiolock); pr_info("%s: headset remove --2\n",__func__); } return 0; }
static int rt5501_headset_detect(int on) { if(on) { pr_info("%s: headset in ++\n",__func__); mutex_lock(&rt5501_query.mlock); if(rt5501_query.headsetom == HEADSET_OM_UNDER_DETECT || \ time_after64(get_jiffies_64(),last_hp_remove + msecs_to_jiffies(500))) { rt5501_query.hs_qstatus = RT5501_QUERY_HEADSET; rt5501_query.headsetom = HEADSET_OM_UNDER_DETECT; } else { rt5501_query.hs_qstatus = RT5501_QUERY_FINISH; } mutex_unlock(&rt5501_query.mlock); cancel_delayed_work_sync(&rt5501_query.hs_imp_detec_work); mutex_lock(&rt5501_query.gpiolock); mutex_lock(&rt5501_query.mlock); if(rt5501_query.rt5501_status == RT5501_PLAYBACK) { if(high_imp) { rt5501_write_reg(1,0x7); rt5501_write_reg(0xb1,0x81); } else { rt5501_write_reg(1,0xc7); } last_spkamp_state = 0; pr_info("%s: OFF\n", __func__); rt5501_query.rt5501_status = RT5501_SUSPEND; } pr_info("%s: headset in --\n",__func__); mutex_unlock(&rt5501_query.mlock); mutex_unlock(&rt5501_query.gpiolock); queue_delayed_work(hs_wq,&rt5501_query.hs_imp_detec_work,msecs_to_jiffies(5)); pr_info("%s: headset in --2\n",__func__); } else { pr_info("%s: headset remove ++\n",__func__); flush_work_sync(&rt5501_query.volume_ramp_work.work); mutex_lock(&rt5501_query.mlock); rt5501_query.hs_qstatus = RT5501_QUERY_OFF; mutex_unlock(&rt5501_query.mlock); cancel_delayed_work_sync(&rt5501_query.hs_imp_detec_work); mutex_lock(&rt5501_query.gpiolock); mutex_lock(&rt5501_query.mlock); if(rt5501_query.rt5501_status == RT5501_PLAYBACK) { if(high_imp) { rt5501_write_reg(1,0x7); rt5501_write_reg(0xb1,0x81); } else { rt5501_write_reg(1,0xc7); } last_spkamp_state = 0; pr_info("%s: OFF\n", __func__); rt5501_query.rt5501_status = RT5501_SUSPEND; } rt5501_query.curmode = RT5501_MODE_OFF; pr_info("%s: headset remove --1\n",__func__); if(high_imp) { int closegpio = 0; if((rt5501_query.gpiostatus == AMP_GPIO_OFF) && pdata->gpio_rt5501_spk_en) { if(rt5501_query.s4status == AMP_S4_AUTO) { pm8921_aud_set_s4_pwm(); rt5501_query.s4status = AMP_S4_PWM; msleep(1); } pr_info("%s: enable gpio %d\n",__func__,pdata->gpio_rt5501_spk_en); gpio_direction_output(pdata->gpio_rt5501_spk_en, 1); rt5501_query.gpiostatus = AMP_GPIO_ON; closegpio = 1; msleep(1); } pr_info("%s: reset rt5501\n",__func__); rt5501_write_reg(0x0,0x4); mdelay(1); rt5501_write_reg(0x1,0xc7); high_imp = 0; if(closegpio && (rt5501_query.gpiostatus == AMP_GPIO_ON) && pdata->gpio_rt5501_spk_en) { pr_info("%s: disable gpio %d\n",__func__,pdata->gpio_rt5501_spk_en); gpio_direction_output(pdata->gpio_rt5501_spk_en, 0); rt5501_query.gpiostatus = AMP_GPIO_OFF; if(rt5501_query.s4status == AMP_S4_PWM) { pm8921_aud_set_s4_auto(); rt5501_query.s4status = AMP_S4_AUTO; } } } last_hp_remove = get_jiffies_64(); mutex_unlock(&rt5501_query.mlock); mutex_unlock(&rt5501_query.gpiolock); pr_info("%s: headset remove --2\n",__func__); } return 0; }