/* AD7091R_REG_CHANNEL specified which channels to be converted */
ret = regmap_write(st->map, AD7091R_REG_CHANNEL,
BIT(channel) | (BIT(channel) << 8)); if (ret) return ret;
/* * There is a latency of one conversion before the channel conversion * sequence is updated
*/ return regmap_read(st->map, AD7091R_REG_RESULT, &dummy);
}
ret = ad7091r_set_channel(st, channel); if (ret) return ret;
ret = regmap_read(st->map, AD7091R_REG_RESULT, &val); if (ret) return ret;
if (st->chip_info->reg_result_chan_id(val) != channel) return -EIO;
*read_val = AD7091R_REG_RESULT_CONV_RESULT(val);
return 0;
}
staticint ad7091r_read_raw(struct iio_dev *iio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long m)
{ struct ad7091r_state *st = iio_priv(iio_dev); unsignedint read_val; int ret;
guard(mutex)(&st->lock);
switch (m) { case IIO_CHAN_INFO_RAW: if (st->mode != AD7091R_MODE_COMMAND) return -EBUSY;
ret = ad7091r_read_one(iio_dev, chan->channel, &read_val); if (ret) return ret;
*val = read_val; return IIO_VAL_INT;
case IIO_CHAN_INFO_SCALE: if (st->vref) {
ret = regulator_get_voltage(st->vref); if (ret < 0) return ret;
switch (dir) { case IIO_EV_DIR_RISING:
ret = regmap_read(st->map,
AD7091R_REG_CH_HIGH_LIMIT(chan->channel),
&val); if (ret) return ret; return val != AD7091R_HIGH_LIMIT; case IIO_EV_DIR_FALLING:
ret = regmap_read(st->map,
AD7091R_REG_CH_LOW_LIMIT(chan->channel),
&val); if (ret) return ret; return val != AD7091R_LOW_LIMIT; default: return -EINVAL;
}
}
if (state) { return regmap_set_bits(st->map, AD7091R_REG_CONF,
AD7091R_REG_CONF_ALERT_EN);
} else { /* * Set thresholds either to 0 or to 2^12 - 1 as appropriate to * prevent alerts and thus disable event generation.
*/ switch (dir) { case IIO_EV_DIR_RISING: return regmap_write(st->map,
AD7091R_REG_CH_HIGH_LIMIT(chan->channel),
AD7091R_HIGH_LIMIT); case IIO_EV_DIR_FALLING: return regmap_write(st->map,
AD7091R_REG_CH_LOW_LIMIT(chan->channel),
AD7091R_LOW_LIMIT); default: return -EINVAL;
}
}
}
staticint ad7091r_read_event_value(struct iio_dev *indio_dev, conststruct iio_chan_spec *chan, enum iio_event_type type, enum iio_event_direction dir, enum iio_event_info info, int *val, int *val2)
{ struct ad7091r_state *st = iio_priv(indio_dev); int ret;
switch (info) { case IIO_EV_INFO_VALUE: switch (dir) { case IIO_EV_DIR_RISING:
ret = regmap_read(st->map,
AD7091R_REG_CH_HIGH_LIMIT(chan->channel),
val); if (ret) return ret; return IIO_VAL_INT; case IIO_EV_DIR_FALLING:
ret = regmap_read(st->map,
AD7091R_REG_CH_LOW_LIMIT(chan->channel),
val); if (ret) return ret; return IIO_VAL_INT; default: return -EINVAL;
} case IIO_EV_INFO_HYSTERESIS:
ret = regmap_read(st->map,
AD7091R_REG_CH_HYSTERESIS(chan->channel),
val); if (ret) return ret; return IIO_VAL_INT; default: return -EINVAL;
}
}
bool ad7091r_volatile_reg(struct device *dev, unsignedint reg)
{ /* The volatile ad7091r registers are also the only RO ones. */ return !ad7091r_writeable_reg(dev, reg);
}
EXPORT_SYMBOL_NS_GPL(ad7091r_volatile_reg, "IIO_AD7091R");
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.