if (data->reset_gpiod) { /* If we have GPIO reset line, use it */
gpiod_set_value_cansleep(data->reset_gpiod, 1);
udelay(10);
gpiod_set_value_cansleep(data->reset_gpiod, 0);
} else { /* Otherwise use software reset */
ret = regmap_write(data->regmap, AF8133J_REG_SWR,
AF8133J_REG_SWR_PERFORM); if (ret) {
dev_err(dev, "Failed to reset the chip\n"); return ret;
}
}
/* Wait for reset to finish */
usleep_range(1000, 1100);
/* Restore range setting */ if (data->range == AF8133J_REG_RANGE_22G) {
ret = regmap_write(data->regmap, AF8133J_REG_RANGE, data->range); if (ret) return ret;
}
ret = regulator_bulk_enable(ARRAY_SIZE(data->supplies), data->supplies); if (ret) {
dev_err(dev, "Could not enable regulators\n"); return ret;
}
gpiod_set_value_cansleep(data->reset_gpiod, 0);
/* Wait for power on reset */
usleep_range(15000, 16000);
ret = af8133j_reset(data); if (ret) {
af8133j_power_down(data); return ret;
}
return 0;
}
staticint af8133j_take_measurement(struct af8133j_data *data)
{ unsignedint val; int ret;
ret = regmap_write(data->regmap,
AF8133J_REG_STATE, AF8133J_REG_STATE_WORK); if (ret) return ret;
/* The datasheet says "Mesaure Time <1.5ms" */
ret = regmap_read_poll_timeout(data->regmap, AF8133J_REG_STATUS, val,
val & AF8133J_REG_STATUS_ACQ,
500, 1500); if (ret) return ret;
ret = regmap_write(data->regmap,
AF8133J_REG_STATE, AF8133J_REG_STATE_STBY); if (ret) return ret;
ret = pm_runtime_resume_and_get(dev); if (ret) { /* * Ignore EACCES because that happens when RPM is disabled * during system sleep, while userspace leave eg. hrtimer * trigger attached and IIO core keeps trying to do measurements.
*/ if (ret != -EACCES)
dev_err(dev, "Failed to power on (%d)\n", ret); return ret;
}
scoped_guard(mutex, &data->mutex) {
ret = af8133j_take_measurement(data); if (ret) goto out_rpm_put;
ret = regmap_bulk_read(data->regmap, AF8133J_REG_OUT,
buf, sizeof(__le16) * 3);
}
staticint af8133j_set_scale(struct af8133j_data *data, unsignedint val, unsignedint val2)
{ struct device *dev = &data->client->dev;
u8 range; int ret = 0;
if (af8133j_scales[0][0] == val && af8133j_scales[0][1] == val2)
range = AF8133J_REG_RANGE_12G; elseif (af8133j_scales[1][0] == val && af8133j_scales[1][1] == val2)
range = AF8133J_REG_RANGE_22G; else return -EINVAL;
pm_runtime_disable(dev);
/* * When suspended, just store the new range to data->range to be * applied later during power up.
*/ if (!pm_runtime_status_suspended(dev)) {
scoped_guard(mutex, &data->mutex)
ret = regmap_write(data->regmap,
AF8133J_REG_RANGE, range);
}
pm_runtime_enable(dev);
data->range = range; return ret;
}
staticint af8133j_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask)
{ struct af8133j_data *data = iio_priv(indio_dev);
data->reset_gpiod = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH); if (IS_ERR(data->reset_gpiod)) return dev_err_probe(dev, PTR_ERR(data->reset_gpiod), "Failed to get reset gpio\n");
for (i = 0; i < ARRAY_SIZE(af8133j_supply_names); i++)
data->supplies[i].supply = af8133j_supply_names[i];
ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(data->supplies),
data->supplies); if (ret) return ret;
ret = iio_read_mount_matrix(dev, &data->orientation); if (ret) return dev_err_probe(dev, ret, "Failed to read mount matrix\n");
ret = af8133j_power_up(data); if (ret) return ret;
pm_runtime_set_active(dev);
ret = devm_add_action_or_reset(dev, af8133j_power_down_action, data); if (ret) return ret;
ret = af8133j_product_check(data); if (ret) return ret;
pm_runtime_get_noresume(dev);
pm_runtime_use_autosuspend(dev);
pm_runtime_set_autosuspend_delay(dev, 500);
ret = devm_pm_runtime_enable(dev); if (ret) return ret;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.