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_TEMP_CHAN(ADIS16350_XTEMP_OUT, 12), IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP), }; static struct adis16400_chip_info adis16400_chips[] = { [ADIS16300] = { .channels = adis16300_channels, .num_channels = ARRAY_SIZE(adis16300_channels), .flags = ADIS16400_HAS_SLOW_MODE, .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */ .accel_scale_micro = 5884, .temp_scale_nano = 140000000, /* 0.14 C */ .temp_offset = 25000000 / 140000, /* 25 C = 0x00 */ .set_freq = adis16400_set_freq, .get_freq = adis16400_get_freq, }, [ADIS16334] = { .channels = adis16334_channels, .num_channels = ARRAY_SIZE(adis16334_channels), .flags = ADIS16400_HAS_PROD_ID | ADIS16400_NO_BURST | ADIS16400_HAS_SERIAL_NUMBER, .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */ .accel_scale_micro = IIO_G_TO_M_S_2(1000), /* 1 mg */ .temp_scale_nano = 67850000, /* 0.06785 C */ .temp_offset = 25000000 / 67850, /* 25 C = 0x00 */
.status_error_msgs = adis16136_status_error_msgs, .status_error_mask = BIT(ADIS16136_DIAG_STAT_FLASH_UPDATE_FAIL) | BIT(ADIS16136_DIAG_STAT_SPI_FAIL) | BIT(ADIS16136_DIAG_STAT_SELF_TEST_FAIL) | BIT(ADIS16136_DIAG_STAT_FLASH_CHKSUM_FAIL), }; enum adis16136_id { ID_ADIS16133, ID_ADIS16135, ID_ADIS16136, }; static const struct adis16136_chip_info adis16136_chip_info[] = { [ID_ADIS16133] = { .precision = IIO_DEGREE_TO_RAD(1200), .fullscale = 24000, }, [ID_ADIS16135] = { .precision = IIO_DEGREE_TO_RAD(300), .fullscale = 24000, }, [ID_ADIS16136] = { .precision = IIO_DEGREE_TO_RAD(450), .fullscale = 24623, }, }; static int adis16136_probe(struct spi_device *spi) { const struct spi_device_id *id = spi_get_device_id(spi);
.mask = 0x08, .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE, .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE, }, .enable_axis = { .addr = ST_SENSORS_DEFAULT_AXIS_ADDR, .mask = ST_SENSORS_DEFAULT_AXIS_MASK, }, .fs = { .addr = 0x23, .mask = 0x30, .fs_avl = { [0] = { .num = ST_GYRO_FS_AVL_250DPS, .value = 0x00, .gain = IIO_DEGREE_TO_RAD(8750), }, [1] = { .num = ST_GYRO_FS_AVL_500DPS, .value = 0x01, .gain = IIO_DEGREE_TO_RAD(17500), }, [2] = { .num = ST_GYRO_FS_AVL_2000DPS, .value = 0x02, .gain = IIO_DEGREE_TO_RAD(70000), }, }, }, .bdu = { .addr = 0x23,
#define MPU3050_PWR_MGM_PLL_Z 0x03 #define MPU3050_PWR_MGM_CLKSEL_MASK 0x07 #define MPU3050_PWR_MGM_STBY_ZG BIT(3) #define MPU3050_PWR_MGM_STBY_YG BIT(4) #define MPU3050_PWR_MGM_STBY_XG BIT(5) #define MPU3050_PWR_MGM_SLEEP BIT(6) #define MPU3050_PWR_MGM_RESET BIT(7) #define MPU3050_PWR_MGM_MASK 0xff /* * Fullscale precision is (for finest precision) +/- 250 deg/s, so the full * scale is actually 500 deg/s. All 16 bits are then used to cover this scale, * in two's complement. */ static unsigned int mpu3050_fs_precision[] = { IIO_DEGREE_TO_RAD(250), IIO_DEGREE_TO_RAD(500), IIO_DEGREE_TO_RAD(1000), IIO_DEGREE_TO_RAD(2000) }; /* * Regulator names */ static const char mpu3050_reg_vdd[] = "vdd"; static const char mpu3050_reg_vlogic[] = "vlogic"; static unsigned int mpu3050_get_freq(struct mpu3050 *mpu3050) { unsigned int freq;
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; switch (mask) { case IIO_CHAN_INFO_RAW: return adis_single_conversion(indio_dev, chan, ADIS16260_ERROR_ACTIVE, val); case IIO_CHAN_INFO_SCALE: switch (chan->type) { case IIO_ANGL_VEL: *val = 0; if (spi_get_device_id(adis->spi)->driver_data) { /* 0.01832 degree / sec */ *val2 = IIO_DEGREE_TO_RAD(18320); } else { /* 0.07326 degree / sec */ *val2 = IIO_DEGREE_TO_RAD(73260); } return IIO_VAL_INT_PLUS_MICRO; case IIO_INCLI: *val = 0; *val2 = IIO_DEGREE_TO_RAD(36630); return IIO_VAL_INT_PLUS_MICRO; case IIO_VOLTAGE: if (chan->channel == 0) { *val = 1; *val2 = 831500; /* 1.8315 mV */ } else { *val = 0; *val2 = 610500; /* 610.5 uV */ } return IIO_VAL_INT_PLUS_MICRO; case IIO_TEMP: *val = 145; *val2 = 300000; /* 0.1453 C */ return IIO_VAL_INT_PLUS_MICRO; default: return -EINVAL; } case IIO_CHAN_INFO_OFFSET: *val = 250000 / 1453; /* 25 C = 0x00 */ return IIO_VAL_INT; case IIO_CHAN_INFO_CALIBBIAS: addr = adis16260_addresses[chan->scan_index][0]; ret = adis_read_reg_16(adis, addr, &val16); if (ret) return ret; *val = sign_extend32(val16, 11); return IIO_VAL_INT; case IIO_CHAN_INFO_CALIBSCALE: addr = adis16260_addresses[chan->scan_index][1]; ret = adis_read_reg_16(adis, addr, &val16); if (ret) return ret; *val = val16; return IIO_VAL_INT; case IIO_CHAN_INFO_SAMP_FREQ: ret = adis_read_reg_16(adis, ADIS16260_SMPL_PRD, &val16); if (ret) return ret; if (spi_get_device_id(adis->spi)->driver_data) /* If an adis16251 */ *val = (val16 & ADIS16260_SMPL_PRD_TIME_BASE) ? 8 : 256; else *val = (val16 & ADIS16260_SMPL_PRD_TIME_BASE) ? 66 : 2048; *val /= (val16 & ADIS16260_SMPL_PRD_DIV_MASK) + 1; return IIO_VAL_INT; } return -EINVAL; }