greybus: camera: Add CSI configuration parameters
authorJacopo Mondi <jacopo.mondi@linaro.org>
Tue, 23 Feb 2016 10:22:48 +0000 (11:22 +0100)
committerGreg Kroah-Hartman <gregkh@google.com>
Wed, 24 Feb 2016 06:39:20 +0000 (22:39 -0800)
Add CSI configuration parameters to the configure_stream operation
response.
Currently, only the total number of lines in a second is used to configure the
the AP-Bridge CSI transmitter, all other parameters (number of CSI data
lanes, and CSI bus clock frequency) are kept hard-coded for two reasons:
1) We need to configure the CSI receiver on AP side accordingly to these
settings, before sending them to APB1 CSI transmitter.
2) We cannot use the camera module provided parameters as-is, but use
those information to compute the required bandwidth on the CSI bus, and
configure the # of CSI data lanes, and the CSI bus clock speed in a way that
satisfies that bandwidth requirement.

Signed-off-by: Jacopo Mondi <jacopo.mondi@linaro.org>
Acked-by: Laurent Pinchart <laurent.pinchart@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/camera.c
drivers/staging/greybus/greybus_protocols.h

index bb8bc175dc0aa0916118f1be3a14251357e482aa..3f205cbcb21b777ea35ac7ca3fb0cdf67f295748 100644 (file)
@@ -162,6 +162,7 @@ struct ap_csi_config_request {
        __u8 num_lanes;
        __u8 padding;
        __le32 bus_freq;
+       __le32 lines_per_second;
 } __packed;
 
 static int gb_camera_configure_streams(struct gb_camera *gcam,
@@ -254,7 +255,14 @@ static int gb_camera_configure_streams(struct gb_camera *gcam,
        if (ret < 0)
                goto done;
 
-       /* Configure the CSI transmitter. Hardcode the parameters for now. */
+       /*
+        * Configure the APB1 CSI transmitter using the lines count reported by
+        * the  camera module, but with hard-coded bus frequency and lanes number.
+        *
+        * TODO: use the clocking and size informations reported by camera module
+        * to compute the required CSI bandwidth, and configure the CSI receiver
+        * on AP side, and the CSI transmitter on APB1 side accordingly.
+        */
        memset(&csi_cfg, 0, sizeof(csi_cfg));
 
        if (nstreams) {
@@ -262,6 +270,7 @@ static int gb_camera_configure_streams(struct gb_camera *gcam,
                csi_cfg.clock_mode = 0;
                csi_cfg.num_lanes = 4;
                csi_cfg.bus_freq = cpu_to_le32(960000000);
+               csi_cfg.lines_per_second = resp->lines_per_second;
                ret = gb_hd_output(gcam->connection->hd, &csi_cfg,
                                   sizeof(csi_cfg),
                                   GB_APB_REQUEST_CSI_TX_CONTROL, false);
index 6b192924a566adde43a993ac4f4dfc3a43fcc09f..1a90dc2d9c3a2d48b39cacd65412872b688d85dd 100644 (file)
@@ -1276,7 +1276,10 @@ struct gb_camera_configure_streams_response {
        __u8 num_streams;
        __u8 flags;
 #define GB_CAMERA_CONFIGURE_STREAMS_ADJUSTED   0x01
-       __le16 padding;
+       __u8 num_lanes;
+       __u8 padding;
+       __le32 bus_freq;
+       __le32 lines_per_second;
        struct gb_camera_stream_config_response config[0];
 } __packed;