[ARM] 5525/1: AFEB9260: fix for MMC support
[safe/jmp/linux-2.6] / arch / arm / mach-pxa / pcm990-baseboard.c
index f46698e..6c12b5a 100644 (file)
@@ -377,17 +377,52 @@ struct pxacamera_platform_data pcm990_pxacamera_platform_data = {
 #include <linux/i2c/pca953x.h>
 
 static struct pca953x_platform_data pca9536_data = {
-       .gpio_base      = NR_BUILTIN_GPIO + 1,
+       .gpio_base      = NR_BUILTIN_GPIO,
 };
 
-static struct soc_camera_link iclink[] = {
-       {
-               .bus_id = 0, /* Must match with the camera ID above */
-               .gpio   = NR_BUILTIN_GPIO + 1,
-       }, {
-               .bus_id = 0, /* Must match with the camera ID above */
-               .gpio   = -ENXIO,
+static int gpio_bus_switch;
+
+static int pcm990_camera_set_bus_param(struct soc_camera_link *link,
+               unsigned long flags)
+{
+       if (gpio_bus_switch <= 0) {
+               if (flags == SOCAM_DATAWIDTH_10)
+                       return 0;
+               else
+                       return -EINVAL;
+       }
+
+       if (flags & SOCAM_DATAWIDTH_8)
+               gpio_set_value(gpio_bus_switch, 1);
+       else
+               gpio_set_value(gpio_bus_switch, 0);
+
+       return 0;
+}
+
+static unsigned long pcm990_camera_query_bus_param(struct soc_camera_link *link)
+{
+       int ret;
+
+       if (!gpio_bus_switch) {
+               ret = gpio_request(NR_BUILTIN_GPIO, "camera");
+               if (!ret) {
+                       gpio_bus_switch = NR_BUILTIN_GPIO;
+                       gpio_direction_output(gpio_bus_switch, 0);
+               } else
+                       gpio_bus_switch = -EINVAL;
        }
+
+       if (gpio_bus_switch > 0)
+               return SOCAM_DATAWIDTH_8 | SOCAM_DATAWIDTH_10;
+       else
+               return SOCAM_DATAWIDTH_10;
+}
+
+static struct soc_camera_link iclink = {
+       .bus_id = 0, /* Must match with the camera ID above */
+       .query_bus_param = pcm990_camera_query_bus_param,
+       .set_bus_param = pcm990_camera_set_bus_param,
 };
 
 /* Board I2C devices. */
@@ -398,10 +433,10 @@ static struct i2c_board_info __initdata pcm990_i2c_devices[] = {
                .platform_data = &pca9536_data,
        }, {
                I2C_BOARD_INFO("mt9v022", 0x48),
-               .platform_data = &iclink[0], /* With extender */
+               .platform_data = &iclink, /* With extender */
        }, {
                I2C_BOARD_INFO("mt9m001", 0x5d),
-               .platform_data = &iclink[0], /* With extender */
+               .platform_data = &iclink, /* With extender */
        },
 };
 #endif /* CONFIG_VIDEO_PXA27x ||CONFIG_VIDEO_PXA27x_MODULE */