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
committerDan Willemsen <dwillemsen@nvidia.com>2012-03-23 21:18:47 -0700
commit0907baa58be2dcf5eb3047b0122533c7ca107881 (patch)
treea4f69818139fa819fa44b4b76a760d20c9a30fe9 /arch/arm/mach-tegra/board-kai-sensors.c
parenta727eabbddfc49bd3745fe7722ba11f7df354a9f (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> Rebase-Id: R5c74d6c609f25ed42c6e9862ce338ecc9e9f8ceb
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 b93ae93c47a3..82784ebd9735 100644
--- a/arch/arm/mach-tegra/board-kai-sensors.c
+++ b/arch/arm/mach-tegra/board-kai-sensors.c
@@ -22,6 +22,7 @@
#include <linux/err.h>
#include <linux/i2c.h>
#include <linux/cm3217.h>
+#include <linux/mpu.h>
#include <linux/regulator/consumer.h>
#include <asm/mach-types.h>
#include <mach/gpio.h>
@@ -140,6 +141,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();
@@ -150,5 +253,7 @@ int __init kai_sensors_init(void)
i2c_register_board_info(0, kai_i2c0_cm3217_board_info,
ARRAY_SIZE(kai_i2c0_cm3217_board_info));
+ mpuirq_init();
+
return 0;
}