From 446091c999388f9365e8d206f70b0c1a860212a0 Mon Sep 17 00:00:00 2001 From: Jacopo Mondi Date: Tue, 23 Feb 2016 11:22:48 +0100 Subject: [PATCH] greybus: camera: Add CSI configuration parameters 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 Acked-by: Laurent Pinchart Signed-off-by: Greg Kroah-Hartman --- drivers/staging/greybus/camera.c | 11 ++++++++++- drivers/staging/greybus/greybus_protocols.h | 5 ++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/drivers/staging/greybus/camera.c b/drivers/staging/greybus/camera.c index bb8bc175dc0a..3f205cbcb21b 100644 --- a/drivers/staging/greybus/camera.c +++ b/drivers/staging/greybus/camera.c @@ -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); diff --git a/drivers/staging/greybus/greybus_protocols.h b/drivers/staging/greybus/greybus_protocols.h index 6b192924a566..1a90dc2d9c3a 100644 --- a/drivers/staging/greybus/greybus_protocols.h +++ b/drivers/staging/greybus/greybus_protocols.h @@ -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; -- 2.39.5