From 6c1fe6cb4fa4af6bec804675c040c52a023765df Mon Sep 17 00:00:00 2001 From: Fenglin Wu Date: Wed, 24 Jun 2020 11:10:28 +0800 Subject: [PATCH 1/2] input: qcom-hv-haptics: Update sequence of reading STATUS_DATA Per HW recommendation, when reading HAP_CFG_STATUS_DATA registers, MOD_STATUS_XT.SEL need to be written first to select the right mux, then update MOD_STATUS_SEL register so haptics module can present the desired status values into STATUS_DATA registers. Change-Id: I24205072074ff75b25b42c752333b5f99d83d067 Signed-off-by: Fenglin Wu --- drivers/input/misc/qcom-hv-haptics.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/drivers/input/misc/qcom-hv-haptics.c b/drivers/input/misc/qcom-hv-haptics.c index a3ac8bda69eb..cd5ce79c3a15 100644 --- a/drivers/input/misc/qcom-hv-haptics.c +++ b/drivers/input/misc/qcom-hv-haptics.c @@ -768,10 +768,15 @@ static int haptics_get_closeloop_lra_period_v2( u8 val[2]; u32 tmp; - val[0] = MOD_STATUS_SEL_LAST_GOOD_TLRA_VAL; - val[1] = MOD_STATUS_XT_SEL_LAST_GOOD_TLRA_VAL; + val[0] = MOD_STATUS_XT_SEL_LAST_GOOD_TLRA_VAL; rc = haptics_write(chip, chip->cfg_addr_base, - HAP_CFG_MOD_STATUS_SEL_REG, val, 2); + HAP_CFG_MOD_STATUS_XT_V2_REG, val, 1); + if (rc < 0) + return rc; + + val[0] = MOD_STATUS_SEL_LAST_GOOD_TLRA_VAL; + rc = haptics_write(chip, chip->cfg_addr_base, + HAP_CFG_MOD_STATUS_SEL_REG, val, 1); if (rc < 0) return rc; @@ -1075,8 +1080,8 @@ static int haptics_get_available_fifo_memory(struct haptics_chip *chip) u8 val[2]; u32 fill, available; - val[0] = MOD_STATUS_SEL_FIFO_FILL_STATUS_VAL; if (chip->ptn_revision == HAP_PTN_V1) { + val[0] = MOD_STATUS_SEL_FIFO_FILL_STATUS_VAL; rc = haptics_write(chip, chip->cfg_addr_base, HAP_CFG_MOD_STATUS_SEL_REG, val, 1); if (rc < 0) @@ -1089,9 +1094,15 @@ static int haptics_get_available_fifo_memory(struct haptics_chip *chip) fill = val[0] & FIFO_REAL_TIME_FILL_STATUS_MASK_V1; } else { - val[1] = MOD_STATUS_XT_V2_FIFO_FILL_STATUS_VAL; + val[0] = MOD_STATUS_XT_V2_FIFO_FILL_STATUS_VAL; rc = haptics_write(chip, chip->cfg_addr_base, - HAP_CFG_MOD_STATUS_SEL_REG, val, 2); + HAP_CFG_MOD_STATUS_XT_V2_REG, val, 1); + if (rc < 0) + return rc; + + val[0] = MOD_STATUS_SEL_FIFO_FILL_STATUS_VAL; + rc = haptics_write(chip, chip->cfg_addr_base, + HAP_CFG_MOD_STATUS_SEL_REG, val, 1); if (rc < 0) return rc; From 1625d8d142ce38b97fd4e9d072effa29281770fb Mon Sep 17 00:00:00 2001 From: Fenglin Wu Date: Wed, 24 Jun 2020 11:20:01 +0800 Subject: [PATCH 2/2] input: qcom-hv-haptics: set effect to NULL in constant playing In constant waveform playing, there is no need to use an effect data structure to capture the current playing effect, hence set it to NULL. This also helps the set_gain() callback to use the correct Vmax when it's called in constant playing case. Also add a debug message to show the Vmax setting. Change-Id: I763ec7407b8696300dbe93f5e6935900544e75a8 Signed-off-by: Fenglin Wu --- drivers/input/misc/qcom-hv-haptics.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/input/misc/qcom-hv-haptics.c b/drivers/input/misc/qcom-hv-haptics.c index cd5ce79c3a15..5239f81641b5 100644 --- a/drivers/input/misc/qcom-hv-haptics.c +++ b/drivers/input/misc/qcom-hv-haptics.c @@ -840,6 +840,8 @@ static int haptics_set_vmax_mv(struct haptics_chip *chip, u32 vmax_mv) HAP_CFG_VMAX_REG, &val, 1); if (rc < 0) dev_err(chip->dev, "config VMAX failed, rc=%d\n", rc); + else + dev_dbg(chip->dev, "Set Vmax to %u mV\n", vmax_mv); return rc; } @@ -1313,6 +1315,9 @@ static int haptics_load_constant_effect(struct haptics_chip *chip, u8 amplitude) goto unlock; } + /* No effect data when playing constant waveform */ + play->effect = NULL; + /* configure VMAX in case it was changed in previous effect playing */ rc = haptics_set_vmax_mv(chip, chip->config.vmax_mv); if (rc < 0)