static struct iio_dev * st_lsm6dsx_shub_alloc_iiodev(struct st_lsm6dsx_hw *hw, enum st_lsm6dsx_sensor_id id, const struct st_lsm6dsx_ext_dev_settings *info, u8 i2c_addr, const char *name) { struct iio_chan_spec *ext_channels; struct st_lsm6dsx_sensor *sensor; struct iio_dev *iio_dev; iio_dev = devm_iio_device_alloc(hw->dev, sizeof(*sensor)); if (!iio_dev) return NULL; iio_dev->modes = INDIO_DIRECT_MODE; iio_dev->dev.parent = hw->dev; iio_dev->info = &st_lsm6dsx_ext_info; sensor = iio_priv(iio_dev); sensor->id = id; sensor->hw = hw; sensor->odr = info->odr_table.odr_avl[0].hz; sensor->gain = info->fs_table.fs_avl[0].gain; sensor->ext_info.settings = info; sensor->ext_info.addr = i2c_addr; sensor->watermark = 1; switch (info->id) { case ST_LSM6DSX_ID_MAGN: { const struct iio_chan_spec magn_channels[] = { ST_LSM6DSX_CHANNEL(IIO_MAGN, info->out.addr, IIO_MOD_X, 0), ST_LSM6DSX_CHANNEL(IIO_MAGN, info->out.addr + 2, IIO_MOD_Y, 1), ST_LSM6DSX_CHANNEL(IIO_MAGN, info->out.addr + 4, IIO_MOD_Z, 2), IIO_CHAN_SOFT_TIMESTAMP(3), }; ext_channels = devm_kzalloc(hw->dev, sizeof(magn_channels), GFP_KERNEL); if (!ext_channels) return NULL; memcpy(ext_channels, magn_channels, sizeof(magn_channels)); iio_dev->available_scan_masks = st_lsm6dsx_available_scan_masks; iio_dev->channels = ext_channels; iio_dev->num_channels = ARRAY_SIZE(magn_channels); scnprintf(sensor->name, sizeof(sensor->name), "%s_magn", name); break; } default: return NULL; } iio_dev->name = sensor->name; return iio_dev; }
} static const struct iio_chan_spec adis16400_channels[] = { ADIS16400_SUPPLY_CHAN(ADIS16400_SUPPLY_OUT, 14), ADIS16400_GYRO_CHAN(X, ADIS16400_XGYRO_OUT, 14), ADIS16400_GYRO_CHAN(Y, ADIS16400_YGYRO_OUT, 14), ADIS16400_GYRO_CHAN(Z, ADIS16400_ZGYRO_OUT, 14), ADIS16400_ACCEL_CHAN(X, ADIS16400_XACCL_OUT, 14), ADIS16400_ACCEL_CHAN(Y, ADIS16400_YACCL_OUT, 14), ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 14), ADIS16400_MAGN_CHAN(X, ADIS16400_XMAGN_OUT, 14), ADIS16400_MAGN_CHAN(Y, ADIS16400_YMAGN_OUT, 14), ADIS16400_MAGN_CHAN(Z, ADIS16400_ZMAGN_OUT, 14), ADIS16400_TEMP_CHAN(ADIS16400_TEMP_OUT, 12), ADIS16400_AUX_ADC_CHAN(ADIS16400_AUX_ADC, 12), IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP), }; static const struct iio_chan_spec adis16448_channels[] = { ADIS16400_GYRO_CHAN(X, ADIS16400_XGYRO_OUT, 16), ADIS16400_GYRO_CHAN(Y, ADIS16400_YGYRO_OUT, 16), ADIS16400_GYRO_CHAN(Z, ADIS16400_ZGYRO_OUT, 16), ADIS16400_ACCEL_CHAN(X, ADIS16400_XACCL_OUT, 16), ADIS16400_ACCEL_CHAN(Y, ADIS16400_YACCL_OUT, 16), ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 16), ADIS16400_MAGN_CHAN(X, ADIS16400_XMAGN_OUT, 16), ADIS16400_MAGN_CHAN(Y, ADIS16400_YMAGN_OUT, 16), ADIS16400_MAGN_CHAN(Z, ADIS16400_ZMAGN_OUT, 16), { .type = IIO_PRESSURE, .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SAMP_FREQ) | \ BIT(IIO_CHAN_INFO_SCALE), \ .scan_index = idx, \ .scan_type = { \ .sign = 's', \ .realbits = 10, \ .storagebits = 16, \ .endianness = IIO_LE, \ }, \ } static const struct iio_chan_spec mma7455_channels[] = { MMA7455_CHANNEL(X, 0), MMA7455_CHANNEL(Y, 1), MMA7455_CHANNEL(Z, 2), IIO_CHAN_SOFT_TIMESTAMP(3), }; static const unsigned long mma7455_scan_masks[] = {0x7, 0}; const struct regmap_config mma7455_core_regmap = { .reg_bits = 8, .val_bits = 8, .max_register = MMA7455_REG_TW, }; EXPORT_SYMBOL_GPL(mma7455_core_regmap); int mma7455_core_probe(struct device *dev, struct regmap *regmap, const char *name) { struct mma7455_data *mma7455;
#define YAS_ACCELEROMETER_CHANNEL(axis) \ { \ .type = IIO_ACCEL, \ .modified = 1, \ .channel2 = IIO_MOD_##axis, \ .info_mask = YAS_ACCELEROMETER_INFO_MASK, \ .scan_index = YAS_SCAN_ACCEL_##axis, \ .scan_type = IIO_ST('s', 32, 32, 0) \ } static const struct iio_chan_spec yas_channels[] = { YAS_ACCELEROMETER_CHANNEL(X), YAS_ACCELEROMETER_CHANNEL(Y), YAS_ACCELEROMETER_CHANNEL(Z), IIO_CHAN_SOFT_TIMESTAMP(YAS_SCAN_TIMESTAMP) }; static IIO_DEVICE_ATTR(sampling_frequency, S_IRUSR|S_IWUSR, yas_sampling_frequency_show, yas_sampling_frequency_store, 0); static IIO_DEVICE_ATTR(position, S_IRUSR|S_IWUSR, yas_position_show, yas_position_store, 0); static IIO_DEVICE_ATTR(ping, S_IRUGO|S_IWUSR|S_IWGRP, yas_ping, NULL, 0); static IIO_DEVICE_ATTR(selftest, S_IRUGO, yas_selftest_show, NULL, 0); static struct attribute *yas_attributes[] = { &iio_dev_attr_sampling_frequency.dev_attr.attr, &iio_dev_attr_position.dev_attr.attr,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),\ .scan_index = num, \ .scan_type = IIO_ST('s', 16, 16, 0), \ } static const struct iio_chan_spec ad7606_8_channels[] = { AD7606_CHANNEL(0), AD7606_CHANNEL(1), AD7606_CHANNEL(2), AD7606_CHANNEL(3), AD7606_CHANNEL(4), AD7606_CHANNEL(5), AD7606_CHANNEL(6), AD7606_CHANNEL(7), IIO_CHAN_SOFT_TIMESTAMP(8), }; static const struct iio_chan_spec ad7606_6_channels[] = { AD7606_CHANNEL(0), AD7606_CHANNEL(1), AD7606_CHANNEL(2), AD7606_CHANNEL(3), AD7606_CHANNEL(4), AD7606_CHANNEL(5), IIO_CHAN_SOFT_TIMESTAMP(6), }; static const struct iio_chan_spec ad7606_4_channels[] = { AD7606_CHANNEL(0), AD7606_CHANNEL(1),
.indexed = 1, \ .channel = num, \ .address = num, \ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),\ .scan_index = num, \ .scan_type = { \ .sign = 's', \ .realbits = 16, \ .storagebits = 16, \ .endianness = IIO_CPU, \ }, \ } static const struct iio_chan_spec ad7606_channels[] = { IIO_CHAN_SOFT_TIMESTAMP(8), AD7606_CHANNEL(0), AD7606_CHANNEL(1), AD7606_CHANNEL(2), AD7606_CHANNEL(3), AD7606_CHANNEL(4), AD7606_CHANNEL(5), AD7606_CHANNEL(6), AD7606_CHANNEL(7), }; static const struct ad7606_chip_info ad7606_chip_info_tbl[] = { /* * More devices added in future */ [ID_AD7606_8] = {
.scan_type = { \ .sign = 's', \ .realbits = (bits), \ .storagebits = 16, \ .shift = 16 - (bits), \ .endianness = IIO_BE, \ }, \ .event_spec = mma8452_motion_event, \ .num_event_specs = ARRAY_SIZE(mma8452_motion_event), \ } static const struct iio_chan_spec mma8452_channels[] = { MMA8452_CHANNEL(X, idx_x, 12), MMA8452_CHANNEL(Y, idx_y, 12), MMA8452_CHANNEL(Z, idx_z, 12), IIO_CHAN_SOFT_TIMESTAMP(idx_ts), }; static const struct iio_chan_spec mma8453_channels[] = { MMA8452_CHANNEL(X, idx_x, 10), MMA8452_CHANNEL(Y, idx_y, 10), MMA8452_CHANNEL(Z, idx_z, 10), IIO_CHAN_SOFT_TIMESTAMP(idx_ts), }; static const struct iio_chan_spec mma8652_channels[] = { MMA8652_CHANNEL(X, idx_x, 12), MMA8652_CHANNEL(Y, idx_y, 12), MMA8652_CHANNEL(Z, idx_z, 12), IIO_CHAN_SOFT_TIMESTAMP(idx_ts), };
} static const struct iio_chan_spec adis16260_channels[] = { ADIS_GYRO_CHAN(X, ADIS16260_GYRO_OUT, ADIS16260_SCAN_GYRO, BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_CALIBSCALE), BIT(IIO_CHAN_INFO_SAMP_FREQ), 14), ADIS_INCLI_CHAN(X, ADIS16260_ANGL_OUT, ADIS16260_SCAN_ANGL, 0, BIT(IIO_CHAN_INFO_SAMP_FREQ), 14), ADIS_TEMP_CHAN(ADIS16260_TEMP_OUT, ADIS16260_SCAN_TEMP, BIT(IIO_CHAN_INFO_SAMP_FREQ), 12), ADIS_SUPPLY_CHAN(ADIS16260_SUPPLY_OUT, ADIS16260_SCAN_SUPPLY, BIT(IIO_CHAN_INFO_SAMP_FREQ), 12), ADIS_AUX_ADC_CHAN(ADIS16260_AUX_ADC, ADIS16260_SCAN_AUX_ADC, BIT(IIO_CHAN_INFO_SAMP_FREQ), 12), IIO_CHAN_SOFT_TIMESTAMP(5), }; static const u8 adis16260_addresses[][2] = { [ADIS16260_SCAN_GYRO] = { ADIS16260_GYRO_OFF, ADIS16260_GYRO_SCALE }, }; static int adis16260_read_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; s16 val16;