Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit db3f5f10 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "qcom: qpnp-haptics: extend stop timer for a longer request"

parents f75d803a 453824b9
Loading
Loading
Loading
Loading
+38 −25
Original line number Diff line number Diff line
/* Copyright (c) 2014-2015, 2017, The Linux Foundation. All rights reserved.
/* Copyright (c) 2014-2018, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -2231,6 +2231,8 @@ static void qpnp_hap_td_enable(struct timed_output_dev *dev, int time_ms)
{
	struct qpnp_hap *hap = container_of(dev, struct qpnp_hap,
					 timed_dev);
	bool state = !!time_ms;
	ktime_t rem;
	int rc;

	if (time_ms < 0)
@@ -2238,23 +2240,31 @@ static void qpnp_hap_td_enable(struct timed_output_dev *dev, int time_ms)

	mutex_lock(&hap->lock);

	if (time_ms == 0) {
		/* disable haptics */
	if (hap->state == state) {
		if (state) {
			rem = hrtimer_get_remaining(&hap->hap_timer);
			if (time_ms > ktime_to_ms(rem)) {
				time_ms = (time_ms > hap->timeout_ms ?
						 hap->timeout_ms : time_ms);
				hrtimer_cancel(&hap->hap_timer);
		hap->state = 0;
		schedule_work(&hap->work);
				hap->play_time_ms = time_ms;
				hrtimer_start(&hap->hap_timer,
						ktime_set(time_ms / 1000,
						(time_ms % 1000) * 1000000),
						HRTIMER_MODE_REL);
			}
		}
		mutex_unlock(&hap->lock);
		return;
	}

	hap->state = state;
	if (!hap->state) {
		hrtimer_cancel(&hap->hap_timer);
	} else {
		if (time_ms < 10)
			time_ms = 10;

	if (is_sw_lra_auto_resonance_control(hap))
		hrtimer_cancel(&hap->auto_res_err_poll_timer);

	hrtimer_cancel(&hap->hap_timer);

		if (hap->auto_mode) {
			rc = qpnp_hap_auto_mode_config(hap, time_ms);
			if (rc < 0) {
@@ -2264,12 +2274,15 @@ static void qpnp_hap_td_enable(struct timed_output_dev *dev, int time_ms)
			}
		}

	time_ms = (time_ms > hap->timeout_ms ? hap->timeout_ms : time_ms);
		time_ms = (time_ms > hap->timeout_ms ?
				 hap->timeout_ms : time_ms);
		hap->play_time_ms = time_ms;
	hap->state = 1;
		hrtimer_start(&hap->hap_timer,
		ktime_set(time_ms / 1000, (time_ms % 1000) * 1000000),
				ktime_set(time_ms / 1000,
				(time_ms % 1000) * 1000000),
				HRTIMER_MODE_REL);
	}

	mutex_unlock(&hap->lock);
	schedule_work(&hap->work);
}