Merge "input: qcom-hv-haptics: update drive waveform data format"

This commit is contained in:
qctecmdr 2020-06-09 14:25:01 -07:00 • committed by Gerrit - the friendly Code Review server
commit f6564e6eb6

View file

@ -54,9 +54,11 @@
#define HAP_CFG_VMAX_REG 0x48
#define VMAX_STEP_MV 50
#define MAX_VMAX_MV 11000
#define CLAMPED_VMAX_MV 5000
#define DEFAULT_VMAX_MV 5000
#define HAP_CFG_DRV_WF_SEL_REG 0x49
#define DRV_WF_FMT_BIT BIT(4)
#define DRV_WF_SEL_MASK GENMASK(1, 0)
#define HAP_CFG_AUTO_SHUTDOWN_CFG_REG 0x4A
@ -202,6 +204,16 @@
#define HAP_PTN_BRAKE_AMP_REG 0x70
/* register in HBOOST module */
#define HAP_BOOST_REVISION1 0x00
#define HAP_BOOST_REVISION2 0x01
#define HAP_BOOST_V0P0 0x0000
#define HAP_BOOST_V0P1 0x0001
#define HAP_BOOST_V0P0_CLAMP_REG 0xF1
#define HAP_BOOST_V0P1_CLAMP_REG 0x70
#define CLAMP_5V_BIT BIT(0)
/* constant parameters */
#define SAMPLES_PER_PATTERN 8
#define BRAKE_SAMPLE_COUNT 8
@ -221,6 +233,9 @@
((chip)->ptn_revision == HAP_PTN_V1 ? 48 : 280)
#define is_between(val, min, max) \
(((min) <= (max)) && ((min) <= (val)) && ((val) <= (max)))
#define HAP_BOOST_CLAMP_5V_REG_OFFSET(chip) \
((chip)->hbst_revision == HAP_BOOST_V0P0 ? \
HAP_BOOST_V0P0_CLAMP_REG : HAP_BOOST_V0P1_CLAMP_REG)
enum drv_sig_shape {
WF_SQUARE,
@ -417,9 +432,12 @@ struct haptics_chip {
u32 effects_count;
u32 cfg_addr_base;
u32 ptn_addr_base;
u32 hbst_addr_base;
u8 ptn_revision;
u16 hbst_revision;
bool fifo_empty_irq_en;
bool swr_slave_enabled;
bool clamp_at_5v;
};
static int haptics_read(struct haptics_chip *chip,
@ -806,6 +824,9 @@ static int haptics_set_vmax_mv(struct haptics_chip *chip, u32 vmax_mv)
return -EINVAL;
}
if (chip->clamp_at_5v && (vmax_mv > CLAMPED_VMAX_MV))
vmax_mv = CLAMPED_VMAX_MV;
val = vmax_mv / VMAX_STEP_MV;
rc = haptics_write(chip, chip->cfg_addr_base,
HAP_CFG_VMAX_REG, &val, 1);
@ -1740,8 +1761,8 @@ static int haptics_erase(struct input_dev *dev, int effect_id)
static void haptics_set_gain(struct input_dev *dev, u16 gain)
{
struct haptics_chip *chip = input_get_drvdata(dev);
struct haptics_hw_config *config = &chip->config;
struct haptics_play_info *play = &chip->play;
u32 vmax_mv;
if (gain == 0)
return;
@ -1749,7 +1770,11 @@ static void haptics_set_gain(struct input_dev *dev, u16 gain)
if (gain > 0x7fff)
gain = 0x7fff;
play->vmax_mv = ((u32)(gain * config->vmax_mv)) / 0x7fff;
vmax_mv = play->effect->vmax_mv;
if (chip->clamp_at_5v && (vmax_mv > CLAMPED_VMAX_MV))
vmax_mv = CLAMPED_VMAX_MV;
play->vmax_mv = ((u32)(gain * vmax_mv)) / 0x7fff;
haptics_set_vmax_mv(chip, play->vmax_mv);
}
@ -1803,13 +1828,25 @@ static int haptics_hw_init(struct haptics_chip *chip)
struct haptics_hw_config *config = &chip->config;
struct haptics_effect *effect;
int rc = 0, i;
u8 val;
u8 val[2];
/* Store CL brake settings */
rc = haptics_store_cl_brake_settings(chip);
if (rc < 0)
return rc;
rc = haptics_read(chip, chip->hbst_addr_base,
HAP_BOOST_REVISION1, val, 2);
if (rc < 0)
return rc;
chip->hbst_revision = (val[1] << 8) | val[0];
rc = haptics_read(chip, chip->hbst_addr_base,
HAP_BOOST_CLAMP_5V_REG_OFFSET(chip), val, 1);
if (rc < 0)
return rc;
chip->clamp_at_5v = val[0] & CLAMP_5V_BIT;
/* Config VMAX */
rc = haptics_set_vmax_mv(chip, config->vmax_mv);
if (rc < 0)
@ -1823,13 +1860,13 @@ static int haptics_hw_init(struct haptics_chip *chip)
return rc;
/* Config brake mode and waveform shape */
val = (config->brake.mode << BRAKE_MODE_SHIFT)
val[0] = (config->brake.mode << BRAKE_MODE_SHIFT)
| config->brake.sine_gain << BRAKE_SINE_GAIN_SHIFT
| config->brake.brake_wf;
rc = haptics_masked_write(chip, chip->cfg_addr_base,
HAP_CFG_BRAKE_MODE_CFG_REG,
BRAKE_MODE_MASK | BRAKE_SINE_GAIN_MASK
| BRAKE_WF_SEL_MASK, val);
| BRAKE_WF_SEL_MASK, val[0]);
if (rc < 0)
return rc;
@ -1845,6 +1882,12 @@ static int haptics_hw_init(struct haptics_chip *chip)
if (rc < 0)
return rc;
/* Config to use 2's complement values for sample data */
rc = haptics_masked_write(chip, chip->cfg_addr_base,
HAP_CFG_DRV_WF_SEL_REG, DRV_WF_FMT_BIT, 0);
if (rc < 0)
return rc;
/* preload effect */
if (config->preload_effect != -EINVAL) {
for (i = 0; i < chip->effects_count; i++)
@ -2972,20 +3015,25 @@ static int haptics_parse_dt(struct haptics_chip *chip)
addr = of_get_address(node, 0, NULL, NULL);
if (!addr) {
dev_err(chip->dev, "Read HAPTICS_CFG address failed, rc = %d\n",
rc);
return rc;
dev_err(chip->dev, "Read HAPTICS_CFG address failed\n");
return -EINVAL;
}
chip->cfg_addr_base = be32_to_cpu(*addr);
addr = of_get_address(node, 1, NULL, NULL);
if (!addr) {
dev_err(chip->dev, "Read HAPTICS_PATTERN address failed, rc = %d\n",
rc);
return rc;
dev_err(chip->dev, "Read HAPTICS_PATTERN address failed\n");
return -EINVAL;
}
chip->ptn_addr_base = be32_to_cpu(*addr);
addr = of_get_address(node, 2, NULL, NULL);
if (!addr) {
dev_err(chip->dev, "Read HAPTICS_HBOOST address failed\n");
return -EINVAL;
}
chip->hbst_addr_base = be32_to_cpu(*addr);
rc = haptics_get_revision(chip);
if (rc < 0) {
dev_err(chip->dev, "Get revision failed, rc=%d\n", rc);