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)
136 result = inv_set_bank(st, BANK_SEL_2);
139 result = inv_plat_single_write(st, REG_ACCEL_CONFIG,
140 (st->chip_config.accel_fs << SHIFT_ACCEL_FS) | 0);
144 result = inv_set_bank(st, BANK_SEL_0);
148 result = inv_set_accel_fsr_V3(st);
151 result = inv_set_accel_scale2_V3(st);
158 static int inv_set_gyro_avg_filter(struct inv_mpu_state *st)
162 result = inv_set_bank(st, BANK_SEL_2);
165 result = inv_plat_single_write(st, REG_GYRO_CONFIG_2,
166 st->chip_config.gyro_avg_filter);
170 result = inv_set_bank(st, BANK_SEL_0);
175 static int inv_set_accel_avg_filter(struct inv_mpu_state *st)
179 result = inv_set_bank(st, BANK_SEL_2);
182 result = inv_plat_single_write(st, REG_ACCEL_CONFIG_2,
183 st->chip_config.accel_avg_filter);
187 result = inv_set_bank(st, BANK_SEL_0);
192 int inv_set_secondary(struct inv_mpu_state *st)
196 r = inv_set_bank(st, BANK_SEL_3);
199 r = inv_plat_single_write(st, REG_I2C_MST_CTRL, BIT_I2C_MST_P_NSR);
203 r = inv_plat_single_write(st, REG_I2C_MST_ODR_CONFIG,
208 r = inv_set_bank(st, BANK_SEL_0);
212 static int inv_set_odr_sync(struct inv_mpu_state *st)
216 r = inv_set_bank(st, BANK_SEL_2);
219 r = inv_plat_single_write(st, REG_MOD_CTRL_USR, BIT_ODR_SYNC);
222 r = inv_set_bank(st, BANK_SEL_0);
227 static int inv_init_secondary(struct inv_mpu_state *st)
229 st->slv_reg[0].addr = REG_I2C_SLV0_ADDR;
230 st->slv_reg[0].reg = REG_I2C_SLV0_REG;
231 st->slv_reg[0].ctrl = REG_I2C_SLV0_CTRL;
232 st->slv_reg[0].d0 = REG_I2C_SLV0_DO;
234 st->slv_reg[1].addr = REG_I2C_SLV1_ADDR;
235 st->slv_reg[1].reg = REG_I2C_SLV1_REG;
236 st->slv_reg[1].ctrl = REG_I2C_SLV1_CTRL;
237 st->slv_reg[1].d0 = REG_I2C_SLV1_DO;
239 st->slv_reg[2].addr = REG_I2C_SLV2_ADDR;
240 st->slv_reg[2].reg = REG_I2C_SLV2_REG;
241 st->slv_reg[2].ctrl = REG_I2C_SLV2_CTRL;
242 st->slv_reg[2].d0 = REG_I2C_SLV2_DO;
244 st->slv_reg[3].addr = REG_I2C_SLV3_ADDR;
245 st->slv_reg[3].reg = REG_I2C_SLV3_REG;
246 st->slv_reg[3].ctrl = REG_I2C_SLV3_CTRL;
247 st->slv_reg[3].d0 = REG_I2C_SLV3_DO;
252 static int inv_init_config(struct inv_mpu_state *st)
256 st->batch.overflow_on = 0;
257 st->chip_config.fsr = MPU_INIT_GYRO_SCALE;
258 st->chip_config.accel_fs = MPU_INIT_ACCEL_SCALE;
259 st->chip_config.gyro_avg_filter = MPU_INIT_GYRO_AVG_FILTER;
260 st->chip_config.accel_avg_filter = MPU_INIT_ACCEL_AVG_FILTER;
261 st->ped.int_thresh = MPU_INIT_PED_INT_THRESH;
262 st->ped.step_thresh = MPU_INIT_PED_STEP_THRESH;
263 st->smd.timer_thresh = MPU_INIT_SMD_TIMER_THLD;
264 st->chip_config.low_power_gyro_on = 1;
265 st->suspend_state = false;
267 st->chip_config.debug_data_collection_gyro_freq = BASE_SAMPLE_RATE;
268 st->chip_config.debug_data_collection_accel_freq = BASE_SAMPLE_RATE;
270 inv_init_secondary(st);
272 res = inv_read_timebase(st);
275 res = inv_set_dmp(st);
279 res = inv_set_gyro_sf(st);
282 res = inv_set_accel_sf(st);
285 res = inv_set_gyro_avg_filter(st);
288 res = inv_set_accel_avg_filter(st);
292 res = inv_set_odr_sync(st);
296 res = inv_set_secondary(st);
302 * inv_firmware_loaded_store() - calling this function will change
305 static ssize_t inv_firmware_loaded_store(struct device *dev,
306 struct device_attribute *attr, const char *buf, size_t count)
308 struct iio_dev *indio_dev = dev_get_drvdata(dev);
309 struct inv_mpu_state *st = iio_priv(indio_dev);
312 result = kstrtoint(buf, 10, &data);
318 st->chip_config.firmware_loaded = 0;
324 static ssize_t _dmp_bias_store(struct device *dev,
325 struct device_attribute *attr, const char *buf, size_t count)
327 struct iio_dev *indio_dev = dev_get_drvdata(dev);
328 struct inv_mpu_state *st = iio_priv(indio_dev);
329 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
332 if (!st->chip_config.firmware_loaded)
335 result = inv_switch_power_in_lp(st, true);
339 result = kstrtoint(buf, 10, &data);
341 goto dmp_bias_store_fail;
342 switch (this_attr->address) {
343 case ATTR_DMP_ACCEL_X_DMP_BIAS:
345 st->sensor_acurracy_flag[SENSOR_ACCEL_ACCURACY] = DEFAULT_ACCURACY;
346 result = write_be32_to_mem(st, data, ACCEL_BIAS_X);
348 goto dmp_bias_store_fail;
349 st->input_accel_dmp_bias[0] = data;
351 case ATTR_DMP_ACCEL_Y_DMP_BIAS:
352 result = write_be32_to_mem(st, data, ACCEL_BIAS_Y);
354 goto dmp_bias_store_fail;
355 st->input_accel_dmp_bias[1] = data;
357 case ATTR_DMP_ACCEL_Z_DMP_BIAS:
358 result = write_be32_to_mem(st, data, ACCEL_BIAS_Z);
360 goto dmp_bias_store_fail;
361 st->input_accel_dmp_bias[2] = data;
363 case ATTR_DMP_GYRO_X_DMP_BIAS:
365 st->sensor_acurracy_flag[SENSOR_GYRO_ACCURACY] = DEFAULT_ACCURACY;
366 result = write_be32_to_mem(st, data, GYRO_BIAS_X);
368 goto dmp_bias_store_fail;
369 st->input_gyro_dmp_bias[0] = data;
371 case ATTR_DMP_GYRO_Y_DMP_BIAS:
372 result = write_be32_to_mem(st, data, GYRO_BIAS_Y);
374 goto dmp_bias_store_fail;
375 st->input_gyro_dmp_bias[1] = data;
377 case ATTR_DMP_GYRO_Z_DMP_BIAS:
378 result = write_be32_to_mem(st, data, GYRO_BIAS_Z);
380 goto dmp_bias_store_fail;
381 st->input_gyro_dmp_bias[2] = data;
383 case ATTR_DMP_MAGN_X_DMP_BIAS:
385 st->sensor_acurracy_flag[SENSOR_COMPASS_ACCURACY] = 3;
386 result = write_be32_to_mem(st, data, CPASS_BIAS_X);
388 goto dmp_bias_store_fail;
389 st->input_compass_dmp_bias[0] = data;
391 case ATTR_DMP_MAGN_Y_DMP_BIAS:
392 result = write_be32_to_mem(st, data, CPASS_BIAS_Y);
394 goto dmp_bias_store_fail;
395 st->input_compass_dmp_bias[1] = data;
397 case ATTR_DMP_MAGN_Z_DMP_BIAS:
398 result = write_be32_to_mem(st, data, CPASS_BIAS_Z);
400 goto dmp_bias_store_fail;
401 st->input_compass_dmp_bias[2] = data;
403 case ATTR_DMP_MISC_GYRO_RECALIBRATION:
404 result = write_be32_to_mem(st, 0, GYRO_LAST_TEMPR);
406 goto dmp_bias_store_fail;
408 case ATTR_DMP_MISC_ACCEL_RECALIBRATION:
410 u8 d[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
412 u32 d1[] = {0, 0, 0, 0,
414 3276800, 3276800, 3276800, 3276800};
418 result = inv_write_2bytes(st, ACCEL_CAL_RESET, 1);
420 goto dmp_bias_store_fail;
421 result = mem_w(ACCEL_PRE_SENSOR_DATA, ARRAY_SIZE(d), d);
424 w_d = st->accel_covariance;
426 for (i = 0; i < ARRAY_SIZE(d1); i++) {
427 result = write_be32_to_mem(st, w_d[i],
428 ACCEL_COVARIANCE + i * sizeof(int));
430 goto dmp_bias_store_fail;
435 case ATTR_DMP_MISC_COMPASS_RECALIBRATION:
437 u32 d[] = {0, 0, 0, 0,
438 14745600, 14745600, 14745600, 14745600,
446 w_d = st->compass_covariance;
447 for (i = 0; i < ARRAY_SIZE(d); i++) {
448 result = write_be32_to_mem(st,
449 st->curr_compass_covariance[i],
450 CPASS_COVARIANCE_CUR +
453 goto dmp_bias_store_fail;
455 result = write_be32_to_mem(st, st->ref_mag_3d,
458 goto dmp_bias_store_fail;
461 for (i = 0; i < ARRAY_SIZE(d); i++) {
462 result = write_be32_to_mem(st, w_d[i],
463 CPASS_COVARIANCE + i * sizeof(int));
465 goto dmp_bias_store_fail;
469 case ATTR_DMP_PARAMS_ACCEL_CALIBRATION_THRESHOLD:
470 result = write_be32_to_mem(st, data, ACCEL_VARIANCE_THRESH);
472 goto dmp_bias_store_fail;
473 st->accel_calib_threshold = data;
475 /* this serves as a divider of calibration rate, 0->225, 3->55 */
476 case ATTR_DMP_PARAMS_ACCEL_CALIBRATION_RATE:
479 result = inv_write_2bytes(st, ACCEL_CAL_RATE, data);
481 goto dmp_bias_store_fail;
482 st->accel_calib_rate = data;
484 case ATTR_DMP_DEBUG_MEM_READ:
485 debug_mem_read_addr = data;
487 case ATTR_DMP_DEBUG_MEM_WRITE:
488 inv_write_2bytes(st, debug_mem_read_addr, data);
497 result = inv_switch_power_in_lp(st, false);
504 static ssize_t inv_dmp_bias_store(struct device *dev,
505 struct device_attribute *attr, const char *buf, size_t count)
507 struct iio_dev *indio_dev = dev_get_drvdata(dev);
510 mutex_lock(&indio_dev->mlock);
511 result = _dmp_bias_store(dev, attr, buf, count);
512 mutex_unlock(&indio_dev->mlock);
517 static ssize_t inv_debug_store(struct device *dev,
518 struct device_attribute *attr, const char *buf, size_t count)
520 struct iio_dev *indio_dev = dev_get_drvdata(dev);
521 struct inv_mpu_state *st = iio_priv(indio_dev);
522 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
525 result = kstrtoint(buf, 10, &data);
528 switch (this_attr->address) {
529 case ATTR_DMP_LP_EN_OFF:
530 st->chip_config.lp_en_mode_off = !!data;
531 inv_switch_power_in_lp(st, !!data);
533 case ATTR_DMP_CYCLE_MODE_OFF:
534 st->chip_config.cycle_mode_off = !!data;
535 inv_turn_off_cycle_mode(st, !!data);
536 case ATTR_DMP_CLK_SEL:
537 st->chip_config.clk_sel = !!data;
538 inv_switch_power_in_lp(st, !!data);
540 case ATTR_DEBUG_REG_ADDR:
541 debug_reg_addr = data;
543 case ATTR_DEBUG_REG_WRITE:
544 inv_plat_single_write(st, debug_reg_addr, data);
546 case ATTR_DEBUG_WRITE_CFG:
551 static ssize_t _misc_attr_store(struct device *dev,
552 struct device_attribute *attr, const char *buf, size_t count)
554 struct iio_dev *indio_dev = dev_get_drvdata(dev);
555 struct inv_mpu_state *st = iio_priv(indio_dev);
556 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
559 if (!st->chip_config.firmware_loaded)
561 result = inv_switch_power_in_lp(st, true);
564 result = kstrtoint(buf, 10, &data);
567 switch (this_attr->address) {
568 case ATTR_DMP_LOW_POWER_GYRO_ON:
569 st->chip_config.low_power_gyro_on = !!data;
571 case ATTR_DEBUG_DATA_COLLECTION_MODE:
572 st->chip_config.debug_data_collection_mode_on = !!data;
574 case ATTR_DEBUG_DATA_COLLECTION_GYRO_RATE:
575 st->chip_config.debug_data_collection_gyro_freq = data;
577 case ATTR_DEBUG_DATA_COLLECTION_ACCEL_RATE:
578 st->chip_config.debug_data_collection_accel_freq = data;
580 case ATTR_DMP_REF_MAG_3D:
581 st->ref_mag_3d = data;
583 case ATTR_DMP_DEBUG_DETERMINE_ENGINE_ON:
584 st->debug_determine_engine_on = !!data;
586 case ATTR_GYRO_SCALE:
589 st->chip_config.fsr = data;
590 result = inv_set_gyro_sf(st);
593 case ATTR_ACCEL_SCALE:
596 st->chip_config.accel_fs = data;
597 result = inv_set_accel_sf(st);
600 case ATTR_DMP_PED_INT_ON:
601 result = inv_write_cntl(st, PEDOMETER_INT_EN << 8, !!data,
605 st->ped.int_on = !!data;
608 case ATTR_DMP_PED_STEP_THRESH:
609 result = inv_write_2bytes(st, PEDSTD_SB, data);
612 st->ped.step_thresh = data;
615 case ATTR_DMP_PED_INT_THRESH:
616 result = inv_write_2bytes(st, PEDSTD_SB2, data);
619 st->ped.int_thresh = data;
625 st->trigger_state = MISC_TRIGGER;
626 result = set_inv_enable(indio_dev);
632 * inv_misc_attr_store() - calling this function will store current
633 * dmp parameter settings
635 static ssize_t inv_misc_attr_store(struct device *dev,
636 struct device_attribute *attr, const char *buf, size_t count)
638 struct iio_dev *indio_dev = dev_get_drvdata(dev);
641 mutex_lock(&indio_dev->mlock);
642 result = _misc_attr_store(dev, attr, buf, count);
643 mutex_unlock(&indio_dev->mlock);
650 static ssize_t _debug_attr_store(struct device *dev,
651 struct device_attribute *attr, const char *buf, size_t count)
653 struct iio_dev *indio_dev = dev_get_drvdata(dev);
654 struct inv_mpu_state *st = iio_priv(indio_dev);
655 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
658 if (!st->chip_config.firmware_loaded)
660 if (!st->debug_determine_engine_on)
663 result = kstrtoint(buf, 10, &data);
666 switch (this_attr->address) {
667 case ATTR_DMP_IN_ANGLVEL_ACCURACY_ENABLE:
668 st->sensor_accuracy[SENSOR_GYRO_ACCURACY].on = !!data;
670 case ATTR_DMP_IN_ACCEL_ACCURACY_ENABLE:
671 st->sensor_accuracy[SENSOR_ACCEL_ACCURACY].on = !!data;
673 case ATTR_DMP_IN_MAGN_ACCURACY_ENABLE:
674 st->sensor_accuracy[SENSOR_COMPASS_ACCURACY].on = !!data;
676 case ATTR_DMP_ACCEL_CAL_ENABLE:
677 st->accel_cal_enable = !!data;
679 case ATTR_DMP_GYRO_CAL_ENABLE:
680 st->gyro_cal_enable = !!data;
682 case ATTR_DMP_COMPASS_CAL_ENABLE:
683 st->compass_cal_enable = !!data;
685 case ATTR_DMP_EVENT_INT_ON:
686 st->chip_config.dmp_event_int_on = !!data;
689 st->chip_config.dmp_on = !!data;
691 case ATTR_GYRO_ENABLE:
692 st->chip_config.gyro_enable = !!data;
694 case ATTR_ACCEL_ENABLE:
695 st->chip_config.accel_enable = !!data;
697 case ATTR_COMPASS_ENABLE:
698 st->chip_config.compass_enable = !!data;
703 st->trigger_state = DEBUG_TRIGGER;
704 result = set_inv_enable(indio_dev);
712 * inv_debug_attr_store() - calling this function will store current
713 * dmp parameter settings
715 static ssize_t inv_debug_attr_store(struct device *dev,
716 struct device_attribute *attr, const char *buf, size_t count)
718 struct iio_dev *indio_dev = dev_get_drvdata(dev);
721 mutex_lock(&indio_dev->mlock);
722 result = _debug_attr_store(dev, attr, buf, count);
723 mutex_unlock(&indio_dev->mlock);
728 static int inv_rate_convert(struct inv_mpu_state *st, int ind, int data)
730 int t, out, out1, out2;
732 out = MPU_INIT_SENSOR_RATE;
733 if ((SENSOR_COMPASS == ind) || (SENSOR_CALIB_COMPASS == ind)) {
734 if ((MSEC_PER_SEC / st->slave_compass->rate_scale) < data)
735 out = MSEC_PER_SEC / st->slave_compass->rate_scale;
738 } else if (SENSOR_ALS == ind) {
739 if (data > MAX_ALS_RATE)
743 } else if (SENSOR_PRESSURE == ind) {
744 if (data > MAX_PRESSURE_RATE)
745 out = MAX_PRESSURE_RATE;
749 t = MPU_DEFAULT_DMP_FREQ / data;
752 out1 = MPU_DEFAULT_DMP_FREQ / (t + 1);
753 out2 = MPU_DEFAULT_DMP_FREQ / t;
754 if (abs(out1 - data) < abs(out2 - data))
763 static ssize_t inv_sensor_rate_show(struct device *dev,
764 struct device_attribute *attr, char *buf)
766 struct iio_dev *indio_dev = dev_get_drvdata(dev);
767 struct inv_mpu_state *st = iio_priv(indio_dev);
768 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
770 return sprintf(buf, "%d\n", st->sensor[this_attr->address].rate);
772 static ssize_t inv_sensor_rate_store(struct device *dev,
773 struct device_attribute *attr, const char *buf, size_t count)
775 struct iio_dev *indio_dev = dev_get_drvdata(dev);
776 struct inv_mpu_state *st = iio_priv(indio_dev);
777 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
781 if (!st->chip_config.firmware_loaded) {
782 pr_err("sensor_rate_store: firmware not loaded\n");
785 result = kstrtoint(buf, 10, &data);
789 pr_err("sensor_rate_store: invalid data=%d\n", data);
792 ind = this_attr->address;
793 rate = inv_rate_convert(st, ind, data);
794 if (rate == st->sensor[ind].rate)
796 mutex_lock(&indio_dev->mlock);
797 st->sensor[ind].rate = rate;
798 if (!st->sensor[ind].on) {
799 mutex_unlock(&indio_dev->mlock);
803 st->trigger_state = DATA_TRIGGER;
804 result = set_inv_enable(indio_dev);
805 mutex_unlock(&indio_dev->mlock);
812 static ssize_t inv_sensor_on_show(struct device *dev,
813 struct device_attribute *attr, char *buf)
815 struct iio_dev *indio_dev = dev_get_drvdata(dev);
816 struct inv_mpu_state *st = iio_priv(indio_dev);
817 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
819 return sprintf(buf, "%d\n", st->sensor[this_attr->address].on);
821 static ssize_t inv_sensor_on_store(struct device *dev,
822 struct device_attribute *attr, const char *buf, size_t count)
824 struct iio_dev *indio_dev = dev_get_drvdata(dev);
825 struct inv_mpu_state *st = iio_priv(indio_dev);
826 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
830 if (!st->chip_config.firmware_loaded) {
831 pr_err("sensor_on store: firmware not loaded\n");
834 result = kstrtoint(buf, 10, &data);
838 pr_err("sensor_on_store: invalid data=%d\n", data);
841 ind = this_attr->address;
843 if (on == st->sensor[ind].on)
845 mutex_lock(&indio_dev->mlock);
846 st->sensor[ind].on = on;
847 if (on && (!st->sensor[ind].rate)) {
848 mutex_unlock(&indio_dev->mlock);
851 st->trigger_state = RATE_TRIGGER;
852 result = set_inv_enable(indio_dev);
853 mutex_unlock(&indio_dev->mlock);
860 static ssize_t _basic_attr_store(struct device *dev,
861 struct device_attribute *attr, const char *buf, size_t count)
863 struct iio_dev *indio_dev = dev_get_drvdata(dev);
864 struct inv_mpu_state *st = iio_priv(indio_dev);
865 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
869 if (!st->chip_config.firmware_loaded)
871 result = kstrtoint(buf, 10, &data);
872 if (result || (data < 0))
875 switch (this_attr->address) {
876 case ATTR_DMP_PED_ON:
877 if ((!!data) == st->ped.on)
881 case ATTR_DMP_SMD_ENABLE:
882 if ((!!data) == st->smd.on)
886 case ATTR_DMP_STEP_DETECTOR_ON:
887 if ((!!data) == st->chip_config.step_detector_on)
889 st->chip_config.step_detector_on = !!data;
891 case ATTR_DMP_STEP_INDICATOR_ON:
892 if ((!!data) == st->chip_config.step_indicator_on)
894 st->chip_config.step_indicator_on = !!data;
896 case ATTR_DMP_BATCHMODE_TIMEOUT:
897 if (data == st->batch.timeout)
899 st->batch.timeout = data;
905 st->trigger_state = EVENT_TRIGGER;
906 result = set_inv_enable(indio_dev);
914 * inv_basic_attr_store() - calling this function will store current
915 * non-dmp parameter settings
917 static ssize_t inv_basic_attr_store(struct device *dev,
918 struct device_attribute *attr, const char *buf, size_t count)
920 struct iio_dev *indio_dev = dev_get_drvdata(dev);
923 mutex_lock(&indio_dev->mlock);
924 result = _basic_attr_store(dev, attr, buf, count);
926 mutex_unlock(&indio_dev->mlock);
932 * inv_attr_bias_show() - calling this function will show current
933 * dmp gyro/accel bias.
935 static ssize_t inv_attr_bias_show(struct device *dev,
936 struct device_attribute *attr, char *buf)
938 struct iio_dev *indio_dev = dev_get_drvdata(dev);
939 struct inv_mpu_state *st = iio_priv(indio_dev);
940 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
941 int axes, addr, result, dmp_bias;
944 switch (this_attr->address) {
945 case ATTR_ANGLVEL_X_CALIBBIAS:
946 return sprintf(buf, "%d\n", st->gyro_bias[0]);
947 case ATTR_ANGLVEL_Y_CALIBBIAS:
948 return sprintf(buf, "%d\n", st->gyro_bias[1]);
949 case ATTR_ANGLVEL_Z_CALIBBIAS:
950 return sprintf(buf, "%d\n", st->gyro_bias[2]);
951 case ATTR_ACCEL_X_CALIBBIAS:
952 return sprintf(buf, "%d\n", st->accel_bias[0]);
953 case ATTR_ACCEL_Y_CALIBBIAS:
954 return sprintf(buf, "%d\n", st->accel_bias[1]);
955 case ATTR_ACCEL_Z_CALIBBIAS:
956 return sprintf(buf, "%d\n", st->accel_bias[2]);
957 case ATTR_DMP_ACCEL_X_DMP_BIAS:
960 sensor_type = SENSOR_ACCEL;
962 case ATTR_DMP_ACCEL_Y_DMP_BIAS:
965 sensor_type = SENSOR_ACCEL;
967 case ATTR_DMP_ACCEL_Z_DMP_BIAS:
970 sensor_type = SENSOR_ACCEL;
972 case ATTR_DMP_GYRO_X_DMP_BIAS:
975 sensor_type = SENSOR_GYRO;
977 case ATTR_DMP_GYRO_Y_DMP_BIAS:
980 sensor_type = SENSOR_GYRO;
982 case ATTR_DMP_GYRO_Z_DMP_BIAS:
985 sensor_type = SENSOR_GYRO;
987 case ATTR_DMP_MAGN_X_DMP_BIAS:
990 sensor_type = SENSOR_COMPASS;
992 case ATTR_DMP_MAGN_Y_DMP_BIAS:
995 sensor_type = SENSOR_COMPASS;
997 case ATTR_DMP_MAGN_Z_DMP_BIAS:
1000 sensor_type = SENSOR_COMPASS;
1005 result = inv_switch_power_in_lp(st, true);
1008 result = read_be32_from_mem(st, &dmp_bias, addr);
1011 inv_switch_power_in_lp(st, false);
1012 if (SENSOR_GYRO == sensor_type)
1013 st->input_gyro_dmp_bias[axes] = dmp_bias;
1014 else if (SENSOR_ACCEL == sensor_type)
1015 st->input_accel_dmp_bias[axes] = dmp_bias;
1016 else if (SENSOR_COMPASS == sensor_type)
1017 st->input_compass_dmp_bias[axes] = dmp_bias;
1021 return sprintf(buf, "%d\n", dmp_bias);
1025 * inv_attr_show() - calling this function will show current
1028 static ssize_t inv_attr_show(struct device *dev,
1029 struct device_attribute *attr, char *buf)
1031 struct iio_dev *indio_dev = dev_get_drvdata(dev);
1032 struct inv_mpu_state *st = iio_priv(indio_dev);
1033 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
1037 switch (this_attr->address) {
1038 case ATTR_GYRO_SCALE:
1040 const s16 gyro_scale[] = {250, 500, 1000, 2000};
1042 return sprintf(buf, "%d\n", gyro_scale[st->chip_config.fsr]);
1044 case ATTR_ACCEL_SCALE:
1046 const s16 accel_scale[] = {2, 4, 8, 16};
1047 return sprintf(buf, "%d\n",
1048 accel_scale[st->chip_config.accel_fs]);
1050 case ATTR_COMPASS_SCALE:
1051 st->slave_compass->get_scale(st, &result);
1053 return sprintf(buf, "%d\n", result);
1054 case ATTR_GYRO_ENABLE:
1055 return sprintf(buf, "%d\n", st->chip_config.gyro_enable);
1056 case ATTR_ACCEL_ENABLE:
1057 return sprintf(buf, "%d\n", st->chip_config.accel_enable);
1058 case ATTR_DMP_ACCEL_CAL_ENABLE:
1059 return sprintf(buf, "%d\n", st->accel_cal_enable);
1060 case ATTR_DMP_GYRO_CAL_ENABLE:
1061 return sprintf(buf, "%d\n", st->gyro_cal_enable);
1062 case ATTR_DMP_COMPASS_CAL_ENABLE:
1063 return sprintf(buf, "%d\n", st->compass_cal_enable);
1064 case ATTR_DMP_DEBUG_DETERMINE_ENGINE_ON:
1065 return sprintf(buf, "%d\n", st->debug_determine_engine_on);
1066 case ATTR_DMP_PARAMS_ACCEL_CALIBRATION_THRESHOLD:
1067 return sprintf(buf, "%d\n", st->accel_calib_threshold);
1068 case ATTR_DMP_PARAMS_ACCEL_CALIBRATION_RATE:
1069 return sprintf(buf, "%d\n", st->accel_calib_rate);
1070 case ATTR_FIRMWARE_LOADED:
1071 return sprintf(buf, "%d\n", st->chip_config.firmware_loaded);
1073 return sprintf(buf, "%d\n", st->chip_config.dmp_on);
1074 case ATTR_DMP_BATCHMODE_TIMEOUT:
1075 return sprintf(buf, "%d\n", st->batch.timeout);
1076 case ATTR_DMP_EVENT_INT_ON:
1077 return sprintf(buf, "%d\n", st->chip_config.dmp_event_int_on);
1078 case ATTR_DMP_PED_INT_ON:
1079 return sprintf(buf, "%d\n", st->ped.int_on);
1080 case ATTR_DMP_PED_ON:
1081 return sprintf(buf, "%d\n", st->ped.on);
1082 case ATTR_DMP_PED_STEP_THRESH:
1083 return sprintf(buf, "%d\n", st->ped.step_thresh);
1084 case ATTR_DMP_PED_INT_THRESH:
1085 return sprintf(buf, "%d\n", st->ped.int_thresh);
1086 case ATTR_DMP_SMD_ENABLE:
1087 return sprintf(buf, "%d\n", st->smd.on);
1088 case ATTR_DMP_LOW_POWER_GYRO_ON:
1089 return sprintf(buf, "%d\n", st->chip_config.low_power_gyro_on);
1090 case ATTR_DEBUG_DATA_COLLECTION_MODE:
1091 return sprintf(buf, "%d\n",
1092 st->chip_config.debug_data_collection_mode_on);
1093 case ATTR_DEBUG_DATA_COLLECTION_GYRO_RATE:
1094 return sprintf(buf, "%d\n",
1095 st->chip_config.debug_data_collection_gyro_freq);
1096 case ATTR_DEBUG_DATA_COLLECTION_ACCEL_RATE:
1097 return sprintf(buf, "%d\n",
1098 st->chip_config.debug_data_collection_accel_freq);
1099 case ATTR_DMP_LP_EN_OFF:
1100 return sprintf(buf, "%d\n", st->chip_config.lp_en_mode_off);
1101 case ATTR_DMP_CYCLE_MODE_OFF:
1102 return sprintf(buf, "%d\n", st->chip_config.cycle_mode_off);
1103 case ATTR_COMPASS_ENABLE:
1104 return sprintf(buf, "%d\n", st->chip_config.compass_enable);
1105 case ATTR_DMP_STEP_INDICATOR_ON:
1106 return sprintf(buf, "%d\n", st->chip_config.step_indicator_on);
1107 case ATTR_DMP_STEP_DETECTOR_ON:
1108 return sprintf(buf, "%d\n", st->chip_config.step_detector_on);
1109 case ATTR_DMP_IN_ANGLVEL_ACCURACY_ENABLE:
1110 return sprintf(buf, "%d\n",
1111 st->sensor_accuracy[SENSOR_GYRO_ACCURACY].on);
1112 case ATTR_DMP_IN_ACCEL_ACCURACY_ENABLE:
1113 return sprintf(buf, "%d\n",
1114 st->sensor_accuracy[SENSOR_ACCEL_ACCURACY].on);
1115 case ATTR_DMP_IN_MAGN_ACCURACY_ENABLE:
1116 return sprintf(buf, "%d\n",
1117 st->sensor_accuracy[SENSOR_COMPASS_ACCURACY].on);
1118 case ATTR_GYRO_MATRIX:
1119 m = st->plat_data.orientation;
1120 return sprintf(buf, "%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
1121 m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]);
1122 case ATTR_ACCEL_MATRIX:
1123 m = st->plat_data.orientation;
1124 return sprintf(buf, "%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
1125 m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]);
1126 case ATTR_COMPASS_MATRIX:
1127 if (st->plat_data.sec_slave_type ==
1128 SECONDARY_SLAVE_TYPE_COMPASS)
1130 st->plat_data.secondary_orientation;
1133 return sprintf(buf, "%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
1134 m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]);
1135 case ATTR_SECONDARY_NAME:
1137 const char *n[] = {"NULL", "AK8975", "AK8972", "AK8963",
1138 "MLX90399", "AK09911", "AK09912"};
1140 switch (st->plat_data.sec_slave_id) {
1141 case COMPASS_ID_AK8975:
1142 return sprintf(buf, "%s\n", n[1]);
1143 case COMPASS_ID_AK8972:
1144 return sprintf(buf, "%s\n", n[2]);
1145 case COMPASS_ID_AK8963:
1146 return sprintf(buf, "%s\n", n[3]);
1147 case COMPASS_ID_MLX90399:
1148 return sprintf(buf, "%s\n", n[4]);
1149 case COMPASS_ID_AK09911:
1150 return sprintf(buf, "%s\n", n[5]);
1151 case COMPASS_ID_AK09912:
1152 return sprintf(buf, "%s\n", n[6]);
1154 return sprintf(buf, "%s\n", n[0]);
1157 case ATTR_DMP_REF_MAG_3D:
1160 inv_switch_power_in_lp(st, true);
1161 result = read_be32_from_mem(st, &out, CPASS_REF_MAG_3D);
1164 inv_switch_power_in_lp(st, false);
1165 return sprintf(buf, "%d\n", out);
1167 case ATTR_DMP_DEBUG_MEM_READ:
1171 inv_switch_power_in_lp(st, true);
1172 result = read_be32_from_mem(st, &out, debug_mem_read_addr);
1175 inv_switch_power_in_lp(st, false);
1176 return sprintf(buf, "0x%x\n", out);
1179 return sprintf(buf, "%d\n", st->gyro_sf);
1185 static ssize_t inv_attr64_show(struct device *dev,
1186 struct device_attribute *attr, char *buf)
1188 struct iio_dev *indio_dev = dev_get_drvdata(dev);
1189 struct inv_mpu_state *st = iio_priv(indio_dev);
1190 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
1195 mutex_lock(&indio_dev->mlock);
1196 if (!st->chip_config.dmp_on) {
1197 mutex_unlock(&indio_dev->mlock);
1201 switch (this_attr->address) {
1202 case ATTR_DMP_PEDOMETER_STEPS:
1203 inv_switch_power_in_lp(st, true);
1204 result = inv_get_pedometer_steps(st, &ped);
1205 result |= inv_read_pedometer_counter(st);
1206 tmp = (u64)st->ped.step + (u64)ped;
1207 inv_switch_power_in_lp(st, false);
1209 case ATTR_DMP_PEDOMETER_TIME:
1210 inv_switch_power_in_lp(st, true);
1211 result = inv_get_pedometer_time(st, &ped);
1212 tmp = (u64)st->ped.time + ((u64)ped) * MS_PER_PED_TICKS;
1213 inv_switch_power_in_lp(st, false);
1215 case ATTR_DMP_PEDOMETER_COUNTER:
1216 tmp = st->ped.last_step_time;
1224 mutex_unlock(&indio_dev->mlock);
1227 return sprintf(buf, "%lld\n", tmp);
1230 static ssize_t inv_attr64_store(struct device *dev,
1231 struct device_attribute *attr, const char *buf, size_t count)
1233 struct iio_dev *indio_dev = dev_get_drvdata(dev);
1234 struct inv_mpu_state *st = iio_priv(indio_dev);
1235 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
1237 u8 d[4] = {0, 0, 0, 0};
1240 mutex_lock(&indio_dev->mlock);
1241 if (!st->chip_config.firmware_loaded) {
1242 mutex_unlock(&indio_dev->mlock);
1245 result = inv_switch_power_in_lp(st, true);
1247 mutex_unlock(&indio_dev->mlock);
1250 result = kstrtoull(buf, 10, &data);
1252 goto attr64_store_fail;
1253 switch (this_attr->address) {
1254 case ATTR_DMP_PEDOMETER_STEPS:
1255 result = mem_w(PEDSTD_STEPCTR, ARRAY_SIZE(d), d);
1257 goto attr64_store_fail;
1258 st->ped.step = data;
1260 case ATTR_DMP_PEDOMETER_TIME:
1261 result = mem_w(PEDSTD_TIMECTR, ARRAY_SIZE(d), d);
1263 goto attr64_store_fail;
1264 st->ped.time = data;
1271 mutex_unlock(&indio_dev->mlock);
1272 result = inv_switch_power_in_lp(st, false);
1279 static ssize_t inv_self_test(struct device *dev,
1280 struct device_attribute *attr, char *buf)
1282 struct iio_dev *indio_dev = dev_get_drvdata(dev);
1283 struct inv_mpu_state *st = iio_priv(indio_dev);
1286 mutex_lock(&indio_dev->mlock);
1287 res = inv_hw_self_test(st);
1288 set_inv_enable(indio_dev);
1289 mutex_unlock(&indio_dev->mlock);
1291 return sprintf(buf, "%d\n", res);
1295 * inv_temperature_show() - Read temperature data directly from registers.
1297 static ssize_t inv_temperature_show(struct device *dev,
1298 struct device_attribute *attr, char *buf)
1301 struct iio_dev *indio_dev = dev_get_drvdata(dev);
1302 struct inv_mpu_state *st = iio_priv(indio_dev);
1303 int result, scale_t;
1307 mutex_lock(&indio_dev->mlock);
1308 result = inv_switch_power_in_lp(st, true);
1310 mutex_unlock(&indio_dev->mlock);
1314 result = inv_plat_read(st, REG_TEMPERATURE, 2, data);
1315 mutex_unlock(&indio_dev->mlock);
1317 pr_err("Could not read temperature register.\n");
1320 result = inv_switch_power_in_lp(st, false);
1323 temp = (s16)(be16_to_cpup((short *)&data[0]));
1324 scale_t = TEMPERATURE_OFFSET +
1325 inv_q30_mult((int)temp << MPU_TEMP_SHIFT, TEMPERATURE_SCALE);
1327 INV_I2C_INC_TEMPREAD(1);
1329 return sprintf(buf, "%d %lld\n", scale_t, get_time_ns());
1333 * inv_smd_show() - calling this function showes smd interrupt.
1334 * This event must use poll.
1336 static ssize_t inv_smd_show(struct device *dev,
1337 struct device_attribute *attr, char *buf)
1339 return sprintf(buf, "1\n");
1343 * inv_ped_show() - calling this function showes pedometer interrupt.
1344 * This event must use poll.
1346 static ssize_t inv_ped_show(struct device *dev,
1347 struct device_attribute *attr, char *buf)
1349 return sprintf(buf, "1\n");
1353 * inv_reg_dump_show() - Register dump for testing.
1355 static ssize_t inv_reg_dump_show(struct device *dev,
1356 struct device_attribute *attr, char *buf)
1360 ssize_t bytes_printed = 0;
1361 struct iio_dev *indio_dev = dev_get_drvdata(dev);
1362 struct inv_mpu_state *st = iio_priv(indio_dev);
1364 mutex_lock(&indio_dev->mlock);
1365 inv_set_bank(st, BANK_SEL_0);
1366 bytes_printed += sprintf(buf + bytes_printed, "bank 0\n");
1368 for (ii = 0; ii < 0x7F; ii++) {
1369 /* don't read fifo r/w register */
1370 if ((ii == REG_MEM_R_W) || (ii == REG_FIFO_R_W))
1373 inv_plat_read(st, ii, 1, &data);
1374 bytes_printed += sprintf(buf + bytes_printed, "%#2x: %#2x\n",
1377 inv_set_bank(st, BANK_SEL_1);
1378 bytes_printed += sprintf(buf + bytes_printed, "bank 1\n");
1379 for (ii = 0; ii < 0x2A; ii++) {
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_2);
1385 bytes_printed += sprintf(buf + bytes_printed, "bank 2\n");
1386 for (ii = 0; ii < 0x55; 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_3);
1392 bytes_printed += sprintf(buf + bytes_printed, "bank 3\n");
1393 for (ii = 0; ii < 0x18; 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_0);
1399 set_inv_enable(indio_dev);
1400 mutex_unlock(&indio_dev->mlock);
1402 return bytes_printed;
1405 static ssize_t inv_flush_batch_show(struct device *dev,
1406 struct device_attribute *attr, char *buf)
1408 struct iio_dev *indio_dev = dev_get_drvdata(dev);
1412 mutex_lock(&indio_dev->mlock);
1413 result = inv_flush_batch_data(indio_dev, &has_data);
1414 mutex_unlock(&indio_dev->mlock);
1416 return sprintf(buf, "%d\n", result);
1418 return sprintf(buf, "%d\n", has_data);
1421 static const struct iio_chan_spec inv_mpu_channels[] = {
1422 IIO_CHAN_SOFT_TIMESTAMP(INV_MPU_SCAN_TIMESTAMP),
1425 static DEVICE_ATTR(poll_smd, S_IRUGO, inv_smd_show, NULL);
1426 static DEVICE_ATTR(poll_pedometer, S_IRUGO, inv_ped_show, NULL);
1428 /* special run time sysfs entry, read only */
1429 static DEVICE_ATTR(misc_flush_batch, S_IRUGO, inv_flush_batch_show, NULL);
1431 static DEVICE_ATTR(debug_reg_dump, S_IRUGO | S_IWUGO, inv_reg_dump_show, NULL);
1432 static DEVICE_ATTR(out_temperature, S_IRUGO | S_IWUGO,
1433 inv_temperature_show, NULL);
1434 static DEVICE_ATTR(misc_self_test, S_IRUGO | S_IWUGO, inv_self_test, NULL);
1436 static IIO_DEVICE_ATTR(info_anglvel_matrix, S_IRUGO, inv_attr_show, NULL,
1438 static IIO_DEVICE_ATTR(info_accel_matrix, S_IRUGO, inv_attr_show, NULL,
1440 static IIO_DEVICE_ATTR(info_magn_matrix, S_IRUGO, inv_attr_show, NULL,
1441 ATTR_COMPASS_MATRIX);
1442 static IIO_DEVICE_ATTR(info_secondary_name, S_IRUGO, inv_attr_show, NULL,
1443 ATTR_SECONDARY_NAME);
1444 static IIO_DEVICE_ATTR(info_gyro_sf, S_IRUGO, inv_attr_show, NULL,
1447 /* sensor on/off sysfs control */
1448 static IIO_DEVICE_ATTR(in_accel_enable, S_IRUGO | S_IWUGO,
1449 inv_sensor_on_show, inv_sensor_on_store, SENSOR_ACCEL);
1450 static IIO_DEVICE_ATTR(in_anglvel_enable, S_IRUGO | S_IWUGO,
1451 inv_sensor_on_show, inv_sensor_on_store, SENSOR_GYRO);
1452 static IIO_DEVICE_ATTR(in_magn_enable, S_IRUGO | S_IWUGO,
1453 inv_sensor_on_show, inv_sensor_on_store, SENSOR_COMPASS);
1454 static IIO_DEVICE_ATTR(in_6quat_enable, S_IRUGO | S_IWUGO,
1455 inv_sensor_on_show, inv_sensor_on_store, SENSOR_SIXQ);
1456 static IIO_DEVICE_ATTR(in_9quat_enable, S_IRUGO | S_IWUGO,
1457 inv_sensor_on_show, inv_sensor_on_store, SENSOR_NINEQ);
1458 static IIO_DEVICE_ATTR(in_geomag_enable, S_IRUGO | S_IWUGO,
1459 inv_sensor_on_show, inv_sensor_on_store, SENSOR_GEOMAG);
1460 static IIO_DEVICE_ATTR(in_p6quat_enable, S_IRUGO | S_IWUGO,
1461 inv_sensor_on_show, inv_sensor_on_store, SENSOR_PEDQ);
1462 static IIO_DEVICE_ATTR(in_pressure_enable, S_IRUGO | S_IWUGO,
1463 inv_sensor_on_show, inv_sensor_on_store, SENSOR_PRESSURE);
1464 static IIO_DEVICE_ATTR(in_als_px_enable, S_IRUGO | S_IWUGO,
1465 inv_sensor_on_show, inv_sensor_on_store, SENSOR_ALS);
1466 static IIO_DEVICE_ATTR(in_calib_anglvel_enable, S_IRUGO | S_IWUGO,
1467 inv_sensor_on_show, inv_sensor_on_store, SENSOR_CALIB_GYRO);
1468 static IIO_DEVICE_ATTR(in_calib_magn_enable, S_IRUGO | S_IWUGO,
1469 inv_sensor_on_show, inv_sensor_on_store, SENSOR_CALIB_COMPASS);
1471 /* sensor rate sysfs control */
1472 static IIO_DEVICE_ATTR(in_accel_rate, S_IRUGO | S_IWUGO,
1473 inv_sensor_rate_show, inv_sensor_rate_store, SENSOR_ACCEL);
1474 static IIO_DEVICE_ATTR(in_anglvel_rate, S_IRUGO | S_IWUGO,
1475 inv_sensor_rate_show, inv_sensor_rate_store, SENSOR_GYRO);
1476 static IIO_DEVICE_ATTR(in_magn_rate, S_IRUGO | S_IWUGO,
1477 inv_sensor_rate_show, inv_sensor_rate_store, SENSOR_COMPASS);
1478 static IIO_DEVICE_ATTR(in_6quat_rate, S_IRUGO | S_IWUGO,
1479 inv_sensor_rate_show, inv_sensor_rate_store, SENSOR_SIXQ);
1480 static IIO_DEVICE_ATTR(in_9quat_rate, S_IRUGO | S_IWUGO,
1481 inv_sensor_rate_show, inv_sensor_rate_store, SENSOR_NINEQ);
1482 static IIO_DEVICE_ATTR(in_geomag_rate, S_IRUGO | S_IWUGO,
1483 inv_sensor_rate_show, inv_sensor_rate_store, SENSOR_GEOMAG);
1484 static IIO_DEVICE_ATTR(in_p6quat_rate, S_IRUGO | S_IWUGO,
1485 inv_sensor_rate_show, inv_sensor_rate_store, SENSOR_PEDQ);
1486 static IIO_DEVICE_ATTR(in_pressure_rate, S_IRUGO | S_IWUGO,
1487 inv_sensor_rate_show, inv_sensor_rate_store, SENSOR_PRESSURE);
1488 static IIO_DEVICE_ATTR(in_als_px_rate, S_IRUGO | S_IWUGO,
1489 inv_sensor_rate_show, inv_sensor_rate_store, SENSOR_ALS);
1490 static IIO_DEVICE_ATTR(in_calib_anglvel_rate, S_IRUGO | S_IWUGO,
1491 inv_sensor_rate_show, inv_sensor_rate_store, SENSOR_CALIB_GYRO);
1492 static IIO_DEVICE_ATTR(in_calib_magn_rate, S_IRUGO | S_IWUGO,
1493 inv_sensor_rate_show, inv_sensor_rate_store, SENSOR_CALIB_COMPASS);
1495 /* debug determine engine related sysfs */
1496 static IIO_DEVICE_ATTR(debug_anglvel_accuracy_enable, S_IRUGO | S_IWUGO,
1497 inv_attr_show, inv_debug_attr_store,
1498 ATTR_DMP_IN_ANGLVEL_ACCURACY_ENABLE);
1499 static IIO_DEVICE_ATTR(debug_accel_accuracy_enable, S_IRUGO | S_IWUGO,
1500 inv_attr_show, inv_debug_attr_store, ATTR_DMP_IN_ACCEL_ACCURACY_ENABLE);
1501 static IIO_DEVICE_ATTR(debug_magn_accuracy_enable, S_IRUGO | S_IWUGO,
1502 inv_attr_show, inv_debug_attr_store, ATTR_DMP_IN_MAGN_ACCURACY_ENABLE);
1503 static IIO_DEVICE_ATTR(debug_gyro_cal_enable, S_IRUGO | S_IWUGO,
1504 inv_attr_show, inv_debug_attr_store, ATTR_DMP_GYRO_CAL_ENABLE);
1505 static IIO_DEVICE_ATTR(debug_accel_cal_enable, S_IRUGO | S_IWUGO,
1506 inv_attr_show, inv_debug_attr_store, ATTR_DMP_ACCEL_CAL_ENABLE);
1507 static IIO_DEVICE_ATTR(debug_compass_cal_enable, S_IRUGO | S_IWUGO,
1508 inv_attr_show, inv_debug_attr_store, ATTR_DMP_COMPASS_CAL_ENABLE);
1509 static IIO_DEVICE_ATTR(misc_magn_recalibration, S_IRUGO | S_IWUGO, NULL,
1510 inv_dmp_bias_store, ATTR_DMP_MISC_COMPASS_RECALIBRATION);
1511 static IIO_DEVICE_ATTR(misc_ref_mag_3d, S_IRUGO | S_IWUGO,
1512 inv_attr_show, inv_misc_attr_store, ATTR_DMP_REF_MAG_3D);
1514 static IIO_DEVICE_ATTR(debug_gyro_enable, S_IRUGO | S_IWUGO,
1515 inv_attr_show, inv_debug_attr_store, ATTR_GYRO_ENABLE);
1516 static IIO_DEVICE_ATTR(debug_accel_enable, S_IRUGO | S_IWUGO,
1517 inv_attr_show, inv_debug_attr_store, ATTR_ACCEL_ENABLE);
1518 static IIO_DEVICE_ATTR(debug_compass_enable, S_IRUGO | S_IWUGO,
1519 inv_attr_show, inv_debug_attr_store, ATTR_COMPASS_ENABLE);
1520 static IIO_DEVICE_ATTR(debug_dmp_on, S_IRUGO | S_IWUGO,
1521 inv_attr_show, inv_debug_attr_store, ATTR_DMP_ON);
1522 static IIO_DEVICE_ATTR(debug_dmp_event_int_on, S_IRUGO | S_IWUGO,
1523 inv_attr_show, inv_debug_attr_store, ATTR_DMP_EVENT_INT_ON);
1524 static IIO_DEVICE_ATTR(debug_mem_read, S_IRUGO | S_IWUGO,
1525 inv_attr_show, inv_dmp_bias_store, ATTR_DMP_DEBUG_MEM_READ);
1526 static IIO_DEVICE_ATTR(debug_mem_write, S_IRUGO | S_IWUGO,
1527 inv_attr_show, inv_dmp_bias_store, ATTR_DMP_DEBUG_MEM_WRITE);
1529 static IIO_DEVICE_ATTR(misc_batchmode_timeout, S_IRUGO | S_IWUGO,
1530 inv_attr_show, inv_basic_attr_store, ATTR_DMP_BATCHMODE_TIMEOUT);
1532 static IIO_DEVICE_ATTR(info_firmware_loaded, S_IRUGO | S_IWUGO, inv_attr_show,
1533 inv_firmware_loaded_store, ATTR_FIRMWARE_LOADED);
1536 static IIO_DEVICE_ATTR(in_accel_scale, S_IRUGO | S_IWUGO, inv_attr_show,
1537 inv_misc_attr_store, ATTR_ACCEL_SCALE);
1538 static IIO_DEVICE_ATTR(in_anglvel_scale, S_IRUGO | S_IWUGO, inv_attr_show,
1539 inv_misc_attr_store, ATTR_GYRO_SCALE);
1540 static IIO_DEVICE_ATTR(in_magn_scale, S_IRUGO | S_IWUGO, inv_attr_show,
1541 NULL, ATTR_COMPASS_SCALE);
1543 static IIO_DEVICE_ATTR(debug_low_power_gyro_on, S_IRUGO | S_IWUGO,
1544 inv_attr_show, inv_misc_attr_store, ATTR_DMP_LOW_POWER_GYRO_ON);
1545 static IIO_DEVICE_ATTR(debug_lp_en_off, S_IRUGO | S_IWUGO,
1546 inv_attr_show, inv_debug_store, ATTR_DMP_LP_EN_OFF);
1547 static IIO_DEVICE_ATTR(debug_cycle_mode_off, S_IRUGO | S_IWUGO,
1548 inv_attr_show, inv_debug_store, ATTR_DMP_CYCLE_MODE_OFF);
1549 static IIO_DEVICE_ATTR(debug_clock_sel, S_IRUGO | S_IWUGO,
1550 inv_attr_show, inv_debug_store, ATTR_DMP_CLK_SEL);
1551 static IIO_DEVICE_ATTR(debug_reg_write, S_IRUGO | S_IWUGO,
1552 inv_attr_show, inv_debug_store, ATTR_DEBUG_REG_WRITE);
1553 static IIO_DEVICE_ATTR(debug_cfg_write, S_IRUGO | S_IWUGO,
1554 inv_attr_show, inv_debug_store, ATTR_DEBUG_WRITE_CFG);
1555 static IIO_DEVICE_ATTR(debug_reg_write_addr, S_IRUGO | S_IWUGO,
1556 inv_attr_show, inv_debug_store, ATTR_DEBUG_REG_ADDR);
1557 static IIO_DEVICE_ATTR(debug_data_collection_mode_on, S_IRUGO | S_IWUGO,
1558 inv_attr_show, inv_misc_attr_store, ATTR_DEBUG_DATA_COLLECTION_MODE);
1559 static IIO_DEVICE_ATTR(debug_data_collection_mode_gyro_rate, S_IRUGO | S_IWUGO,
1560 inv_attr_show, inv_misc_attr_store,
1561 ATTR_DEBUG_DATA_COLLECTION_GYRO_RATE);
1562 static IIO_DEVICE_ATTR(debug_data_collection_mode_accel_rate, S_IRUGO | S_IWUGO,
1563 inv_attr_show, inv_misc_attr_store,
1564 ATTR_DEBUG_DATA_COLLECTION_ACCEL_RATE);
1566 static IIO_DEVICE_ATTR(in_accel_x_calibbias, S_IRUGO | S_IWUGO,
1567 inv_attr_bias_show, NULL, ATTR_ACCEL_X_CALIBBIAS);
1568 static IIO_DEVICE_ATTR(in_accel_y_calibbias, S_IRUGO | S_IWUGO,
1569 inv_attr_bias_show, NULL, ATTR_ACCEL_Y_CALIBBIAS);
1570 static IIO_DEVICE_ATTR(in_accel_z_calibbias, S_IRUGO | S_IWUGO,
1571 inv_attr_bias_show, NULL, ATTR_ACCEL_Z_CALIBBIAS);
1573 static IIO_DEVICE_ATTR(in_anglvel_x_calibbias, S_IRUGO | S_IWUGO,
1574 inv_attr_bias_show, NULL, ATTR_ANGLVEL_X_CALIBBIAS);
1575 static IIO_DEVICE_ATTR(in_anglvel_y_calibbias, S_IRUGO | S_IWUGO,
1576 inv_attr_bias_show, NULL, ATTR_ANGLVEL_Y_CALIBBIAS);
1577 static IIO_DEVICE_ATTR(in_anglvel_z_calibbias, S_IRUGO | S_IWUGO,
1578 inv_attr_bias_show, NULL, ATTR_ANGLVEL_Z_CALIBBIAS);
1580 static IIO_DEVICE_ATTR(in_accel_x_dmp_bias, S_IRUGO | S_IWUGO,
1581 inv_attr_bias_show, inv_dmp_bias_store, ATTR_DMP_ACCEL_X_DMP_BIAS);
1582 static IIO_DEVICE_ATTR(in_accel_y_dmp_bias, S_IRUGO | S_IWUGO,
1583 inv_attr_bias_show, inv_dmp_bias_store, ATTR_DMP_ACCEL_Y_DMP_BIAS);
1584 static IIO_DEVICE_ATTR(in_accel_z_dmp_bias, S_IRUGO | S_IWUGO,
1585 inv_attr_bias_show, inv_dmp_bias_store, ATTR_DMP_ACCEL_Z_DMP_BIAS);
1587 static IIO_DEVICE_ATTR(in_anglvel_x_dmp_bias, S_IRUGO | S_IWUGO,
1588 inv_attr_bias_show, inv_dmp_bias_store, ATTR_DMP_GYRO_X_DMP_BIAS);
1589 static IIO_DEVICE_ATTR(in_anglvel_y_dmp_bias, S_IRUGO | S_IWUGO,
1590 inv_attr_bias_show, inv_dmp_bias_store, ATTR_DMP_GYRO_Y_DMP_BIAS);
1591 static IIO_DEVICE_ATTR(in_anglvel_z_dmp_bias, S_IRUGO | S_IWUGO,
1592 inv_attr_bias_show, inv_dmp_bias_store, ATTR_DMP_GYRO_Z_DMP_BIAS);
1594 static IIO_DEVICE_ATTR(in_magn_x_dmp_bias, S_IRUGO | S_IWUGO,
1595 inv_attr_bias_show, inv_dmp_bias_store, ATTR_DMP_MAGN_X_DMP_BIAS);
1596 static IIO_DEVICE_ATTR(in_magn_y_dmp_bias, S_IRUGO | S_IWUGO,
1597 inv_attr_bias_show, inv_dmp_bias_store, ATTR_DMP_MAGN_Y_DMP_BIAS);
1598 static IIO_DEVICE_ATTR(in_magn_z_dmp_bias, S_IRUGO | S_IWUGO,
1599 inv_attr_bias_show, inv_dmp_bias_store, ATTR_DMP_MAGN_Z_DMP_BIAS);
1601 static IIO_DEVICE_ATTR(debug_determine_engine_on, S_IRUGO | S_IWUGO,
1602 inv_attr_show, inv_misc_attr_store, ATTR_DMP_DEBUG_DETERMINE_ENGINE_ON);
1603 static IIO_DEVICE_ATTR(misc_gyro_recalibration, S_IRUGO | S_IWUGO, NULL,
1604 inv_dmp_bias_store, ATTR_DMP_MISC_GYRO_RECALIBRATION);
1605 static IIO_DEVICE_ATTR(misc_accel_recalibration, S_IRUGO | S_IWUGO, NULL,
1606 inv_dmp_bias_store, ATTR_DMP_MISC_ACCEL_RECALIBRATION);
1607 static IIO_DEVICE_ATTR(params_accel_calibration_threshold, S_IRUGO | S_IWUGO,
1608 inv_attr_show, inv_dmp_bias_store,
1609 ATTR_DMP_PARAMS_ACCEL_CALIBRATION_THRESHOLD);
1610 static IIO_DEVICE_ATTR(params_accel_calibration_rate, S_IRUGO | S_IWUGO,
1611 inv_attr_show, inv_dmp_bias_store,
1612 ATTR_DMP_PARAMS_ACCEL_CALIBRATION_RATE);
1614 static IIO_DEVICE_ATTR(in_step_detector_enable, S_IRUGO | S_IWUGO,
1615 inv_attr_show, inv_basic_attr_store, ATTR_DMP_STEP_DETECTOR_ON);
1616 static IIO_DEVICE_ATTR(in_step_indicator_enable, S_IRUGO | S_IWUGO,
1617 inv_attr_show, inv_basic_attr_store, ATTR_DMP_STEP_INDICATOR_ON);
1619 static IIO_DEVICE_ATTR(event_smd_enable, S_IRUGO | S_IWUGO,
1620 inv_attr_show, inv_basic_attr_store, ATTR_DMP_SMD_ENABLE);
1622 static IIO_DEVICE_ATTR(params_pedometer_int_on, S_IRUGO | S_IWUGO,
1623 inv_attr_show, inv_misc_attr_store, ATTR_DMP_PED_INT_ON);
1624 static IIO_DEVICE_ATTR(event_pedometer_enable, S_IRUGO | S_IWUGO,
1625 inv_attr_show, inv_basic_attr_store, ATTR_DMP_PED_ON);
1626 static IIO_DEVICE_ATTR(params_pedometer_step_thresh, S_IRUGO | S_IWUGO,
1627 inv_attr_show, inv_misc_attr_store, ATTR_DMP_PED_STEP_THRESH);
1628 static IIO_DEVICE_ATTR(params_pedometer_int_thresh, S_IRUGO | S_IWUGO,
1629 inv_attr_show, inv_misc_attr_store, ATTR_DMP_PED_INT_THRESH);
1631 static IIO_DEVICE_ATTR(out_pedometer_steps, S_IRUGO | S_IWUGO, inv_attr64_show,
1632 inv_attr64_store, ATTR_DMP_PEDOMETER_STEPS);
1633 static IIO_DEVICE_ATTR(out_pedometer_time, S_IRUGO | S_IWUGO, inv_attr64_show,
1634 inv_attr64_store, ATTR_DMP_PEDOMETER_TIME);
1635 static IIO_DEVICE_ATTR(out_pedometer_counter, S_IRUGO | S_IWUGO,
1636 inv_attr64_show, NULL, ATTR_DMP_PEDOMETER_COUNTER);
1638 static const struct attribute *inv_raw_attributes[] = {
1639 &dev_attr_debug_reg_dump.attr,
1640 &dev_attr_out_temperature.attr,
1641 &dev_attr_misc_flush_batch.attr,
1642 &dev_attr_misc_self_test.attr,
1643 &iio_dev_attr_info_anglvel_matrix.dev_attr.attr,
1644 &iio_dev_attr_debug_gyro_enable.dev_attr.attr,
1645 &iio_dev_attr_in_anglvel_enable.dev_attr.attr,
1646 &iio_dev_attr_debug_accel_enable.dev_attr.attr,
1647 &iio_dev_attr_in_accel_enable.dev_attr.attr,
1648 &iio_dev_attr_info_accel_matrix.dev_attr.attr,
1649 &iio_dev_attr_in_accel_scale.dev_attr.attr,
1650 &iio_dev_attr_in_anglvel_scale.dev_attr.attr,
1651 &iio_dev_attr_info_firmware_loaded.dev_attr.attr,
1652 &iio_dev_attr_debug_dmp_on.dev_attr.attr,
1653 &iio_dev_attr_misc_batchmode_timeout.dev_attr.attr,
1654 &iio_dev_attr_debug_dmp_event_int_on.dev_attr.attr,
1655 &iio_dev_attr_debug_low_power_gyro_on.dev_attr.attr,
1656 &iio_dev_attr_debug_data_collection_mode_on.dev_attr.attr,
1657 &iio_dev_attr_debug_data_collection_mode_gyro_rate.dev_attr.attr,
1658 &iio_dev_attr_debug_data_collection_mode_accel_rate.dev_attr.attr,
1659 &iio_dev_attr_debug_lp_en_off.dev_attr.attr,
1660 &iio_dev_attr_debug_cycle_mode_off.dev_attr.attr,
1661 &iio_dev_attr_debug_clock_sel.dev_attr.attr,
1662 &iio_dev_attr_debug_reg_write.dev_attr.attr,
1663 &iio_dev_attr_debug_reg_write_addr.dev_attr.attr,
1664 &iio_dev_attr_debug_cfg_write.dev_attr.attr,
1665 &iio_dev_attr_in_anglvel_rate.dev_attr.attr,
1666 &iio_dev_attr_in_accel_rate.dev_attr.attr,
1667 &iio_dev_attr_in_accel_x_dmp_bias.dev_attr.attr,
1668 &iio_dev_attr_in_accel_y_dmp_bias.dev_attr.attr,
1669 &iio_dev_attr_in_accel_z_dmp_bias.dev_attr.attr,
1670 &iio_dev_attr_debug_accel_cal_enable.dev_attr.attr,
1671 &iio_dev_attr_debug_gyro_cal_enable.dev_attr.attr,
1672 &iio_dev_attr_in_anglvel_x_dmp_bias.dev_attr.attr,
1673 &iio_dev_attr_in_anglvel_y_dmp_bias.dev_attr.attr,
1674 &iio_dev_attr_in_anglvel_z_dmp_bias.dev_attr.attr,
1675 &iio_dev_attr_in_accel_x_calibbias.dev_attr.attr,
1676 &iio_dev_attr_in_accel_y_calibbias.dev_attr.attr,
1677 &iio_dev_attr_in_accel_z_calibbias.dev_attr.attr,
1678 &iio_dev_attr_in_anglvel_x_calibbias.dev_attr.attr,
1679 &iio_dev_attr_in_anglvel_y_calibbias.dev_attr.attr,
1680 &iio_dev_attr_in_anglvel_z_calibbias.dev_attr.attr,
1681 &iio_dev_attr_in_6quat_enable.dev_attr.attr,
1682 &iio_dev_attr_in_6quat_rate.dev_attr.attr,
1683 &iio_dev_attr_in_p6quat_enable.dev_attr.attr,
1684 &iio_dev_attr_in_p6quat_rate.dev_attr.attr,
1685 &iio_dev_attr_in_calib_anglvel_enable.dev_attr.attr,
1686 &iio_dev_attr_in_calib_anglvel_rate.dev_attr.attr,
1687 &iio_dev_attr_debug_anglvel_accuracy_enable.dev_attr.attr,
1688 &iio_dev_attr_debug_accel_accuracy_enable.dev_attr.attr,
1689 &iio_dev_attr_info_secondary_name.dev_attr.attr,
1690 &iio_dev_attr_info_gyro_sf.dev_attr.attr,
1691 &iio_dev_attr_debug_determine_engine_on.dev_attr.attr,
1692 &iio_dev_attr_debug_mem_read.dev_attr.attr,
1693 &iio_dev_attr_debug_mem_write.dev_attr.attr,
1694 &iio_dev_attr_misc_gyro_recalibration.dev_attr.attr,
1695 &iio_dev_attr_misc_accel_recalibration.dev_attr.attr,
1696 &iio_dev_attr_params_accel_calibration_threshold.dev_attr.attr,
1697 &iio_dev_attr_params_accel_calibration_rate.dev_attr.attr,
1700 static const struct attribute *inv_compass_attributes[] = {
1701 &iio_dev_attr_in_magn_scale.dev_attr.attr,
1702 &iio_dev_attr_debug_compass_enable.dev_attr.attr,
1703 &iio_dev_attr_info_magn_matrix.dev_attr.attr,
1704 &iio_dev_attr_in_magn_x_dmp_bias.dev_attr.attr,
1705 &iio_dev_attr_in_magn_y_dmp_bias.dev_attr.attr,
1706 &iio_dev_attr_in_magn_z_dmp_bias.dev_attr.attr,
1707 &iio_dev_attr_debug_compass_cal_enable.dev_attr.attr,
1708 &iio_dev_attr_misc_magn_recalibration.dev_attr.attr,
1709 &iio_dev_attr_misc_ref_mag_3d.dev_attr.attr,
1710 &iio_dev_attr_debug_magn_accuracy_enable.dev_attr.attr,
1711 &iio_dev_attr_in_calib_magn_enable.dev_attr.attr,
1712 &iio_dev_attr_in_calib_magn_rate.dev_attr.attr,
1713 &iio_dev_attr_in_geomag_enable.dev_attr.attr,
1714 &iio_dev_attr_in_geomag_rate.dev_attr.attr,
1715 &iio_dev_attr_in_magn_enable.dev_attr.attr,
1716 &iio_dev_attr_in_magn_rate.dev_attr.attr,
1717 &iio_dev_attr_in_9quat_enable.dev_attr.attr,
1718 &iio_dev_attr_in_9quat_rate.dev_attr.attr,
1721 static const struct attribute *inv_pedometer_attributes[] = {
1722 &dev_attr_poll_pedometer.attr,
1723 &iio_dev_attr_params_pedometer_int_on.dev_attr.attr,
1724 &iio_dev_attr_event_pedometer_enable.dev_attr.attr,
1725 &iio_dev_attr_in_step_indicator_enable.dev_attr.attr,
1726 &iio_dev_attr_in_step_detector_enable.dev_attr.attr,
1727 &iio_dev_attr_out_pedometer_steps.dev_attr.attr,
1728 &iio_dev_attr_out_pedometer_time.dev_attr.attr,
1729 &iio_dev_attr_out_pedometer_counter.dev_attr.attr,
1730 &iio_dev_attr_params_pedometer_step_thresh.dev_attr.attr,
1731 &iio_dev_attr_params_pedometer_int_thresh.dev_attr.attr,
1733 static const struct attribute *inv_smd_attributes[] = {
1734 &dev_attr_poll_smd.attr,
1735 &iio_dev_attr_event_smd_enable.dev_attr.attr,
1738 static const struct attribute *inv_pressure_attributes[] = {
1739 &iio_dev_attr_in_pressure_enable.dev_attr.attr,
1740 &iio_dev_attr_in_pressure_rate.dev_attr.attr,
1743 static const struct attribute *inv_als_attributes[] = {
1744 &iio_dev_attr_in_als_px_enable.dev_attr.attr,
1745 &iio_dev_attr_in_als_px_rate.dev_attr.attr,
1748 static struct attribute *inv_attributes[
1749 ARRAY_SIZE(inv_raw_attributes) +
1750 ARRAY_SIZE(inv_pedometer_attributes) +
1751 ARRAY_SIZE(inv_smd_attributes) +
1752 ARRAY_SIZE(inv_compass_attributes) +
1753 ARRAY_SIZE(inv_pressure_attributes) +
1754 ARRAY_SIZE(inv_als_attributes) +
1758 static const struct attribute_group inv_attribute_group = {
1760 .attrs = inv_attributes
1763 static const struct iio_info mpu_info = {
1764 .driver_module = THIS_MODULE,
1765 .attrs = &inv_attribute_group,
1769 * inv_check_chip_type() - check and setup chip type.
1771 int inv_check_chip_type(struct iio_dev *indio_dev, const char *name)
1776 struct inv_chip_config_s *conf;
1777 struct mpu_platform_data *plat;
1778 struct inv_mpu_state *st;
1780 st = iio_priv(indio_dev);
1781 conf = &st->chip_config;
1782 plat = &st->plat_data;
1783 if (!strcmp(name, "mpu7400"))
1784 st->chip_type = ICM20628;
1785 else if (!strcmp(name, "icm20628"))
1786 st->chip_type = ICM20628;
1787 else if (!strcmp(name, "icm20728"))
1788 st->chip_type = ICM20728;
1789 else if (!strcmp(name, "icm20645"))
1790 st->chip_type = ICM20628;
1793 st->hw = &hw_info[st->chip_type];
1794 result = inv_set_bank(st, BANK_SEL_0);
1797 /* reset to make sure previous state are not there */
1798 result = inv_plat_single_write(st, REG_PWR_MGMT_1, BIT_H_RESET);
1801 usleep_range(REG_UP_TIME_USEC, REG_UP_TIME_USEC);
1803 /* toggle power state */
1804 result = inv_set_power(st, false);
1808 result = inv_set_power(st, true);
1811 result = inv_plat_read(st, REG_WHO_AM_I, 1, &v);
1815 result = inv_plat_single_write(st, REG_USER_CTRL, st->i2c_dis);
1818 result = inv_init_config(st);
1822 if (SECONDARY_SLAVE_TYPE_COMPASS == plat->sec_slave_type)
1823 st->chip_config.has_compass = 1;
1825 st->chip_config.has_compass = 0;
1826 if (SECONDARY_SLAVE_TYPE_PRESSURE == plat->aux_slave_type)
1827 st->chip_config.has_pressure = 1;
1829 st->chip_config.has_pressure = 0;
1830 if (SECONDARY_SLAVE_TYPE_ALS == plat->read_only_slave_type)
1831 st->chip_config.has_als = 1;
1833 st->chip_config.has_als = 0;
1835 if (st->chip_config.has_compass) {
1836 result = inv_mpu_setup_compass_slave(st);
1838 pr_err("compass setup failed\n");
1839 inv_set_power(st, false);
1843 if (st->chip_config.has_pressure) {
1844 result = inv_mpu_setup_pressure_slave(st);
1846 pr_err("pressure setup failed\n");
1847 inv_set_power(st, false);
1851 if (st->chip_config.has_als) {
1852 result = inv_mpu_setup_als_slave(st);
1854 pr_err("als setup failed\n");
1855 inv_set_power(st, false);
1860 result = mem_r(MPU_SOFT_REV_ADDR, 1, &v);
1863 if (v & MPU_SOFT_REV_MASK) {
1864 pr_err("incorrect software revision=%x\n", v);
1867 //set up the low power mode capability
1869 st->chip_config.lp_en_mode = 1;
1871 st->chip_config.lp_en_mode = 0;
1874 memcpy(&inv_attributes[t_ind], inv_raw_attributes,
1875 sizeof(inv_raw_attributes));
1876 t_ind += ARRAY_SIZE(inv_raw_attributes);
1878 memcpy(&inv_attributes[t_ind], inv_pedometer_attributes,
1879 sizeof(inv_pedometer_attributes));
1880 t_ind += ARRAY_SIZE(inv_pedometer_attributes);
1882 memcpy(&inv_attributes[t_ind], inv_smd_attributes,
1883 sizeof(inv_smd_attributes));
1884 t_ind += ARRAY_SIZE(inv_smd_attributes);
1886 if (st->chip_config.has_compass) {
1887 memcpy(&inv_attributes[t_ind], inv_compass_attributes,
1888 sizeof(inv_compass_attributes));
1889 t_ind += ARRAY_SIZE(inv_compass_attributes);
1891 if (ICM20728 == st->chip_type || st->chip_config.has_pressure) {
1892 memcpy(&inv_attributes[t_ind], inv_pressure_attributes,
1893 sizeof(inv_pressure_attributes));
1894 t_ind += ARRAY_SIZE(inv_pressure_attributes);
1896 if (st->chip_config.has_als) {
1897 memcpy(&inv_attributes[t_ind], inv_als_attributes,
1898 sizeof(inv_als_attributes));
1899 t_ind += ARRAY_SIZE(inv_als_attributes);
1902 inv_attributes[t_ind] = NULL;
1904 indio_dev->channels = inv_mpu_channels;
1905 indio_dev->num_channels = ARRAY_SIZE(inv_mpu_channels);
1907 indio_dev->info = &mpu_info;
1908 indio_dev->modes = INDIO_DIRECT_MODE;
1909 indio_dev->currentmode = INDIO_DIRECT_MODE;
1912 result = inv_set_power(st, false);
1918 * inv_create_dmp_sysfs() - create binary sysfs dmp entry.
1920 static const struct bin_attribute dmp_firmware = {
1922 .name = "misc_bin_dmp_firmware",
1923 .mode = S_IRUGO | S_IWUGO
1925 .size = DMP_IMAGE_SIZE,
1926 .read = inv_dmp_firmware_read,
1927 .write = inv_dmp_firmware_write,
1930 static const struct bin_attribute soft_iron_matrix = {
1932 .name = "misc_bin_soft_iron_matrix",
1933 .mode = S_IRUGO | S_IWUGO
1935 .size = SOFT_IRON_MATRIX_SIZE,
1936 .write = inv_soft_iron_matrix_write,
1939 static const struct bin_attribute accel_covariance = {
1941 .name = "misc_bin_accel_covariance",
1942 .mode = S_IRUGO | S_IWUGO
1944 .size = ACCEL_COVARIANCE_SIZE,
1945 .write = inv_accel_covariance_write,
1946 .read = inv_accel_covariance_read,
1949 static const struct bin_attribute compass_covariance = {
1951 .name = "misc_bin_magn_covariance",
1952 .mode = S_IRUGO | S_IWUGO
1954 .size = COMPASS_COVARIANCE_SIZE,
1955 .write = inv_compass_covariance_write,
1956 .read = inv_compass_covariance_read,
1959 static const struct bin_attribute compass_cur_covariance = {
1961 .name = "misc_bin_cur_magn_covariance",
1962 .mode = S_IRUGO | S_IWUGO
1964 .size = COMPASS_COVARIANCE_SIZE,
1965 .write = inv_compass_covariance_cur_write,
1966 .read = inv_compass_covariance_cur_read,
1969 int inv_create_dmp_sysfs(struct iio_dev *ind)
1973 result = sysfs_create_bin_file(&ind->dev.kobj, &dmp_firmware);
1976 result = sysfs_create_bin_file(&ind->dev.kobj, &soft_iron_matrix);
1980 result = sysfs_create_bin_file(&ind->dev.kobj, &accel_covariance);
1983 result = sysfs_create_bin_file(&ind->dev.kobj, &compass_covariance);
1986 result = sysfs_create_bin_file(&ind->dev.kobj, &compass_cur_covariance);