aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-mx3/mx31moboard-marxbot.c
diff options
context:
space:
mode:
authorValentin Longchamp <valentin.longchamp@epfl.ch>2009-11-03 12:09:51 -0500
committerSascha Hauer <s.hauer@pengutronix.de>2009-11-14 04:29:15 -0500
commit04ea3c801905a4562cc89af78eba40dec0f960a9 (patch)
tree51dd16f2bae5032e60720bb7b7d92f499e1a6651 /arch/arm/mach-mx3/mx31moboard-marxbot.c
parent4dd7129345be71cb20da99a75ded01ea50615f66 (diff)
mx31moboard: camera support
We have two mt9t031 cameras that have a muxed bus on the robot. Only one is currently initialized because of limitations in soc_camera that should be removed later. Signed-off-by: Valentin Longchamp <valentin.longchamp@epfl.ch> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm/mach-mx3/mx31moboard-marxbot.c')
-rw-r--r--arch/arm/mach-mx3/mx31moboard-marxbot.c86
1 files changed, 85 insertions, 1 deletions
diff --git a/arch/arm/mach-mx3/mx31moboard-marxbot.c b/arch/arm/mach-mx3/mx31moboard-marxbot.c
index 6b06faf0cf30..e4e344eceb7c 100644
--- a/arch/arm/mach-mx3/mx31moboard-marxbot.c
+++ b/arch/arm/mach-mx3/mx31moboard-marxbot.c
@@ -16,9 +16,11 @@
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 */ 17 */
18 18
19#include <linux/delay.h>
19#include <linux/gpio.h> 20#include <linux/gpio.h>
20#include <linux/init.h> 21#include <linux/init.h>
21#include <linux/interrupt.h> 22#include <linux/interrupt.h>
23#include <linux/i2c.h>
22#include <linux/platform_device.h> 24#include <linux/platform_device.h>
23#include <linux/types.h> 25#include <linux/types.h>
24 26
@@ -28,6 +30,8 @@
28#include <mach/iomux-mx3.h> 30#include <mach/iomux-mx3.h>
29#include <mach/mmc.h> 31#include <mach/mmc.h>
30 32
33#include <media/soc_camera.h>
34
31#include "devices.h" 35#include "devices.h"
32 36
33static unsigned int marxbot_pins[] = { 37static unsigned int marxbot_pins[] = {
@@ -37,7 +41,6 @@ static unsigned int marxbot_pins[] = {
37 MX31_PIN_PC_CD2_B__SD2_CLK, MX31_PIN_PC_CD1_B__SD2_CMD, 41 MX31_PIN_PC_CD2_B__SD2_CLK, MX31_PIN_PC_CD1_B__SD2_CMD,
38 MX31_PIN_ATA_DIOR__GPIO3_28, MX31_PIN_ATA_DIOW__GPIO3_29, 42 MX31_PIN_ATA_DIOR__GPIO3_28, MX31_PIN_ATA_DIOW__GPIO3_29,
39 /* CSI */ 43 /* CSI */
40 MX31_PIN_CSI_D4__CSI_D4, MX31_PIN_CSI_D5__CSI_D5,
41 MX31_PIN_CSI_D6__CSI_D6, MX31_PIN_CSI_D7__CSI_D7, 44 MX31_PIN_CSI_D6__CSI_D6, MX31_PIN_CSI_D7__CSI_D7,
42 MX31_PIN_CSI_D8__CSI_D8, MX31_PIN_CSI_D9__CSI_D9, 45 MX31_PIN_CSI_D8__CSI_D8, MX31_PIN_CSI_D9__CSI_D9,
43 MX31_PIN_CSI_D10__CSI_D10, MX31_PIN_CSI_D11__CSI_D11, 46 MX31_PIN_CSI_D10__CSI_D10, MX31_PIN_CSI_D11__CSI_D11,
@@ -45,6 +48,7 @@ static unsigned int marxbot_pins[] = {
45 MX31_PIN_CSI_D14__CSI_D14, MX31_PIN_CSI_D15__CSI_D15, 48 MX31_PIN_CSI_D14__CSI_D14, MX31_PIN_CSI_D15__CSI_D15,
46 MX31_PIN_CSI_HSYNC__CSI_HSYNC, MX31_PIN_CSI_MCLK__CSI_MCLK, 49 MX31_PIN_CSI_HSYNC__CSI_HSYNC, MX31_PIN_CSI_MCLK__CSI_MCLK,
47 MX31_PIN_CSI_PIXCLK__CSI_PIXCLK, MX31_PIN_CSI_VSYNC__CSI_VSYNC, 50 MX31_PIN_CSI_PIXCLK__CSI_PIXCLK, MX31_PIN_CSI_VSYNC__CSI_VSYNC,
51 MX31_PIN_CSI_D4__GPIO3_4, MX31_PIN_CSI_D5__GPIO3_5,
48 MX31_PIN_GPIO3_0__GPIO3_0, MX31_PIN_GPIO3_1__GPIO3_1, 52 MX31_PIN_GPIO3_0__GPIO3_0, MX31_PIN_GPIO3_1__GPIO3_1,
49 MX31_PIN_TXD2__GPIO1_28, 53 MX31_PIN_TXD2__GPIO1_28,
50 /* dsPIC resets */ 54 /* dsPIC resets */
@@ -122,6 +126,83 @@ static void dspics_resets_init(void)
122 } 126 }
123} 127}
124 128
129#define TURRETCAM_POWER IOMUX_TO_GPIO(MX31_PIN_GPIO3_1)
130#define BASECAM_POWER IOMUX_TO_GPIO(MX31_PIN_CSI_D5)
131#define TURRETCAM_RST_B IOMUX_TO_GPIO(MX31_PIN_GPIO3_0)
132#define BASECAM_RST_B IOMUX_TO_GPIO(MX31_PIN_CSI_D4)
133#define CAM_CHOICE IOMUX_TO_GPIO(MX31_PIN_TXD2)
134
135static int marxbot_basecam_power(struct device *dev, int on)
136{
137 gpio_set_value(BASECAM_POWER, !on);
138 return 0;
139}
140
141static int marxbot_basecam_reset(struct device *dev)
142{
143 gpio_set_value(BASECAM_RST_B, 0);
144 udelay(100);
145 gpio_set_value(BASECAM_RST_B, 1);
146 return 0;
147}
148
149static struct i2c_board_info marxbot_i2c_devices[] = {
150 {
151 I2C_BOARD_INFO("mt9t031", 0x5d),
152 },
153};
154
155static struct soc_camera_link base_iclink = {
156 .bus_id = 0, /* Must match with the camera ID */
157 .power = marxbot_basecam_power,
158 .reset = marxbot_basecam_reset,
159 .board_info = &marxbot_i2c_devices[0],
160 .i2c_adapter_id = 0,
161 .module_name = "mt9t031",
162};
163
164static struct platform_device marxbot_camera[] = {
165 {
166 .name = "soc-camera-pdrv",
167 .id = 0,
168 .dev = {
169 .platform_data = &base_iclink,
170 },
171 },
172};
173
174static struct platform_device *marxbot_cameras[] __initdata = {
175 &marxbot_camera[0],
176};
177
178static int __init marxbot_cam_init(void)
179{
180 int ret = gpio_request(CAM_CHOICE, "cam-choice");
181 if (ret)
182 return ret;
183 gpio_direction_output(CAM_CHOICE, 1);
184
185 ret = gpio_request(BASECAM_RST_B, "basecam-reset");
186 if (ret)
187 return ret;
188 gpio_direction_output(BASECAM_RST_B, 1);
189 ret = gpio_request(BASECAM_POWER, "basecam-standby");
190 if (ret)
191 return ret;
192 gpio_direction_output(BASECAM_POWER, 0);
193
194 ret = gpio_request(TURRETCAM_RST_B, "turretcam-reset");
195 if (ret)
196 return ret;
197 gpio_direction_output(TURRETCAM_RST_B, 1);
198 ret = gpio_request(TURRETCAM_POWER, "turretcam-standby");
199 if (ret)
200 return ret;
201 gpio_direction_output(TURRETCAM_POWER, 0);
202
203 return 0;
204}
205
125/* 206/*
126 * system init for baseboard usage. Will be called by mx31moboard init. 207 * system init for baseboard usage. Will be called by mx31moboard init.
127 */ 208 */
@@ -136,6 +217,9 @@ void __init mx31moboard_marxbot_init(void)
136 217
137 mxc_register_device(&mxcsdhc_device1, &sdhc2_pdata); 218 mxc_register_device(&mxcsdhc_device1, &sdhc2_pdata);
138 219
220 marxbot_cam_init();
221 platform_add_devices(marxbot_cameras, ARRAY_SIZE(marxbot_cameras));
222
139 /* battery present pin */ 223 /* battery present pin */
140 gpio_request(IOMUX_TO_GPIO(MX31_PIN_LCS0), "bat-present"); 224 gpio_request(IOMUX_TO_GPIO(MX31_PIN_LCS0), "bat-present");
141 gpio_direction_input(IOMUX_TO_GPIO(MX31_PIN_LCS0)); 225 gpio_direction_input(IOMUX_TO_GPIO(MX31_PIN_LCS0));