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

This commit is contained in:
Linux Build Service Account 2018-01-26 05:40:03 -08:00 committed by Gerrit - the friendly Code Review server
commit db3f5f103e

View file

@ -1,4 +1,4 @@
/* 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 * 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 * 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, struct qpnp_hap *hap = container_of(dev, struct qpnp_hap,
timed_dev); timed_dev);
bool state = !!time_ms;
ktime_t rem;
int rc; int rc;
if (time_ms < 0) if (time_ms < 0)
@ -2238,38 +2240,49 @@ static void qpnp_hap_td_enable(struct timed_output_dev *dev, int time_ms)
mutex_lock(&hap->lock); mutex_lock(&hap->lock);
if (time_ms == 0) { if (hap->state == state) {
/* disable haptics */ if (state) {
hrtimer_cancel(&hap->hap_timer); rem = hrtimer_get_remaining(&hap->hap_timer);
hap->state = 0; if (time_ms > ktime_to_ms(rem)) {
schedule_work(&hap->work); time_ms = (time_ms > hap->timeout_ms ?
hap->timeout_ms : time_ms);
hrtimer_cancel(&hap->hap_timer);
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); mutex_unlock(&hap->lock);
return; return;
} }
if (time_ms < 10) hap->state = state;
time_ms = 10; if (!hap->state) {
hrtimer_cancel(&hap->hap_timer);
} else {
if (time_ms < 10)
time_ms = 10;
if (is_sw_lra_auto_resonance_control(hap)) if (hap->auto_mode) {
hrtimer_cancel(&hap->auto_res_err_poll_timer); rc = qpnp_hap_auto_mode_config(hap, time_ms);
if (rc < 0) {
hrtimer_cancel(&hap->hap_timer); pr_err("Unable to do auto mode config\n");
mutex_unlock(&hap->lock);
if (hap->auto_mode) { return;
rc = qpnp_hap_auto_mode_config(hap, time_ms); }
if (rc < 0) {
pr_err("Unable to do auto mode config\n");
mutex_unlock(&hap->lock);
return;
} }
time_ms = (time_ms > hap->timeout_ms ?
hap->timeout_ms : time_ms);
hap->play_time_ms = time_ms;
hrtimer_start(&hap->hap_timer,
ktime_set(time_ms / 1000,
(time_ms % 1000) * 1000000),
HRTIMER_MODE_REL);
} }
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),
HRTIMER_MODE_REL);
mutex_unlock(&hap->lock); mutex_unlock(&hap->lock);
schedule_work(&hap->work); schedule_work(&hap->work);
} }