static int adis16209_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask) { struct adis *st = iio_priv(indio_dev); int bits; s16 val16; u8 addr; switch (mask) { case IIO_CHAN_INFO_CALIBBIAS: switch (chan->type) { case IIO_ACCEL: case IIO_INCLI: bits = 14; break; default: return -EINVAL; } val16 = val & ((1 << bits) - 1); addr = adis16209_addresses[chan->scan_index][0]; return adis_write_reg_16(st, addr, val16); } return -EINVAL; }
static int adis16400_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long info) { struct adis16400_state *st = iio_priv(indio_dev); int ret, sps; switch (info) { case IIO_CHAN_INFO_CALIBBIAS: mutex_lock(&indio_dev->mlock); ret = adis_write_reg_16(&st->adis, adis16400_addresses[chan->scan_index], val); mutex_unlock(&indio_dev->mlock); return ret; case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: /* * Need to cache values so we can update if the frequency * changes. */ mutex_lock(&indio_dev->mlock); st->filt_int = val; /* Work out update to current value */ sps = st->variant->get_freq(st); if (sps < 0) { mutex_unlock(&indio_dev->mlock); return sps; } ret = adis16400_set_filter(indio_dev, sps, val * 1000 + val2 / 1000); mutex_unlock(&indio_dev->mlock); return ret; default: return -EINVAL; } }
static int adis16260_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask) { struct adis *adis = iio_priv(indio_dev); int ret; u8 addr; u8 t; switch (mask) { case IIO_CHAN_INFO_CALIBBIAS: if (val < -2048 || val >= 2048) return -EINVAL; addr = adis16260_addresses[chan->scan_index][0]; return adis_write_reg_16(adis, addr, val); case IIO_CHAN_INFO_CALIBSCALE: if (val < 0 || val >= 4096) return -EINVAL; addr = adis16260_addresses[chan->scan_index][1]; return adis_write_reg_16(adis, addr, val); case IIO_CHAN_INFO_SAMP_FREQ: mutex_lock(&indio_dev->mlock); if (spi_get_device_id(adis->spi)->driver_data) t = 256 / val; else t = 2048 / val; if (t > ADIS16260_SMPL_PRD_DIV_MASK) t = ADIS16260_SMPL_PRD_DIV_MASK; else if (t > 0) t--; if (t >= 0x0A) adis->spi->max_speed_hz = ADIS16260_SPI_SLOW; else adis->spi->max_speed_hz = ADIS16260_SPI_FAST; ret = adis_write_reg_8(adis, ADIS16260_SMPL_PRD, t); mutex_unlock(&indio_dev->mlock); return ret; } return -EINVAL; }
static int adis16136_stop_device(struct iio_dev *indio_dev) { struct adis16136 *adis16136 = iio_priv(indio_dev); int ret; ret = adis_write_reg_16(&adis16136->adis, ADIS16136_REG_SLP_CTRL, 0xff); if (ret) dev_err(&indio_dev->dev, "Could not power down device: %d\n", ret); return ret; }
/* Power down the device */ static int adis16260_stop_device(struct iio_dev *indio_dev) { struct adis *adis = iio_priv(indio_dev); int ret; u16 val = ADIS16260_SLP_CNT_POWER_OFF; ret = adis_write_reg_16(adis, ADIS16260_SLP_CNT, val); if (ret) dev_err(&indio_dev->dev, "problem with turning device off: SLP_CNT"); return ret; }
/* Power down the device */ static int adis16400_stop_device(struct iio_dev *indio_dev) { struct adis16400_state *st = iio_priv(indio_dev); int ret; ret = adis_write_reg_16(&st->adis, ADIS16400_SLP_CNT, ADIS16400_SLP_CNT_POWER_OFF); if (ret) dev_err(&indio_dev->dev, "problem with turning device off: SLP_CNT"); return ret; }
static int adis16136_set_freq(struct adis16136 *adis16136, unsigned int freq) { unsigned int t; t = 32768 / freq; if (t < 0xf) t = 0xf; else if (t > 0xffff) t = 0xffff; else t--; return adis_write_reg_16(&adis16136->adis, ADIS16136_REG_SMPL_PRD, t); }
static int adis16334_set_freq(struct adis16400_state *st, unsigned int freq) { unsigned int t; if (freq < 819200) t = ilog2(819200 / freq); else t = 0; if (t > 0x31) t = 0x31; t <<= ADIS16334_RATE_DIV_SHIFT; t |= ADIS16334_RATE_INT_CLK; return adis_write_reg_16(&st->adis, ADIS16400_SMPL_PRD, t); }
static int adis16136_set_filter(struct iio_dev *indio_dev, int val) { struct adis16136 *adis16136 = iio_priv(indio_dev); unsigned int freq; int i, ret; ret = adis16136_get_freq(adis16136, &freq); if (ret < 0) return ret; for (i = ARRAY_SIZE(adis16136_3db_divisors) - 1; i >= 1; i--) { if (freq / adis16136_3db_divisors[i] >= val) break; } return adis_write_reg_16(&adis16136->adis, ADIS16136_REG_AVG_CNT, i); }
static int adis16400_set_filter(struct iio_dev *indio_dev, int sps, int val) { struct adis16400_state *st = iio_priv(indio_dev); uint16_t val16; int i, ret; for (i = ARRAY_SIZE(adis16400_3db_divisors) - 1; i >= 1; i--) { if (sps / adis16400_3db_divisors[i] >= val) break; } ret = adis_read_reg_16(&st->adis, ADIS16400_SENS_AVG, &val16); if (ret < 0) return ret; ret = adis_write_reg_16(&st->adis, ADIS16400_SENS_AVG, (val16 & ~0x07) | i); return ret; }