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;
}