Merge "qcom: qpnp-haptics: extend stop timer for a longer request"
This commit is contained in:
commit
db3f5f103e
1 changed files with 38 additions and 25 deletions
|
@ -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,23 +2240,31 @@ 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) {
|
||||||
|
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);
|
hrtimer_cancel(&hap->hap_timer);
|
||||||
hap->state = 0;
|
hap->play_time_ms = time_ms;
|
||||||
schedule_work(&hap->work);
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hap->state = state;
|
||||||
|
if (!hap->state) {
|
||||||
|
hrtimer_cancel(&hap->hap_timer);
|
||||||
|
} else {
|
||||||
if (time_ms < 10)
|
if (time_ms < 10)
|
||||||
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) {
|
if (hap->auto_mode) {
|
||||||
rc = qpnp_hap_auto_mode_config(hap, time_ms);
|
rc = qpnp_hap_auto_mode_config(hap, time_ms);
|
||||||
if (rc < 0) {
|
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->play_time_ms = time_ms;
|
||||||
hap->state = 1;
|
|
||||||
hrtimer_start(&hap->hap_timer,
|
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);
|
HRTIMER_MODE_REL);
|
||||||
|
}
|
||||||
|
|
||||||
mutex_unlock(&hap->lock);
|
mutex_unlock(&hap->lock);
|
||||||
schedule_work(&hap->work);
|
schedule_work(&hap->work);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue