static int st_lsm6dsx_shub_write_raw(struct iio_dev *iio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask) { struct st_lsm6dsx_sensor *sensor = iio_priv(iio_dev); int err; err = iio_device_claim_direct_mode(iio_dev); if (err) return err; switch (mask) { case IIO_CHAN_INFO_SAMP_FREQ: { u16 data; err = st_lsm6dsx_shub_get_odr_val(sensor, val, &data); if (!err) sensor->odr = val; break; } default: err = -EINVAL; break; } iio_device_release_direct_mode(iio_dev); return err; }
static int ad7606_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long m) { int ret; struct ad7606_state *st = iio_priv(indio_dev); switch (m) { case IIO_CHAN_INFO_RAW: ret = iio_device_claim_direct_mode(indio_dev); if (ret) return ret; ret = ad7606_scan_direct(indio_dev, chan->address); iio_device_release_direct_mode(indio_dev); if (ret < 0) return ret; *val = (short)ret; return IIO_VAL_INT; case IIO_CHAN_INFO_SCALE: *val = st->range * 2; *val2 = st->chip_info->channels[0].scan_type.realbits; return IIO_VAL_FRACTIONAL_LOG2; } return -EINVAL; }
static int st_lsm6dsx_shub_read_raw(struct iio_dev *iio_dev, struct iio_chan_spec const *ch, int *val, int *val2, long mask) { struct st_lsm6dsx_sensor *sensor = iio_priv(iio_dev); int ret; switch (mask) { case IIO_CHAN_INFO_RAW: ret = iio_device_claim_direct_mode(iio_dev); if (ret) break; ret = st_lsm6dsx_shub_read_oneshot(sensor, ch, val); iio_device_release_direct_mode(iio_dev); break; case IIO_CHAN_INFO_SAMP_FREQ: *val = sensor->odr; ret = IIO_VAL_INT; break; case IIO_CHAN_INFO_SCALE: *val = 0; *val2 = sensor->gain; ret = IIO_VAL_INT_PLUS_MICRO; break; default: ret = -EINVAL; break; } return ret; }
static int ad7298_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long m) { int ret; struct ad7298_state *st = iio_priv(indio_dev); switch (m) { case IIO_CHAN_INFO_RAW: ret = iio_device_claim_direct_mode(indio_dev); if (ret) return ret; if (chan->address == AD7298_CH_TEMP) ret = ad7298_scan_temp(st, val); else ret = ad7298_scan_direct(st, chan->address); iio_device_release_direct_mode(indio_dev); if (ret < 0) return ret; if (chan->address != AD7298_CH_TEMP) *val = ret & GENMASK(chan->scan_type.realbits - 1, 0); return IIO_VAL_INT; case IIO_CHAN_INFO_SCALE: switch (chan->type) { case IIO_VOLTAGE: *val = ad7298_get_ref_voltage(st); *val2 = chan->scan_type.realbits; return IIO_VAL_FRACTIONAL_LOG2; case IIO_TEMP: *val = ad7298_get_ref_voltage(st); *val2 = 10; return IIO_VAL_FRACTIONAL; default: return -EINVAL; } case IIO_CHAN_INFO_OFFSET: *val = 1093 - 2732500 / ad7298_get_ref_voltage(st); return IIO_VAL_INT; } return -EINVAL; }
static int adc108s102_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long m) { struct adc108s102_state *st = iio_priv(indio_dev); int ret; switch (m) { case IIO_CHAN_INFO_RAW: ret = iio_device_claim_direct_mode(indio_dev); if (ret) return ret; ret = adc108s102_scan_direct(st, chan->address); iio_device_release_direct_mode(indio_dev); if (ret < 0) return ret; *val = ADC108S102_RES_DATA(ret); return IIO_VAL_INT; case IIO_CHAN_INFO_SCALE: if (chan->type != IIO_VOLTAGE) break; *val = st->va_millivolt; *val2 = chan->scan_type.realbits; return IIO_VAL_FRACTIONAL_LOG2; default: break; } return -EINVAL; }
static int ltr501_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask) { struct ltr501_data *data = iio_priv(indio_dev); int i, ret, freq_val, freq_val2; struct ltr501_chip_info *info = data->chip_info; ret = iio_device_claim_direct_mode(indio_dev); if (ret) return ret; switch (mask) { case IIO_CHAN_INFO_SCALE: switch (chan->type) { case IIO_INTENSITY: i = ltr501_get_gain_index(info->als_gain, info->als_gain_tbl_size, val, val2); if (i < 0) { ret = -EINVAL; break; } data->als_contr &= ~info->als_gain_mask; data->als_contr |= i << info->als_gain_shift; ret = regmap_write(data->regmap, LTR501_ALS_CONTR, data->als_contr); break; case IIO_PROXIMITY: i = ltr501_get_gain_index(info->ps_gain, info->ps_gain_tbl_size, val, val2); if (i < 0) { ret = -EINVAL; break; } data->ps_contr &= ~LTR501_CONTR_PS_GAIN_MASK; data->ps_contr |= i << LTR501_CONTR_PS_GAIN_SHIFT; ret = regmap_write(data->regmap, LTR501_PS_CONTR, data->ps_contr); break; default: ret = -EINVAL; break; } break; case IIO_CHAN_INFO_INT_TIME: switch (chan->type) { case IIO_INTENSITY: if (val != 0) { ret = -EINVAL; break; } mutex_lock(&data->lock_als); ret = ltr501_set_it_time(data, val2); mutex_unlock(&data->lock_als); break; default: ret = -EINVAL; break; } break; case IIO_CHAN_INFO_SAMP_FREQ: switch (chan->type) { case IIO_INTENSITY: ret = ltr501_als_read_samp_freq(data, &freq_val, &freq_val2); if (ret < 0) break; ret = ltr501_als_write_samp_freq(data, val, val2); if (ret < 0) break; /* update persistence count when changing frequency */ ret = ltr501_write_intr_prst(data, chan->type, 0, data->als_period); if (ret < 0) ret = ltr501_als_write_samp_freq(data, freq_val, freq_val2); break; case IIO_PROXIMITY: ret = ltr501_ps_read_samp_freq(data, &freq_val, &freq_val2); if (ret < 0) break; ret = ltr501_ps_write_samp_freq(data, val, val2); if (ret < 0) break; /* update persistence count when changing frequency */ ret = ltr501_write_intr_prst(data, chan->type, 0, data->ps_period); if (ret < 0) ret = ltr501_ps_write_samp_freq(data, freq_val, freq_val2); break; default: ret = -EINVAL; break; } break; default: ret = -EINVAL; break; } iio_device_release_direct_mode(indio_dev); return ret; }
static int ltr501_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask) { struct ltr501_data *data = iio_priv(indio_dev); __le16 buf[2]; int ret, i; switch (mask) { case IIO_CHAN_INFO_PROCESSED: switch (chan->type) { case IIO_LIGHT: ret = iio_device_claim_direct_mode(indio_dev); if (ret) return ret; mutex_lock(&data->lock_als); ret = ltr501_read_als(data, buf); mutex_unlock(&data->lock_als); iio_device_release_direct_mode(indio_dev); if (ret < 0) return ret; *val = ltr501_calculate_lux(le16_to_cpu(buf[1]), le16_to_cpu(buf[0])); return IIO_VAL_INT; default: return -EINVAL; } case IIO_CHAN_INFO_RAW: ret = iio_device_claim_direct_mode(indio_dev); if (ret) return ret; switch (chan->type) { case IIO_INTENSITY: mutex_lock(&data->lock_als); ret = ltr501_read_als(data, buf); mutex_unlock(&data->lock_als); if (ret < 0) break; *val = le16_to_cpu(chan->address == LTR501_ALS_DATA1 ? buf[0] : buf[1]); ret = IIO_VAL_INT; break; case IIO_PROXIMITY: mutex_lock(&data->lock_ps); ret = ltr501_read_ps(data); mutex_unlock(&data->lock_ps); if (ret < 0) break; *val = ret & LTR501_PS_DATA_MASK; ret = IIO_VAL_INT; break; default: ret = -EINVAL; break; } iio_device_release_direct_mode(indio_dev); return ret; case IIO_CHAN_INFO_SCALE: switch (chan->type) { case IIO_INTENSITY: i = (data->als_contr & data->chip_info->als_gain_mask) >> data->chip_info->als_gain_shift; *val = data->chip_info->als_gain[i].scale; *val2 = data->chip_info->als_gain[i].uscale; return IIO_VAL_INT_PLUS_MICRO; case IIO_PROXIMITY: i = (data->ps_contr & LTR501_CONTR_PS_GAIN_MASK) >> LTR501_CONTR_PS_GAIN_SHIFT; *val = data->chip_info->ps_gain[i].scale; *val2 = data->chip_info->ps_gain[i].uscale; return IIO_VAL_INT_PLUS_MICRO; default: return -EINVAL; } case IIO_CHAN_INFO_INT_TIME: switch (chan->type) { case IIO_INTENSITY: return ltr501_read_it_time(data, val, val2); default: return -EINVAL; } case IIO_CHAN_INFO_SAMP_FREQ: switch (chan->type) { case IIO_INTENSITY: return ltr501_als_read_samp_freq(data, val, val2); case IIO_PROXIMITY: return ltr501_ps_read_samp_freq(data, val, val2); default: return -EINVAL; } } return -EINVAL; }