From 00baf48dcdb76c94d12ec2457b608e17f2a9f1ac Mon Sep 17 00:00:00 2001 From: Bhanu Murthy V Date: Wed, 31 Oct 2018 20:00:26 -0700 Subject: drivers: camera: Support sensor blobs in controls Add mode and control blobs for sensor safety architecture. Add support for tvcf to expose control context apis to prepare control blobs. Bug 2433156 Change-Id: If2ada23eb52f7b55545db8cd1d4bf29efc333af1 Signed-off-by: Bhanu Murthy V Reviewed-on: https://git-master.nvidia.com/r/1941463 (cherry picked from commit cc9b60122046565200fb42c1159d612764d1bca8) Reviewed-on: https://git-master.nvidia.com/r/2006763 Reviewed-by: svc-mobile-coverity Tested-by: Ian Kaszubski Reviewed-by: Vincent Chung GVS: Gerrit_Virtual_Submit Reviewed-by: Frank Chen Reviewed-by: mobile promotions Tested-by: mobile promotions --- .../media/platform/tegra/camera/tegracam_core.c | 2 +- .../media/platform/tegra/camera/tegracam_ctrls.c | 62 ++++++++++++++++++++-- .../media/platform/tegra/camera/tegracam_v4l2.c | 16 +++++- include/media/camera_common.h | 16 +++++- 4 files changed, 87 insertions(+), 9 deletions(-) diff --git a/drivers/media/platform/tegra/camera/tegracam_core.c b/drivers/media/platform/tegra/camera/tegracam_core.c index 9df1c3ea4..0165749f6 100644 --- a/drivers/media/platform/tegra/camera/tegracam_core.c +++ b/drivers/media/platform/tegra/camera/tegracam_core.c @@ -22,7 +22,7 @@ /* use semantic versioning convention */ #define TEGRACAM_MAJOR_VERSION 2 #define TEGRACAM_MINOR_VERSION 0 -#define TEGRACAM_PATCH_VERSION 2 +#define TEGRACAM_PATCH_VERSION 3 u32 tegracam_version(u8 major, u8 minor, u8 patch) { diff --git a/drivers/media/platform/tegra/camera/tegracam_ctrls.c b/drivers/media/platform/tegra/camera/tegracam_ctrls.c index 1b4542770..06bc8c941 100644 --- a/drivers/media/platform/tegra/camera/tegracam_ctrls.c +++ b/drivers/media/platform/tegra/camera/tegracam_ctrls.c @@ -218,18 +218,17 @@ static int tegracam_setup_string_ctrls(struct tegracam_device *tc_dev, return 0; } -static int tegracam_s_ctrl(struct v4l2_ctrl *ctrl) +static int tegracam_set_ctrls(struct tegracam_ctrl_handler *handler, + struct v4l2_ctrl *ctrl) { - struct tegracam_ctrl_handler *handler = - container_of(ctrl->handler, - struct tegracam_ctrl_handler, ctrl_handler); const struct tegracam_ctrl_ops *ops = handler->ctrl_ops; struct tegracam_device *tc_dev = handler->tc_dev; struct camera_common_data *s_data = tc_dev->s_data; int err = 0; u32 status = 0; - if (v4l2_subdev_call(&s_data->subdev, video, g_input_status, &status)) { + if (v4l2_subdev_call(&s_data->subdev, video, + g_input_status, &status)) { dev_err(s_data->dev, "power status query unsupported\n"); return -ENOTTY; } @@ -256,6 +255,7 @@ static int tegracam_s_ctrl(struct v4l2_ctrl *ctrl) break; case TEGRA_CAMERA_CID_SENSOR_MODE_ID: s_data->sensor_mode_id = (int) (*ctrl->p_new.p_s64); + break; case TEGRA_CAMERA_CID_HDR_EN: break; default: @@ -266,6 +266,58 @@ static int tegracam_s_ctrl(struct v4l2_ctrl *ctrl) return err; } +static int tegracam_set_ctrls_ex(struct tegracam_ctrl_handler *handler, + struct v4l2_ctrl *ctrl) +{ + const struct tegracam_ctrl_ops *ops = handler->ctrl_ops; + struct tegracam_device *tc_dev = handler->tc_dev; + struct camera_common_data *s_data = tc_dev->s_data; + struct tegracam_sensor_data *sensor_data = &handler->sensor_data; + struct sensor_blob *blob = &sensor_data->ctrls_blob; + int err = 0; + + switch (ctrl->id) { + case TEGRA_CAMERA_CID_GAIN: + err = ops->set_gain_ex(tc_dev, blob, *ctrl->p_new.p_s64); + break; + case TEGRA_CAMERA_CID_FRAME_RATE: + err = ops->set_frame_rate_ex(tc_dev, blob, *ctrl->p_new.p_s64); + break; + case TEGRA_CAMERA_CID_EXPOSURE: + err = ops->set_exposure_ex(tc_dev, blob, *ctrl->p_new.p_s64); + break; + case TEGRA_CAMERA_CID_GROUP_HOLD: + err = ops->set_group_hold_ex(tc_dev, blob, ctrl->val); + break; + case TEGRA_CAMERA_CID_SENSOR_MODE_ID: + s_data->sensor_mode_id = (int) (*ctrl->p_new.p_s64); + break; + case TEGRA_CAMERA_CID_HDR_EN: + break; + default: + pr_err("%s: unknown ctrl id.\n", __func__); + return -EINVAL; + } + + return err; +} + + +static int tegracam_s_ctrl(struct v4l2_ctrl *ctrl) +{ + struct tegracam_ctrl_handler *handler = + container_of(ctrl->handler, + struct tegracam_ctrl_handler, ctrl_handler); + const struct tegracam_ctrl_ops *ops = handler->ctrl_ops; + + if (ops->is_blob_supported) + return tegracam_set_ctrls_ex(handler, ctrl); + else + return tegracam_set_ctrls(handler, ctrl); + + return 0; +} + int tegracam_ctrl_set_overrides(struct tegracam_ctrl_handler *hdl) { struct v4l2_ext_controls ctrls; diff --git a/drivers/media/platform/tegra/camera/tegracam_v4l2.c b/drivers/media/platform/tegra/camera/tegracam_v4l2.c index 1c40746e6..5ea18298a 100644 --- a/drivers/media/platform/tegra/camera/tegracam_v4l2.c +++ b/drivers/media/platform/tegra/camera/tegracam_v4l2.c @@ -1,7 +1,7 @@ /* - * tegracam_core - tegra camera framework initialization + * tegracam_v4l2 - tegra camera framework for v4l2 support * - * Copyright (c) 2017-2018, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2018-2019, NVIDIA CORPORATION. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -18,6 +18,7 @@ #include #include #include +#include static int v4l2sd_stream(struct v4l2_subdev *sd, int enable) { @@ -25,10 +26,16 @@ static int v4l2sd_stream(struct v4l2_subdev *sd, int enable) struct camera_common_data *s_data = to_camera_common_data(&client->dev); struct camera_common_sensor_ops *sensor_ops = s_data->ops; struct tegracam_device *tc_dev = to_tegracam_device(s_data); + struct tegracam_sensor_data *sensor_data = &s_data->tegracam_ctrl_hdl->sensor_data; + struct sensor_blob *ctrl_blob = &sensor_data->ctrls_blob; + struct sensor_blob *mode_blob = &sensor_data->mode_blob; int err; dev_dbg(&client->dev, "%s++ enable %d\n", __func__, enable); + /* reset control packet at start/stop streaming */ + memset(ctrl_blob, 0, sizeof(struct sensor_blob)); + memset(mode_blob, 0, sizeof(struct sensor_blob)); if (enable) { err = sensor_ops->set_mode(tc_dev); if (err) { @@ -51,12 +58,17 @@ static int v4l2sd_stream(struct v4l2_subdev *sd, int enable) dev_err(&client->dev, "Error turning on streaming\n"); return err; } + /* add done command for blobs */ + prepare_done_cmd(mode_blob); + prepare_done_cmd(ctrl_blob); } else { err = sensor_ops->stop_streaming(tc_dev); if (err) { dev_err(&client->dev, "Error turning off streaming\n"); return err; } + /* add done command for blob */ + prepare_done_cmd(ctrl_blob); } return 0; diff --git a/include/media/camera_common.h b/include/media/camera_common.h index be8f41b15..a6a523837 100644 --- a/include/media/camera_common.h +++ b/include/media/camera_common.h @@ -179,24 +179,38 @@ struct camera_common_sensor_ops { int (*stop_streaming)(struct tegracam_device *tc_dev); }; +struct tegracam_sensor_data { + struct sensor_blob mode_blob; + struct sensor_blob ctrls_blob; +}; struct tegracam_ctrl_ops { u32 numctrls; u32 string_ctrl_size[TEGRA_CAM_MAX_STRING_CONTROLS]; const u32 *ctrl_cid_list; + bool is_blob_supported; int (*set_gain)(struct tegracam_device *tc_dev, s64 val); int (*set_exposure)(struct tegracam_device *tc_dev, s64 val); int (*set_exposure_short)(struct tegracam_device *tc_dev, s64 val); int (*set_frame_rate)(struct tegracam_device *tc_dev, s64 val); int (*set_group_hold)(struct tegracam_device *tc_dev, bool val); int (*fill_string_ctrl)(struct tegracam_device *tc_dev, - struct v4l2_ctrl *ctrl); + struct v4l2_ctrl *ctrl); + int (*set_gain_ex)(struct tegracam_device *tc_dev, + struct sensor_blob *blob, s64 val); + int (*set_exposure_ex)(struct tegracam_device *tc_dev, + struct sensor_blob *blob, s64 val); + int (*set_frame_rate_ex)(struct tegracam_device *tc_dev, + struct sensor_blob *blob, s64 val); + int (*set_group_hold_ex)(struct tegracam_device *tc_dev, + struct sensor_blob *blob, bool val); }; struct tegracam_ctrl_handler { struct v4l2_ctrl_handler ctrl_handler; const struct tegracam_ctrl_ops *ctrl_ops; struct tegracam_device *tc_dev; + struct tegracam_sensor_data sensor_data; int numctrls; struct v4l2_ctrl *ctrls[MAX_CID_CONTROLS]; -- cgit v1.2.2