On Tue, Sep 13, 2022 at 12:27 AM Eddie James eajames@linux.ibm.com wrote:
The DPS310 chip has been observed to get "stuck" such that pressure and temperature measurements are never indicated as "ready" in the MEAS_CFG register. The only solution is to reset the device and try again. In order to avoid continual failures, use a boolean flag to only try the reset after timeout once if errors persist.
...
+static int dps310_ready_status(struct dps310_data *data, int ready_bit, int timeout) +{
int ready;
int sleep = DPS310_POLL_SLEEP_US(timeout);
Longer line first?
return regmap_read_poll_timeout(data->regmap, DPS310_MEAS_CFG, ready, ready & ready_bit,
sleep, timeout);
+}
...
+static int dps310_ready(struct dps310_data *data, int ready_bit, int timeout) +{
int rc;
rc = dps310_ready_status(data, ready_bit, timeout);
if (rc) {
if (rc == -ETIMEDOUT && !data->timeout_recovery_failed) {
int rc2;
/* Reset and reinitialize the chip. */
rc2 = dps310_reset_reinit(data);
if (rc2) {
With below in mind this might become
if (dps310_reset_init(...)) ... = true;
data->timeout_recovery_failed = true;
} else {
/* Try again to get sensor ready status. */
rc2 = dps310_ready_status(data, ready_bit, timeout);
if (rc2)
data->timeout_recovery_failed = true;
Shouldn't you re-use rc here again?
else
return 0;
}
}
return rc;
}