Loading drivers/iio/adc/qcom-tadc.c +42 −7 Original line number Diff line number Diff line Loading @@ -228,6 +228,7 @@ struct tadc_chip { struct votable *tadc_disable_votable; struct work_struct status_change_work; struct notifier_block nb; u8 hwtrig_conv; }; struct tadc_pt { Loading Loading @@ -356,6 +357,26 @@ unlock: return rc; } static int tadc_masked_write(struct tadc_chip *chip, u16 reg, u8 mask, u8 data) { int rc = 0; mutex_lock(&chip->write_lock); if (tadc_is_reg_locked(chip, reg)) { rc = regmap_write(chip->regmap, (reg & 0xFF00) | 0xD0, 0xA5); if (rc < 0) { pr_err("Couldn't unlock secure register rc=%d\n", rc); goto unlock; } } rc = regmap_update_bits(chip->regmap, reg, mask, data); unlock: mutex_unlock(&chip->write_lock); return rc; } static int tadc_lerp(const struct tadc_pt *pts, size_t size, bool inv, s32 input, s32 *output) { Loading Loading @@ -880,6 +901,12 @@ static int tadc_disable_vote_callback(struct votable *votable, if (timeleft == 0) pr_err("Timed out waiting for eoc, disabling hw conversions regardless\n"); rc = tadc_read(chip, TADC_HWTRIG_CONV_CH_EN_REG(chip), &chip->hwtrig_conv, 1); if (rc < 0) { pr_err("Couldn't save hw conversions rc=%d\n", rc); return rc; } rc = tadc_write(chip, TADC_HWTRIG_CONV_CH_EN_REG(chip), 0x00); if (rc < 0) { pr_err("Couldn't disable hw conversions rc=%d\n", rc); Loading @@ -896,9 +923,10 @@ static int tadc_disable_vote_callback(struct votable *votable, pr_err("Couldn't disable direct test mode rc=%d\n", rc); return rc; } rc = tadc_write(chip, TADC_HWTRIG_CONV_CH_EN_REG(chip), 0x07); rc = tadc_write(chip, TADC_HWTRIG_CONV_CH_EN_REG(chip), chip->hwtrig_conv); if (rc < 0) { pr_err("Couldn't enable hw conversions rc=%d\n", rc); pr_err("Couldn't restore hw conversions rc=%d\n", rc); return rc; } } Loading Loading @@ -1126,16 +1154,23 @@ static int tadc_init_hw(struct tadc_chip *chip) return rc; } /* enable all temperature hardware triggers */ rc = tadc_write(chip, TADC_HWTRIG_CONV_CH_EN_REG(chip), BIT(TADC_THERM1) | BIT(TADC_THERM2) | BIT(TADC_DIE_TEMP)); /* enable connector and die temp hardware triggers */ rc = tadc_masked_write(chip, TADC_HWTRIG_CONV_CH_EN_REG(chip), BIT(TADC_THERM2) | BIT(TADC_DIE_TEMP), BIT(TADC_THERM2) | BIT(TADC_DIE_TEMP)); if (rc < 0) { pr_err("Couldn't enable hardware triggers rc=%d\n", rc); return rc; } /* save hw triggered conversion configuration */ rc = tadc_read(chip, TADC_HWTRIG_CONV_CH_EN_REG(chip), &chip->hwtrig_conv, 1); if (rc < 0) { pr_err("Couldn't save hw conversions rc=%d\n", rc); return rc; } return 0; } Loading Loading
drivers/iio/adc/qcom-tadc.c +42 −7 Original line number Diff line number Diff line Loading @@ -228,6 +228,7 @@ struct tadc_chip { struct votable *tadc_disable_votable; struct work_struct status_change_work; struct notifier_block nb; u8 hwtrig_conv; }; struct tadc_pt { Loading Loading @@ -356,6 +357,26 @@ unlock: return rc; } static int tadc_masked_write(struct tadc_chip *chip, u16 reg, u8 mask, u8 data) { int rc = 0; mutex_lock(&chip->write_lock); if (tadc_is_reg_locked(chip, reg)) { rc = regmap_write(chip->regmap, (reg & 0xFF00) | 0xD0, 0xA5); if (rc < 0) { pr_err("Couldn't unlock secure register rc=%d\n", rc); goto unlock; } } rc = regmap_update_bits(chip->regmap, reg, mask, data); unlock: mutex_unlock(&chip->write_lock); return rc; } static int tadc_lerp(const struct tadc_pt *pts, size_t size, bool inv, s32 input, s32 *output) { Loading Loading @@ -880,6 +901,12 @@ static int tadc_disable_vote_callback(struct votable *votable, if (timeleft == 0) pr_err("Timed out waiting for eoc, disabling hw conversions regardless\n"); rc = tadc_read(chip, TADC_HWTRIG_CONV_CH_EN_REG(chip), &chip->hwtrig_conv, 1); if (rc < 0) { pr_err("Couldn't save hw conversions rc=%d\n", rc); return rc; } rc = tadc_write(chip, TADC_HWTRIG_CONV_CH_EN_REG(chip), 0x00); if (rc < 0) { pr_err("Couldn't disable hw conversions rc=%d\n", rc); Loading @@ -896,9 +923,10 @@ static int tadc_disable_vote_callback(struct votable *votable, pr_err("Couldn't disable direct test mode rc=%d\n", rc); return rc; } rc = tadc_write(chip, TADC_HWTRIG_CONV_CH_EN_REG(chip), 0x07); rc = tadc_write(chip, TADC_HWTRIG_CONV_CH_EN_REG(chip), chip->hwtrig_conv); if (rc < 0) { pr_err("Couldn't enable hw conversions rc=%d\n", rc); pr_err("Couldn't restore hw conversions rc=%d\n", rc); return rc; } } Loading Loading @@ -1126,16 +1154,23 @@ static int tadc_init_hw(struct tadc_chip *chip) return rc; } /* enable all temperature hardware triggers */ rc = tadc_write(chip, TADC_HWTRIG_CONV_CH_EN_REG(chip), BIT(TADC_THERM1) | BIT(TADC_THERM2) | BIT(TADC_DIE_TEMP)); /* enable connector and die temp hardware triggers */ rc = tadc_masked_write(chip, TADC_HWTRIG_CONV_CH_EN_REG(chip), BIT(TADC_THERM2) | BIT(TADC_DIE_TEMP), BIT(TADC_THERM2) | BIT(TADC_DIE_TEMP)); if (rc < 0) { pr_err("Couldn't enable hardware triggers rc=%d\n", rc); return rc; } /* save hw triggered conversion configuration */ rc = tadc_read(chip, TADC_HWTRIG_CONV_CH_EN_REG(chip), &chip->hwtrig_conv, 1); if (rc < 0) { pr_err("Couldn't save hw conversions rc=%d\n", rc); return rc; } return 0; } Loading