static int hp206c_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask) { int ret = 0; struct hp206c_data *data = iio_priv(indio_dev); if (mask != IIO_CHAN_INFO_OVERSAMPLING_RATIO) return -EINVAL; mutex_lock(&data->mutex); switch (chan->type) { case IIO_TEMP: data->temp_osr_index = find_closest_descending(val, hp206c_osr_rates, ARRAY_SIZE(hp206c_osr_rates)); break; case IIO_PRESSURE: data->pres_osr_index = find_closest_descending(val, hp206c_osr_rates, ARRAY_SIZE(hp206c_osr_rates)); break; default: ret = -EINVAL; } mutex_unlock(&data->mutex); return ret; }
static ssize_t interval_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { unsigned long val; int idx; int ret = count; struct stts751_priv *priv = dev_get_drvdata(dev); if (kstrtoul(buf, 10, &val) < 0) return -EINVAL; idx = find_closest_descending(val, stts751_intervals, ARRAY_SIZE(stts751_intervals)); dev_dbg(&priv->client->dev, "setting interval. req:%lu, idx: %d, val: %d", val, idx, stts751_intervals[idx]); mutex_lock(&priv->access_lock); if (priv->interval == idx) goto exit; /* * In early development stages I've become suspicious about the chip * starting to misbehave if I ever set, even briefly, an invalid * configuration. While I'm not sure this is really needed, be * conservative and set rate/resolution in such an order that avoids * passing through an invalid configuration. */ /* speed up: lower the resolution, then modify convrate */ if (priv->interval < idx) { dev_dbg(&priv->client->dev, "lower resolution, then modify convrate"); priv->interval = idx; ret = stts751_adjust_resolution(priv); if (ret) goto exit; } ret = i2c_smbus_write_byte_data(priv->client, STTS751_REG_RATE, idx); if (ret) goto exit; /* slow down: modify convrate, then raise resolution */ if (priv->interval != idx) { dev_dbg(&priv->client->dev, "modify convrate, then raise resolution"); priv->interval = idx; ret = stts751_adjust_resolution(priv); if (ret) goto exit; } ret = count; exit: mutex_unlock(&priv->access_lock); return ret; }