aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-pxa
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2009-03-13 05:08:20 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2009-03-30 11:43:21 -0400
commitd75b1dcc84a5c8bf3e660dd1ba3ae6cd5e6d0929 (patch)
tree7392b0a3bec39fdd596f0f4e33d9eed5b4e3865d /arch/arm/mach-pxa
parent28f59339f72d191e24e0f97f156a481dd5c3db65 (diff)
V4L/DVB (11031): pcm990 baseboard: add camera bus width switch setting
Some Phytec cameras have a I2C GPIO expander which allows it to switch between different sensor bus widths. This was previously handled in the camera driver. Since handling of this switch varies on several boards the cameras are used on, the board support seems a better place to handle the switch Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'arch/arm/mach-pxa')
-rw-r--r--arch/arm/mach-pxa/pcm990-baseboard.c54
1 files changed, 45 insertions, 9 deletions
diff --git a/arch/arm/mach-pxa/pcm990-baseboard.c b/arch/arm/mach-pxa/pcm990-baseboard.c
index f46698e20c1f..90a399075ff6 100644
--- a/arch/arm/mach-pxa/pcm990-baseboard.c
+++ b/arch/arm/mach-pxa/pcm990-baseboard.c
@@ -380,14 +380,50 @@ static struct pca953x_platform_data pca9536_data = {
380 .gpio_base = NR_BUILTIN_GPIO + 1, 380 .gpio_base = NR_BUILTIN_GPIO + 1,
381}; 381};
382 382
383static struct soc_camera_link iclink[] = { 383static int gpio_bus_switch;
384 { 384
385 .bus_id = 0, /* Must match with the camera ID above */ 385static int pcm990_camera_set_bus_param(struct soc_camera_link *link,
386 .gpio = NR_BUILTIN_GPIO + 1, 386 unsigned long flags)
387 }, { 387{
388 .bus_id = 0, /* Must match with the camera ID above */ 388 if (gpio_bus_switch <= 0) {
389 .gpio = -ENXIO, 389 if (flags == SOCAM_DATAWIDTH_10)
390 return 0;
391 else
392 return -EINVAL;
393 }
394
395 if (flags & SOCAM_DATAWIDTH_8)
396 gpio_set_value(gpio_bus_switch, 1);
397 else
398 gpio_set_value(gpio_bus_switch, 0);
399
400 return 0;
401}
402
403static unsigned long pcm990_camera_query_bus_param(struct soc_camera_link *link)
404{
405 int ret;
406
407 if (!gpio_bus_switch) {
408 ret = gpio_request(NR_BUILTIN_GPIO + 1, "camera");
409 if (!ret) {
410 gpio_bus_switch = NR_BUILTIN_GPIO + 1;
411 gpio_direction_output(gpio_bus_switch, 0);
412 } else
413 gpio_bus_switch = -EINVAL;
390 } 414 }
415
416 if (gpio_bus_switch > 0)
417 return SOCAM_DATAWIDTH_8 | SOCAM_DATAWIDTH_10;
418 else
419 return SOCAM_DATAWIDTH_10;
420}
421
422static struct soc_camera_link iclink = {
423 .bus_id = 0, /* Must match with the camera ID above */
424 .gpio = NR_BUILTIN_GPIO + 1,
425 .query_bus_param = pcm990_camera_query_bus_param,
426 .set_bus_param = pcm990_camera_set_bus_param,
391}; 427};
392 428
393/* Board I2C devices. */ 429/* Board I2C devices. */
@@ -398,10 +434,10 @@ static struct i2c_board_info __initdata pcm990_i2c_devices[] = {
398 .platform_data = &pca9536_data, 434 .platform_data = &pca9536_data,
399 }, { 435 }, {
400 I2C_BOARD_INFO("mt9v022", 0x48), 436 I2C_BOARD_INFO("mt9v022", 0x48),
401 .platform_data = &iclink[0], /* With extender */ 437 .platform_data = &iclink, /* With extender */
402 }, { 438 }, {
403 I2C_BOARD_INFO("mt9m001", 0x5d), 439 I2C_BOARD_INFO("mt9m001", 0x5d),
404 .platform_data = &iclink[0], /* With extender */ 440 .platform_data = &iclink, /* With extender */
405 }, 441 },
406}; 442};
407#endif /* CONFIG_VIDEO_PXA27x ||CONFIG_VIDEO_PXA27x_MODULE */ 443#endif /* CONFIG_VIDEO_PXA27x ||CONFIG_VIDEO_PXA27x_MODULE */