summaryrefslogtreecommitdiffstats
path: root/drivers/staging/greybus/camera.c
diff options
context:
space:
mode:
authorEvgeniy Borisov2016-04-06 14:22:45 +0200
committerGreg Kroah-Hartman2016-04-12 03:47:57 +0200
commitb4905038965fb986d8496e47cc52a08428408ae5 (patch)
tree4ba3ac977ed07a31319080c5fd90765caa0dc3fa /drivers/staging/greybus/camera.c
parentgreybus: svc: add Interface power measurements support (diff)
downloadkernel-qcow2-linux-b4905038965fb986d8496e47cc52a08428408ae5.tar.gz
kernel-qcow2-linux-b4905038965fb986d8496e47cc52a08428408ae5.tar.xz
kernel-qcow2-linux-b4905038965fb986d8496e47cc52a08428408ae5.zip
greybus: camera-gb: Extend the configure streams interface
Extending the configure streams interface with CSI params. Getting CSI frequency data form configure streams response. * num_lanes - Number of CSI data lanes * clk_freq - CSI clock frequency in Hz * lines_per_second - Total number of lines in a second of transmission (blanking included) From the AP side we need to know for the CSI speed configuration. This information is needed for dynamically bandwidth calculations. NOTE: Change should be along merged with corresponding interface change in kernel: "camera: Extend the configure streams interface with CSI params" Signed-off-by: Evgeniy Borisov <eborisov@mm-sol.com> Reviewed-by: Gjorgji Rosikopulos <grosikopulos@mm-sol.com> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Diffstat (limited to 'drivers/staging/greybus/camera.c')
-rw-r--r--drivers/staging/greybus/camera.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/staging/greybus/camera.c b/drivers/staging/greybus/camera.c
index 6db89efb8f0e..d3ee5b7240db 100644
--- a/drivers/staging/greybus/camera.c
+++ b/drivers/staging/greybus/camera.c
@@ -203,7 +203,8 @@ struct ap_csi_config_request {
static int gb_camera_configure_streams(struct gb_camera *gcam,
unsigned int *num_streams,
unsigned int *flags,
- struct gb_camera_stream_config *streams)
+ struct gb_camera_stream_config *streams,
+ struct gb_camera_csi_params *csi_params)
{
struct gb_camera_configure_streams_request *req;
struct gb_camera_configure_streams_response *resp;
@@ -309,6 +310,12 @@ static int gb_camera_configure_streams(struct gb_camera *gcam,
ret = gb_hd_output(gcam->connection->hd, &csi_cfg,
sizeof(csi_cfg),
GB_APB_REQUEST_CSI_TX_CONTROL, false);
+ if (csi_params) {
+ csi_params->num_lanes = csi_cfg.num_lanes;
+ /* Transmitting two bits per cycle. (DDR clock) */
+ csi_params->clk_freq = csi_cfg.bus_freq / 2;
+ csi_params->lines_per_second = csi_cfg.lines_per_second;
+ }
} else {
csi_cfg.csi_id = 1;
ret = gb_hd_output(gcam->connection->hd, &csi_cfg,
@@ -442,7 +449,8 @@ static ssize_t gb_camera_op_capabilities(void *priv, char *data, size_t len)
}
static int gb_camera_op_configure_streams(void *priv, unsigned int *nstreams,
- unsigned int *flags, struct gb_camera_stream *streams)
+ unsigned int *flags, struct gb_camera_stream *streams,
+ struct gb_camera_csi_params *csi_params)
{
struct gb_camera *gcam = priv;
struct gb_camera_stream_config *gb_streams;
@@ -469,7 +477,7 @@ static int gb_camera_op_configure_streams(void *priv, unsigned int *nstreams,
gb_flags |= GB_CAMERA_CONFIGURE_STREAMS_TEST_ONLY;
ret = gb_camera_configure_streams(gcam, &gb_nstreams,
- &gb_flags, gb_streams);
+ &gb_flags, gb_streams, csi_params);
if (ret < 0)
goto done;
if (gb_nstreams > *nstreams) {
@@ -643,7 +651,8 @@ static ssize_t gb_camera_debugfs_configure_streams(struct gb_camera *gcam,
goto done;
}
- ret = gb_camera_configure_streams(gcam, &nstreams, &flags, streams);
+ ret = gb_camera_configure_streams(gcam, &nstreams, &flags, streams,
+ NULL);
if (ret < 0)
goto done;