diff options
Diffstat (limited to 'drivers/iio/imu-aosp/inv_mpu6515/inv_slave_bma250.c')
| -rw-r--r-- | drivers/iio/imu-aosp/inv_mpu6515/inv_slave_bma250.c | 315 |
1 files changed, 0 insertions, 315 deletions
diff --git a/drivers/iio/imu-aosp/inv_mpu6515/inv_slave_bma250.c b/drivers/iio/imu-aosp/inv_mpu6515/inv_slave_bma250.c deleted file mode 100644 index 99ae702e67a..00000000000 --- a/drivers/iio/imu-aosp/inv_mpu6515/inv_slave_bma250.c +++ /dev/null @@ -1,315 +0,0 @@ -/* -* Copyright (C) 2012 Invensense, Inc. -* -* This software is licensed under the terms of the GNU General Public -* License version 2, as published by the Free Software Foundation, and -* may be copied, distributed, and modified under those terms. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/slab.h> -#include <linux/i2c.h> -#include <linux/err.h> -#include <linux/delay.h> -#include <linux/sysfs.h> -#include <linux/jiffies.h> -#include <linux/irq.h> -#include <linux/interrupt.h> -#include <linux/kfifo.h> -#include <linux/poll.h> -#include <linux/miscdevice.h> -#include <linux/spinlock.h> - -#include "inv_mpu_iio.h" -#define BMA250_CHIP_ID 3 -#define BMA250_RANGE_SET 0 -#define BMA250_BW_SET 4 - -/* range and bandwidth */ -#define BMA250_RANGE_2G 3 -#define BMA250_RANGE_4G 5 -#define BMA250_RANGE_8G 8 -#define BMA250_RANGE_16G 12 -#define BMA250_RANGE_MAX 4 -#define BMA250_RANGE_MASK 0xF0 - -#define BMA250_BW_7_81HZ 0x08 -#define BMA250_BW_15_63HZ 0x09 -#define BMA250_BW_31_25HZ 0x0A -#define BMA250_BW_62_50HZ 0x0B -#define BMA250_BW_125HZ 0x0C -#define BMA250_BW_250HZ 0x0D -#define BMA250_BW_500HZ 0x0E -#define BMA250_BW_1000HZ 0x0F -#define BMA250_MAX_BW_SIZE 8 -#define BMA250_BW_REG_MASK 0xE0 - -/* register definitions */ -#define BMA250_X_AXIS_LSB_REG 0x02 -#define BMA250_RANGE_SEL_REG 0x0F -#define BMA250_BW_SEL_REG 0x10 -#define BMA250_MODE_CTRL_REG 0x11 - -/* mode settings */ -#define BMA250_MODE_NORMAL 0 -#define BMA250_MODE_LOWPOWER 1 -#define BMA250_MODE_SUSPEND 2 -#define BMA250_MODE_MAX 3 -#define BMA250_MODE_MASK 0x3F -#define BMA250_BIT_SUSPEND 0x80 -#define BMA250_BIT_LP 0x40 - -struct bma_property { - int range; - int bandwidth; - int mode; -}; - -static struct bma_property bma_static_property = { - .range = BMA250_RANGE_SET, - .bandwidth = BMA250_BW_SET, - .mode = BMA250_MODE_SUSPEND -}; - -static int bma250_set_bandwidth(struct inv_mpu_state *st, u8 bw) -{ - int res; - u8 data; - int bandwidth; - switch (bw) { - case 0: - bandwidth = BMA250_BW_7_81HZ; - break; - case 1: - bandwidth = BMA250_BW_15_63HZ; - break; - case 2: - bandwidth = BMA250_BW_31_25HZ; - break; - case 3: - bandwidth = BMA250_BW_62_50HZ; - break; - case 4: - bandwidth = BMA250_BW_125HZ; - break; - case 5: - bandwidth = BMA250_BW_250HZ; - break; - case 6: - bandwidth = BMA250_BW_500HZ; - break; - case 7: - bandwidth = BMA250_BW_1000HZ; - break; - default: - return -EINVAL; - } - res = inv_secondary_read(BMA250_BW_SEL_REG, 1, &data); - if (res) - return res; - data &= BMA250_BW_REG_MASK; - data |= bandwidth; - res = inv_secondary_write(BMA250_BW_SEL_REG, data); - return res; -} - -static int bma250_set_range(struct inv_mpu_state *st, u8 range) -{ - int res; - u8 orig, data; - switch (range) { - case 0: - data = BMA250_RANGE_2G; - break; - case 1: - data = BMA250_RANGE_4G; - break; - case 2: - data = BMA250_RANGE_8G; - break; - case 3: - data = BMA250_RANGE_16G; - break; - default: - return -EINVAL; - } - res = inv_secondary_read(BMA250_RANGE_SEL_REG, 1, &orig); - if (res) - return res; - orig &= BMA250_RANGE_MASK; - data |= orig; - res = inv_secondary_write(BMA250_RANGE_SEL_REG, data); - if (res) - return res; - bma_static_property.range = range; - - return 0; -} - -static int setup_slave_bma250(struct inv_mpu_state *st) -{ - int result; - u8 data[2]; - result = set_3050_bypass(st, true); - if (result) - return result; - /*read secondary i2c ID register */ - result = inv_secondary_read(0, 1, data); - if (result) - return result; - if (BMA250_CHIP_ID != data[0]) - return -EINVAL; - result = set_3050_bypass(st, false); - if (result) - return result; - /*AUX(accel), slave address is set inside set_3050_bypass*/ - /* bma250 x axis LSB register address is 2 */ - result = inv_i2c_single_write(st, REG_3050_AUX_BST_ADDR, - BMA250_X_AXIS_LSB_REG); - - return result; -} - -static int bma250_set_mode(struct inv_mpu_state *st, u8 mode) -{ - int res; - u8 data; - - res = inv_secondary_read(BMA250_MODE_CTRL_REG, 1, &data); - if (res) - return res; - data &= BMA250_MODE_MASK; - switch (mode) { - case BMA250_MODE_NORMAL: - break; - case BMA250_MODE_LOWPOWER: - data |= BMA250_BIT_LP; - break; - case BMA250_MODE_SUSPEND: - data |= BMA250_BIT_SUSPEND; - break; - default: - return -EINVAL; - } - res = inv_secondary_write(BMA250_MODE_CTRL_REG, data); - if (res) - return res; - bma_static_property.mode = mode; - - return 0; -} - -static int suspend_slave_bma250(struct inv_mpu_state *st) -{ - int result; - if (bma_static_property.mode == BMA250_MODE_SUSPEND) - return 0; - /*set to bypass mode */ - result = set_3050_bypass(st, true); - if (result) - return result; - bma250_set_mode(st, BMA250_MODE_SUSPEND); - /* no need to recover to non-bypass mode because we need it now */ - - return 0; -} - -static int resume_slave_bma250(struct inv_mpu_state *st) -{ - int result; - if (bma_static_property.mode == BMA250_MODE_NORMAL) - return 0; - /*set to bypass mode */ - result = set_3050_bypass(st, true); - if (result) - return result; - result = bma250_set_mode(st, BMA250_MODE_NORMAL); - /* recover bypass mode */ - result |= set_3050_bypass(st, false); - - return result ? (-EINVAL) : 0; -} - -static int combine_data_slave_bma250(u8 *in, short *out) -{ - out[0] = le16_to_cpup((__le16 *)(&in[0])); - out[1] = le16_to_cpup((__le16 *)(&in[2])); - out[2] = le16_to_cpup((__le16 *)(&in[4])); - - return 0; -} - -static int get_mode_slave_bma250(void) -{ - switch (bma_static_property.mode) { - case BMA250_MODE_SUSPEND: - return INV_MODE_SUSPEND; - case BMA250_MODE_NORMAL: - return INV_MODE_NORMAL; - default: - return -EINVAL; - } -} - -/** - * set_lpf_bma250() - set lpf value - */ - -static int set_lpf_bma250(struct inv_mpu_state *st, int rate) -{ - const short hz[] = {1000, 500, 250, 125, 62, 31, 15, 7}; - const int d[] = {7, 6, 5, 4, 3, 2, 1, 0}; - int i, h, data, result; - h = (rate >> 1); - i = 0; - while ((h < hz[i]) && (i < ARRAY_SIZE(hz) - 1)) - i++; - data = d[i]; - - result = set_3050_bypass(st, true); - if (result) - return result; - result = bma250_set_bandwidth(st, (u8) data); - result |= set_3050_bypass(st, false); - - return result ? (-EINVAL) : 0; -} -/** - * set_fs_bma250() - set range value - */ - -static int set_fs_bma250(struct inv_mpu_state *st, int fs) -{ - int result; - result = set_3050_bypass(st, true); - if (result) - return result; - result = bma250_set_range(st, (u8) fs); - result |= set_3050_bypass(st, false); - - return result ? (-EINVAL) : 0; -} - -static struct inv_mpu_slave slave_bma250 = { - .suspend = suspend_slave_bma250, - .resume = resume_slave_bma250, - .setup = setup_slave_bma250, - .combine_data = combine_data_slave_bma250, - .get_mode = get_mode_slave_bma250, - .set_lpf = set_lpf_bma250, - .set_fs = set_fs_bma250 -}; - -int inv_register_mpu3050_slave(struct inv_mpu_state *st) -{ - st->slave_accel = &slave_bma250; - - return 0; -} - |