greybus: camera: Configure the bridge CSI transmitter
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Fri, 18 Dec 2015 19:23:25 +0000 (21:23 +0200)
committerGreg Kroah-Hartman <gregkh@google.com>
Tue, 22 Dec 2015 00:35:27 +0000 (16:35 -0800)
Start or stop the CSI transmitter when configuring and unconfiguring the
streams respectively. The CSI configuration parameters are currently
hardcoded.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/camera.c

index f163689f50a5e8df357a3226277cd23d07c48295..556226a19ada9a318cf89a6fbea2e154446375e4 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/uaccess.h>
 #include <linux/vmalloc.h>
 
+#include "es2.h"
 #include "greybus.h"
 #include "greybus_protocols.h"
 
@@ -79,6 +80,7 @@ static int gb_camera_configure_streams(struct gb_camera *gcam,
 {
        struct gb_camera_configure_streams_request *req;
        struct gb_camera_configure_streams_response *resp;
+       struct es2_ap_csi_config csi_cfg;
        unsigned int i;
        size_t req_size;
        size_t resp_size;
@@ -146,6 +148,27 @@ static int gb_camera_configure_streams(struct gb_camera *gcam,
                }
        }
 
+       /* Configure the CSI transmitter. Hardcode the parameters for now. */
+       if (nstreams && !(resp->flags & GB_CAMERA_CONFIGURE_STREAMS_ADJUSTED)) {
+               csi_cfg.csi_id = 1;
+               csi_cfg.clock_mode = 0;
+               csi_cfg.num_lanes = 2;
+               csi_cfg.bus_freq = 250000000;
+
+               ret = es2_ap_csi_setup(gcam->connection->hd, true, &csi_cfg);
+       } else if (nstreams == 0) {
+               csi_cfg.csi_id = 1;
+               csi_cfg.clock_mode = 0;
+               csi_cfg.num_lanes = 0;
+               csi_cfg.bus_freq = 0;
+
+               ret = es2_ap_csi_setup(gcam->connection->hd, false, &csi_cfg);
+       }
+
+       if (ret < 0)
+               gcam_err(gcam, "failed to %s the CSI transmitter\n",
+                        nstreams ? "start" : "stop");
+
        ret = resp->num_streams;
 
 done: