summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/board-kai-sensors.c
diff options
context:
space:
mode:
authorRakesh Iyer <riyer@nvidia.com>2012-02-02 16:42:49 -0800
committerRohan Somvanshi <rsomvanshi@nvidia.com>2012-02-17 06:34:51 -0800
commit555d8f1491dac8e733977652a03bccaa8702a4b1 (patch)
treebb0a8d77212900a733effbd4993804f132ae7390 /arch/arm/mach-tegra/board-kai-sensors.c
parent7a1133116203ff1c0ef78ffee007ebc18580c91b (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/board-kai-sensors.c')
-rw-r--r--arch/arm/mach-tegra/board-kai-sensors.c105
1 files changed, 105 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;
}