2 * Copyright (C) 2012 Invensense, Inc.
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 #define pr_fmt(fmt) "inv_mpu: " fmt
15 #include <linux/module.h>
16 #include <linux/init.h>
17 #include <linux/slab.h>
18 #include <linux/err.h>
19 #include <linux/delay.h>
20 #include <linux/sysfs.h>
21 #include <linux/jiffies.h>
22 #include <linux/irq.h>
23 #include <linux/interrupt.h>
24 #include <linux/kfifo.h>
25 #include <linux/poll.h>
26 #include <linux/miscdevice.h>
27 #include <linux/spinlock.h>
29 #include "inv_mpu_iio.h"
31 #include "inv_test/inv_counters.h"
33 #ifdef CONFIG_DTS_INV_MPU_IIO
34 #include "inv_mpu_dts.h"
37 static const struct inv_hw_s hw_info[INV_NUM_PARTS] = {
41 static int debug_mem_read_addr = 0x900;
42 static char debug_reg_addr = 0x6;
44 int inv_set_dmp(struct inv_mpu_state *st)
48 result = inv_set_bank(st, BANK_SEL_2);
51 result = inv_plat_single_write(st, REG_PRGM_START_ADDRH,
55 result = inv_plat_single_write(st, REG_PRGM_START_ADDRH + 1,
56 DMP_START_ADDR & 0xff);
59 result = inv_set_bank(st, BANK_SEL_0);
64 static int inv_calc_gyro_sf(s8 pll)
69 t = 102870L + 81L * pll;
71 r = (1L << 30) - a * t;
72 value = a * 797 * DMP_DIVIDER;
73 value += (s64)((a * 1011387LL * DMP_DIVIDER) >> 20);
74 value += r * 797L * DMP_DIVIDER / t;
75 value += (s32)((s64)((r * 1011387LL * DMP_DIVIDER) >> 20)) / t;
81 static int inv_read_timebase(struct inv_mpu_state *st)
87 result = inv_set_bank(st, BANK_SEL_1);
90 result = inv_plat_read(st, REG_TIMEBASE_CORRECTION_PLL, 1, &d);
97 st->eng_info[ENGINE_ACCEL].base_time = NSEC_PER_SEC;
98 /* talor expansion to calculate base time unit */
99 st->eng_info[ENGINE_GYRO].base_time = NSEC_PER_SEC - t * 769903 +
100 ((t * 769903) / 1270) * t;
101 st->eng_info[ENGINE_PRESSURE].base_time = NSEC_PER_SEC;
102 st->eng_info[ENGINE_I2C].base_time = NSEC_PER_SEC;
104 st->eng_info[ENGINE_ACCEL].orig_rate = BASE_SAMPLE_RATE;
105 st->eng_info[ENGINE_GYRO].orig_rate = BASE_SAMPLE_RATE;
106 st->eng_info[ENGINE_PRESSURE].orig_rate = MAX_PRS_RATE;
107 st->eng_info[ENGINE_I2C].orig_rate = BASE_SAMPLE_RATE;
109 st->gyro_sf = inv_calc_gyro_sf(t);
110 result = inv_set_bank(st, BANK_SEL_0);
115 static int inv_set_gyro_sf(struct inv_mpu_state *st)
119 result = inv_set_bank(st, BANK_SEL_2);
122 result = inv_plat_single_write(st, REG_GYRO_CONFIG_1,
123 (st->chip_config.fsr << SHIFT_GYRO_FS_SEL) | 1);
127 result = inv_set_bank(st, BANK_SEL_0);
132 static int inv_set_accel_sf(struct inv_mpu_state *st)
135 int scale[] = {33554432, 67108864, 134217728, 268435456};
137 result = inv_set_bank(st, BANK_SEL_2);
140 result = inv_plat_single_write(st, REG_ACCEL_CONFIG,
141 (st->chip_config.accel_fs << SHIFT_ACCEL_FS) | 0);
145 result = inv_set_bank(st, BANK_SEL_0);
149 result = write_be32_to_mem(st,
150 scale[st->chip_config.accel_fs], ACC_SCALE);
155 static int inv_set_gyro_avg_filter(struct inv_mpu_state *st)
159 result = inv_set_bank(st, BANK_SEL_2);
162 result = inv_plat_single_write(st, REG_GYRO_CONFIG_2,
163 st->chip_config.gyro_avg_filter);
167 result = inv_set_bank(st, BANK_SEL_0);
172 static int inv_set_accel_avg_filter(struct inv_mpu_state *st)
176 result = inv_set_bank(st, BANK_SEL_2);
179 result = inv_plat_single_write(st, REG_ACCEL_CONFIG_2,
180 st->chip_config.accel_avg_filter);
184 result = inv_set_bank(st, BANK_SEL_0);
189 int inv_set_secondary(struct inv_mpu_state *st)
193 r = inv_set_bank(st, BANK_SEL_3);
196 r = inv_plat_single_write(st, REG_I2C_MST_CTRL, BIT_I2C_MST_P_NSR);
200 r = inv_plat_single_write(st, REG_I2C_MST_ODR_CONFIG,
205 r = inv_set_bank(st, BANK_SEL_0);
209 static int inv_set_odr_sync(struct inv_mpu_state *st)
213 r = inv_set_bank(st, BANK_SEL_2);
216 r = inv_plat_single_write(st, REG_MOD_CTRL_USR, BIT_ODR_SYNC);
219 r = inv_set_bank(st, BANK_SEL_0);
224 static int inv_init_secondary(struct inv_mpu_state *st)
226 st->slv_reg[0].addr = REG_I2C_SLV0_ADDR;
227 st->slv_reg[0].reg = REG_I2C_SLV0_REG;
228 st->slv_reg[0].ctrl = REG_I2C_SLV0_CTRL;
229 st->slv_reg[0].d0 = REG_I2C_SLV0_DO;
231 st->slv_reg[1].addr = REG_I2C_SLV1_ADDR;
232 st->slv_reg[1].reg = REG_I2C_SLV1_REG;
233 st->slv_reg[1].ctrl = REG_I2C_SLV1_CTRL;
234 st->slv_reg[1].d0 = REG_I2C_SLV1_DO;
236 st->slv_reg[2].addr = REG_I2C_SLV2_ADDR;
237 st->slv_reg[2].reg = REG_I2C_SLV2_REG;
238 st->slv_reg[2].ctrl = REG_I2C_SLV2_CTRL;
239 st->slv_reg[2].d0 = REG_I2C_SLV2_DO;
241 st->slv_reg[3].addr = REG_I2C_SLV3_ADDR;
242 st->slv_reg[3].reg = REG_I2C_SLV3_REG;
243 st->slv_reg[3].ctrl = REG_I2C_SLV3_CTRL;
244 st->slv_reg[3].d0 = REG_I2C_SLV3_DO;
249 static int inv_init_config(struct inv_mpu_state *st)
253 st->batch.overflow_on = 0;
254 st->chip_config.fsr = MPU_INIT_GYRO_SCALE;
255 st->chip_config.accel_fs = MPU_INIT_ACCEL_SCALE;
256 st->chip_config.gyro_avg_filter = MPU_INIT_GYRO_AVG_FILTER;
257 st->chip_config.accel_avg_filter = MPU_INIT_ACCEL_AVG_FILTER;
258 st->ped.int_thresh = MPU_INIT_PED_INT_THRESH;
259 st->ped.step_thresh = MPU_INIT_PED_STEP_THRESH;
260 st->smd.timer_thresh = MPU_INIT_SMD_TIMER_THLD;
261 st->chip_config.low_power_gyro_on = 1;
262 st->suspend_state = false;
264 st->chip_config.debug_data_collection_gyro_freq = BASE_SAMPLE_RATE;
265 st->chip_config.debug_data_collection_accel_freq = BASE_SAMPLE_RATE;
267 inv_init_secondary(st);
269 res = inv_read_timebase(st);
272 res = inv_set_dmp(st);
276 res = inv_set_gyro_sf(st);
279 res = inv_set_accel_sf(st);
282 res = inv_set_gyro_avg_filter(st);
285 res = inv_set_accel_avg_filter(st);
289 res = inv_set_odr_sync(st);
293 res = inv_set_secondary(st);
299 * inv_firmware_loaded_store() - calling this function will change
302 static ssize_t inv_firmware_loaded_store(struct device *dev,
303 struct device_attribute *attr, const char *buf, size_t count)
305 struct iio_dev *indio_dev = dev_get_drvdata(dev);
306 struct inv_mpu_state *st = iio_priv(indio_dev);
309 result = kstrtoint(buf, 10, &data);
315 st->chip_config.firmware_loaded = 0;
321 static ssize_t _dmp_bias_store(struct device *dev,
322 struct device_attribute *attr, const char *buf, size_t count)
324 struct iio_dev *indio_dev = dev_get_drvdata(dev);
325 struct inv_mpu_state *st = iio_priv(indio_dev);
326 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
329 if (!st->chip_config.firmware_loaded)
332 result = inv_switch_power_in_lp(st, true);
336 result = kstrtoint(buf, 10, &data);
338 goto dmp_bias_store_fail;
339 switch (this_attr->address) {
340 case ATTR_DMP_ACCEL_X_DMP_BIAS:
342 st->sensor_acurracy_flag[SENSOR_ACCEL_ACCURACY] = DEFAULT_ACCURACY;
343 result = write_be32_to_mem(st, data, ACCEL_BIAS_X);
345 goto dmp_bias_store_fail;
346 st->input_accel_dmp_bias[0] = data;
348 case ATTR_DMP_ACCEL_Y_DMP_BIAS:
349 result = write_be32_to_mem(st, data, ACCEL_BIAS_Y);
351 goto dmp_bias_store_fail;
352 st->input_accel_dmp_bias[1] = data;
354 case ATTR_DMP_ACCEL_Z_DMP_BIAS:
355 result = write_be32_to_mem(st, data, ACCEL_BIAS_Z);
357 goto dmp_bias_store_fail;
358 st->input_accel_dmp_bias[2] = data;
360 case ATTR_DMP_GYRO_X_DMP_BIAS:
362 st->sensor_acurracy_flag[SENSOR_GYRO_ACCURACY] = DEFAULT_ACCURACY;
363 result = write_be32_to_mem(st, data, GYRO_BIAS_X);
365 goto dmp_bias_store_fail;
366 st->input_gyro_dmp_bias[0] = data;
368 case ATTR_DMP_GYRO_Y_DMP_BIAS:
369 result = write_be32_to_mem(st, data, GYRO_BIAS_Y);
371 goto dmp_bias_store_fail;
372 st->input_gyro_dmp_bias[1] = data;
374 case ATTR_DMP_GYRO_Z_DMP_BIAS:
375 result = write_be32_to_mem(st, data, GYRO_BIAS_Z);
377 goto dmp_bias_store_fail;
378 st->input_gyro_dmp_bias[2] = data;
380 case ATTR_DMP_MAGN_X_DMP_BIAS:
382 st->sensor_acurracy_flag[SENSOR_COMPASS_ACCURACY] = 3;
383 result = write_be32_to_mem(st, data, CPASS_BIAS_X);
385 goto dmp_bias_store_fail;
386 st->input_compass_dmp_bias[0] = data;
388 case ATTR_DMP_MAGN_Y_DMP_BIAS:
389 result = write_be32_to_mem(st, data, CPASS_BIAS_Y);
391 goto dmp_bias_store_fail;
392 st->input_compass_dmp_bias[1] = data;
394 case ATTR_DMP_MAGN_Z_DMP_BIAS:
395 result = write_be32_to_mem(st, data, CPASS_BIAS_Z);
397 goto dmp_bias_store_fail;
398 st->input_compass_dmp_bias[2] = data;
400 case ATTR_DMP_MISC_GYRO_RECALIBRATION:
401 result = write_be32_to_mem(st, 0, GYRO_LAST_TEMPR);
403 goto dmp_bias_store_fail;
405 case ATTR_DMP_MISC_ACCEL_RECALIBRATION:
407 u8 d[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
409 u32 d1[] = {0, 0, 0, 0,
411 3276800, 3276800, 3276800, 3276800};
415 result = inv_write_2bytes(st, ACCEL_CAL_RESET, 1);
417 goto dmp_bias_store_fail;
418 result = mem_w(ACCEL_PRE_SENSOR_DATA, ARRAY_SIZE(d), d);
421 w_d = st->accel_covariance;
423 for (i = 0; i < ARRAY_SIZE(d1); i++) {
424 result = write_be32_to_mem(st, w_d[i],
425 ACCEL_COVARIANCE + i * sizeof(int));
427 goto dmp_bias_store_fail;
432 case ATTR_DMP_MISC_COMPASS_RECALIBRATION:
434 u32 d[] = {0, 0, 0, 0,
435 14745600, 14745600, 14745600, 14745600,
443 w_d = st->compass_covariance;
444 for (i = 0; i < ARRAY_SIZE(d); i++) {
445 result = write_be32_to_mem(st,
446 st->curr_compass_covariance[i],
447 CPASS_COVARIANCE_CUR +
450 goto dmp_bias_store_fail;
452 result = write_be32_to_mem(st, st->ref_mag_3d,
455 goto dmp_bias_store_fail;
458 for (i = 0; i < ARRAY_SIZE(d); i++) {
459 result = write_be32_to_mem(st, w_d[i],
460 CPASS_COVARIANCE + i * sizeof(int));
462 goto dmp_bias_store_fail;
466 case ATTR_DMP_PARAMS_ACCEL_CALIBRATION_THRESHOLD:
467 result = write_be32_to_mem(st, data, ACCEL_VARIANCE_THRESH);
469 goto dmp_bias_store_fail;
470 st->accel_calib_threshold = data;
472 /* this serves as a divider of calibration rate, 0->225, 3->55 */
473 case ATTR_DMP_PARAMS_ACCEL_CALIBRATION_RATE:
476 result = inv_write_2bytes(st, ACCEL_CAL_RATE, data);
478 goto dmp_bias_store_fail;
479 st->accel_calib_rate = data;
481 case ATTR_DMP_DEBUG_MEM_READ:
482 debug_mem_read_addr = data;
484 case ATTR_DMP_DEBUG_MEM_WRITE:
485 inv_write_2bytes(st, debug_mem_read_addr, data);
494 result = inv_switch_power_in_lp(st, false);
501 static ssize_t inv_dmp_bias_store(struct device *dev,
502 struct device_attribute *attr, const char *buf, size_t count)
504 struct iio_dev *indio_dev = dev_get_drvdata(dev);
507 mutex_lock(&indio_dev->mlock);
508 result = _dmp_bias_store(dev, attr, buf, count);
509 mutex_unlock(&indio_dev->mlock);
514 static ssize_t inv_debug_store(struct device *dev,
515 struct device_attribute *attr, const char *buf, size_t count)
517 struct iio_dev *indio_dev = dev_get_drvdata(dev);
518 struct inv_mpu_state *st = iio_priv(indio_dev);
519 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
522 result = kstrtoint(buf, 10, &data);
525 switch (this_attr->address) {
526 case ATTR_DMP_LP_EN_OFF:
527 st->chip_config.lp_en_mode_off = !!data;
528 inv_switch_power_in_lp(st, !!data);
530 case ATTR_DMP_CYCLE_MODE_OFF:
531 st->chip_config.cycle_mode_off = !!data;
532 inv_turn_off_cycle_mode(st, !!data);
533 case ATTR_DMP_CLK_SEL:
534 st->chip_config.clk_sel = !!data;
535 inv_switch_power_in_lp(st, !!data);
537 case ATTR_DEBUG_REG_ADDR:
538 debug_reg_addr = data;
540 case ATTR_DEBUG_REG_WRITE:
541 inv_plat_single_write(st, debug_reg_addr, data);
543 case ATTR_DEBUG_WRITE_CFG:
548 static ssize_t _misc_attr_store(struct device *dev,
549 struct device_attribute *attr, const char *buf, size_t count)
551 struct iio_dev *indio_dev = dev_get_drvdata(dev);
552 struct inv_mpu_state *st = iio_priv(indio_dev);
553 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
556 if (!st->chip_config.firmware_loaded)
558 result = inv_switch_power_in_lp(st, true);
561 result = kstrtoint(buf, 10, &data);
564 switch (this_attr->address) {
565 case ATTR_DMP_LOW_POWER_GYRO_ON:
566 st->chip_config.low_power_gyro_on = !!data;
568 case ATTR_DEBUG_DATA_COLLECTION_MODE:
569 st->chip_config.debug_data_collection_mode_on = !!data;
571 case ATTR_DEBUG_DATA_COLLECTION_GYRO_RATE:
572 st->chip_config.debug_data_collection_gyro_freq = data;
574 case ATTR_DEBUG_DATA_COLLECTION_ACCEL_RATE:
575 st->chip_config.debug_data_collection_accel_freq = data;
577 case ATTR_DMP_REF_MAG_3D:
578 st->ref_mag_3d = data;
580 case ATTR_DMP_DEBUG_DETERMINE_ENGINE_ON:
581 st->debug_determine_engine_on = !!data;
583 case ATTR_GYRO_SCALE:
586 st->chip_config.fsr = data;
587 result = inv_set_gyro_sf(st);
590 case ATTR_ACCEL_SCALE:
593 st->chip_config.accel_fs = data;
594 result = inv_set_accel_sf(st);
597 case ATTR_DMP_PED_INT_ON:
598 result = inv_write_cntl(st, PEDOMETER_INT_EN << 8, !!data,
602 st->ped.int_on = !!data;
605 case ATTR_DMP_PED_STEP_THRESH:
606 result = inv_write_2bytes(st, PEDSTD_SB, data);
609 st->ped.step_thresh = data;
612 case ATTR_DMP_PED_INT_THRESH:
613 result = inv_write_2bytes(st, PEDSTD_SB2, data);
616 st->ped.int_thresh = data;
619 case ATTR_DMP_SMD_TIMER_THLD:
622 result = write_be32_to_mem(st, data, SMD_TIMER_THLD);
625 st->smd.timer_thresh = data;
630 st->trigger_state = MISC_TRIGGER;
631 result = set_inv_enable(indio_dev);
637 * inv_misc_attr_store() - calling this function will store current
638 * dmp parameter settings
640 static ssize_t inv_misc_attr_store(struct device *dev,
641 struct device_attribute *attr, const char *buf, size_t count)
643 struct iio_dev *indio_dev = dev_get_drvdata(dev);
646 mutex_lock(&indio_dev->mlock);
647 result = _misc_attr_store(dev, attr, buf, count);
648 mutex_unlock(&indio_dev->mlock);
655 static ssize_t _debug_attr_store(struct device *dev,
656 struct device_attribute *attr, const char *buf, size_t count)
658 struct iio_dev *indio_dev = dev_get_drvdata(dev);
659 struct inv_mpu_state *st = iio_priv(indio_dev);
660 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
663 if (!st->chip_config.firmware_loaded)
665 if (!st->debug_determine_engine_on)
668 result = kstrtoint(buf, 10, &data);
671 switch (this_attr->address) {
672 case ATTR_DMP_IN_ANGLVEL_ACCURACY_ENABLE:
673 st->sensor_accuracy[SENSOR_GYRO_ACCURACY].on = !!data;
675 case ATTR_DMP_IN_ACCEL_ACCURACY_ENABLE:
676 st->sensor_accuracy[SENSOR_ACCEL_ACCURACY].on = !!data;
678 case ATTR_DMP_IN_MAGN_ACCURACY_ENABLE:
679 st->sensor_accuracy[SENSOR_COMPASS_ACCURACY].on = !!data;
681 case ATTR_DMP_ACCEL_CAL_ENABLE:
682 st->accel_cal_enable = !!data;
684 case ATTR_DMP_GYRO_CAL_ENABLE:
685 st->gyro_cal_enable = !!data;
687 case ATTR_DMP_COMPASS_CAL_ENABLE:
688 st->compass_cal_enable = !!data;
690 case ATTR_DMP_EVENT_INT_ON:
691 st->chip_config.dmp_event_int_on = !!data;
694 st->chip_config.dmp_on = !!data;
696 case ATTR_GYRO_ENABLE:
697 st->chip_config.gyro_enable = !!data;
699 case ATTR_ACCEL_ENABLE:
700 st->chip_config.accel_enable = !!data;
702 case ATTR_COMPASS_ENABLE:
703 st->chip_config.compass_enable = !!data;
708 st->trigger_state = DEBUG_TRIGGER;
709 result = set_inv_enable(indio_dev);
717 * inv_debug_attr_store() - calling this function will store current
718 * dmp parameter settings
720 static ssize_t inv_debug_attr_store(struct device *dev,
721 struct device_attribute *attr, const char *buf, size_t count)
723 struct iio_dev *indio_dev = dev_get_drvdata(dev);
726 mutex_lock(&indio_dev->mlock);
727 result = _debug_attr_store(dev, attr, buf, count);
728 mutex_unlock(&indio_dev->mlock);
733 static int inv_rate_convert(struct inv_mpu_state *st, int ind, int data)
735 int t, out, out1, out2;
737 out = MPU_INIT_SENSOR_RATE;
738 if ((SENSOR_COMPASS == ind) || (SENSOR_CALIB_COMPASS == ind)) {
739 if ((MSEC_PER_SEC / st->slave_compass->rate_scale) < data)
740 out = MSEC_PER_SEC / st->slave_compass->rate_scale;
743 } else if (SENSOR_ALS == ind) {
744 if (data > MAX_ALS_RATE)
748 } else if (SENSOR_PRESSURE == ind) {
749 if (data > MAX_PRESSURE_RATE)
750 out = MAX_PRESSURE_RATE;
754 t = MPU_DEFAULT_DMP_FREQ / data;
757 out1 = MPU_DEFAULT_DMP_FREQ / (t + 1);
758 out2 = MPU_DEFAULT_DMP_FREQ / t;
759 if (abs(out1 - data) < abs(out2 - data))
768 static ssize_t inv_sensor_rate_show(struct device *dev,
769 struct device_attribute *attr, char *buf)
771 struct iio_dev *indio_dev = dev_get_drvdata(dev);
772 struct inv_mpu_state *st = iio_priv(indio_dev);
773 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
775 return sprintf(buf, "%d\n", st->sensor[this_attr->address].rate);
777 static ssize_t inv_sensor_rate_store(struct device *dev,
778 struct device_attribute *attr, const char *buf, size_t count)
780 struct iio_dev *indio_dev = dev_get_drvdata(dev);
781 struct inv_mpu_state *st = iio_priv(indio_dev);
782 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
786 if (!st->chip_config.firmware_loaded) {
787 pr_err("sensor_rate_store: firmware not loaded\n");
790 result = kstrtoint(buf, 10, &data);
794 pr_err("sensor_rate_store: invalid data=%d\n", data);
797 ind = this_attr->address;
798 rate = inv_rate_convert(st, ind, data);
799 if (rate == st->sensor[ind].rate)
801 mutex_lock(&indio_dev->mlock);
802 st->sensor[ind].rate = rate;
803 if (!st->sensor[ind].on) {
804 mutex_unlock(&indio_dev->mlock);
808 st->trigger_state = DATA_TRIGGER;
809 result = set_inv_enable(indio_dev);
810 mutex_unlock(&indio_dev->mlock);
817 static ssize_t inv_sensor_on_show(struct device *dev,
818 struct device_attribute *attr, char *buf)
820 struct iio_dev *indio_dev = dev_get_drvdata(dev);
821 struct inv_mpu_state *st = iio_priv(indio_dev);
822 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
824 return sprintf(buf, "%d\n", st->sensor[this_attr->address].on);
826 static ssize_t inv_sensor_on_store(struct device *dev,
827 struct device_attribute *attr, const char *buf, size_t count)
829 struct iio_dev *indio_dev = dev_get_drvdata(dev);
830 struct inv_mpu_state *st = iio_priv(indio_dev);
831 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
835 if (!st->chip_config.firmware_loaded) {
836 pr_err("sensor_on store: firmware not loaded\n");
839 result = kstrtoint(buf, 10, &data);
843 pr_err("sensor_on_store: invalid data=%d\n", data);
846 ind = this_attr->address;
848 if (on == st->sensor[ind].on)
850 mutex_lock(&indio_dev->mlock);
851 st->sensor[ind].on = on;
852 if (on && (!st->sensor[ind].rate)) {
853 mutex_unlock(&indio_dev->mlock);
856 st->trigger_state = RATE_TRIGGER;
857 result = set_inv_enable(indio_dev);
858 mutex_unlock(&indio_dev->mlock);
865 static ssize_t _basic_attr_store(struct device *dev,
866 struct device_attribute *attr, const char *buf, size_t count)
868 struct iio_dev *indio_dev = dev_get_drvdata(dev);
869 struct inv_mpu_state *st = iio_priv(indio_dev);
870 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
874 if (!st->chip_config.firmware_loaded)
876 result = kstrtoint(buf, 10, &data);
877 if (result || (data < 0))
880 switch (this_attr->address) {
881 case ATTR_DMP_PED_ON:
882 if ((!!data) == st->ped.on)
886 case ATTR_DMP_SMD_ENABLE:
887 if ((!!data) == st->smd.on)
891 case ATTR_DMP_STEP_DETECTOR_ON:
892 if ((!!data) == st->chip_config.step_detector_on)
894 st->chip_config.step_detector_on = !!data;
896 case ATTR_DMP_STEP_INDICATOR_ON:
897 if ((!!data) == st->chip_config.step_indicator_on)
899 st->chip_config.step_indicator_on = !!data;
901 case ATTR_DMP_BATCHMODE_TIMEOUT:
902 if (data == st->batch.timeout)
904 st->batch.timeout = data;
910 st->trigger_state = EVENT_TRIGGER;
911 result = set_inv_enable(indio_dev);
919 * inv_basic_attr_store() - calling this function will store current
920 * non-dmp parameter settings
922 static ssize_t inv_basic_attr_store(struct device *dev,
923 struct device_attribute *attr, const char *buf, size_t count)
925 struct iio_dev *indio_dev = dev_get_drvdata(dev);
928 mutex_lock(&indio_dev->mlock);
929 result = _basic_attr_store(dev, attr, buf, count);
931 mutex_unlock(&indio_dev->mlock);
937 * inv_attr_bias_show() - calling this function will show current
938 * dmp gyro/accel bias.
940 static ssize_t inv_attr_bias_show(struct device *dev,
941 struct device_attribute *attr, char *buf)
943 struct iio_dev *indio_dev = dev_get_drvdata(dev);
944 struct inv_mpu_state *st = iio_priv(indio_dev);
945 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
946 int axes, addr, result, dmp_bias;
949 switch (this_attr->address) {
950 case ATTR_ANGLVEL_X_CALIBBIAS:
951 return sprintf(buf, "%d\n", st->gyro_bias[0]);
952 case ATTR_ANGLVEL_Y_CALIBBIAS:
953 return sprintf(buf, "%d\n", st->gyro_bias[1]);
954 case ATTR_ANGLVEL_Z_CALIBBIAS:
955 return sprintf(buf, "%d\n", st->gyro_bias[2]);
956 case ATTR_ACCEL_X_CALIBBIAS:
957 return sprintf(buf, "%d\n", st->accel_bias[0]);
958 case ATTR_ACCEL_Y_CALIBBIAS:
959 return sprintf(buf, "%d\n", st->accel_bias[1]);
960 case ATTR_ACCEL_Z_CALIBBIAS:
961 return sprintf(buf, "%d\n", st->accel_bias[2]);
962 case ATTR_DMP_ACCEL_X_DMP_BIAS:
965 sensor_type = SENSOR_ACCEL;
967 case ATTR_DMP_ACCEL_Y_DMP_BIAS:
970 sensor_type = SENSOR_ACCEL;
972 case ATTR_DMP_ACCEL_Z_DMP_BIAS:
975 sensor_type = SENSOR_ACCEL;
977 case ATTR_DMP_GYRO_X_DMP_BIAS:
980 sensor_type = SENSOR_GYRO;
982 case ATTR_DMP_GYRO_Y_DMP_BIAS:
985 sensor_type = SENSOR_GYRO;
987 case ATTR_DMP_GYRO_Z_DMP_BIAS:
990 sensor_type = SENSOR_GYRO;
992 case ATTR_DMP_MAGN_X_DMP_BIAS:
995 sensor_type = SENSOR_COMPASS;
997 case ATTR_DMP_MAGN_Y_DMP_BIAS:
1000 sensor_type = SENSOR_COMPASS;
1002 case ATTR_DMP_MAGN_Z_DMP_BIAS:
1004 addr = CPASS_BIAS_Z;
1005 sensor_type = SENSOR_COMPASS;
1010 result = inv_switch_power_in_lp(st, true);
1013 result = read_be32_from_mem(st, &dmp_bias, addr);
1016 inv_switch_power_in_lp(st, false);
1017 if (SENSOR_GYRO == sensor_type)
1018 st->input_gyro_dmp_bias[axes] = dmp_bias;
1019 else if (SENSOR_ACCEL == sensor_type)
1020 st->input_accel_dmp_bias[axes] = dmp_bias;
1021 else if (SENSOR_COMPASS == sensor_type)
1022 st->input_compass_dmp_bias[axes] = dmp_bias;
1026 return sprintf(buf, "%d\n", dmp_bias);
1030 * inv_attr_show() - calling this function will show current
1033 static ssize_t inv_attr_show(struct device *dev,
1034 struct device_attribute *attr, char *buf)
1036 struct iio_dev *indio_dev = dev_get_drvdata(dev);
1037 struct inv_mpu_state *st = iio_priv(indio_dev);
1038 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
1042 switch (this_attr->address) {
1043 case ATTR_GYRO_SCALE:
1045 const s16 gyro_scale[] = {250, 500, 1000, 2000};
1047 return sprintf(buf, "%d\n", gyro_scale[st->chip_config.fsr]);
1049 case ATTR_ACCEL_SCALE:
1051 const s16 accel_scale[] = {2, 4, 8, 16};
1052 return sprintf(buf, "%d\n",
1053 accel_scale[st->chip_config.accel_fs]);
1055 case ATTR_COMPASS_SCALE:
1056 st->slave_compass->get_scale(st, &result);
1058 return sprintf(buf, "%d\n", result);
1059 case ATTR_GYRO_ENABLE:
1060 return sprintf(buf, "%d\n", st->chip_config.gyro_enable);
1061 case ATTR_ACCEL_ENABLE:
1062 return sprintf(buf, "%d\n", st->chip_config.accel_enable);
1063 case ATTR_DMP_ACCEL_CAL_ENABLE:
1064 return sprintf(buf, "%d\n", st->accel_cal_enable);
1065 case ATTR_DMP_GYRO_CAL_ENABLE:
1066 return sprintf(buf, "%d\n", st->gyro_cal_enable);
1067 case ATTR_DMP_COMPASS_CAL_ENABLE:
1068 return sprintf(buf, "%d\n", st->compass_cal_enable);
1069 case ATTR_DMP_DEBUG_DETERMINE_ENGINE_ON:
1070 return sprintf(buf, "%d\n", st->debug_determine_engine_on);
1071 case ATTR_DMP_PARAMS_ACCEL_CALIBRATION_THRESHOLD:
1072 return sprintf(buf, "%d\n", st->accel_calib_threshold);
1073 case ATTR_DMP_PARAMS_ACCEL_CALIBRATION_RATE:
1074 return sprintf(buf, "%d\n", st->accel_calib_rate);
1075 case ATTR_FIRMWARE_LOADED:
1076 return sprintf(buf, "%d\n", st->chip_config.firmware_loaded);
1078 return sprintf(buf, "%d\n", st->chip_config.dmp_on);
1079 case ATTR_DMP_BATCHMODE_TIMEOUT:
1080 return sprintf(buf, "%d\n", st->batch.timeout);
1081 case ATTR_DMP_EVENT_INT_ON:
1082 return sprintf(buf, "%d\n", st->chip_config.dmp_event_int_on);
1083 case ATTR_DMP_PED_INT_ON:
1084 return sprintf(buf, "%d\n", st->ped.int_on);
1085 case ATTR_DMP_PED_ON:
1086 return sprintf(buf, "%d\n", st->ped.on);
1087 case ATTR_DMP_PED_STEP_THRESH:
1088 return sprintf(buf, "%d\n", st->ped.step_thresh);
1089 case ATTR_DMP_PED_INT_THRESH:
1090 return sprintf(buf, "%d\n", st->ped.int_thresh);
1091 case ATTR_DMP_SMD_ENABLE:
1092 return sprintf(buf, "%d\n", st->smd.on);
1093 case ATTR_DMP_SMD_TIMER_THLD:
1094 return sprintf(buf, "%d\n", st->smd.timer_thresh);
1095 case ATTR_DMP_LOW_POWER_GYRO_ON:
1096 return sprintf(buf, "%d\n", st->chip_config.low_power_gyro_on);
1097 case ATTR_DEBUG_DATA_COLLECTION_MODE:
1098 return sprintf(buf, "%d\n",
1099 st->chip_config.debug_data_collection_mode_on);
1100 case ATTR_DEBUG_DATA_COLLECTION_GYRO_RATE:
1101 return sprintf(buf, "%d\n",
1102 st->chip_config.debug_data_collection_gyro_freq);
1103 case ATTR_DEBUG_DATA_COLLECTION_ACCEL_RATE:
1104 return sprintf(buf, "%d\n",
1105 st->chip_config.debug_data_collection_accel_freq);
1106 case ATTR_DMP_LP_EN_OFF:
1107 return sprintf(buf, "%d\n", st->chip_config.lp_en_mode_off);
1108 case ATTR_DMP_CYCLE_MODE_OFF:
1109 return sprintf(buf, "%d\n", st->chip_config.cycle_mode_off);
1110 case ATTR_COMPASS_ENABLE:
1111 return sprintf(buf, "%d\n", st->chip_config.compass_enable);
1112 case ATTR_DMP_STEP_INDICATOR_ON:
1113 return sprintf(buf, "%d\n", st->chip_config.step_indicator_on);
1114 case ATTR_DMP_STEP_DETECTOR_ON:
1115 return sprintf(buf, "%d\n", st->chip_config.step_detector_on);
1116 case ATTR_DMP_IN_ANGLVEL_ACCURACY_ENABLE:
1117 return sprintf(buf, "%d\n",
1118 st->sensor_accuracy[SENSOR_GYRO_ACCURACY].on);
1119 case ATTR_DMP_IN_ACCEL_ACCURACY_ENABLE:
1120 return sprintf(buf, "%d\n",
1121 st->sensor_accuracy[SENSOR_ACCEL_ACCURACY].on);
1122 case ATTR_DMP_IN_MAGN_ACCURACY_ENABLE:
1123 return sprintf(buf, "%d\n",
1124 st->sensor_accuracy[SENSOR_COMPASS_ACCURACY].on);
1125 case ATTR_GYRO_MATRIX:
1126 m = st->plat_data.orientation;
1127 return sprintf(buf, "%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
1128 m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]);
1129 case ATTR_ACCEL_MATRIX:
1130 m = st->plat_data.orientation;
1131 return sprintf(buf, "%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
1132 m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]);
1133 case ATTR_COMPASS_MATRIX:
1134 if (st->plat_data.sec_slave_type ==
1135 SECONDARY_SLAVE_TYPE_COMPASS)
1137 st->plat_data.secondary_orientation;
1140 return sprintf(buf, "%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
1141 m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]);
1142 case ATTR_SECONDARY_NAME:
1144 const char *n[] = {"NULL", "AK8975", "AK8972", "AK8963",
1145 "MLX90399", "AK09911", "AK09912"};
1147 switch (st->plat_data.sec_slave_id) {
1148 case COMPASS_ID_AK8975:
1149 return sprintf(buf, "%s\n", n[1]);
1150 case COMPASS_ID_AK8972:
1151 return sprintf(buf, "%s\n", n[2]);
1152 case COMPASS_ID_AK8963:
1153 return sprintf(buf, "%s\n", n[3]);
1154 case COMPASS_ID_MLX90399:
1155 return sprintf(buf, "%s\n", n[4]);
1156 case COMPASS_ID_AK09911:
1157 return sprintf(buf, "%s\n", n[5]);
1158 case COMPASS_ID_AK09912:
1159 return sprintf(buf, "%s\n", n[6]);
1161 return sprintf(buf, "%s\n", n[0]);
1164 case ATTR_DMP_REF_MAG_3D:
1167 inv_switch_power_in_lp(st, true);
1168 result = read_be32_from_mem(st, &out, CPASS_REF_MAG_3D);
1171 inv_switch_power_in_lp(st, false);
1172 return sprintf(buf, "%d\n", out);
1174 case ATTR_DMP_DEBUG_MEM_READ:
1178 inv_switch_power_in_lp(st, true);
1179 result = read_be32_from_mem(st, &out, debug_mem_read_addr);
1182 inv_switch_power_in_lp(st, false);
1183 return sprintf(buf, "0x%x\n", out);
1186 return sprintf(buf, "%d\n", st->gyro_sf);
1192 static ssize_t inv_attr64_show(struct device *dev,
1193 struct device_attribute *attr, char *buf)
1195 struct iio_dev *indio_dev = dev_get_drvdata(dev);
1196 struct inv_mpu_state *st = iio_priv(indio_dev);
1197 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
1202 mutex_lock(&indio_dev->mlock);
1203 if (!st->chip_config.dmp_on) {
1204 mutex_unlock(&indio_dev->mlock);
1208 switch (this_attr->address) {
1209 case ATTR_DMP_PEDOMETER_STEPS:
1210 inv_switch_power_in_lp(st, true);
1211 result = inv_get_pedometer_steps(st, &ped);
1212 result |= inv_read_pedometer_counter(st);
1213 tmp = (u64)st->ped.step + (u64)ped;
1214 inv_switch_power_in_lp(st, false);
1216 case ATTR_DMP_PEDOMETER_TIME:
1217 inv_switch_power_in_lp(st, true);
1218 result = inv_get_pedometer_time(st, &ped);
1219 tmp = (u64)st->ped.time + ((u64)ped) * MS_PER_PED_TICKS;
1220 inv_switch_power_in_lp(st, false);
1222 case ATTR_DMP_PEDOMETER_COUNTER:
1223 tmp = st->ped.last_step_time;
1231 mutex_unlock(&indio_dev->mlock);
1234 return sprintf(buf, "%lld\n", tmp);
1237 static ssize_t inv_attr64_store(struct device *dev,
1238 struct device_attribute *attr, const char *buf, size_t count)
1240 struct iio_dev *indio_dev = dev_get_drvdata(dev);
1241 struct inv_mpu_state *st = iio_priv(indio_dev);
1242 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
1244 u8 d[4] = {0, 0, 0, 0};
1247 mutex_lock(&indio_dev->mlock);
1248 if (!st->chip_config.firmware_loaded) {
1249 mutex_unlock(&indio_dev->mlock);
1252 result = inv_switch_power_in_lp(st, true);
1254 mutex_unlock(&indio_dev->mlock);
1257 result = kstrtoull(buf, 10, &data);
1259 goto attr64_store_fail;
1260 switch (this_attr->address) {
1261 case ATTR_DMP_PEDOMETER_STEPS:
1262 result = mem_w(PEDSTD_STEPCTR, ARRAY_SIZE(d), d);
1264 goto attr64_store_fail;
1265 st->ped.step = data;
1267 case ATTR_DMP_PEDOMETER_TIME:
1268 result = mem_w(PEDSTD_TIMECTR, ARRAY_SIZE(d), d);
1270 goto attr64_store_fail;
1271 st->ped.time = data;
1278 mutex_unlock(&indio_dev->mlock);
1279 result = inv_switch_power_in_lp(st, false);
1286 static ssize_t inv_self_test(struct device *dev,
1287 struct device_attribute *attr, char *buf)
1289 struct iio_dev *indio_dev = dev_get_drvdata(dev);
1290 struct inv_mpu_state *st = iio_priv(indio_dev);
1293 mutex_lock(&indio_dev->mlock);
1294 res = inv_hw_self_test(st);
1295 set_inv_enable(indio_dev);
1296 mutex_unlock(&indio_dev->mlock);
1298 return sprintf(buf, "%d\n", res);
1302 * inv_temperature_show() - Read temperature data directly from registers.
1304 static ssize_t inv_temperature_show(struct device *dev,
1305 struct device_attribute *attr, char *buf)
1308 struct iio_dev *indio_dev = dev_get_drvdata(dev);
1309 struct inv_mpu_state *st = iio_priv(indio_dev);
1310 int result, scale_t;
1314 mutex_lock(&indio_dev->mlock);
1315 result = inv_switch_power_in_lp(st, true);
1317 mutex_unlock(&indio_dev->mlock);
1321 result = inv_plat_read(st, REG_TEMPERATURE, 2, data);
1322 mutex_unlock(&indio_dev->mlock);
1324 pr_err("Could not read temperature register.\n");
1327 result = inv_switch_power_in_lp(st, false);
1330 temp = (s16)(be16_to_cpup((short *)&data[0]));
1331 scale_t = TEMPERATURE_OFFSET +
1332 inv_q30_mult((int)temp << MPU_TEMP_SHIFT, TEMPERATURE_SCALE);
1334 INV_I2C_INC_TEMPREAD(1);
1336 return sprintf(buf, "%d %lld\n", scale_t, get_time_ns());
1340 * inv_smd_show() - calling this function showes smd interrupt.
1341 * This event must use poll.
1343 static ssize_t inv_smd_show(struct device *dev,
1344 struct device_attribute *attr, char *buf)
1346 return sprintf(buf, "1\n");
1350 * inv_ped_show() - calling this function showes pedometer interrupt.
1351 * This event must use poll.
1353 static ssize_t inv_ped_show(struct device *dev,
1354 struct device_attribute *attr, char *buf)
1356 return sprintf(buf, "1\n");
1360 * inv_reg_dump_show() - Register dump for testing.
1362 static ssize_t inv_reg_dump_show(struct device *dev,
1363 struct device_attribute *attr, char *buf)
1367 ssize_t bytes_printed = 0;
1368 struct iio_dev *indio_dev = dev_get_drvdata(dev);
1369 struct inv_mpu_state *st = iio_priv(indio_dev);
1371 mutex_lock(&indio_dev->mlock);
1372 inv_set_bank(st, BANK_SEL_0);
1373 bytes_printed += sprintf(buf + bytes_printed, "bank 0\n");
1375 for (ii = 0; ii < 0x7F; ii++) {
1376 /* don't read fifo r/w register */
1377 if ((ii == REG_MEM_R_W) || (ii == REG_FIFO_R_W))
1380 inv_plat_read(st, ii, 1, &data);
1381 bytes_printed += sprintf(buf + bytes_printed, "%#2x: %#2x\n",
1384 inv_set_bank(st, BANK_SEL_1);
1385 bytes_printed += sprintf(buf + bytes_printed, "bank 1\n");
1386 for (ii = 0; ii < 0x2A; ii++) {
1387 inv_plat_read(st, ii, 1, &data);
1388 bytes_printed += sprintf(buf + bytes_printed, "%#2x: %#2x\n",
1391 inv_set_bank(st, BANK_SEL_2);
1392 bytes_printed += sprintf(buf + bytes_printed, "bank 2\n");
1393 for (ii = 0; ii < 0x55; ii++) {
1394 inv_plat_read(st, ii, 1, &data);
1395 bytes_printed += sprintf(buf + bytes_printed, "%#2x: %#2x\n",
1398 inv_set_bank(st, BANK_SEL_3);
1399 bytes_printed += sprintf(buf + bytes_printed, "bank 3\n");
1400 for (ii = 0; ii < 0x18; ii++) {
1401 inv_plat_read(st, ii, 1, &data);
1402 bytes_printed += sprintf(buf + bytes_printed, "%#2x: %#2x\n",
1405 inv_set_bank(st, BANK_SEL_0);
1406 set_inv_enable(indio_dev);
1407 mutex_unlock(&indio_dev->mlock);
1409 return bytes_printed;
1412 static ssize_t inv_flush_batch_show(struct device *dev,
1413 struct device_attribute *attr, char *buf)
1415 struct iio_dev *indio_dev = dev_get_drvdata(dev);
1419 mutex_lock(&indio_dev->mlock);
1420 result = inv_flush_batch_data(indio_dev, &has_data);
1421 mutex_unlock(&indio_dev->mlock);
1423 return sprintf(buf, "%d\n", result);
1425 return sprintf(buf, "%d\n", has_data);
1428 static const struct iio_chan_spec inv_mpu_channels[] = {
1429 IIO_CHAN_SOFT_TIMESTAMP(INV_MPU_SCAN_TIMESTAMP),
1432 static DEVICE_ATTR(poll_smd, S_IRUGO, inv_smd_show, NULL);
1433 static DEVICE_ATTR(poll_pedometer, S_IRUGO, inv_ped_show, NULL);
1435 /* special run time sysfs entry, read only */
1436 static DEVICE_ATTR(misc_flush_batch, S_IRUGO, inv_flush_batch_show, NULL);
1438 static DEVICE_ATTR(debug_reg_dump, S_IRUGO | S_IWUGO, inv_reg_dump_show, NULL);
1439 static DEVICE_ATTR(out_temperature, S_IRUGO | S_IWUGO,
1440 inv_temperature_show, NULL);
1441 static DEVICE_ATTR(misc_self_test, S_IRUGO | S_IWUGO, inv_self_test, NULL);
1443 static IIO_DEVICE_ATTR(info_anglvel_matrix, S_IRUGO, inv_attr_show, NULL,
1445 static IIO_DEVICE_ATTR(info_accel_matrix, S_IRUGO, inv_attr_show, NULL,
1447 static IIO_DEVICE_ATTR(info_magn_matrix, S_IRUGO, inv_attr_show, NULL,
1448 ATTR_COMPASS_MATRIX);
1449 static IIO_DEVICE_ATTR(info_secondary_name, S_IRUGO, inv_attr_show, NULL,
1450 ATTR_SECONDARY_NAME);
1451 static IIO_DEVICE_ATTR(info_gyro_sf, S_IRUGO, inv_attr_show, NULL,
1454 /* sensor on/off sysfs control */
1455 static IIO_DEVICE_ATTR(in_accel_enable, S_IRUGO | S_IWUGO,
1456 inv_sensor_on_show, inv_sensor_on_store, SENSOR_ACCEL);
1457 static IIO_DEVICE_ATTR(in_anglvel_enable, S_IRUGO | S_IWUGO,
1458 inv_sensor_on_show, inv_sensor_on_store, SENSOR_GYRO);
1459 static IIO_DEVICE_ATTR(in_magn_enable, S_IRUGO | S_IWUGO,
1460 inv_sensor_on_show, inv_sensor_on_store, SENSOR_COMPASS);
1461 static IIO_DEVICE_ATTR(in_6quat_enable, S_IRUGO | S_IWUGO,
1462 inv_sensor_on_show, inv_sensor_on_store, SENSOR_SIXQ);
1463 static IIO_DEVICE_ATTR(in_9quat_enable, S_IRUGO | S_IWUGO,
1464 inv_sensor_on_show, inv_sensor_on_store, SENSOR_NINEQ);
1465 static IIO_DEVICE_ATTR(in_geomag_enable, S_IRUGO | S_IWUGO,
1466 inv_sensor_on_show, inv_sensor_on_store, SENSOR_GEOMAG);
1467 static IIO_DEVICE_ATTR(in_p6quat_enable, S_IRUGO | S_IWUGO,
1468 inv_sensor_on_show, inv_sensor_on_store, SENSOR_PEDQ);
1469 static IIO_DEVICE_ATTR(in_pressure_enable, S_IRUGO | S_IWUGO,
1470 inv_sensor_on_show, inv_sensor_on_store, SENSOR_PRESSURE);
1471 static IIO_DEVICE_ATTR(in_als_px_enable, S_IRUGO | S_IWUGO,
1472 inv_sensor_on_show, inv_sensor_on_store, SENSOR_ALS);
1473 static IIO_DEVICE_ATTR(in_calib_anglvel_enable, S_IRUGO | S_IWUGO,
1474 inv_sensor_on_show, inv_sensor_on_store, SENSOR_CALIB_GYRO);
1475 static IIO_DEVICE_ATTR(in_calib_magn_enable, S_IRUGO | S_IWUGO,
1476 inv_sensor_on_show, inv_sensor_on_store, SENSOR_CALIB_COMPASS);
1478 /* sensor rate sysfs control */
1479 static IIO_DEVICE_ATTR(in_accel_rate, S_IRUGO | S_IWUGO,
1480 inv_sensor_rate_show, inv_sensor_rate_store, SENSOR_ACCEL);
1481 static IIO_DEVICE_ATTR(in_anglvel_rate, S_IRUGO | S_IWUGO,
1482 inv_sensor_rate_show, inv_sensor_rate_store, SENSOR_GYRO);
1483 static IIO_DEVICE_ATTR(in_magn_rate, S_IRUGO | S_IWUGO,
1484 inv_sensor_rate_show, inv_sensor_rate_store, SENSOR_COMPASS);
1485 static IIO_DEVICE_ATTR(in_6quat_rate, S_IRUGO | S_IWUGO,
1486 inv_sensor_rate_show, inv_sensor_rate_store, SENSOR_SIXQ);
1487 static IIO_DEVICE_ATTR(in_9quat_rate, S_IRUGO | S_IWUGO,
1488 inv_sensor_rate_show, inv_sensor_rate_store, SENSOR_NINEQ);
1489 static IIO_DEVICE_ATTR(in_geomag_rate, S_IRUGO | S_IWUGO,
1490 inv_sensor_rate_show, inv_sensor_rate_store, SENSOR_GEOMAG);
1491 static IIO_DEVICE_ATTR(in_p6quat_rate, S_IRUGO | S_IWUGO,
1492 inv_sensor_rate_show, inv_sensor_rate_store, SENSOR_PEDQ);
1493 static IIO_DEVICE_ATTR(in_pressure_rate, S_IRUGO | S_IWUGO,
1494 inv_sensor_rate_show, inv_sensor_rate_store, SENSOR_PRESSURE);
1495 static IIO_DEVICE_ATTR(in_als_px_rate, S_IRUGO | S_IWUGO,
1496 inv_sensor_rate_show, inv_sensor_rate_store, SENSOR_ALS);
1497 static IIO_DEVICE_ATTR(in_calib_anglvel_rate, S_IRUGO | S_IWUGO,
1498 inv_sensor_rate_show, inv_sensor_rate_store, SENSOR_CALIB_GYRO);
1499 static IIO_DEVICE_ATTR(in_calib_magn_rate, S_IRUGO | S_IWUGO,
1500 inv_sensor_rate_show, inv_sensor_rate_store, SENSOR_CALIB_COMPASS);
1502 /* debug determine engine related sysfs */
1503 static IIO_DEVICE_ATTR(debug_anglvel_accuracy_enable, S_IRUGO | S_IWUGO,
1504 inv_attr_show, inv_debug_attr_store,
1505 ATTR_DMP_IN_ANGLVEL_ACCURACY_ENABLE);
1506 static IIO_DEVICE_ATTR(debug_accel_accuracy_enable, S_IRUGO | S_IWUGO,
1507 inv_attr_show, inv_debug_attr_store, ATTR_DMP_IN_ACCEL_ACCURACY_ENABLE);
1508 static IIO_DEVICE_ATTR(debug_magn_accuracy_enable, S_IRUGO | S_IWUGO,
1509 inv_attr_show, inv_debug_attr_store, ATTR_DMP_IN_MAGN_ACCURACY_ENABLE);
1510 static IIO_DEVICE_ATTR(debug_gyro_cal_enable, S_IRUGO | S_IWUGO,
1511 inv_attr_show, inv_debug_attr_store, ATTR_DMP_GYRO_CAL_ENABLE);
1512 static IIO_DEVICE_ATTR(debug_accel_cal_enable, S_IRUGO | S_IWUGO,
1513 inv_attr_show, inv_debug_attr_store, ATTR_DMP_ACCEL_CAL_ENABLE);
1514 static IIO_DEVICE_ATTR(debug_compass_cal_enable, S_IRUGO | S_IWUGO,
1515 inv_attr_show, inv_debug_attr_store, ATTR_DMP_COMPASS_CAL_ENABLE);
1516 static IIO_DEVICE_ATTR(misc_magn_recalibration, S_IRUGO | S_IWUGO, NULL,
1517 inv_dmp_bias_store, ATTR_DMP_MISC_COMPASS_RECALIBRATION);
1518 static IIO_DEVICE_ATTR(misc_ref_mag_3d, S_IRUGO | S_IWUGO,
1519 inv_attr_show, inv_misc_attr_store, ATTR_DMP_REF_MAG_3D);
1521 static IIO_DEVICE_ATTR(debug_gyro_enable, S_IRUGO | S_IWUGO,
1522 inv_attr_show, inv_debug_attr_store, ATTR_GYRO_ENABLE);
1523 static IIO_DEVICE_ATTR(debug_accel_enable, S_IRUGO | S_IWUGO,
1524 inv_attr_show, inv_debug_attr_store, ATTR_ACCEL_ENABLE);
1525 static IIO_DEVICE_ATTR(debug_compass_enable, S_IRUGO | S_IWUGO,
1526 inv_attr_show, inv_debug_attr_store, ATTR_COMPASS_ENABLE);
1527 static IIO_DEVICE_ATTR(debug_dmp_on, S_IRUGO | S_IWUGO,
1528 inv_attr_show, inv_debug_attr_store, ATTR_DMP_ON);
1529 static IIO_DEVICE_ATTR(debug_dmp_event_int_on, S_IRUGO | S_IWUGO,
1530 inv_attr_show, inv_debug_attr_store, ATTR_DMP_EVENT_INT_ON);
1531 static IIO_DEVICE_ATTR(debug_mem_read, S_IRUGO | S_IWUGO,
1532 inv_attr_show, inv_dmp_bias_store, ATTR_DMP_DEBUG_MEM_READ);
1533 static IIO_DEVICE_ATTR(debug_mem_write, S_IRUGO | S_IWUGO,
1534 inv_attr_show, inv_dmp_bias_store, ATTR_DMP_DEBUG_MEM_WRITE);
1536 static IIO_DEVICE_ATTR(misc_batchmode_timeout, S_IRUGO | S_IWUGO,
1537 inv_attr_show, inv_basic_attr_store, ATTR_DMP_BATCHMODE_TIMEOUT);
1539 static IIO_DEVICE_ATTR(info_firmware_loaded, S_IRUGO | S_IWUGO, inv_attr_show,
1540 inv_firmware_loaded_store, ATTR_FIRMWARE_LOADED);
1543 static IIO_DEVICE_ATTR(in_accel_scale, S_IRUGO | S_IWUGO, inv_attr_show,
1544 inv_misc_attr_store, ATTR_ACCEL_SCALE);
1545 static IIO_DEVICE_ATTR(in_anglvel_scale, S_IRUGO | S_IWUGO, inv_attr_show,
1546 inv_misc_attr_store, ATTR_GYRO_SCALE);
1547 static IIO_DEVICE_ATTR(in_magn_scale, S_IRUGO | S_IWUGO, inv_attr_show,
1548 NULL, ATTR_COMPASS_SCALE);
1550 static IIO_DEVICE_ATTR(debug_low_power_gyro_on, S_IRUGO | S_IWUGO,
1551 inv_attr_show, inv_misc_attr_store, ATTR_DMP_LOW_POWER_GYRO_ON);
1552 static IIO_DEVICE_ATTR(debug_lp_en_off, S_IRUGO | S_IWUGO,
1553 inv_attr_show, inv_debug_store, ATTR_DMP_LP_EN_OFF);
1554 static IIO_DEVICE_ATTR(debug_cycle_mode_off, S_IRUGO | S_IWUGO,
1555 inv_attr_show, inv_debug_store, ATTR_DMP_CYCLE_MODE_OFF);
1556 static IIO_DEVICE_ATTR(debug_clock_sel, S_IRUGO | S_IWUGO,
1557 inv_attr_show, inv_debug_store, ATTR_DMP_CLK_SEL);
1558 static IIO_DEVICE_ATTR(debug_reg_write, S_IRUGO | S_IWUGO,
1559 inv_attr_show, inv_debug_store, ATTR_DEBUG_REG_WRITE);
1560 static IIO_DEVICE_ATTR(debug_cfg_write, S_IRUGO | S_IWUGO,
1561 inv_attr_show, inv_debug_store, ATTR_DEBUG_WRITE_CFG);
1562 static IIO_DEVICE_ATTR(debug_reg_write_addr, S_IRUGO | S_IWUGO,
1563 inv_attr_show, inv_debug_store, ATTR_DEBUG_REG_ADDR);
1564 static IIO_DEVICE_ATTR(debug_data_collection_mode_on, S_IRUGO | S_IWUGO,
1565 inv_attr_show, inv_misc_attr_store, ATTR_DEBUG_DATA_COLLECTION_MODE);
1566 static IIO_DEVICE_ATTR(debug_data_collection_mode_gyro_rate, S_IRUGO | S_IWUGO,
1567 inv_attr_show, inv_misc_attr_store,
1568 ATTR_DEBUG_DATA_COLLECTION_GYRO_RATE);
1569 static IIO_DEVICE_ATTR(debug_data_collection_mode_accel_rate, S_IRUGO | S_IWUGO,
1570 inv_attr_show, inv_misc_attr_store,
1571 ATTR_DEBUG_DATA_COLLECTION_ACCEL_RATE);
1573 static IIO_DEVICE_ATTR(in_accel_x_calibbias, S_IRUGO | S_IWUGO,
1574 inv_attr_bias_show, NULL, ATTR_ACCEL_X_CALIBBIAS);
1575 static IIO_DEVICE_ATTR(in_accel_y_calibbias, S_IRUGO | S_IWUGO,
1576 inv_attr_bias_show, NULL, ATTR_ACCEL_Y_CALIBBIAS);
1577 static IIO_DEVICE_ATTR(in_accel_z_calibbias, S_IRUGO | S_IWUGO,
1578 inv_attr_bias_show, NULL, ATTR_ACCEL_Z_CALIBBIAS);
1580 static IIO_DEVICE_ATTR(in_anglvel_x_calibbias, S_IRUGO | S_IWUGO,
1581 inv_attr_bias_show, NULL, ATTR_ANGLVEL_X_CALIBBIAS);
1582 static IIO_DEVICE_ATTR(in_anglvel_y_calibbias, S_IRUGO | S_IWUGO,
1583 inv_attr_bias_show, NULL, ATTR_ANGLVEL_Y_CALIBBIAS);
1584 static IIO_DEVICE_ATTR(in_anglvel_z_calibbias, S_IRUGO | S_IWUGO,
1585 inv_attr_bias_show, NULL, ATTR_ANGLVEL_Z_CALIBBIAS);
1587 static IIO_DEVICE_ATTR(in_accel_x_dmp_bias, S_IRUGO | S_IWUGO,
1588 inv_attr_bias_show, inv_dmp_bias_store, ATTR_DMP_ACCEL_X_DMP_BIAS);
1589 static IIO_DEVICE_ATTR(in_accel_y_dmp_bias, S_IRUGO | S_IWUGO,
1590 inv_attr_bias_show, inv_dmp_bias_store, ATTR_DMP_ACCEL_Y_DMP_BIAS);
1591 static IIO_DEVICE_ATTR(in_accel_z_dmp_bias, S_IRUGO | S_IWUGO,
1592 inv_attr_bias_show, inv_dmp_bias_store, ATTR_DMP_ACCEL_Z_DMP_BIAS);
1594 static IIO_DEVICE_ATTR(in_anglvel_x_dmp_bias, S_IRUGO | S_IWUGO,
1595 inv_attr_bias_show, inv_dmp_bias_store, ATTR_DMP_GYRO_X_DMP_BIAS);
1596 static IIO_DEVICE_ATTR(in_anglvel_y_dmp_bias, S_IRUGO | S_IWUGO,
1597 inv_attr_bias_show, inv_dmp_bias_store, ATTR_DMP_GYRO_Y_DMP_BIAS);
1598 static IIO_DEVICE_ATTR(in_anglvel_z_dmp_bias, S_IRUGO | S_IWUGO,
1599 inv_attr_bias_show, inv_dmp_bias_store, ATTR_DMP_GYRO_Z_DMP_BIAS);
1601 static IIO_DEVICE_ATTR(in_magn_x_dmp_bias, S_IRUGO | S_IWUGO,
1602 inv_attr_bias_show, inv_dmp_bias_store, ATTR_DMP_MAGN_X_DMP_BIAS);
1603 static IIO_DEVICE_ATTR(in_magn_y_dmp_bias, S_IRUGO | S_IWUGO,
1604 inv_attr_bias_show, inv_dmp_bias_store, ATTR_DMP_MAGN_Y_DMP_BIAS);
1605 static IIO_DEVICE_ATTR(in_magn_z_dmp_bias, S_IRUGO | S_IWUGO,
1606 inv_attr_bias_show, inv_dmp_bias_store, ATTR_DMP_MAGN_Z_DMP_BIAS);
1608 static IIO_DEVICE_ATTR(debug_determine_engine_on, S_IRUGO | S_IWUGO,
1609 inv_attr_show, inv_misc_attr_store, ATTR_DMP_DEBUG_DETERMINE_ENGINE_ON);
1610 static IIO_DEVICE_ATTR(misc_gyro_recalibration, S_IRUGO | S_IWUGO, NULL,
1611 inv_dmp_bias_store, ATTR_DMP_MISC_GYRO_RECALIBRATION);
1612 static IIO_DEVICE_ATTR(misc_accel_recalibration, S_IRUGO | S_IWUGO, NULL,
1613 inv_dmp_bias_store, ATTR_DMP_MISC_ACCEL_RECALIBRATION);
1614 static IIO_DEVICE_ATTR(params_accel_calibration_threshold, S_IRUGO | S_IWUGO,
1615 inv_attr_show, inv_dmp_bias_store,
1616 ATTR_DMP_PARAMS_ACCEL_CALIBRATION_THRESHOLD);
1617 static IIO_DEVICE_ATTR(params_accel_calibration_rate, S_IRUGO | S_IWUGO,
1618 inv_attr_show, inv_dmp_bias_store,
1619 ATTR_DMP_PARAMS_ACCEL_CALIBRATION_RATE);
1621 static IIO_DEVICE_ATTR(in_step_detector_enable, S_IRUGO | S_IWUGO,
1622 inv_attr_show, inv_basic_attr_store, ATTR_DMP_STEP_DETECTOR_ON);
1623 static IIO_DEVICE_ATTR(in_step_indicator_enable, S_IRUGO | S_IWUGO,
1624 inv_attr_show, inv_basic_attr_store, ATTR_DMP_STEP_INDICATOR_ON);
1626 static IIO_DEVICE_ATTR(event_smd_enable, S_IRUGO | S_IWUGO,
1627 inv_attr_show, inv_basic_attr_store, ATTR_DMP_SMD_ENABLE);
1628 static IIO_DEVICE_ATTR(params_smd_timer_thresh, S_IRUGO | S_IWUGO,
1629 inv_attr_show, inv_misc_attr_store, ATTR_DMP_SMD_TIMER_THLD);
1631 static IIO_DEVICE_ATTR(params_pedometer_int_on, S_IRUGO | S_IWUGO,
1632 inv_attr_show, inv_misc_attr_store, ATTR_DMP_PED_INT_ON);
1633 static IIO_DEVICE_ATTR(event_pedometer_enable, S_IRUGO | S_IWUGO,
1634 inv_attr_show, inv_basic_attr_store, ATTR_DMP_PED_ON);
1635 static IIO_DEVICE_ATTR(params_pedometer_step_thresh, S_IRUGO | S_IWUGO,
1636 inv_attr_show, inv_misc_attr_store, ATTR_DMP_PED_STEP_THRESH);
1637 static IIO_DEVICE_ATTR(params_pedometer_int_thresh, S_IRUGO | S_IWUGO,
1638 inv_attr_show, inv_misc_attr_store, ATTR_DMP_PED_INT_THRESH);
1640 static IIO_DEVICE_ATTR(out_pedometer_steps, S_IRUGO | S_IWUGO, inv_attr64_show,
1641 inv_attr64_store, ATTR_DMP_PEDOMETER_STEPS);
1642 static IIO_DEVICE_ATTR(out_pedometer_time, S_IRUGO | S_IWUGO, inv_attr64_show,
1643 inv_attr64_store, ATTR_DMP_PEDOMETER_TIME);
1644 static IIO_DEVICE_ATTR(out_pedometer_counter, S_IRUGO | S_IWUGO,
1645 inv_attr64_show, NULL, ATTR_DMP_PEDOMETER_COUNTER);
1647 static const struct attribute *inv_raw_attributes[] = {
1648 &dev_attr_debug_reg_dump.attr,
1649 &dev_attr_out_temperature.attr,
1650 &dev_attr_misc_flush_batch.attr,
1651 &dev_attr_misc_self_test.attr,
1652 &iio_dev_attr_info_anglvel_matrix.dev_attr.attr,
1653 &iio_dev_attr_debug_gyro_enable.dev_attr.attr,
1654 &iio_dev_attr_in_anglvel_enable.dev_attr.attr,
1655 &iio_dev_attr_debug_accel_enable.dev_attr.attr,
1656 &iio_dev_attr_in_accel_enable.dev_attr.attr,
1657 &iio_dev_attr_info_accel_matrix.dev_attr.attr,
1658 &iio_dev_attr_in_accel_scale.dev_attr.attr,
1659 &iio_dev_attr_in_anglvel_scale.dev_attr.attr,
1660 &iio_dev_attr_info_firmware_loaded.dev_attr.attr,
1661 &iio_dev_attr_debug_dmp_on.dev_attr.attr,
1662 &iio_dev_attr_misc_batchmode_timeout.dev_attr.attr,
1663 &iio_dev_attr_debug_dmp_event_int_on.dev_attr.attr,
1664 &iio_dev_attr_debug_low_power_gyro_on.dev_attr.attr,
1665 &iio_dev_attr_debug_data_collection_mode_on.dev_attr.attr,
1666 &iio_dev_attr_debug_data_collection_mode_gyro_rate.dev_attr.attr,
1667 &iio_dev_attr_debug_data_collection_mode_accel_rate.dev_attr.attr,
1668 &iio_dev_attr_debug_lp_en_off.dev_attr.attr,
1669 &iio_dev_attr_debug_cycle_mode_off.dev_attr.attr,
1670 &iio_dev_attr_debug_clock_sel.dev_attr.attr,
1671 &iio_dev_attr_debug_reg_write.dev_attr.attr,
1672 &iio_dev_attr_debug_reg_write_addr.dev_attr.attr,
1673 &iio_dev_attr_debug_cfg_write.dev_attr.attr,
1674 &iio_dev_attr_in_anglvel_rate.dev_attr.attr,
1675 &iio_dev_attr_in_accel_rate.dev_attr.attr,
1676 &iio_dev_attr_in_accel_x_dmp_bias.dev_attr.attr,
1677 &iio_dev_attr_in_accel_y_dmp_bias.dev_attr.attr,
1678 &iio_dev_attr_in_accel_z_dmp_bias.dev_attr.attr,
1679 &iio_dev_attr_debug_accel_cal_enable.dev_attr.attr,
1680 &iio_dev_attr_debug_gyro_cal_enable.dev_attr.attr,
1681 &iio_dev_attr_in_anglvel_x_dmp_bias.dev_attr.attr,
1682 &iio_dev_attr_in_anglvel_y_dmp_bias.dev_attr.attr,
1683 &iio_dev_attr_in_anglvel_z_dmp_bias.dev_attr.attr,
1684 &iio_dev_attr_in_accel_x_calibbias.dev_attr.attr,
1685 &iio_dev_attr_in_accel_y_calibbias.dev_attr.attr,
1686 &iio_dev_attr_in_accel_z_calibbias.dev_attr.attr,
1687 &iio_dev_attr_in_anglvel_x_calibbias.dev_attr.attr,
1688 &iio_dev_attr_in_anglvel_y_calibbias.dev_attr.attr,
1689 &iio_dev_attr_in_anglvel_z_calibbias.dev_attr.attr,
1690 &iio_dev_attr_in_6quat_enable.dev_attr.attr,
1691 &iio_dev_attr_in_6quat_rate.dev_attr.attr,
1692 &iio_dev_attr_in_p6quat_enable.dev_attr.attr,
1693 &iio_dev_attr_in_p6quat_rate.dev_attr.attr,
1694 &iio_dev_attr_in_calib_anglvel_enable.dev_attr.attr,
1695 &iio_dev_attr_in_calib_anglvel_rate.dev_attr.attr,
1696 &iio_dev_attr_debug_anglvel_accuracy_enable.dev_attr.attr,
1697 &iio_dev_attr_debug_accel_accuracy_enable.dev_attr.attr,
1698 &iio_dev_attr_info_secondary_name.dev_attr.attr,
1699 &iio_dev_attr_info_gyro_sf.dev_attr.attr,
1700 &iio_dev_attr_debug_determine_engine_on.dev_attr.attr,
1701 &iio_dev_attr_debug_mem_read.dev_attr.attr,
1702 &iio_dev_attr_debug_mem_write.dev_attr.attr,
1703 &iio_dev_attr_misc_gyro_recalibration.dev_attr.attr,
1704 &iio_dev_attr_misc_accel_recalibration.dev_attr.attr,
1705 &iio_dev_attr_params_accel_calibration_threshold.dev_attr.attr,
1706 &iio_dev_attr_params_accel_calibration_rate.dev_attr.attr,
1709 static const struct attribute *inv_compass_attributes[] = {
1710 &iio_dev_attr_in_magn_scale.dev_attr.attr,
1711 &iio_dev_attr_debug_compass_enable.dev_attr.attr,
1712 &iio_dev_attr_info_magn_matrix.dev_attr.attr,
1713 &iio_dev_attr_in_magn_x_dmp_bias.dev_attr.attr,
1714 &iio_dev_attr_in_magn_y_dmp_bias.dev_attr.attr,
1715 &iio_dev_attr_in_magn_z_dmp_bias.dev_attr.attr,
1716 &iio_dev_attr_debug_compass_cal_enable.dev_attr.attr,
1717 &iio_dev_attr_misc_magn_recalibration.dev_attr.attr,
1718 &iio_dev_attr_misc_ref_mag_3d.dev_attr.attr,
1719 &iio_dev_attr_debug_magn_accuracy_enable.dev_attr.attr,
1720 &iio_dev_attr_in_calib_magn_enable.dev_attr.attr,
1721 &iio_dev_attr_in_calib_magn_rate.dev_attr.attr,
1722 &iio_dev_attr_in_geomag_enable.dev_attr.attr,
1723 &iio_dev_attr_in_geomag_rate.dev_attr.attr,
1724 &iio_dev_attr_in_magn_enable.dev_attr.attr,
1725 &iio_dev_attr_in_magn_rate.dev_attr.attr,
1726 &iio_dev_attr_in_9quat_enable.dev_attr.attr,
1727 &iio_dev_attr_in_9quat_rate.dev_attr.attr,
1730 static const struct attribute *inv_pedometer_attributes[] = {
1731 &dev_attr_poll_pedometer.attr,
1732 &iio_dev_attr_params_pedometer_int_on.dev_attr.attr,
1733 &iio_dev_attr_event_pedometer_enable.dev_attr.attr,
1734 &iio_dev_attr_in_step_indicator_enable.dev_attr.attr,
1735 &iio_dev_attr_in_step_detector_enable.dev_attr.attr,
1736 &iio_dev_attr_out_pedometer_steps.dev_attr.attr,
1737 &iio_dev_attr_out_pedometer_time.dev_attr.attr,
1738 &iio_dev_attr_out_pedometer_counter.dev_attr.attr,
1739 &iio_dev_attr_params_pedometer_step_thresh.dev_attr.attr,
1740 &iio_dev_attr_params_pedometer_int_thresh.dev_attr.attr,
1742 static const struct attribute *inv_smd_attributes[] = {
1743 &dev_attr_poll_smd.attr,
1744 &iio_dev_attr_event_smd_enable.dev_attr.attr,
1745 &iio_dev_attr_params_smd_timer_thresh.dev_attr.attr,
1748 static const struct attribute *inv_pressure_attributes[] = {
1749 &iio_dev_attr_in_pressure_enable.dev_attr.attr,
1750 &iio_dev_attr_in_pressure_rate.dev_attr.attr,
1753 static const struct attribute *inv_als_attributes[] = {
1754 &iio_dev_attr_in_als_px_enable.dev_attr.attr,
1755 &iio_dev_attr_in_als_px_rate.dev_attr.attr,
1758 static struct attribute *inv_attributes[
1759 ARRAY_SIZE(inv_raw_attributes) +
1760 ARRAY_SIZE(inv_pedometer_attributes) +
1761 ARRAY_SIZE(inv_smd_attributes) +
1762 ARRAY_SIZE(inv_compass_attributes) +
1763 ARRAY_SIZE(inv_pressure_attributes) +
1764 ARRAY_SIZE(inv_als_attributes) +
1768 static const struct attribute_group inv_attribute_group = {
1770 .attrs = inv_attributes
1773 static const struct iio_info mpu_info = {
1774 .driver_module = THIS_MODULE,
1775 .attrs = &inv_attribute_group,
1779 * inv_check_chip_type() - check and setup chip type.
1781 int inv_check_chip_type(struct iio_dev *indio_dev, const char *name)
1786 struct inv_chip_config_s *conf;
1787 struct mpu_platform_data *plat;
1788 struct inv_mpu_state *st;
1790 st = iio_priv(indio_dev);
1791 conf = &st->chip_config;
1792 plat = &st->plat_data;
1793 if (!strcmp(name, "mpu7400"))
1794 st->chip_type = ICM20628;
1795 else if (!strcmp(name, "icm20628"))
1796 st->chip_type = ICM20628;
1797 else if (!strcmp(name, "icm20728"))
1798 st->chip_type = ICM20728;
1799 else if (!strcmp(name, "icm20645"))
1800 st->chip_type = ICM20628;
1803 st->hw = &hw_info[st->chip_type];
1804 result = inv_set_bank(st, BANK_SEL_0);
1807 /* reset to make sure previous state are not there */
1808 result = inv_plat_single_write(st, REG_PWR_MGMT_1, BIT_H_RESET);
1811 usleep_range(REG_UP_TIME_USEC, REG_UP_TIME_USEC);
1813 /* toggle power state */
1814 result = inv_set_power(st, false);
1818 result = inv_set_power(st, true);
1821 result = inv_plat_read(st, REG_WHO_AM_I, 1, &v);
1825 result = inv_plat_single_write(st, REG_USER_CTRL, st->i2c_dis);
1828 result = inv_init_config(st);
1832 if (SECONDARY_SLAVE_TYPE_COMPASS == plat->sec_slave_type)
1833 st->chip_config.has_compass = 1;
1835 st->chip_config.has_compass = 0;
1836 if (SECONDARY_SLAVE_TYPE_PRESSURE == plat->aux_slave_type)
1837 st->chip_config.has_pressure = 1;
1839 st->chip_config.has_pressure = 0;
1840 if (SECONDARY_SLAVE_TYPE_ALS == plat->read_only_slave_type)
1841 st->chip_config.has_als = 1;
1843 st->chip_config.has_als = 0;
1845 if (st->chip_config.has_compass) {
1846 result = inv_mpu_setup_compass_slave(st);
1848 pr_err("compass setup failed\n");
1849 inv_set_power(st, false);
1853 if (st->chip_config.has_pressure) {
1854 result = inv_mpu_setup_pressure_slave(st);
1856 pr_err("pressure setup failed\n");
1857 inv_set_power(st, false);
1861 if (st->chip_config.has_als) {
1862 result = inv_mpu_setup_als_slave(st);
1864 pr_err("als setup failed\n");
1865 inv_set_power(st, false);
1870 result = mem_r(MPU_SOFT_REV_ADDR, 1, &v);
1873 if (v & MPU_SOFT_REV_MASK) {
1874 pr_err("incorrect software revision=%x\n", v);
1877 //set up the low power mode capability
1879 st->chip_config.lp_en_mode = 1;
1881 st->chip_config.lp_en_mode = 0;
1884 memcpy(&inv_attributes[t_ind], inv_raw_attributes,
1885 sizeof(inv_raw_attributes));
1886 t_ind += ARRAY_SIZE(inv_raw_attributes);
1888 memcpy(&inv_attributes[t_ind], inv_pedometer_attributes,
1889 sizeof(inv_pedometer_attributes));
1890 t_ind += ARRAY_SIZE(inv_pedometer_attributes);
1892 memcpy(&inv_attributes[t_ind], inv_smd_attributes,
1893 sizeof(inv_smd_attributes));
1894 t_ind += ARRAY_SIZE(inv_smd_attributes);
1896 if (st->chip_config.has_compass) {
1897 memcpy(&inv_attributes[t_ind], inv_compass_attributes,
1898 sizeof(inv_compass_attributes));
1899 t_ind += ARRAY_SIZE(inv_compass_attributes);
1901 if (ICM20728 == st->chip_type || st->chip_config.has_pressure) {
1902 memcpy(&inv_attributes[t_ind], inv_pressure_attributes,
1903 sizeof(inv_pressure_attributes));
1904 t_ind += ARRAY_SIZE(inv_pressure_attributes);
1906 if (st->chip_config.has_als) {
1907 memcpy(&inv_attributes[t_ind], inv_als_attributes,
1908 sizeof(inv_als_attributes));
1909 t_ind += ARRAY_SIZE(inv_als_attributes);
1912 inv_attributes[t_ind] = NULL;
1914 indio_dev->channels = inv_mpu_channels;
1915 indio_dev->num_channels = ARRAY_SIZE(inv_mpu_channels);
1917 indio_dev->info = &mpu_info;
1918 indio_dev->modes = INDIO_DIRECT_MODE;
1919 indio_dev->currentmode = INDIO_DIRECT_MODE;
1922 result = inv_set_power(st, false);
1928 * inv_create_dmp_sysfs() - create binary sysfs dmp entry.
1930 static const struct bin_attribute dmp_firmware = {
1932 .name = "misc_bin_dmp_firmware",
1933 .mode = S_IRUGO | S_IWUGO
1935 .size = DMP_IMAGE_SIZE,
1936 .read = inv_dmp_firmware_read,
1937 .write = inv_dmp_firmware_write,
1940 static const struct bin_attribute soft_iron_matrix = {
1942 .name = "misc_bin_soft_iron_matrix",
1943 .mode = S_IRUGO | S_IWUGO
1945 .size = SOFT_IRON_MATRIX_SIZE,
1946 .write = inv_soft_iron_matrix_write,
1949 static const struct bin_attribute accel_covariance = {
1951 .name = "misc_bin_accel_covariance",
1952 .mode = S_IRUGO | S_IWUGO
1954 .size = ACCEL_COVARIANCE_SIZE,
1955 .write = inv_accel_covariance_write,
1956 .read = inv_accel_covariance_read,
1959 static const struct bin_attribute compass_covariance = {
1961 .name = "misc_bin_magn_covariance",
1962 .mode = S_IRUGO | S_IWUGO
1964 .size = COMPASS_COVARIANCE_SIZE,
1965 .write = inv_compass_covariance_write,
1966 .read = inv_compass_covariance_read,
1969 static const struct bin_attribute compass_cur_covariance = {
1971 .name = "misc_bin_cur_magn_covariance",
1972 .mode = S_IRUGO | S_IWUGO
1974 .size = COMPASS_COVARIANCE_SIZE,
1975 .write = inv_compass_covariance_cur_write,
1976 .read = inv_compass_covariance_cur_read,
1979 int inv_create_dmp_sysfs(struct iio_dev *ind)
1983 result = sysfs_create_bin_file(&ind->dev.kobj, &dmp_firmware);
1986 result = sysfs_create_bin_file(&ind->dev.kobj, &soft_iron_matrix);
1990 result = sysfs_create_bin_file(&ind->dev.kobj, &accel_covariance);
1993 result = sysfs_create_bin_file(&ind->dev.kobj, &compass_covariance);
1996 result = sysfs_create_bin_file(&ind->dev.kobj, &compass_cur_covariance);