]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
ARM: tegra: ardbeg: enable soc_camera support
authorBryan Wu <pengw@nvidia.com>
Fri, 4 Oct 2013 01:08:56 +0000 (18:08 -0700)
committerBryan Wu <pengw@nvidia.com>
Fri, 1 Nov 2013 18:13:11 +0000 (11:13 -0700)
Introduce soc_camera_platform device as a pseudo device for our
VI2/CSI2 test pattern generator.

Bug 1377330

Change-Id: Iaba2083e5fadee5cbe23d88109b10ae56c531972
Signed-off-by: Bryan Wu <pengw@nvidia.com>
Reviewed-on: http://git-master/r/289330
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Allen Martin <amartin@nvidia.com>
arch/arm/mach-tegra/board-ardbeg-sensors.c

index 79a5e6a106780f62d480f49f06a9eb2751aa78b5..b5acf2532a6d11101526030158a79089c2b02c3f 100644 (file)
 #include <media/ad5823.h>
 #include <media/max77387.h>
 
+#include <linux/platform_device.h>
+#include <media/soc_camera.h>
+#include <media/soc_camera_platform.h>
+#include <media/tegra_v4l2_camera.h>
+
 #include "cpu-tegra.h"
 #include "devices.h"
 #include "board.h"
@@ -127,6 +132,78 @@ static void mpuirq_init(void)
                ARRAY_SIZE(inv_mpu9250_i2c0_board_info));
 }
 
+/*
+ * Soc Camera platform driver for testing
+ */
+#if IS_ENABLED(CONFIG_SOC_CAMERA_PLATFORM)
+static int ardbeg_soc_camera_add(struct soc_camera_device *icd);
+static void ardbeg_soc_camera_del(struct soc_camera_device *icd);
+
+static int ardbeg_soc_camera_set_capture(struct soc_camera_platform_info *info,
+               int enable)
+{
+       /* TODO: probably add clk opertaion here */
+       return 0; /* camera sensor always enabled */
+}
+
+static struct soc_camera_platform_info ardbeg_soc_camera_info = {
+       .format_name = "RGB4",
+       .format_depth = 32,
+       .format = {
+               .code = V4L2_MBUS_FMT_RGBA8888_4X8_LE,
+               .colorspace = V4L2_COLORSPACE_SRGB,
+               .field = V4L2_FIELD_NONE,
+               .width = 1280,
+               .height = 720,
+       },
+       .set_capture = ardbeg_soc_camera_set_capture,
+};
+
+static struct tegra_camera_platform_data ardbeg_camera_platform_data = {
+       .flip_v                 = 0,
+       .flip_h                 = 0,
+       .port                   = TEGRA_CAMERA_PORT_CSI_A,
+       .lanes                  = 4,
+       .continuous_clk         = 0,
+};
+
+static struct soc_camera_link ardbeg_soc_camera_link = {
+       .bus_id         = 0, /* This must match the .id of tegra_vi01_device */
+       .add_device     = ardbeg_soc_camera_add,
+       .del_device     = ardbeg_soc_camera_del,
+       .module_name    = "soc_camera_platform",
+       .priv           = &ardbeg_camera_platform_data,
+       .dev_priv       = &ardbeg_soc_camera_info,
+};
+
+static struct platform_device *ardbeg_pdev;
+
+static void ardbeg_soc_camera_release(struct device *dev)
+{
+       soc_camera_platform_release(&ardbeg_pdev);
+}
+
+static int ardbeg_soc_camera_add(struct soc_camera_device *icd)
+{
+       return soc_camera_platform_add(icd, &ardbeg_pdev,
+                       &ardbeg_soc_camera_link,
+                       ardbeg_soc_camera_release, 0);
+}
+
+static void ardbeg_soc_camera_del(struct soc_camera_device *icd)
+{
+       soc_camera_platform_del(icd, ardbeg_pdev, &ardbeg_soc_camera_link);
+}
+
+static struct platform_device ardbeg_soc_camera_device = {
+       .name   = "soc-camera-pdrv",
+       .id     = 0,
+       .dev    = {
+               .platform_data = &ardbeg_soc_camera_link,
+       },
+};
+#endif
+
 static struct regulator *ardbeg_vcmvdd;
 
 static int ardbeg_get_extra_regulators(void)
@@ -843,6 +920,10 @@ static int ardbeg_camera_init(void)
                &ardbeg_pcl_pdata, sizeof(ardbeg_pcl_pdata));
        platform_device_register(&ardbeg_camera_generic);
 
+#if IS_ENABLED(CONFIG_SOC_CAMERA_PLATFORM)
+       platform_device_register(&ardbeg_soc_camera_device);
+#endif
+
        return 0;
 }