1895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/*
2895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall $License:
3895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall   Copyright 2011 InvenSense, Inc.
4895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
5895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall Licensed under the Apache License, Version 2.0 (the "License");
6895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall you may not use this file except in compliance with the License.
7895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall You may obtain a copy of the License at
8895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
9895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall http://www.apache.org/licenses/LICENSE-2.0
10895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
11895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall Unless required by applicable law or agreed to in writing, software
12895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall distributed under the License is distributed on an "AS IS" BASIS,
13895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall See the License for the specific language governing permissions and
15895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall limitations under the License.
16895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall  $
17895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
18895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
19895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/******************************************************************************
20895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
21895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * $Id: mldl_cfg_mpu.c 5653 2011-06-16 21:06:55Z nroyer $
22895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
23895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *****************************************************************************/
24895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
25895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
26895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @addtogroup MLDL
27895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
28895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @{
29895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *      @file   mldl_cfg_mpu.c
30895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *      @brief  The Motion Library Driver Layer.
31895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
32895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
33895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* ------------------ */
34895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* - Include Files. - */
35895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* ------------------ */
36895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
37895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include <stddef.h>
38895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mldl_cfg.h"
39895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mlsl.h"
40895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mpu.h"
41895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
42895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#ifdef LINUX
43895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include <sys/ioctl.h>
44895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#endif
45895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
46895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "log.h"
47895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#undef MPL_LOG_TAG
48895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MPL_LOG_TAG "MPL-mldl_cfg_mpu:"
49895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
50895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* --------------------- */
51895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* -    Variables.     - */
52895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* --------------------- */
53895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
54895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
55895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* ---------------------- */
56895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* -  Static Functions. - */
57895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* ---------------------- */
58895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallvoid mpu_print_cfg(struct mldl_cfg * mldl_cfg)
59895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
60895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    struct mpu_platform_data   *pdata   = mldl_cfg->pdata;
61895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    struct ext_slave_platform_data *accel   = &mldl_cfg->pdata->accel;
62895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    struct ext_slave_platform_data *compass = &mldl_cfg->pdata->compass;
63895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    struct ext_slave_platform_data *pressure = &mldl_cfg->pdata->pressure;
64895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
65895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("mldl_cfg.addr             = %02x\n", mldl_cfg->addr);
66895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("mldl_cfg.int_config       = %02x\n", mldl_cfg->int_config);
67895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("mldl_cfg.ext_sync         = %02x\n", mldl_cfg->ext_sync);
68895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("mldl_cfg.full_scale       = %02x\n", mldl_cfg->full_scale);
69895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("mldl_cfg.lpf              = %02x\n", mldl_cfg->lpf);
70895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("mldl_cfg.clk_src          = %02x\n", mldl_cfg->clk_src);
71895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("mldl_cfg.divider          = %02x\n", mldl_cfg->divider);
72895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("mldl_cfg.dmp_enable       = %02x\n", mldl_cfg->dmp_enable);
73895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("mldl_cfg.fifo_enable      = %02x\n", mldl_cfg->fifo_enable);
74895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("mldl_cfg.dmp_cfg1         = %02x\n", mldl_cfg->dmp_cfg1);
75895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("mldl_cfg.dmp_cfg2         = %02x\n", mldl_cfg->dmp_cfg2);
76895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("mldl_cfg.offset_tc[0]     = %02x\n", mldl_cfg->offset_tc[0]);
77895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("mldl_cfg.offset_tc[1]     = %02x\n", mldl_cfg->offset_tc[1]);
78895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("mldl_cfg.offset_tc[2]     = %02x\n", mldl_cfg->offset_tc[2]);
79895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("mldl_cfg.silicon_revision = %02x\n", mldl_cfg->silicon_revision);
80895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("mldl_cfg.product_id       = %02x\n", mldl_cfg->product_id);
81895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("mldl_cfg.gyro_sens_trim   = %02x\n", mldl_cfg->gyro_sens_trim);
82895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#if defined CONFIG_MPU_SENSORS_MPU6050A2 || defined CONFIG_MPU_SENSORS_MPU6050B1
83895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("mldl_cfg.accel_sens_trim   = %02x\n", mldl_cfg->accel_sens_trim);
84895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#endif
85895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
86895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (mldl_cfg->accel) {
876f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat        MPL_LOGD("slave_accel->suspend      = %p\n", mldl_cfg->accel->suspend);
886f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat        MPL_LOGD("slave_accel->resume       = %p\n", mldl_cfg->accel->resume);
896f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat        MPL_LOGD("slave_accel->read         = %p\n", mldl_cfg->accel->read);
90895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        MPL_LOGD("slave_accel->type         = %02x\n", mldl_cfg->accel->type);
91895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        MPL_LOGD("slave_accel->read_reg     = %02x\n",
92895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                 mldl_cfg->accel->read_reg);
93895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        MPL_LOGD("slave_accel->read_len     = %02x\n",
94895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                 mldl_cfg->accel->read_len);
95895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        MPL_LOGD("slave_accel->endian       = %02x\n", mldl_cfg->accel->endian);
96895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        MPL_LOGD("slave_accel->range.mantissa= %02x\n", (int)mldl_cfg->accel->range.mantissa);
97895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        MPL_LOGD("slave_accel->range.fraction= %02x\n", (int)mldl_cfg->accel->range.fraction);
98895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    } else {
99895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        MPL_LOGD("slave_accel               = NULL\n");
100895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
101895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
102895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (mldl_cfg->compass) {
1036f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat        MPL_LOGD("slave_compass->suspend    = %p\n", mldl_cfg->compass->suspend);
1046f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat        MPL_LOGD("slave_compass->resume     = %p\n", mldl_cfg->compass->resume);
1056f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat        MPL_LOGD("slave_compass->read       = %p\n", mldl_cfg->compass->read);
106895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        MPL_LOGD("slave_compass->type       = %02x\n", mldl_cfg->compass->type);
107895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        MPL_LOGD("slave_compass->read_reg   = %02x\n",
108895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                 mldl_cfg->compass->read_reg);
109895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        MPL_LOGD("slave_compass->read_len   = %02x\n",
110895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                 mldl_cfg->compass->read_len);
111895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        MPL_LOGD("slave_compass->endian     = %02x\n", mldl_cfg->compass->endian);
112895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        MPL_LOGD("slave_compass->range.mantissa= %02x\n", (int)mldl_cfg->compass->range.mantissa);
113895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        MPL_LOGD("slave_compass->range.fraction= %02x\n", (int)mldl_cfg->compass->range.fraction);
114895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    } else {
115895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        MPL_LOGD("slave_compass             = NULL\n");
116895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
117895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
118895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (mldl_cfg->pressure) {
1196f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat        MPL_LOGD("slave_pressure->suspend    = %p\n", mldl_cfg->pressure->suspend);
1206f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat        MPL_LOGD("slave_pressure->resume     = %p\n", mldl_cfg->pressure->resume);
1216f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat        MPL_LOGD("slave_pressure->read       = %p\n", mldl_cfg->pressure->read);
122895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        MPL_LOGD("slave_pressure->type       = %02x\n", mldl_cfg->pressure->type);
123895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        MPL_LOGD("slave_pressure->read_reg   = %02x\n",
124895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                 mldl_cfg->pressure->read_reg);
125895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        MPL_LOGD("slave_pressure->read_len   = %02x\n",
126895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                 mldl_cfg->pressure->read_len);
127895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        MPL_LOGD("slave_pressure->endian     = %02x\n", mldl_cfg->pressure->endian);
128895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        MPL_LOGD("slave_pressure->range.mantissa= %02x\n", (int)mldl_cfg->pressure->range.mantissa);
129895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        MPL_LOGD("slave_pressure->range.fraction= %02x\n", (int)mldl_cfg->pressure->range.fraction);
130895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    } else {
131895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        MPL_LOGD("slave_pressure             = NULL\n");
132895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
133895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1346f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat    MPL_LOGD("accel->get_slave_descr    = %p\n",accel->get_slave_descr);
135895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("accel->adapt_num          = %02x\n", accel->adapt_num);
136895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("accel->bus                = %02x\n", accel->bus);
137895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("accel->address            = %02x\n", accel->address);
138895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("accel->orientation        = \n"
139895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             "                            %2d %2d %2d\n"
140895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             "                            %2d %2d %2d\n"
141895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             "                            %2d %2d %2d\n",
142895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             accel->orientation[0],accel->orientation[1],accel->orientation[2],
143895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             accel->orientation[3],accel->orientation[4],accel->orientation[5],
144895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             accel->orientation[6],accel->orientation[7],accel->orientation[8]);
1456f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat    MPL_LOGD("compass->get_slave_descr  = %p\n",compass->get_slave_descr);
146895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("compass->adapt_num        = %02x\n", compass->adapt_num);
147895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("compass->bus              = %02x\n", compass->bus);
148895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("compass->address          = %02x\n", compass->address);
149895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("compass->orientation      = \n"
150895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             "                            %2d %2d %2d\n"
151895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             "                            %2d %2d %2d\n"
152895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             "                            %2d %2d %2d\n",
153895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             compass->orientation[0],compass->orientation[1],compass->orientation[2],
154895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             compass->orientation[3],compass->orientation[4],compass->orientation[5],
155895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             compass->orientation[6],compass->orientation[7],compass->orientation[8]);
1566f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat    MPL_LOGD("pressure->get_slave_descr  = %p\n",pressure->get_slave_descr);
157895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("pressure->adapt_num        = %02x\n", pressure->adapt_num);
158895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("pressure->bus              = %02x\n", pressure->bus);
159895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("pressure->address          = %02x\n", pressure->address);
160895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("pressure->orientation      = \n"
161895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             "                            %2d %2d %2d\n"
162895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             "                            %2d %2d %2d\n"
163895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             "                            %2d %2d %2d\n",
164895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             pressure->orientation[0],pressure->orientation[1],pressure->orientation[2],
165895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             pressure->orientation[3],pressure->orientation[4],pressure->orientation[5],
166895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             pressure->orientation[6],pressure->orientation[7],pressure->orientation[8]);
167895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
168895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("pdata->int_config         = %02x\n", pdata->int_config);
169895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("pdata->level_shifter      = %02x\n", pdata->level_shifter);
170895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPL_LOGD("pdata->orientation        = \n"
171895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             "                            %2d %2d %2d\n"
172895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             "                            %2d %2d %2d\n"
173895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             "                            %2d %2d %2d\n",
174895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             pdata->orientation[0],pdata->orientation[1],pdata->orientation[2],
175895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             pdata->orientation[3],pdata->orientation[4],pdata->orientation[5],
176895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             pdata->orientation[6],pdata->orientation[7],pdata->orientation[8]);
177895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1786f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat    MPL_LOGD("Struct sizes: mldl_cfg: %zu, "
1796f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat             "ext_slave_descr:%zu, mpu_platform_data:%zu: RamOffset: %zu\n",
180895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             sizeof(struct mldl_cfg), sizeof(struct ext_slave_descr),
181895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             sizeof(struct mpu_platform_data),
182895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall             offsetof(struct mldl_cfg, ram));
183895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
184895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
185895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/******************************************************************************
186895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall ******************************************************************************
187895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * Exported functions
188895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall ******************************************************************************
189895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *****************************************************************************/
190895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
191895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
192895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * Initializes the pdata structure to defaults.
193895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
194895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * Opens the device to read silicon revision, product id and whoami.  Leaves
195895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * the device in suspended state for low power.
196895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
197895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param mldl_cfg handle to the config structure
198895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param mlsl_handle handle to the mpu serial layer
199895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param accel_handle handle to the accel serial layer
200895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param compass_handle handle to the compass serial layer
201895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param pressure_handle handle to the pressure serial layer
202895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
203895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @return INV_SUCCESS if silicon revision, product id and woami are supported
204895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *         by this software.
205895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
206895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallint inv_mpu_open(struct mldl_cfg *mldl_cfg,
207895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                 void *mlsl_handle,
208895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                 void *accel_handle,
209895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                 void *compass_handle,
210895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                 void *pressure_handle)
211895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
212895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    int result;
2136f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat    result = ioctl((int)(uintptr_t)mlsl_handle, MPU_GET_MPU_CONFIG, mldl_cfg);
214895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
215895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
216895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
217895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
218895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
219895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_mpu_suspend(mldl_cfg, mlsl_handle, NULL, NULL, NULL,
220895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                             INV_ALL_SENSORS);
221895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
222895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
223895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
224895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
225895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
226895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
227895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
228895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
229895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * Stub for driver close.  Just verify that the devices are suspended
230895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
231895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param mldl_cfg handle to the config structure
232895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param mlsl_handle handle to the mpu serial layer
233895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param accel_handle handle to the accel serial layer
234895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param compass_handle handle to the compass serial layer
235895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param pressure_handle handle to the compass serial layer
236895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
237895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @return INV_SUCCESS or non-zero error code
238895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
239895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallint inv_mpu_close(struct mldl_cfg *mldl_cfg,
240895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall		  void *mlsl_handle,
241895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall		  void *accel_handle,
242895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall		  void *compass_handle,
243895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall		  void *pressure_handle)
244895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
245895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    int result = INV_SUCCESS;
246895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
247895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_mpu_suspend(mldl_cfg, mlsl_handle, NULL, NULL, NULL,
248895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                             INV_ALL_SENSORS);
249895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
250895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
251895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
252895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallint inv_mpu_resume(struct mldl_cfg* mldl_cfg,
253895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                   void *mlsl_handle,
254895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                   void *accel_handle,
255895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                   void *compass_handle,
256895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                   void *pressure_handle,
257895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                   unsigned long sensors)
258895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
259895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    int result;
260895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
261895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    mldl_cfg->requested_sensors = sensors;
2626f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat    result = ioctl((int)(uintptr_t)mlsl_handle, MPU_SET_MPU_CONFIG, mldl_cfg);
263895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
264895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
265895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
266895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
2676f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat    result = ioctl((int)(uintptr_t)mlsl_handle, MPU_RESUME, NULL);
268895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
269895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
270895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
271895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
2726f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat    result = ioctl((int)(uintptr_t)mlsl_handle, MPU_GET_MPU_CONFIG, mldl_cfg);
273895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
274895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
275895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
276895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
277895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    //MPL_LOGI("%s: Resuming to %04lx\n", __func__, mldl_cfg->requested_sensors);
278895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
279895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
280895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
281895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
282895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
283895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallint inv_mpu_suspend(struct mldl_cfg *mldl_cfg,
284895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall          	    void *mlsl_handle,
285895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                    void *accel_handle,
286895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                    void *compass_handle,
287895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                    void *pressure_handle,
288895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                    unsigned long sensors)
289895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
290895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    int result;
291895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    unsigned long requested = mldl_cfg->requested_sensors;
292895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
293895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    mldl_cfg->requested_sensors = (~sensors) & INV_ALL_SENSORS;
294895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    //MPL_LOGI("%s: suspending sensors to %04lx\n", __func__,
295895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    //         mldl_cfg->requested_sensors);
296895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2976f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat    result = ioctl((int)(uintptr_t)mlsl_handle, MPU_SET_MPU_CONFIG, mldl_cfg);
298895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
299895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
300895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
301895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
3026f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat    result = ioctl((int)(uintptr_t)mlsl_handle, MPU_SUSPEND, NULL);
303895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
304895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
305895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
306895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
3076f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat    result = ioctl((int)(uintptr_t)mlsl_handle, MPU_GET_MPU_CONFIG, mldl_cfg);
308895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
309895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
310895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
311895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
312895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
313895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    mldl_cfg->requested_sensors = requested;
314895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    //MPL_LOGI("%s: Will resume next to %04lx\n", __func__, requested);
315895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
316895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
317895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
318895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
319895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
320895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * Send slave configuration information
321895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
322895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param mldl_cfg pointer to the mldl configuration structure
323895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param gyro_handle handle to the gyro sensor
324895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param slave_handle handle to the slave sensor
325895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param slave slave description
326895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param pdata slave platform data
327895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param data where to store the read data
328895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
329895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @return 0 or non-zero error code
330895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
331895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallint inv_mpu_slave_read(struct mldl_cfg *mldl_cfg,
332895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall		void *gyro_handle,
333895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall		void *slave_handle,
334895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall		struct ext_slave_descr *slave,
335895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall		struct ext_slave_platform_data *pdata,
336895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall		unsigned char *data)
337895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
338895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    int result;
339895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (!mldl_cfg || !gyro_handle || !data || !slave) {
340895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
341895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
342895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
343895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
344895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    switch (slave->type) {
345895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case EXT_SLAVE_TYPE_ACCELEROMETER:
3466f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat        result = ioctl((int)(uintptr_t)gyro_handle, MPU_READ_ACCEL, data);
347895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
348895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case EXT_SLAVE_TYPE_COMPASS:
3496f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat        result = ioctl((int)(uintptr_t)gyro_handle, MPU_READ_COMPASS, data);
350895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
351895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case EXT_SLAVE_TYPE_PRESSURE:
3526f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat        result = ioctl((int)(uintptr_t)gyro_handle, MPU_READ_PRESSURE, data);
353895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
354895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    default:
355895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
356895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
357895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
358895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
359895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
360895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
361895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
362895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
363895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
364895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * Send slave configuration information
365895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
366895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param mldl_cfg pointer to the mldl configuration structure
367895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param gyro_handle handle to the gyro sensor
368895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param slave_handle handle to the slave sensor
369895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param data the data being sent
370895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param slave slave description
371895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param pdata slave platform data
372895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
373895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @return 0 or non-zero error code
374895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
375895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallint inv_mpu_slave_config(struct mldl_cfg *mldl_cfg,
376895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                     void *gyro_handle,
377895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                     void *slave_handle,
378895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                     struct ext_slave_config *data,
379895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                     struct ext_slave_descr *slave,
380895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                     struct ext_slave_platform_data *pdata)
381895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
382895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    int result;
383895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (!mldl_cfg || !data || !slave || !pdata || !slave) {
384895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
385895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
386895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
387895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
388895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    switch (slave->type) {
389895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case EXT_SLAVE_TYPE_ACCELEROMETER:
3906f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat        result = ioctl((int)(uintptr_t)gyro_handle, MPU_CONFIG_ACCEL, data);
391895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        if (result) {
392895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            LOG_RESULT_LOCATION(result);
393895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            return result;
394895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        }
395895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
396895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case EXT_SLAVE_TYPE_COMPASS:
3976f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat        result = ioctl((int)(uintptr_t)gyro_handle, MPU_CONFIG_COMPASS, data);
398895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        if (result) {
399895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            LOG_RESULT_LOCATION(result);
400895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            return result;
401895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        }
402895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
403895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case EXT_SLAVE_TYPE_PRESSURE:
4046f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat        result = ioctl((int)(uintptr_t)gyro_handle, MPU_CONFIG_PRESSURE, data);
405895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        if (result) {
406895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            LOG_RESULT_LOCATION(result);
407895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            return result;
408895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        }
409895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
410895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    default:
411895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
412895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
413895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
414895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
415895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
416895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
417895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
418895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
419895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
420895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * Request slave configuration information
421895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
422895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * Use this specifically after requesting a slave configuration to see what the
423895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * slave accually accepted.
424895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
425895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param mldl_cfg pointer to the mldl configuration structure
426895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param gyro_handle handle to the gyro sensor
427895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param slave_handle handle to the slave sensor
428895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param data the data being requested.
429895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param slave slave description
430895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param pdata slave platform data
431895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
432895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @return 0 or non-zero error code
433895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
434895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallint inv_mpu_get_slave_config(struct mldl_cfg *mldl_cfg,
435895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                         void *gyro_handle,
436895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                         void *slave_handle,
437895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                         struct ext_slave_config *data,
438895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                         struct ext_slave_descr *slave,
439895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                         struct ext_slave_platform_data *pdata)
440895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
441895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    int result;
442895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (!mldl_cfg || !data || !slave) {
443895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
444895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
445895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
446895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    switch (slave->type) {
447895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case EXT_SLAVE_TYPE_ACCELEROMETER:
4486f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat        result = ioctl((int)(uintptr_t)gyro_handle, MPU_GET_CONFIG_ACCEL, data);
449895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        if (result) {
450895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            LOG_RESULT_LOCATION(result);
451895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            return result;
452895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        }
453895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
454895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case EXT_SLAVE_TYPE_COMPASS:
4556f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat        result = ioctl((int)(uintptr_t)gyro_handle, MPU_GET_CONFIG_COMPASS, data);
456895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        if (result) {
457895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            LOG_RESULT_LOCATION(result);
458895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            return result;
459895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        }
460895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
461895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case EXT_SLAVE_TYPE_PRESSURE:
4626f13e8c2d7d2716474ea56e6fc9429e8a939ae44Ashok Bhat        result = ioctl((int)(uintptr_t)gyro_handle, MPU_GET_CONFIG_PRESSURE, data);
463895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        if (result) {
464895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            LOG_RESULT_LOCATION(result);
465895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            return result;
466895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        }
467895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
468895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    default:
469895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
470895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
471895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
472895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
473895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
474895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
475895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
476895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *@}
477895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
478