]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/blob - drivers/iio/imu/inv_mpu/inv530/inv_mpu_core.c
iio: imu: Invensense: Update to official 5.3.0.K-52 code base.
[sojka/nv-tegra/linux-3.10.git] / drivers / iio / imu / inv_mpu / inv530 / inv_mpu_core.c
1 /*
2 * Copyright (C) 2012 Invensense, Inc.
3 *
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.
7 *
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.
12 */
13 #define pr_fmt(fmt) "inv_mpu: " fmt
14
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>
28
29 #include "inv_mpu_iio.h"
30 #include "sysfs.h"
31 #include "inv_test/inv_counters.h"
32
33 #ifdef CONFIG_DTS_INV_MPU_IIO
34 #include "inv_mpu_dts.h"
35 #endif
36
37 static const struct inv_hw_s hw_info[INV_NUM_PARTS] = {
38         {128, "ICM20628"},
39         {128, "ICM20728"},
40 };
41 static int debug_mem_read_addr = 0x900;
42 static char debug_reg_addr = 0x6;
43
44 int inv_set_dmp(struct inv_mpu_state *st)
45 {
46         int result;
47
48         result = inv_set_bank(st, BANK_SEL_2);
49         if (result)
50                 return result;
51         result = inv_plat_single_write(st, REG_PRGM_START_ADDRH,
52                                                         DMP_START_ADDR >> 8);
53         if (result)
54                 return result;
55         result = inv_plat_single_write(st, REG_PRGM_START_ADDRH + 1,
56                                                         DMP_START_ADDR & 0xff);
57         if (result)
58                 return result;
59         result = inv_set_bank(st, BANK_SEL_0);
60
61         return result;
62 }
63
64 static int inv_calc_gyro_sf(s8 pll)
65 {
66         int a, r;
67         int value, t;
68
69         t = 102870L + 81L * pll;
70         a = (1L << 30) / t;
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;
76         value <<= 1;
77
78         return value;
79 }
80
81 static int inv_read_timebase(struct inv_mpu_state *st)
82 {
83         int result;
84         u8 d;
85         s8 t;
86
87         result = inv_set_bank(st, BANK_SEL_1);
88         if (result)
89                 return result;
90         result = inv_plat_read(st, REG_TIMEBASE_CORRECTION_PLL, 1, &d);
91         if (result)
92                 return result;
93         t = abs(d & 0x7f);
94         if (d & 0x80)
95                 t = -t;
96
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;
103
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;
108
109         st->gyro_sf = inv_calc_gyro_sf(t);
110         result = inv_set_bank(st, BANK_SEL_0);
111
112         return result;
113 }
114
115 static int inv_set_gyro_sf(struct inv_mpu_state *st)
116 {
117         int result;
118
119         result = inv_set_bank(st, BANK_SEL_2);
120         if (result)
121                 return result;
122         result = inv_plat_single_write(st, REG_GYRO_CONFIG_1,
123                                 (st->chip_config.fsr << SHIFT_GYRO_FS_SEL) | 1);
124         if (result)
125                 return result;
126
127         result = inv_set_bank(st, BANK_SEL_0);
128
129         return result;
130 }
131
132 static int inv_set_accel_sf(struct inv_mpu_state *st)
133 {
134         int result;
135
136         result = inv_set_bank(st, BANK_SEL_2);
137         if (result)
138                 return result;
139         result = inv_plat_single_write(st, REG_ACCEL_CONFIG,
140                         (st->chip_config.accel_fs << SHIFT_ACCEL_FS) | 0);
141         if (result)
142                 return result;
143
144         result = inv_set_bank(st, BANK_SEL_0);
145         if (result)
146                 return result;
147
148         result = inv_set_accel_fsr_V3(st);
149         if (result)
150                 return result;
151         result = inv_set_accel_scale2_V3(st);
152         if (result)
153                 return result;
154
155         return result;
156 }
157
158 static int inv_set_gyro_avg_filter(struct inv_mpu_state *st)
159 {
160         int result;
161
162         result = inv_set_bank(st, BANK_SEL_2);
163         if (result)
164                 return result;
165         result = inv_plat_single_write(st, REG_GYRO_CONFIG_2,
166                         st->chip_config.gyro_avg_filter);
167         if (result)
168                 return result;
169
170         result = inv_set_bank(st, BANK_SEL_0);
171
172         return result;
173 }
174
175 static int inv_set_accel_avg_filter(struct inv_mpu_state *st)
176 {
177         int result;
178
179         result = inv_set_bank(st, BANK_SEL_2);
180         if (result)
181                 return result;
182         result = inv_plat_single_write(st, REG_ACCEL_CONFIG_2,
183                         st->chip_config.accel_avg_filter);
184         if (result)
185                 return result;
186
187         result = inv_set_bank(st, BANK_SEL_0);
188
189         return result;
190 }
191
192 int inv_set_secondary(struct inv_mpu_state *st)
193 {
194         int r;
195
196         r = inv_set_bank(st, BANK_SEL_3);
197         if (r)
198                 return r;
199         r = inv_plat_single_write(st, REG_I2C_MST_CTRL, BIT_I2C_MST_P_NSR);
200         if (r)
201                 return r;
202
203         r = inv_plat_single_write(st, REG_I2C_MST_ODR_CONFIG,
204                                                         MIN_MST_ODR_CONFIG);
205         if (r)
206                 return r;
207
208         r = inv_set_bank(st, BANK_SEL_0);
209
210         return r;
211 }
212 static int inv_set_odr_sync(struct inv_mpu_state *st)
213 {
214         int r;
215
216         r = inv_set_bank(st, BANK_SEL_2);
217         if (r)
218                 return r;
219         r = inv_plat_single_write(st, REG_MOD_CTRL_USR, BIT_ODR_SYNC);
220         if (r)
221                 return r;
222         r = inv_set_bank(st, BANK_SEL_0);
223
224         return r;
225
226 }
227 static int inv_init_secondary(struct inv_mpu_state *st)
228 {
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;
233
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;
238
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;
243
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;
248
249         return 0;
250 }
251
252 static int inv_init_config(struct inv_mpu_state *st)
253 {
254         int res;
255
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;
266         st->firmware = 0;
267         st->chip_config.debug_data_collection_gyro_freq = BASE_SAMPLE_RATE;
268         st->chip_config.debug_data_collection_accel_freq = BASE_SAMPLE_RATE;
269
270         inv_init_secondary(st);
271
272         res = inv_read_timebase(st);
273         if (res)
274                 return res;
275         res = inv_set_dmp(st);
276         if (res)
277                 return res;
278
279         res = inv_set_gyro_sf(st);
280         if (res)
281                 return res;
282         res = inv_set_accel_sf(st);
283         if (res)
284                 return res;
285         res = inv_set_gyro_avg_filter(st);
286         if (res)
287                 return res;
288         res = inv_set_accel_avg_filter(st);
289         if (res)
290                 return res;
291
292         res = inv_set_odr_sync(st);
293         if (res)
294                 return res;
295
296         res = inv_set_secondary(st);
297
298         return res;
299 }
300
301 /*
302  * inv_firmware_loaded_store() -  calling this function will change
303  *                        firmware load
304  */
305 static ssize_t inv_firmware_loaded_store(struct device *dev,
306         struct device_attribute *attr, const char *buf, size_t count)
307 {
308         struct iio_dev *indio_dev = dev_get_drvdata(dev);
309         struct inv_mpu_state *st = iio_priv(indio_dev);
310         int result, data;
311
312         result = kstrtoint(buf, 10, &data);
313         if (result)
314                 return -EINVAL;
315
316         if (data)
317                 return -EINVAL;
318         st->chip_config.firmware_loaded = 0;
319
320         return count;
321
322 }
323
324 static ssize_t _dmp_bias_store(struct device *dev,
325         struct device_attribute *attr, const char *buf, size_t count)
326 {
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);
330         int result, data;
331
332         if (!st->chip_config.firmware_loaded)
333                 return -EINVAL;
334
335         result = inv_switch_power_in_lp(st, true);
336         if (result)
337                 return result;
338
339         result = kstrtoint(buf, 10, &data);
340         if (result)
341                 goto dmp_bias_store_fail;
342         switch (this_attr->address) {
343         case ATTR_DMP_ACCEL_X_DMP_BIAS:
344                 if (data)
345                         st->sensor_acurracy_flag[SENSOR_ACCEL_ACCURACY] = DEFAULT_ACCURACY;
346                 result = write_be32_to_mem(st, data, ACCEL_BIAS_X);
347                 if (result)
348                         goto dmp_bias_store_fail;
349                 st->input_accel_dmp_bias[0] = data;
350                 break;
351         case ATTR_DMP_ACCEL_Y_DMP_BIAS:
352                 result = write_be32_to_mem(st, data, ACCEL_BIAS_Y);
353                 if (result)
354                         goto dmp_bias_store_fail;
355                 st->input_accel_dmp_bias[1] = data;
356                 break;
357         case ATTR_DMP_ACCEL_Z_DMP_BIAS:
358                 result = write_be32_to_mem(st, data, ACCEL_BIAS_Z);
359                 if (result)
360                         goto dmp_bias_store_fail;
361                 st->input_accel_dmp_bias[2] = data;
362                 break;
363         case ATTR_DMP_GYRO_X_DMP_BIAS:
364                 if (data)
365                         st->sensor_acurracy_flag[SENSOR_GYRO_ACCURACY] = DEFAULT_ACCURACY;
366                 result = write_be32_to_mem(st, data, GYRO_BIAS_X);
367                 if (result)
368                         goto dmp_bias_store_fail;
369                 st->input_gyro_dmp_bias[0] = data;
370                 break;
371         case ATTR_DMP_GYRO_Y_DMP_BIAS:
372                 result = write_be32_to_mem(st, data, GYRO_BIAS_Y);
373                 if (result)
374                         goto dmp_bias_store_fail;
375                 st->input_gyro_dmp_bias[1] = data;
376                 break;
377         case ATTR_DMP_GYRO_Z_DMP_BIAS:
378                 result = write_be32_to_mem(st, data, GYRO_BIAS_Z);
379                 if (result)
380                         goto dmp_bias_store_fail;
381                 st->input_gyro_dmp_bias[2] = data;
382                 break;
383         case ATTR_DMP_MAGN_X_DMP_BIAS:
384                 if (data)
385                         st->sensor_acurracy_flag[SENSOR_COMPASS_ACCURACY] = 3;
386                 result = write_be32_to_mem(st, data, CPASS_BIAS_X);
387                 if (result)
388                         goto dmp_bias_store_fail;
389                 st->input_compass_dmp_bias[0] = data;
390                 break;
391         case ATTR_DMP_MAGN_Y_DMP_BIAS:
392                 result = write_be32_to_mem(st, data, CPASS_BIAS_Y);
393                 if (result)
394                         goto dmp_bias_store_fail;
395                 st->input_compass_dmp_bias[1] = data;
396                 break;
397         case ATTR_DMP_MAGN_Z_DMP_BIAS:
398                 result = write_be32_to_mem(st, data, CPASS_BIAS_Z);
399                 if (result)
400                         goto dmp_bias_store_fail;
401                 st->input_compass_dmp_bias[2] = data;
402                 break;
403         case ATTR_DMP_MISC_GYRO_RECALIBRATION:
404                 result = write_be32_to_mem(st, 0, GYRO_LAST_TEMPR);
405                 if (result)
406                         goto dmp_bias_store_fail;
407                 break;
408         case ATTR_DMP_MISC_ACCEL_RECALIBRATION:
409         {
410                 u8 d[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
411                 int i;
412                 u32 d1[] = {0, 0, 0, 0,
413                                 0, 0, 0, 0, 0, 0,
414                                 3276800, 3276800, 3276800, 3276800};
415                 u32 *w_d;
416
417                 if (data) {
418                         result = inv_write_2bytes(st, ACCEL_CAL_RESET, 1);
419                         if (result)
420                                 goto dmp_bias_store_fail;
421                         result = mem_w(ACCEL_PRE_SENSOR_DATA, ARRAY_SIZE(d), d);
422                         w_d = d1;
423                 } else {
424                         w_d = st->accel_covariance;
425                 }
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));
429                         if (result)
430                                 goto dmp_bias_store_fail;
431                 }
432
433                 break;
434         }
435         case ATTR_DMP_MISC_COMPASS_RECALIBRATION:
436         {
437                 u32 d[] = {0, 0, 0, 0,
438                                 14745600, 14745600, 14745600, 14745600,
439                                 0, 0, 0, 0,
440                                 0, 0};
441                 int i, *w_d;
442
443                 if (data) {
444                         w_d = d;
445                 } else {
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 +
451                                                 i * sizeof(int));
452                                 if (result)
453                                         goto dmp_bias_store_fail;
454                         }
455                         result = write_be32_to_mem(st, st->ref_mag_3d,
456                                                         CPASS_REF_MAG_3D);
457                         if (result)
458                                 goto dmp_bias_store_fail;
459                 }
460
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));
464                         if (result)
465                                 goto dmp_bias_store_fail;
466                 }
467                 break;
468         }
469         case ATTR_DMP_PARAMS_ACCEL_CALIBRATION_THRESHOLD:
470                 result = write_be32_to_mem(st, data, ACCEL_VARIANCE_THRESH);
471                 if (result)
472                         goto dmp_bias_store_fail;
473                 st->accel_calib_threshold = data;
474                 break;
475         /* this serves as a divider of calibration rate, 0->225, 3->55 */
476         case ATTR_DMP_PARAMS_ACCEL_CALIBRATION_RATE:
477                 if (data < 0)
478                         data = 0;
479                 result = inv_write_2bytes(st, ACCEL_CAL_RATE, data);
480                 if (result)
481                         goto dmp_bias_store_fail;
482                 st->accel_calib_rate = data;
483                 break;
484         case ATTR_DMP_DEBUG_MEM_READ:
485                 debug_mem_read_addr = data;
486                 break;
487         case ATTR_DMP_DEBUG_MEM_WRITE:
488                 inv_write_2bytes(st, debug_mem_read_addr, data);
489                 break;
490         default:
491                 break;
492         }
493
494 dmp_bias_store_fail:
495         if (result)
496                 return result;
497         result = inv_switch_power_in_lp(st, false);
498         if (result)
499                 return result;
500
501         return count;
502 }
503
504 static ssize_t inv_dmp_bias_store(struct device *dev,
505         struct device_attribute *attr, const char *buf, size_t count)
506 {
507         struct iio_dev *indio_dev = dev_get_drvdata(dev);
508         int result;
509
510         mutex_lock(&indio_dev->mlock);
511         result = _dmp_bias_store(dev, attr, buf, count);
512         mutex_unlock(&indio_dev->mlock);
513
514         return result;
515 }
516
517 static ssize_t inv_debug_store(struct device *dev,
518         struct device_attribute *attr, const char *buf, size_t count)
519 {
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);
523         int result, data;
524
525         result = kstrtoint(buf, 10, &data);
526         if (result)
527                 return result;
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);
532                 break;
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);
539                 break;
540         case ATTR_DEBUG_REG_ADDR:
541                 debug_reg_addr = data;
542                 break;
543         case ATTR_DEBUG_REG_WRITE:
544                 inv_plat_single_write(st, debug_reg_addr, data);
545                 break;
546         case ATTR_DEBUG_WRITE_CFG:
547                 break;
548         }
549         return count;
550 }
551 static ssize_t _misc_attr_store(struct device *dev,
552         struct device_attribute *attr, const char *buf, size_t count)
553 {
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);
557         int result, data;
558
559         if (!st->chip_config.firmware_loaded)
560                 return -EINVAL;
561         result = inv_switch_power_in_lp(st, true);
562         if (result)
563                 return result;
564         result = kstrtoint(buf, 10, &data);
565         if (result)
566                 return result;
567         switch (this_attr->address) {
568         case ATTR_DMP_LOW_POWER_GYRO_ON:
569                 st->chip_config.low_power_gyro_on = !!data;
570                 break;
571         case ATTR_DEBUG_DATA_COLLECTION_MODE:
572                 st->chip_config.debug_data_collection_mode_on = !!data;
573                 break;
574         case ATTR_DEBUG_DATA_COLLECTION_GYRO_RATE:
575                 st->chip_config.debug_data_collection_gyro_freq = data;
576                 break;
577         case ATTR_DEBUG_DATA_COLLECTION_ACCEL_RATE:
578                 st->chip_config.debug_data_collection_accel_freq = data;
579                 break;
580         case ATTR_DMP_REF_MAG_3D:
581                 st->ref_mag_3d = data;
582                 return 0;
583         case ATTR_DMP_DEBUG_DETERMINE_ENGINE_ON:
584                 st->debug_determine_engine_on = !!data;
585                 break;
586         case ATTR_GYRO_SCALE:
587                 if (data > 3)
588                         return -EINVAL;
589                 st->chip_config.fsr = data;
590                 result = inv_set_gyro_sf(st);
591
592                 return result;
593         case ATTR_ACCEL_SCALE:
594                 if (data > 3)
595                         return -EINVAL;
596                 st->chip_config.accel_fs = data;
597                 result = inv_set_accel_sf(st);
598
599                 return result;
600         case ATTR_DMP_PED_INT_ON:
601                 result = inv_write_cntl(st, PEDOMETER_INT_EN << 8, !!data,
602                                                         MOTION_EVENT_CTL);
603                 if (result)
604                         return result;
605                 st->ped.int_on = !!data;
606
607                 return 0;
608         case ATTR_DMP_PED_STEP_THRESH:
609                 result = inv_write_2bytes(st, PEDSTD_SB, data);
610                 if (result)
611                         return result;
612                 st->ped.step_thresh = data;
613
614                 return 0;
615         case ATTR_DMP_PED_INT_THRESH:
616                 result = inv_write_2bytes(st, PEDSTD_SB2, data);
617                 if (result)
618                         return result;
619                 st->ped.int_thresh = data;
620
621                 return 0;
622         default:
623                 return -EINVAL;
624         }
625         st->trigger_state = MISC_TRIGGER;
626         result = set_inv_enable(indio_dev);
627
628         return result;
629 }
630
631 /*
632  * inv_misc_attr_store() -  calling this function will store current
633  *                        dmp parameter settings
634  */
635 static ssize_t inv_misc_attr_store(struct device *dev,
636         struct device_attribute *attr, const char *buf, size_t count)
637 {
638         struct iio_dev *indio_dev = dev_get_drvdata(dev);
639         int result;
640
641         mutex_lock(&indio_dev->mlock);
642         result = _misc_attr_store(dev, attr, buf, count);
643         mutex_unlock(&indio_dev->mlock);
644         if (result)
645                 return result;
646
647         return count;
648 }
649
650 static ssize_t _debug_attr_store(struct device *dev,
651         struct device_attribute *attr, const char *buf, size_t count)
652 {
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);
656         int result, data;
657
658         if (!st->chip_config.firmware_loaded)
659                 return -EINVAL;
660         if (!st->debug_determine_engine_on)
661                 return -EINVAL;
662
663         result = kstrtoint(buf, 10, &data);
664         if (result)
665                 return result;
666         switch (this_attr->address) {
667         case ATTR_DMP_IN_ANGLVEL_ACCURACY_ENABLE:
668                 st->sensor_accuracy[SENSOR_GYRO_ACCURACY].on = !!data;
669                 break;
670         case ATTR_DMP_IN_ACCEL_ACCURACY_ENABLE:
671                 st->sensor_accuracy[SENSOR_ACCEL_ACCURACY].on = !!data;
672                 break;
673         case ATTR_DMP_IN_MAGN_ACCURACY_ENABLE:
674                 st->sensor_accuracy[SENSOR_COMPASS_ACCURACY].on = !!data;
675                 break;
676         case ATTR_DMP_ACCEL_CAL_ENABLE:
677                 st->accel_cal_enable = !!data;
678                 break;
679         case ATTR_DMP_GYRO_CAL_ENABLE:
680                 st->gyro_cal_enable = !!data;
681                 break;
682         case ATTR_DMP_COMPASS_CAL_ENABLE:
683                 st->compass_cal_enable = !!data;
684                 break;
685         case ATTR_DMP_EVENT_INT_ON:
686                 st->chip_config.dmp_event_int_on = !!data;
687                 break;
688         case ATTR_DMP_ON:
689                 st->chip_config.dmp_on = !!data;
690                 break;
691         case ATTR_GYRO_ENABLE:
692                 st->chip_config.gyro_enable = !!data;
693                 break;
694         case ATTR_ACCEL_ENABLE:
695                 st->chip_config.accel_enable = !!data;
696                 break;
697         case ATTR_COMPASS_ENABLE:
698                 st->chip_config.compass_enable = !!data;
699                 break;
700         default:
701                 return -EINVAL;
702         }
703         st->trigger_state = DEBUG_TRIGGER;
704         result = set_inv_enable(indio_dev);
705         if (result)
706                 return result;
707
708         return count;
709 }
710
711 /*
712  * inv_debug_attr_store() -  calling this function will store current
713  *                        dmp parameter settings
714  */
715 static ssize_t inv_debug_attr_store(struct device *dev,
716         struct device_attribute *attr, const char *buf, size_t count)
717 {
718         struct iio_dev *indio_dev = dev_get_drvdata(dev);
719         int result;
720
721         mutex_lock(&indio_dev->mlock);
722         result = _debug_attr_store(dev, attr, buf, count);
723         mutex_unlock(&indio_dev->mlock);
724
725         return result;
726 }
727
728 static int inv_rate_convert(struct inv_mpu_state *st, int ind, int data)
729 {
730         int t, out, out1, out2;
731
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;
736                 else
737                         out = data;
738         } else if (SENSOR_ALS == ind) {
739                 if (data > MAX_ALS_RATE)
740                         out = MAX_ALS_RATE;
741                 else
742                         out = data;
743         } else if (SENSOR_PRESSURE == ind) {
744                 if (data > MAX_PRESSURE_RATE)
745                         out = MAX_PRESSURE_RATE;
746                 else
747                         out = data;
748         } else {
749                 t = MPU_DEFAULT_DMP_FREQ / data;
750                 if (!t)
751                         t = 1;
752                 out1 = MPU_DEFAULT_DMP_FREQ / (t + 1);
753                 out2 = MPU_DEFAULT_DMP_FREQ / t;
754                 if (abs(out1 - data) < abs(out2 - data))
755                         out = out1;
756                 else
757                         out = out2;
758         }
759
760         return out;
761 }
762
763 static ssize_t inv_sensor_rate_show(struct device *dev,
764         struct device_attribute *attr, char *buf)
765 {
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);
769
770         return sprintf(buf, "%d\n", st->sensor[this_attr->address].rate);
771 }
772 static ssize_t inv_sensor_rate_store(struct device *dev,
773         struct device_attribute *attr, const char *buf, size_t count)
774 {
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);
778         int data, rate, ind;
779         int result;
780
781         if (!st->chip_config.firmware_loaded) {
782                 pr_err("sensor_rate_store: firmware not loaded\n");
783                 return -EINVAL;
784         }
785         result = kstrtoint(buf, 10, &data);
786         if (result)
787                 return -EINVAL;
788         if (data <= 0) {
789                 pr_err("sensor_rate_store: invalid data=%d\n", data);
790                 return -EINVAL;
791         }
792         ind = this_attr->address;
793         rate = inv_rate_convert(st, ind, data);
794         if (rate == st->sensor[ind].rate)
795                 return count;
796         mutex_lock(&indio_dev->mlock);
797         st->sensor[ind].rate = rate;
798         if (!st->sensor[ind].on) {
799                 mutex_unlock(&indio_dev->mlock);
800                 return count;
801         }
802
803         st->trigger_state = DATA_TRIGGER;
804         result = set_inv_enable(indio_dev);
805         mutex_unlock(&indio_dev->mlock);
806         if (result)
807                 return result;
808
809         return count;
810 }
811
812 static ssize_t inv_sensor_on_show(struct device *dev,
813         struct device_attribute *attr, char *buf)
814 {
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);
818
819         return sprintf(buf, "%d\n", st->sensor[this_attr->address].on);
820 }
821 static ssize_t inv_sensor_on_store(struct device *dev,
822         struct device_attribute *attr, const char *buf, size_t count)
823 {
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);
827         int data, on, ind;
828         int result;
829
830         if (!st->chip_config.firmware_loaded) {
831                 pr_err("sensor_on store: firmware not loaded\n");
832                 return -EINVAL;
833         }
834         result = kstrtoint(buf, 10, &data);
835         if (result)
836                 return -EINVAL;
837         if (data < 0) {
838                 pr_err("sensor_on_store: invalid data=%d\n", data);
839                 return -EINVAL;
840         }
841         ind = this_attr->address;
842         on = !!data;
843         if (on == st->sensor[ind].on)
844                 return count;
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);
849                 return count;
850         }
851         st->trigger_state = RATE_TRIGGER;
852         result = set_inv_enable(indio_dev);
853         mutex_unlock(&indio_dev->mlock);
854         if (result)
855                 return result;
856
857         return count;
858 }
859
860 static ssize_t _basic_attr_store(struct device *dev,
861         struct device_attribute *attr, const char *buf, size_t count)
862 {
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);
866         int data;
867         int result;
868
869         if (!st->chip_config.firmware_loaded)
870                 return -EINVAL;
871         result = kstrtoint(buf, 10, &data);
872         if (result || (data < 0))
873                 return -EINVAL;
874
875         switch (this_attr->address) {
876         case ATTR_DMP_PED_ON:
877                 if ((!!data) == st->ped.on)
878                         return count;
879                 st->ped.on = !!data;
880                 break;
881         case ATTR_DMP_SMD_ENABLE:
882                 if ((!!data) == st->smd.on)
883                         return count;
884                 st->smd.on = !!data;
885                 break;
886         case ATTR_DMP_STEP_DETECTOR_ON:
887                 if ((!!data) == st->chip_config.step_detector_on)
888                         return count;
889                 st->chip_config.step_detector_on = !!data;
890                 break;
891         case ATTR_DMP_STEP_INDICATOR_ON:
892                 if ((!!data) == st->chip_config.step_indicator_on)
893                         return count;
894                 st->chip_config.step_indicator_on = !!data;
895                 break;
896         case ATTR_DMP_BATCHMODE_TIMEOUT:
897                 if (data == st->batch.timeout)
898                         return count;
899                 st->batch.timeout = data;
900                 break;
901         default:
902                 return -EINVAL;
903         };
904
905         st->trigger_state = EVENT_TRIGGER;
906         result = set_inv_enable(indio_dev);
907         if (result)
908                 return result;
909
910         return count;
911 }
912
913 /*
914  * inv_basic_attr_store() -  calling this function will store current
915  *                        non-dmp parameter settings
916  */
917 static ssize_t inv_basic_attr_store(struct device *dev,
918         struct device_attribute *attr, const char *buf, size_t count)
919 {
920         struct iio_dev *indio_dev = dev_get_drvdata(dev);
921         int result;
922
923         mutex_lock(&indio_dev->mlock);
924         result = _basic_attr_store(dev, attr, buf, count);
925
926         mutex_unlock(&indio_dev->mlock);
927
928         return result;
929 }
930
931 /*
932  * inv_attr_bias_show() -  calling this function will show current
933  *                        dmp gyro/accel bias.
934  */
935 static ssize_t inv_attr_bias_show(struct device *dev,
936         struct device_attribute *attr, char *buf)
937 {
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;
942         int sensor_type;
943
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:
958                 axes = 0;
959                 addr = ACCEL_BIAS_X;
960                 sensor_type = SENSOR_ACCEL;
961                 break;
962         case ATTR_DMP_ACCEL_Y_DMP_BIAS:
963                 axes = 1;
964                 addr = ACCEL_BIAS_Y;
965                 sensor_type = SENSOR_ACCEL;
966                 break;
967         case ATTR_DMP_ACCEL_Z_DMP_BIAS:
968                 axes = 2;
969                 addr = ACCEL_BIAS_Z;
970                 sensor_type = SENSOR_ACCEL;
971                 break;
972         case ATTR_DMP_GYRO_X_DMP_BIAS:
973                 axes = 0;
974                 addr = GYRO_BIAS_X;
975                 sensor_type = SENSOR_GYRO;
976                 break;
977         case ATTR_DMP_GYRO_Y_DMP_BIAS:
978                 axes = 1;
979                 addr = GYRO_BIAS_Y;
980                 sensor_type = SENSOR_GYRO;
981                 break;
982         case ATTR_DMP_GYRO_Z_DMP_BIAS:
983                 axes = 2;
984                 addr = GYRO_BIAS_Z;
985                 sensor_type = SENSOR_GYRO;
986                 break;
987         case ATTR_DMP_MAGN_X_DMP_BIAS:
988                 axes = 0;
989                 addr = CPASS_BIAS_X;
990                 sensor_type = SENSOR_COMPASS;
991                 break;
992         case ATTR_DMP_MAGN_Y_DMP_BIAS:
993                 axes = 1;
994                 addr = CPASS_BIAS_Y;
995                 sensor_type = SENSOR_COMPASS;
996                 break;
997         case ATTR_DMP_MAGN_Z_DMP_BIAS:
998                 axes = 2;
999                 addr = CPASS_BIAS_Z;
1000                 sensor_type = SENSOR_COMPASS;
1001                 break;
1002         default:
1003                 return -EINVAL;
1004         }
1005         result = inv_switch_power_in_lp(st, true);
1006         if (result)
1007                 return result;
1008         result = read_be32_from_mem(st, &dmp_bias, addr);
1009         if (result)
1010                 return result;
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;
1018         else
1019                 return -EINVAL;
1020
1021         return sprintf(buf, "%d\n", dmp_bias);
1022 }
1023
1024 /*
1025  * inv_attr_show() -  calling this function will show current
1026  *                        dmp parameters.
1027  */
1028 static ssize_t inv_attr_show(struct device *dev,
1029         struct device_attribute *attr, char *buf)
1030 {
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);
1034         int result;
1035         s8 *m;
1036
1037         switch (this_attr->address) {
1038         case ATTR_GYRO_SCALE:
1039         {
1040                 const s16 gyro_scale[] = {250, 500, 1000, 2000};
1041
1042                 return sprintf(buf, "%d\n", gyro_scale[st->chip_config.fsr]);
1043         }
1044         case ATTR_ACCEL_SCALE:
1045         {
1046                 const s16 accel_scale[] = {2, 4, 8, 16};
1047                 return sprintf(buf, "%d\n",
1048                                         accel_scale[st->chip_config.accel_fs]);
1049         }
1050         case ATTR_COMPASS_SCALE:
1051                 st->slave_compass->get_scale(st, &result);
1052
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);
1072         case ATTR_DMP_ON:
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)
1129                         m =
1130                         st->plat_data.secondary_orientation;
1131                 else
1132                         return -ENODEV;
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:
1136         {
1137                 const char *n[] = {"NULL", "AK8975", "AK8972", "AK8963",
1138                                         "MLX90399", "AK09911", "AK09912"};
1139
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]);
1153                 default:
1154                         return sprintf(buf, "%s\n", n[0]);
1155                 }
1156         }
1157         case ATTR_DMP_REF_MAG_3D:
1158         {
1159                 int out;
1160                 inv_switch_power_in_lp(st, true);
1161                 result = read_be32_from_mem(st, &out, CPASS_REF_MAG_3D);
1162                 if (result)
1163                         return result;
1164                 inv_switch_power_in_lp(st, false);
1165                 return sprintf(buf, "%d\n", out);
1166         }
1167         case ATTR_DMP_DEBUG_MEM_READ:
1168         {
1169                 int out;
1170
1171                 inv_switch_power_in_lp(st, true);
1172                 result = read_be32_from_mem(st, &out, debug_mem_read_addr);
1173                 if (result)
1174                         return result;
1175                 inv_switch_power_in_lp(st, false);
1176                 return sprintf(buf, "0x%x\n", out);
1177         }
1178         case ATTR_GYRO_SF:
1179                 return sprintf(buf, "%d\n", st->gyro_sf);
1180         default:
1181                 return -EPERM;
1182         }
1183 }
1184
1185 static ssize_t inv_attr64_show(struct device *dev,
1186         struct device_attribute *attr, char *buf)
1187 {
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);
1191         int result;
1192         u64 tmp;
1193         u32 ped;
1194
1195         mutex_lock(&indio_dev->mlock);
1196         if (!st->chip_config.dmp_on) {
1197                 mutex_unlock(&indio_dev->mlock);
1198                 return -EINVAL;
1199         }
1200         result = 0;
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);
1208                 break;
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);
1214                 break;
1215         case ATTR_DMP_PEDOMETER_COUNTER:
1216                 tmp = st->ped.last_step_time;
1217                 break;
1218         default:
1219                 tmp = 0;
1220                 result = -EINVAL;
1221                 break;
1222         }
1223
1224         mutex_unlock(&indio_dev->mlock);
1225         if (result)
1226                 return -EINVAL;
1227         return sprintf(buf, "%lld\n", tmp);
1228 }
1229
1230 static ssize_t inv_attr64_store(struct device *dev,
1231         struct device_attribute *attr, const char *buf, size_t count)
1232 {
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);
1236         int result;
1237         u8 d[4] = {0, 0, 0, 0};
1238         u64 data;
1239
1240         mutex_lock(&indio_dev->mlock);
1241         if (!st->chip_config.firmware_loaded) {
1242                 mutex_unlock(&indio_dev->mlock);
1243                 return -EINVAL;
1244         }
1245         result = inv_switch_power_in_lp(st, true);
1246         if (result) {
1247                 mutex_unlock(&indio_dev->mlock);
1248                 return result;
1249         }
1250         result = kstrtoull(buf, 10, &data);
1251         if (result)
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);
1256                 if (result)
1257                         goto attr64_store_fail;
1258                 st->ped.step = data;
1259                 break;
1260         case ATTR_DMP_PEDOMETER_TIME:
1261                 result = mem_w(PEDSTD_TIMECTR, ARRAY_SIZE(d), d);
1262                 if (result)
1263                         goto attr64_store_fail;
1264                 st->ped.time = data;
1265                 break;
1266         default:
1267                 result = -EINVAL;
1268                 break;
1269         }
1270 attr64_store_fail:
1271         mutex_unlock(&indio_dev->mlock);
1272         result = inv_switch_power_in_lp(st, false);
1273         if (result)
1274                 return result;
1275
1276         return count;
1277 }
1278
1279 static ssize_t inv_self_test(struct device *dev,
1280                                 struct device_attribute *attr, char *buf)
1281 {
1282         struct iio_dev *indio_dev = dev_get_drvdata(dev);
1283         struct inv_mpu_state *st = iio_priv(indio_dev);
1284         int res;
1285
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);
1290
1291         return sprintf(buf, "%d\n", res);
1292 }
1293
1294 /*
1295  *  inv_temperature_show() - Read temperature data directly from registers.
1296  */
1297 static ssize_t inv_temperature_show(struct device *dev,
1298         struct device_attribute *attr, char *buf)
1299 {
1300
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;
1304         short temp;
1305         u8 data[2];
1306
1307         mutex_lock(&indio_dev->mlock);
1308         result = inv_switch_power_in_lp(st, true);
1309         if (result) {
1310                 mutex_unlock(&indio_dev->mlock);
1311                 return result;
1312         }
1313
1314         result = inv_plat_read(st, REG_TEMPERATURE, 2, data);
1315         mutex_unlock(&indio_dev->mlock);
1316         if (result) {
1317                 pr_err("Could not read temperature register.\n");
1318                 return result;
1319         }
1320         result = inv_switch_power_in_lp(st, false);
1321         if (result)
1322                 return result;
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);
1326
1327         INV_I2C_INC_TEMPREAD(1);
1328
1329         return sprintf(buf, "%d %lld\n", scale_t, get_time_ns());
1330 }
1331
1332 /*
1333  * inv_smd_show() -  calling this function showes smd interrupt.
1334  *                         This event must use poll.
1335  */
1336 static ssize_t inv_smd_show(struct device *dev,
1337         struct device_attribute *attr, char *buf)
1338 {
1339         return sprintf(buf, "1\n");
1340 }
1341
1342 /*
1343  * inv_ped_show() -  calling this function showes pedometer interrupt.
1344  *                         This event must use poll.
1345  */
1346 static ssize_t inv_ped_show(struct device *dev,
1347         struct device_attribute *attr, char *buf)
1348 {
1349         return sprintf(buf, "1\n");
1350 }
1351
1352 /*
1353  *  inv_reg_dump_show() - Register dump for testing.
1354  */
1355 static ssize_t inv_reg_dump_show(struct device *dev,
1356         struct device_attribute *attr, char *buf)
1357 {
1358         int ii;
1359         char data;
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);
1363
1364         mutex_lock(&indio_dev->mlock);
1365         inv_set_bank(st, BANK_SEL_0);
1366         bytes_printed += sprintf(buf + bytes_printed, "bank 0\n");
1367
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))
1371                         data = 0;
1372                 else
1373                         inv_plat_read(st, ii, 1, &data);
1374                 bytes_printed += sprintf(buf + bytes_printed, "%#2x: %#2x\n",
1375                                          ii, data);
1376         }
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",
1382                                          ii, data);
1383         }
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",
1389                                          ii, data);
1390         }
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",
1396                                          ii, data);
1397         }
1398         inv_set_bank(st, BANK_SEL_0);
1399         set_inv_enable(indio_dev);
1400         mutex_unlock(&indio_dev->mlock);
1401
1402         return bytes_printed;
1403 }
1404
1405 static ssize_t inv_flush_batch_show(struct device *dev,
1406         struct device_attribute *attr, char *buf)
1407 {
1408         struct iio_dev *indio_dev = dev_get_drvdata(dev);
1409         int result;
1410         bool has_data;
1411
1412         mutex_lock(&indio_dev->mlock);
1413         result = inv_flush_batch_data(indio_dev, &has_data);
1414         mutex_unlock(&indio_dev->mlock);
1415         if (result)
1416                 return sprintf(buf, "%d\n", result);
1417         else
1418                 return sprintf(buf, "%d\n", has_data);
1419 }
1420
1421 static const struct iio_chan_spec inv_mpu_channels[] = {
1422         IIO_CHAN_SOFT_TIMESTAMP(INV_MPU_SCAN_TIMESTAMP),
1423 };
1424
1425 static DEVICE_ATTR(poll_smd, S_IRUGO, inv_smd_show, NULL);
1426 static DEVICE_ATTR(poll_pedometer, S_IRUGO, inv_ped_show, NULL);
1427
1428 /* special run time sysfs entry, read only */
1429 static DEVICE_ATTR(misc_flush_batch, S_IRUGO, inv_flush_batch_show, NULL);
1430
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);
1435
1436 static IIO_DEVICE_ATTR(info_anglvel_matrix, S_IRUGO, inv_attr_show, NULL,
1437         ATTR_GYRO_MATRIX);
1438 static IIO_DEVICE_ATTR(info_accel_matrix, S_IRUGO, inv_attr_show, NULL,
1439         ATTR_ACCEL_MATRIX);
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,
1445                                                 ATTR_GYRO_SF);
1446
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);
1470
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);
1494
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);
1513
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);
1528
1529 static IIO_DEVICE_ATTR(misc_batchmode_timeout, S_IRUGO | S_IWUGO,
1530         inv_attr_show, inv_basic_attr_store, ATTR_DMP_BATCHMODE_TIMEOUT);
1531
1532 static IIO_DEVICE_ATTR(info_firmware_loaded, S_IRUGO | S_IWUGO, inv_attr_show,
1533         inv_firmware_loaded_store, ATTR_FIRMWARE_LOADED);
1534
1535 /* engine scale */
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);
1542
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);
1565
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);
1572
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);
1579
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);
1586
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);
1593
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);
1600
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);
1613
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);
1618
1619 static IIO_DEVICE_ATTR(event_smd_enable, S_IRUGO | S_IWUGO,
1620         inv_attr_show, inv_basic_attr_store, ATTR_DMP_SMD_ENABLE);
1621
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);
1630
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);
1637
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,
1698 };
1699
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,
1719 };
1720
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,
1732 };
1733 static const struct attribute *inv_smd_attributes[] = {
1734         &dev_attr_poll_smd.attr,
1735         &iio_dev_attr_event_smd_enable.dev_attr.attr,
1736 };
1737
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,
1741 };
1742
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,
1746 };
1747
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) +
1755         1
1756 ];
1757
1758 static const struct attribute_group inv_attribute_group = {
1759         .name = "mpu",
1760         .attrs = inv_attributes
1761 };
1762
1763 static const struct iio_info mpu_info = {
1764         .driver_module = THIS_MODULE,
1765         .attrs = &inv_attribute_group,
1766 };
1767
1768 /*
1769  *  inv_check_chip_type() - check and setup chip type.
1770  */
1771 int inv_check_chip_type(struct iio_dev *indio_dev, const char *name)
1772 {
1773         u8 v;
1774         int result;
1775         int t_ind;
1776         struct inv_chip_config_s *conf;
1777         struct mpu_platform_data *plat;
1778         struct inv_mpu_state *st;
1779
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;
1791         else
1792                 return -EPERM;
1793         st->hw  = &hw_info[st->chip_type];
1794         result = inv_set_bank(st, BANK_SEL_0);
1795         if (result)
1796                 return result;
1797         /* reset to make sure previous state are not there */
1798         result = inv_plat_single_write(st, REG_PWR_MGMT_1, BIT_H_RESET);
1799         if (result)
1800                 return result;
1801         usleep_range(REG_UP_TIME_USEC, REG_UP_TIME_USEC);
1802         msleep(100);
1803         /* toggle power state */
1804         result = inv_set_power(st, false);
1805         if (result)
1806                 return result;
1807
1808         result = inv_set_power(st, true);
1809         if (result)
1810                 return result;
1811         result = inv_plat_read(st, REG_WHO_AM_I, 1, &v);
1812         if (result)
1813                 return result;
1814                 
1815         result = inv_plat_single_write(st, REG_USER_CTRL, st->i2c_dis);
1816         if (result)
1817                 return result;
1818         result = inv_init_config(st);
1819         if (result)
1820                 return result;
1821
1822         if (SECONDARY_SLAVE_TYPE_COMPASS == plat->sec_slave_type)
1823                 st->chip_config.has_compass = 1;
1824         else
1825                 st->chip_config.has_compass = 0;
1826         if (SECONDARY_SLAVE_TYPE_PRESSURE == plat->aux_slave_type)
1827                 st->chip_config.has_pressure = 1;
1828         else
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;
1832         else
1833                 st->chip_config.has_als = 0;
1834
1835         if (st->chip_config.has_compass) {
1836                 result = inv_mpu_setup_compass_slave(st);
1837                 if (result) {
1838                         pr_err("compass setup failed\n");
1839                         inv_set_power(st, false);
1840                         return result;
1841                 }
1842         }
1843         if (st->chip_config.has_pressure) {
1844                 result = inv_mpu_setup_pressure_slave(st);
1845                 if (result) {
1846                         pr_err("pressure setup failed\n");
1847                         inv_set_power(st, false);
1848                         return result;
1849                 }
1850         }
1851         if (st->chip_config.has_als) {
1852                 result = inv_mpu_setup_als_slave(st);
1853                 if (result) {
1854                         pr_err("als setup failed\n");
1855                         inv_set_power(st, false);
1856                         return result;
1857                 }
1858         }
1859
1860         result = mem_r(MPU_SOFT_REV_ADDR, 1, &v);
1861         if (result)
1862                 return result;
1863         if (v & MPU_SOFT_REV_MASK) {
1864                 pr_err("incorrect software revision=%x\n", v);
1865                 return -EINVAL;
1866         }
1867         //set up the low power mode capability
1868     if (v & 0x04)
1869         st->chip_config.lp_en_mode = 1;
1870     else
1871         st->chip_config.lp_en_mode = 0;
1872         
1873         t_ind = 0;
1874         memcpy(&inv_attributes[t_ind], inv_raw_attributes,
1875                                         sizeof(inv_raw_attributes));
1876         t_ind += ARRAY_SIZE(inv_raw_attributes);
1877
1878         memcpy(&inv_attributes[t_ind], inv_pedometer_attributes,
1879                                         sizeof(inv_pedometer_attributes));
1880         t_ind += ARRAY_SIZE(inv_pedometer_attributes);
1881
1882         memcpy(&inv_attributes[t_ind], inv_smd_attributes,
1883                                         sizeof(inv_smd_attributes));
1884         t_ind += ARRAY_SIZE(inv_smd_attributes);
1885
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);
1890         }
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);
1895         }
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);
1900         }
1901
1902         inv_attributes[t_ind] = NULL;
1903
1904         indio_dev->channels = inv_mpu_channels;
1905         indio_dev->num_channels = ARRAY_SIZE(inv_mpu_channels);
1906
1907         indio_dev->info = &mpu_info;
1908         indio_dev->modes = INDIO_DIRECT_MODE;
1909         indio_dev->currentmode = INDIO_DIRECT_MODE;
1910         INIT_KFIFO(st->kf);
1911
1912         result = inv_set_power(st, false);
1913
1914         return result;
1915 }
1916
1917 /*
1918  *  inv_create_dmp_sysfs() - create binary sysfs dmp entry.
1919  */
1920 static const struct bin_attribute dmp_firmware = {
1921         .attr = {
1922                 .name = "misc_bin_dmp_firmware",
1923                 .mode = S_IRUGO | S_IWUGO
1924         },
1925         .size = DMP_IMAGE_SIZE,
1926         .read = inv_dmp_firmware_read,
1927         .write = inv_dmp_firmware_write,
1928 };
1929
1930 static const struct bin_attribute soft_iron_matrix = {
1931         .attr = {
1932                 .name = "misc_bin_soft_iron_matrix",
1933                 .mode = S_IRUGO | S_IWUGO
1934         },
1935         .size = SOFT_IRON_MATRIX_SIZE,
1936         .write = inv_soft_iron_matrix_write,
1937 };
1938
1939 static const struct bin_attribute accel_covariance = {
1940         .attr = {
1941                 .name = "misc_bin_accel_covariance",
1942                 .mode = S_IRUGO | S_IWUGO
1943         },
1944         .size = ACCEL_COVARIANCE_SIZE,
1945         .write = inv_accel_covariance_write,
1946         .read =  inv_accel_covariance_read,
1947 };
1948
1949 static const struct bin_attribute compass_covariance = {
1950         .attr = {
1951                 .name = "misc_bin_magn_covariance",
1952                 .mode = S_IRUGO | S_IWUGO
1953         },
1954         .size = COMPASS_COVARIANCE_SIZE,
1955         .write = inv_compass_covariance_write,
1956         .read =  inv_compass_covariance_read,
1957 };
1958
1959 static const struct bin_attribute compass_cur_covariance = {
1960         .attr = {
1961                 .name = "misc_bin_cur_magn_covariance",
1962                 .mode = S_IRUGO | S_IWUGO
1963         },
1964         .size = COMPASS_COVARIANCE_SIZE,
1965         .write = inv_compass_covariance_cur_write,
1966         .read =  inv_compass_covariance_cur_read,
1967 };
1968
1969 int inv_create_dmp_sysfs(struct iio_dev *ind)
1970 {
1971         int result;
1972
1973         result = sysfs_create_bin_file(&ind->dev.kobj, &dmp_firmware);
1974         if (result)
1975                 return result;
1976         result = sysfs_create_bin_file(&ind->dev.kobj, &soft_iron_matrix);
1977         if (result)
1978                 return result;
1979
1980         result = sysfs_create_bin_file(&ind->dev.kobj, &accel_covariance);
1981         if (result)
1982                 return result;
1983         result = sysfs_create_bin_file(&ind->dev.kobj, &compass_covariance);
1984         if (result)
1985                 return result;
1986         result = sysfs_create_bin_file(&ind->dev.kobj, &compass_cur_covariance);
1987
1988         return result;
1989 }