From 954033020494784e3b7776b4c3aab0019ab144ea Mon Sep 17 00:00:00 2001 From: Fenglin Wu Date: Fri, 14 Jan 2022 11:55:39 +0800 Subject: [PATCH 1/2] input: qcom-hv-haptics: update sequence to get status data As per the hardware recommendation, MOD_STATUS_XT need to be programmed before programming MOD_STATUS_SEL to get the correct status data in all cases. Update it. Change-Id: Ie66b12cdc702f32ebfad78a72396ad3ac4d14adf Signed-off-by: Fenglin Wu --- drivers/input/misc/qcom-hv-haptics.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/input/misc/qcom-hv-haptics.c b/drivers/input/misc/qcom-hv-haptics.c index a9626830d9ee..15720cb95c19 100644 --- a/drivers/input/misc/qcom-hv-haptics.c +++ b/drivers/input/misc/qcom-hv-haptics.c @@ -891,7 +891,12 @@ static int haptics_get_status_data(struct haptics_chip *chip, mod_sel_val[0] = sel & 0xff; mod_sel_val[1] = (sel >> 8) & 0xff; rc = haptics_write(chip, chip->cfg_addr_base, - HAP_CFG_MOD_STATUS_SEL_REG, mod_sel_val, 2); + HAP_CFG_MOD_STATUS_XT_V2_REG, &mod_sel_val[1], 1); + if (rc < 0) + return rc; + + rc = haptics_write(chip, chip->cfg_addr_base, + HAP_CFG_MOD_STATUS_SEL_REG, mod_sel_val, 1); if (rc < 0) return rc; From 810fcd9e1a5f8bfcde6e945a0c3fe69ce16d60bb Mon Sep 17 00:00:00 2001 From: Fenglin Wu Date: Mon, 17 Jan 2022 10:17:34 +0800 Subject: [PATCH 2/2] input: qcom-hv-haptics: set Vmax before toggling HAPTICS_EN in FIFO play Currently, HAPTICS_EN bit is toggled whenever a FIFO pattern is played followed by setting Vmax. However, this would issue a SWR_VMAX handshake and then follow a SPMI_VMAX handshake in HW if haptics effect is played over SWR bus in the background. This back to back Vmax handshake would potentially cause the HW not responding and no vibration being played. To address this, set the Vmax before toggling HAPTICS_EN bit to avoid back to back Vmax handshakes when SWR and FIFO are played concurrently. Change-Id: I0b8924ab7f369db446458fe2510a0da01519a978 Signed-off-by: Fenglin Wu --- drivers/input/misc/qcom-hv-haptics.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/drivers/input/misc/qcom-hv-haptics.c b/drivers/input/misc/qcom-hv-haptics.c index 15720cb95c19..19114337368a 100644 --- a/drivers/input/misc/qcom-hv-haptics.c +++ b/drivers/input/misc/qcom-hv-haptics.c @@ -2077,22 +2077,11 @@ static int haptics_load_predefined_effect(struct haptics_chip *chip, return -EINVAL; play->effect = effect; - if (play->pattern_src == FIFO) { - /* Toggle HAPTICS_EN for a clear start point of FIFO playing */ - rc = haptics_toggle_module_enable(chip); - if (rc < 0) - return rc; - } - /* Clamp VMAX for different vibration strength */ rc = haptics_set_vmax_mv(chip, play->vmax_mv); if (rc < 0) return rc; - rc = haptics_enable_autores(chip, !play->effect->auto_res_disable); - if (rc < 0) - return rc; - play->pattern_src = play->effect->src; if (play->pattern_src != PATTERN1 && play->pattern_src != PATTERN2 && @@ -2102,6 +2091,17 @@ static int haptics_load_predefined_effect(struct haptics_chip *chip, return -EINVAL; } + if (play->pattern_src == FIFO) { + /* Toggle HAPTICS_EN for a clear start point of FIFO playing */ + rc = haptics_toggle_module_enable(chip); + if (rc < 0) + return rc; + } + + rc = haptics_enable_autores(chip, !play->effect->auto_res_disable); + if (rc < 0) + return rc; + play->brake = play->effect->brake; /* Config brake settings if it's necessary */ if (play->brake) { @@ -2265,12 +2265,12 @@ static int haptics_load_custom_effect(struct haptics_chip *chip, play->effect = chip->custom_effect; play->brake = NULL; play->vmax_mv = (magnitude * chip->custom_effect->vmax_mv) / 0x7fff; - /* Toggle HAPTICS_EN for a clear start point of FIFO playing */ - rc = haptics_toggle_module_enable(chip); + rc = haptics_set_vmax_mv(chip, play->vmax_mv); if (rc < 0) goto cleanup; - rc = haptics_set_vmax_mv(chip, play->vmax_mv); + /* Toggle HAPTICS_EN for a clear start point of FIFO playing */ + rc = haptics_toggle_module_enable(chip); if (rc < 0) goto cleanup;