diff options
author | Rakesh Iyer <riyer@nvidia.com> | 2012-02-02 16:42:49 -0800 |
---|---|---|
committer | Rohan Somvanshi <rsomvanshi@nvidia.com> | 2012-02-17 06:34:51 -0800 |
commit | 555d8f1491dac8e733977652a03bccaa8702a4b1 (patch) | |
tree | bb0a8d77212900a733effbd4993804f132ae7390 /arch/arm/mach-tegra | |
parent | 7a1133116203ff1c0ef78ffee007ebc18580c91b (diff) |
arm: tegra: kai: Add Invensense MPU sensors
Bug 825602
Change-Id: Id3f4db74f2d0d1aebc8aa1f6e1da865171af9b49
Signed-off-by: Johnny Qiu <joqiu@nvidia.com>
Reviewed-on: http://git-master/r/82763
Reviewed-by: Rohan Somvanshi <rsomvanshi@nvidia.com>
Tested-by: Rohan Somvanshi <rsomvanshi@nvidia.com>
Diffstat (limited to 'arch/arm/mach-tegra')
-rw-r--r-- | arch/arm/mach-tegra/board-kai-sensors.c | 105 | ||||
-rw-r--r-- | arch/arm/mach-tegra/board-kai.h | 20 |
2 files changed, 125 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/board-kai-sensors.c b/arch/arm/mach-tegra/board-kai-sensors.c index 70289650d086..fa4b3fa8f46d 100644 --- a/arch/arm/mach-tegra/board-kai-sensors.c +++ b/arch/arm/mach-tegra/board-kai-sensors.c @@ -21,6 +21,7 @@ #include <linux/delay.h> #include <linux/err.h> #include <linux/i2c.h> +#include <linux/mpu.h> #include <linux/regulator/consumer.h> #include <asm/mach-types.h> #include <mach/gpio.h> @@ -126,6 +127,108 @@ static struct i2c_board_info kai_i2c2_board_info[] = { }, }; +/* MPU board file definition */ + +#if (MPU_GYRO_TYPE == MPU_TYPE_MPU3050) +#define MPU_GYRO_NAME "mpu3050" +#endif +#if (MPU_GYRO_TYPE == MPU_TYPE_MPU6050) +#define MPU_GYRO_NAME "mpu6050" +#endif + +static struct mpu_platform_data mpu_gyro_data = { + .int_config = 0x10, + .level_shifter = 0, + .orientation = MPU_GYRO_ORIENTATION, +}; + +#if (MPU_GYRO_TYPE == MPU_TYPE_MPU3050) +static struct ext_slave_platform_data mpu_accel_data = { + .address = MPU_ACCEL_ADDR, + .irq = 0, + .adapt_num = MPU_ACCEL_BUS_NUM, + .bus = EXT_SLAVE_BUS_SECONDARY, + .orientation = MPU_ACCEL_ORIENTATION, +}; +#endif + +static struct ext_slave_platform_data mpu_compass_data = { + .address = MPU_COMPASS_ADDR, + .irq = 0, + .adapt_num = MPU_COMPASS_BUS_NUM, + .bus = EXT_SLAVE_BUS_PRIMARY, + .orientation = MPU_COMPASS_ORIENTATION, +}; + +static struct i2c_board_info __initdata inv_mpu_i2c0_board_info[] = { + { + I2C_BOARD_INFO(MPU_GYRO_NAME, MPU_GYRO_ADDR), + .irq = TEGRA_GPIO_TO_IRQ(MPU_GYRO_IRQ_GPIO), + .platform_data = &mpu_gyro_data, + }, +#if (MPU_GYRO_TYPE == MPU_TYPE_MPU3050) + { + I2C_BOARD_INFO(MPU_ACCEL_NAME, MPU_ACCEL_ADDR), +#if MPU_ACCEL_IRQ_GPIO + .irq = TEGRA_GPIO_TO_IRQ(MPU_ACCEL_IRQ_GPIO), +#endif + .platform_data = &mpu_accel_data, + }, +#endif + { + I2C_BOARD_INFO(MPU_COMPASS_NAME, MPU_COMPASS_ADDR), +#if MPU_COMPASS_IRQ_GPIO + .irq = TEGRA_GPIO_TO_IRQ(MPU_COMPASS_IRQ_GPIO), +#endif + .platform_data = &mpu_compass_data, + }, +}; + +static void mpuirq_init(void) +{ + int ret = 0; + + pr_info("*** MPU START *** mpuirq_init...\n"); + +#if (MPU_GYRO_TYPE == MPU_TYPE_MPU3050) +#if MPU_ACCEL_IRQ_GPIO + /* ACCEL-IRQ assignment */ + tegra_gpio_enable(MPU_ACCEL_IRQ_GPIO); + ret = gpio_request(MPU_ACCEL_IRQ_GPIO, MPU_ACCEL_NAME); + if (ret < 0) { + pr_err("%s: gpio_request failed %d\n", __func__, ret); + return; + } + + ret = gpio_direction_input(MPU_ACCEL_IRQ_GPIO); + if (ret < 0) { + pr_err("%s: gpio_direction_input failed %d\n", __func__, ret); + gpio_free(MPU_ACCEL_IRQ_GPIO); + return; + } +#endif +#endif + + /* MPU-IRQ assignment */ + tegra_gpio_enable(MPU_GYRO_IRQ_GPIO); + ret = gpio_request(MPU_GYRO_IRQ_GPIO, MPU_GYRO_NAME); + if (ret < 0) { + pr_err("%s: gpio_request failed %d\n", __func__, ret); + return; + } + + ret = gpio_direction_input(MPU_GYRO_IRQ_GPIO); + if (ret < 0) { + pr_err("%s: gpio_direction_input failed %d\n", __func__, ret); + gpio_free(MPU_GYRO_IRQ_GPIO); + return; + } + pr_info("*** MPU END *** mpuirq_init...\n"); + + i2c_register_board_info(MPU_GYRO_BUS_NUM, inv_mpu_i2c0_board_info, + ARRAY_SIZE(inv_mpu_i2c0_board_info)); +} + int __init kai_sensors_init(void) { kai_camera_init(); @@ -133,5 +236,7 @@ int __init kai_sensors_init(void) i2c_register_board_info(2, kai_i2c2_board_info, ARRAY_SIZE(kai_i2c2_board_info)); + mpuirq_init(); + return 0; } diff --git a/arch/arm/mach-tegra/board-kai.h b/arch/arm/mach-tegra/board-kai.h index 39f5dfd4a157..59fae4338379 100644 --- a/arch/arm/mach-tegra/board-kai.h +++ b/arch/arm/mach-tegra/board-kai.h @@ -85,6 +85,26 @@ int __init touch_init_synaptics_kai(void); #define KAI_TS_ID1_PG TEGRA_PINGROUP_GMI_WAIT #define KAI_TS_ID2_PG TEGRA_PINGROUP_GMI_WP_N +#define MPU_TYPE_MPU3050 1 +#define MPU_TYPE_MPU6050 2 +#define MPU_GYRO_TYPE MPU_TYPE_MPU6050 +#define MPU_GYRO_IRQ_GPIO TEGRA_GPIO_PX1 +#define MPU_GYRO_ADDR 0x68 +#define MPU_GYRO_BUS_NUM 0 +#define MPU_GYRO_ORIENTATION { 0, -1, 0, -1, 0, 0, 0, 0, -1 } +#if (MPU_GYRO_TYPE == MPU_TYPE_MPU3050) +#define MPU_ACCEL_NAME "kxtf9" +#define MPU_ACCEL_IRQ_GPIO TEGRA_GPIO_PL1 +#define MPU_ACCEL_ADDR 0x0F +#define MPU_ACCEL_BUS_NUM 0 +#define MPU_ACCEL_ORIENTATION { 0, -1, 0, -1, 0, 0, 0, 0, -1 } +#endif +#define MPU_COMPASS_NAME "ak8975" +#define MPU_COMPASS_IRQ_GPIO 0 +#define MPU_COMPASS_ADDR 0x0C +#define MPU_COMPASS_BUS_NUM 2 +#define MPU_COMPASS_ORIENTATION { 1, 0, 0, 0, 1, 0, 0, 0, 1 } + #define TDIODE_OFFSET (10000) /* in millicelsius */ #endif |