diff options
Diffstat (limited to 'arch/sh/boards/board-ap325rxa.c')
| -rw-r--r-- | arch/sh/boards/board-ap325rxa.c | 63 |
1 files changed, 59 insertions, 4 deletions
diff --git a/arch/sh/boards/board-ap325rxa.c b/arch/sh/boards/board-ap325rxa.c index caf4c33f4e84..7c35787d29b4 100644 --- a/arch/sh/boards/board-ap325rxa.c +++ b/arch/sh/boards/board-ap325rxa.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/gpio.h> | 22 | #include <linux/gpio.h> |
| 23 | #include <linux/spi/spi.h> | 23 | #include <linux/spi/spi.h> |
| 24 | #include <linux/spi/spi_gpio.h> | 24 | #include <linux/spi/spi_gpio.h> |
| 25 | #include <media/ov772x.h> | ||
| 25 | #include <media/soc_camera_platform.h> | 26 | #include <media/soc_camera_platform.h> |
| 26 | #include <media/sh_mobile_ceu.h> | 27 | #include <media/sh_mobile_ceu.h> |
| 27 | #include <video/sh_mobile_lcdc.h> | 28 | #include <video/sh_mobile_lcdc.h> |
| @@ -216,7 +217,14 @@ static struct platform_device lcdc_device = { | |||
| 216 | }, | 217 | }, |
| 217 | }; | 218 | }; |
| 218 | 219 | ||
| 220 | static void camera_power(int val) | ||
| 221 | { | ||
| 222 | gpio_set_value(GPIO_PTZ5, val); /* RST_CAM/RSTB */ | ||
| 223 | mdelay(10); | ||
| 224 | } | ||
| 225 | |||
| 219 | #ifdef CONFIG_I2C | 226 | #ifdef CONFIG_I2C |
| 227 | /* support for the old ncm03j camera */ | ||
| 220 | static unsigned char camera_ncm03j_magic[] = | 228 | static unsigned char camera_ncm03j_magic[] = |
| 221 | { | 229 | { |
| 222 | 0x87, 0x00, 0x88, 0x08, 0x89, 0x01, 0x8A, 0xE8, | 230 | 0x87, 0x00, 0x88, 0x08, 0x89, 0x01, 0x8A, 0xE8, |
| @@ -237,6 +245,23 @@ static unsigned char camera_ncm03j_magic[] = | |||
| 237 | 0x63, 0xD4, 0x64, 0xEA, 0xD6, 0x0F, | 245 | 0x63, 0xD4, 0x64, 0xEA, 0xD6, 0x0F, |
| 238 | }; | 246 | }; |
| 239 | 247 | ||
| 248 | static int camera_probe(void) | ||
| 249 | { | ||
| 250 | struct i2c_adapter *a = i2c_get_adapter(0); | ||
| 251 | struct i2c_msg msg; | ||
| 252 | int ret; | ||
| 253 | |||
| 254 | camera_power(1); | ||
| 255 | msg.addr = 0x6e; | ||
| 256 | msg.buf = camera_ncm03j_magic; | ||
| 257 | msg.len = 2; | ||
| 258 | msg.flags = 0; | ||
| 259 | ret = i2c_transfer(a, &msg, 1); | ||
| 260 | camera_power(0); | ||
| 261 | |||
| 262 | return ret; | ||
| 263 | } | ||
| 264 | |||
| 240 | static int camera_set_capture(struct soc_camera_platform_info *info, | 265 | static int camera_set_capture(struct soc_camera_platform_info *info, |
| 241 | int enable) | 266 | int enable) |
| 242 | { | 267 | { |
| @@ -245,9 +270,11 @@ static int camera_set_capture(struct soc_camera_platform_info *info, | |||
| 245 | int ret = 0; | 270 | int ret = 0; |
| 246 | int i; | 271 | int i; |
| 247 | 272 | ||
| 273 | camera_power(0); | ||
| 248 | if (!enable) | 274 | if (!enable) |
| 249 | return 0; /* no disable for now */ | 275 | return 0; /* no disable for now */ |
| 250 | 276 | ||
| 277 | camera_power(1); | ||
| 251 | for (i = 0; i < ARRAY_SIZE(camera_ncm03j_magic); i += 2) { | 278 | for (i = 0; i < ARRAY_SIZE(camera_ncm03j_magic); i += 2) { |
| 252 | u_int8_t buf[8]; | 279 | u_int8_t buf[8]; |
| 253 | 280 | ||
| @@ -286,8 +313,35 @@ static struct platform_device camera_device = { | |||
| 286 | .platform_data = &camera_info, | 313 | .platform_data = &camera_info, |
| 287 | }, | 314 | }, |
| 288 | }; | 315 | }; |
| 316 | |||
| 317 | static int __init camera_setup(void) | ||
| 318 | { | ||
| 319 | if (camera_probe() > 0) | ||
| 320 | platform_device_register(&camera_device); | ||
| 321 | |||
| 322 | return 0; | ||
| 323 | } | ||
| 324 | late_initcall(camera_setup); | ||
| 325 | |||
| 289 | #endif /* CONFIG_I2C */ | 326 | #endif /* CONFIG_I2C */ |
| 290 | 327 | ||
| 328 | static int ov7725_power(struct device *dev, int mode) | ||
| 329 | { | ||
| 330 | camera_power(0); | ||
| 331 | if (mode) | ||
| 332 | camera_power(1); | ||
| 333 | |||
| 334 | return 0; | ||
| 335 | } | ||
| 336 | |||
| 337 | static struct ov772x_camera_info ov7725_info = { | ||
| 338 | .buswidth = SOCAM_DATAWIDTH_8, | ||
| 339 | .flags = OV772X_FLAG_VFLIP | OV772X_FLAG_HFLIP, | ||
| 340 | .link = { | ||
| 341 | .power = ov7725_power, | ||
| 342 | }, | ||
| 343 | }; | ||
| 344 | |||
| 291 | static struct sh_mobile_ceu_info sh_mobile_ceu_info = { | 345 | static struct sh_mobile_ceu_info sh_mobile_ceu_info = { |
| 292 | .flags = SOCAM_PCLK_SAMPLE_RISING | SOCAM_HSYNC_ACTIVE_HIGH | | 346 | .flags = SOCAM_PCLK_SAMPLE_RISING | SOCAM_HSYNC_ACTIVE_HIGH | |
| 293 | SOCAM_VSYNC_ACTIVE_HIGH | SOCAM_MASTER | SOCAM_DATAWIDTH_8, | 347 | SOCAM_VSYNC_ACTIVE_HIGH | SOCAM_MASTER | SOCAM_DATAWIDTH_8, |
| @@ -338,9 +392,6 @@ static struct platform_device *ap325rxa_devices[] __initdata = { | |||
| 338 | &ap325rxa_nor_flash_device, | 392 | &ap325rxa_nor_flash_device, |
| 339 | &lcdc_device, | 393 | &lcdc_device, |
| 340 | &ceu_device, | 394 | &ceu_device, |
| 341 | #ifdef CONFIG_I2C | ||
| 342 | &camera_device, | ||
| 343 | #endif | ||
| 344 | &nand_flash_device, | 395 | &nand_flash_device, |
| 345 | &sdcard_cn3_device, | 396 | &sdcard_cn3_device, |
| 346 | }; | 397 | }; |
| @@ -349,6 +400,10 @@ static struct i2c_board_info __initdata ap325rxa_i2c_devices[] = { | |||
| 349 | { | 400 | { |
| 350 | I2C_BOARD_INFO("pcf8563", 0x51), | 401 | I2C_BOARD_INFO("pcf8563", 0x51), |
| 351 | }, | 402 | }, |
| 403 | { | ||
| 404 | I2C_BOARD_INFO("ov772x", 0x21), | ||
| 405 | .platform_data = &ov7725_info, | ||
| 406 | }, | ||
| 352 | }; | 407 | }; |
| 353 | 408 | ||
| 354 | static struct spi_board_info ap325rxa_spi_devices[] = { | 409 | static struct spi_board_info ap325rxa_spi_devices[] = { |
| @@ -426,7 +481,7 @@ static int __init ap325rxa_devices_setup(void) | |||
| 426 | gpio_request(GPIO_PTZ6, NULL); | 481 | gpio_request(GPIO_PTZ6, NULL); |
| 427 | gpio_direction_output(GPIO_PTZ6, 0); /* STBY_CAM */ | 482 | gpio_direction_output(GPIO_PTZ6, 0); /* STBY_CAM */ |
| 428 | gpio_request(GPIO_PTZ5, NULL); | 483 | gpio_request(GPIO_PTZ5, NULL); |
| 429 | gpio_direction_output(GPIO_PTZ5, 1); /* RST_CAM */ | 484 | gpio_direction_output(GPIO_PTZ5, 0); /* RST_CAM */ |
| 430 | gpio_request(GPIO_PTZ4, NULL); | 485 | gpio_request(GPIO_PTZ4, NULL); |
| 431 | gpio_direction_output(GPIO_PTZ4, 0); /* SADDR */ | 486 | gpio_direction_output(GPIO_PTZ4, 0); /* SADDR */ |
| 432 | 487 | ||
