ARM: tegra: ardbeg: Add Sensor Support
[linux-3.10.git] / arch / arm / mach-tegra / board-ardbeg-sensors.c
1 /*
2  * arch/arm/mach-tegra/board-ardbeg-sensors.c
3  *
4  * Copyright (c) 2013, NVIDIA CORPORATION.  All rights reserved.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #include <linux/i2c.h>
20 #include <linux/gpio.h>
21 #include <linux/mpu.h>
22
23 #include "board-ardbeg.h"
24
25 static struct i2c_board_info ardbeg_i2c_board_info_cm32181[] = {
26         {
27                 I2C_BOARD_INFO("cm32181", 0x48),
28         },
29 };
30
31 /* MPU board file definition    */
32 static struct mpu_platform_data mpu9250_gyro_data = {
33         .int_config     = 0x10,
34         .level_shifter  = 0,
35         /* Located in board_[platformname].h */
36         .orientation    = MPU_GYRO_ORIENTATION,
37         .sec_slave_type = SECONDARY_SLAVE_TYPE_NONE,
38         .key            = {0x4E, 0xCC, 0x7E, 0xEB, 0xF6, 0x1E, 0x35, 0x22,
39                         0x00, 0x34, 0x0D, 0x65, 0x32, 0xE9, 0x94, 0x89},
40 };
41
42 static struct mpu_platform_data mpu_compass_data = {
43         .orientation    = MPU_COMPASS_ORIENTATION,
44         .config         = NVI_CONFIG_BOOT_MPU,
45 };
46
47 static struct mpu_platform_data mpu_bmp_pdata = {
48         .config         = NVI_CONFIG_BOOT_MPU,
49 };
50
51 static struct i2c_board_info __initdata inv_mpu9250_i2c0_board_info[] = {
52         {
53                 I2C_BOARD_INFO(MPU_GYRO_NAME, MPU_GYRO_ADDR),
54                 .platform_data = &mpu9250_gyro_data,
55         },
56         {
57                 /* The actual BMP180 address is 0x77 but because this conflicts
58                  * with another device, this address is hacked so Linux will
59                  * call the driver.  The conflict is technically okay since the
60                  * BMP180 is behind the MPU.  Also, the BMP180 driver uses a
61                  * hard-coded address of 0x77 since it can't be changed anyway.
62                  */
63                 I2C_BOARD_INFO(MPU_BMP_NAME, MPU_BMP_ADDR),
64                 .platform_data = &mpu_bmp_pdata,
65         },
66         {
67                 I2C_BOARD_INFO(MPU_COMPASS_NAME, MPU_COMPASS_ADDR),
68                 .platform_data = &mpu_compass_data,
69         },
70 };
71
72 static void mpuirq_init(void)
73 {
74         int ret = 0;
75         unsigned gyro_irq_gpio = MPU_GYRO_IRQ_GPIO;
76         unsigned gyro_bus_num = MPU_GYRO_BUS_NUM;
77         char *gyro_name = MPU_GYRO_NAME;
78
79         pr_info("*** MPU START *** mpuirq_init...\n");
80
81         ret = gpio_request(gyro_irq_gpio, gyro_name);
82
83         if (ret < 0) {
84                 pr_err("%s: gpio_request failed %d\n", __func__, ret);
85                 return;
86         }
87
88         ret = gpio_direction_input(gyro_irq_gpio);
89         if (ret < 0) {
90                 pr_err("%s: gpio_direction_input failed %d\n", __func__, ret);
91                 gpio_free(gyro_irq_gpio);
92                 return;
93         }
94         pr_info("*** MPU END *** mpuirq_init...\n");
95
96         inv_mpu9250_i2c0_board_info[0].irq = gpio_to_irq(MPU_GYRO_IRQ_GPIO);
97         i2c_register_board_info(gyro_bus_num, inv_mpu9250_i2c0_board_info,
98                 ARRAY_SIZE(inv_mpu9250_i2c0_board_info));
99 }
100
101 int __init ardbeg_sensors_init(void)
102 {
103         mpuirq_init();
104 /*
105         i2c_register_board_info(0, ardbeg_i2c_board_info_cm32181,
106                 ARRAY_SIZE(ardbeg_i2c_board_info_cm32181));
107 */
108         return 0;
109 }