Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 446091c9 authored by Jacopo Mondi's avatar Jacopo Mondi Committed by Greg Kroah-Hartman
Browse files

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: default avatarJacopo Mondi <jacopo.mondi@linaro.org>
Acked-by: default avatarLaurent Pinchart <laurent.pinchart@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
parent 7f29aded
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -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);
+4 −1
Original line number Diff line number Diff line
@@ -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;