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);
}
Beispiel #5
0
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);
}