From a1bb4c1670f2d06cf8bad7cd4c8ea322e2f35c05 Mon Sep 17 00:00:00 2001 From: Fenglin Wu Date: Tue, 15 Feb 2022 19:14:11 +0800 Subject: [PATCH] input: qcom-hv-haptics: set play rate for PATx_MEM mode PATx_MEM mode has a different play rate setting with FIFO mode and all PATx_MEM sources share the same play rate. Set the play rate when configuring the mmap configuration for preload FIFO effect. Change-Id: I1c0dbf80977b864264e4580d476cf25b4202f757 Signed-off-by: Fenglin Wu --- drivers/input/misc/qcom-hv-haptics.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/drivers/input/misc/qcom-hv-haptics.c b/drivers/input/misc/qcom-hv-haptics.c index 08e7349cff83..834a02731dba 100644 --- a/drivers/input/misc/qcom-hv-haptics.c +++ b/drivers/input/misc/qcom-hv-haptics.c @@ -202,6 +202,7 @@ #define HAP_PTN_FIFO_DIN_NUM 4 #define HAP_PTN_FIFO_PLAY_RATE_REG 0x24 +#define PAT_MEM_PLAY_RATE_MASK GENMASK(7, 4) #define FIFO_PLAY_RATE_MASK GENMASK(3, 0) #define HAP_PTN_FIFO_EMPTY_CFG_REG 0x2A @@ -470,6 +471,7 @@ struct mmap_partition { struct haptics_mmap { struct mmap_partition fifo_mmap; struct mmap_partition pat_sel_mmap[PAT_MEM_MAX]; + enum s_period pat_play_rate; }; /** @@ -2599,6 +2601,15 @@ static int haptics_mmap_config(struct haptics_chip *chip) if (rc < 0) return rc; + /* config PATx_PLAY_RATE */ + rc = haptics_masked_write(chip, chip->ptn_addr_base, + HAP_PTN_FIFO_PLAY_RATE_REG, PAT_MEM_PLAY_RATE_MASK, + FIELD_PREP(PAT_MEM_PLAY_RATE_MASK, chip->mmap.pat_play_rate)); + if (rc < 0) { + dev_err(chip->dev, "Set pat_mem play rate failed, rc=%d\n", rc); + return rc; + } + dev_dbg(chip->dev, "haptics memory map configured with FIFO: %d, PAT1:%d, PAT2: %d, PAT3: %d, PAT4: %d\n", chip->mmap.fifo_mmap.length, chip->mmap.pat_sel_mmap[PAT1_MEM].length, @@ -2619,6 +2630,13 @@ static int haptics_mmap_preload_fifo_effect(struct haptics_chip *chip, return -EINVAL; } + if (chip->mmap.pat_play_rate == F_RESERVED) { + chip->mmap.pat_play_rate = effect->fifo->period_per_s; + } else if (chip->mmap.pat_play_rate != effect->fifo->period_per_s) { + dev_warn(chip->dev, "PATx_MEM sources only support one play rate\n"); + goto mmap_failed; + } + length = effect->fifo->num_s; if (length % MMAP_PAT_LEN_PER_LSB) length = (length / MMAP_PAT_LEN_PER_LSB + 1) * MMAP_PAT_LEN_PER_LSB; @@ -2675,6 +2693,7 @@ static void haptics_mmap_init(struct haptics_chip *chip) (u32)MMAP_PAT3_PAT4_LEN_MASK * MMAP_PAT_LEN_PER_LSB); chip->mmap.pat_sel_mmap[PAT4_MEM].max_size = min(max_pat_mem_size, (u32)MMAP_PAT3_PAT4_LEN_MASK * MMAP_PAT_LEN_PER_LSB); + chip->mmap.pat_play_rate = F_RESERVED; } static int haptics_init_fifo_memory(struct haptics_chip *chip)