diff options
Diffstat (limited to 'arch/sh/boards/board-ap325rxa.c')
-rw-r--r-- | arch/sh/boards/board-ap325rxa.c | 58 |
1 files changed, 46 insertions, 12 deletions
diff --git a/arch/sh/boards/board-ap325rxa.c b/arch/sh/boards/board-ap325rxa.c index 327d47c25a57..2d080732a964 100644 --- a/arch/sh/boards/board-ap325rxa.c +++ b/arch/sh/boards/board-ap325rxa.c | |||
@@ -310,8 +310,10 @@ static int camera_set_capture(struct soc_camera_platform_info *info, | |||
310 | return ret; | 310 | return ret; |
311 | } | 311 | } |
312 | 312 | ||
313 | static int ap325rxa_camera_add(struct soc_camera_link *icl, struct device *dev); | ||
314 | static void ap325rxa_camera_del(struct soc_camera_link *icl); | ||
315 | |||
313 | static struct soc_camera_platform_info camera_info = { | 316 | static struct soc_camera_platform_info camera_info = { |
314 | .iface = 0, | ||
315 | .format_name = "UYVY", | 317 | .format_name = "UYVY", |
316 | .format_depth = 16, | 318 | .format_depth = 16, |
317 | .format = { | 319 | .format = { |
@@ -323,24 +325,46 @@ static struct soc_camera_platform_info camera_info = { | |||
323 | .bus_param = SOCAM_PCLK_SAMPLE_RISING | SOCAM_HSYNC_ACTIVE_HIGH | | 325 | .bus_param = SOCAM_PCLK_SAMPLE_RISING | SOCAM_HSYNC_ACTIVE_HIGH | |
324 | SOCAM_VSYNC_ACTIVE_HIGH | SOCAM_MASTER | SOCAM_DATAWIDTH_8, | 326 | SOCAM_VSYNC_ACTIVE_HIGH | SOCAM_MASTER | SOCAM_DATAWIDTH_8, |
325 | .set_capture = camera_set_capture, | 327 | .set_capture = camera_set_capture, |
328 | .link = { | ||
329 | .bus_id = 0, | ||
330 | .add_device = ap325rxa_camera_add, | ||
331 | .del_device = ap325rxa_camera_del, | ||
332 | .module_name = "soc_camera_platform", | ||
333 | }, | ||
326 | }; | 334 | }; |
327 | 335 | ||
336 | static void dummy_release(struct device *dev) | ||
337 | { | ||
338 | } | ||
339 | |||
328 | static struct platform_device camera_device = { | 340 | static struct platform_device camera_device = { |
329 | .name = "soc_camera_platform", | 341 | .name = "soc_camera_platform", |
330 | .dev = { | 342 | .dev = { |
331 | .platform_data = &camera_info, | 343 | .platform_data = &camera_info, |
344 | .release = dummy_release, | ||
332 | }, | 345 | }, |
333 | }; | 346 | }; |
334 | 347 | ||
335 | static int __init camera_setup(void) | 348 | static int ap325rxa_camera_add(struct soc_camera_link *icl, |
349 | struct device *dev) | ||
336 | { | 350 | { |
337 | if (camera_probe() > 0) | 351 | if (icl != &camera_info.link || camera_probe() <= 0) |
338 | platform_device_register(&camera_device); | 352 | return -ENODEV; |
339 | 353 | ||
340 | return 0; | 354 | camera_info.dev = dev; |
355 | |||
356 | return platform_device_register(&camera_device); | ||
341 | } | 357 | } |
342 | late_initcall(camera_setup); | ||
343 | 358 | ||
359 | static void ap325rxa_camera_del(struct soc_camera_link *icl) | ||
360 | { | ||
361 | if (icl != &camera_info.link) | ||
362 | return; | ||
363 | |||
364 | platform_device_unregister(&camera_device); | ||
365 | memset(&camera_device.dev.kobj, 0, | ||
366 | sizeof(camera_device.dev.kobj)); | ||
367 | } | ||
344 | #endif /* CONFIG_I2C */ | 368 | #endif /* CONFIG_I2C */ |
345 | 369 | ||
346 | static int ov7725_power(struct device *dev, int mode) | 370 | static int ov7725_power(struct device *dev, int mode) |
@@ -416,6 +440,7 @@ static struct ov772x_camera_info ov7725_info = { | |||
416 | .flags = OV772X_FLAG_VFLIP | OV772X_FLAG_HFLIP, | 440 | .flags = OV772X_FLAG_VFLIP | OV772X_FLAG_HFLIP, |
417 | .edgectrl = OV772X_AUTO_EDGECTRL(0xf, 0), | 441 | .edgectrl = OV772X_AUTO_EDGECTRL(0xf, 0), |
418 | .link = { | 442 | .link = { |
443 | .bus_id = 0, | ||
419 | .power = ov7725_power, | 444 | .power = ov7725_power, |
420 | .board_info = &ap325rxa_i2c_camera[0], | 445 | .board_info = &ap325rxa_i2c_camera[0], |
421 | .i2c_adapter_id = 0, | 446 | .i2c_adapter_id = 0, |
@@ -423,11 +448,19 @@ static struct ov772x_camera_info ov7725_info = { | |||
423 | }, | 448 | }, |
424 | }; | 449 | }; |
425 | 450 | ||
426 | static struct platform_device ap325rxa_camera = { | 451 | static struct platform_device ap325rxa_camera[] = { |
427 | .name = "soc-camera-pdrv", | 452 | { |
428 | .id = 0, | 453 | .name = "soc-camera-pdrv", |
429 | .dev = { | 454 | .id = 0, |
430 | .platform_data = &ov7725_info.link, | 455 | .dev = { |
456 | .platform_data = &ov7725_info.link, | ||
457 | }, | ||
458 | }, { | ||
459 | .name = "soc-camera-pdrv", | ||
460 | .id = 1, | ||
461 | .dev = { | ||
462 | .platform_data = &camera_info.link, | ||
463 | }, | ||
431 | }, | 464 | }, |
432 | }; | 465 | }; |
433 | 466 | ||
@@ -438,7 +471,8 @@ static struct platform_device *ap325rxa_devices[] __initdata = { | |||
438 | &ceu_device, | 471 | &ceu_device, |
439 | &nand_flash_device, | 472 | &nand_flash_device, |
440 | &sdcard_cn3_device, | 473 | &sdcard_cn3_device, |
441 | &ap325rxa_camera, | 474 | &ap325rxa_camera[0], |
475 | &ap325rxa_camera[1], | ||
442 | }; | 476 | }; |
443 | 477 | ||
444 | static struct spi_board_info ap325rxa_spi_devices[] = { | 478 | static struct spi_board_info ap325rxa_spi_devices[] = { |