From 9a657623d000d6ea9917ca3d4afd71ac20da3f14 Mon Sep 17 00:00:00 2001 From: dchvs Date: Tue, 9 Feb 2021 17:37:31 -0600 Subject: [PATCH 1/2] Remove extra Kernel sources --- .../tegra186-tx2-spiri-camera.dtsi | 9 +- .../platform/tegra/camera/camera_common.c | 1121 ----------------- .../platform/tegra/camera/tegracam_ctrls.c | 786 ------------ .../include/media/camera_common.h | 413 ------ .../include/media/tegra-v4l2-camera.h | 181 --- 5 files changed, 3 insertions(+), 2507 deletions(-) delete mode 100644 kernel/nvidia-spiri/drivers/media/platform/tegra/camera/camera_common.c delete mode 100644 kernel/nvidia-spiri/drivers/media/platform/tegra/camera/tegracam_ctrls.c delete mode 100644 kernel/nvidia-spiri/include/media/camera_common.h delete mode 100644 kernel/nvidia-spiri/include/media/tegra-v4l2-camera.h diff --git a/hardware/nvidia-spiri/platform/t18x/common/kernel-dts/t18x-common-platforms/tegra186-tx2-spiri-camera.dtsi b/hardware/nvidia-spiri/platform/t18x/common/kernel-dts/t18x-common-platforms/tegra186-tx2-spiri-camera.dtsi index 4dd0e3f..0f5b0f2 100644 --- a/hardware/nvidia-spiri/platform/t18x/common/kernel-dts/t18x-common-platforms/tegra186-tx2-spiri-camera.dtsi +++ b/hardware/nvidia-spiri/platform/t18x/common/kernel-dts/t18x-common-platforms/tegra186-tx2-spiri-camera.dtsi @@ -77,7 +77,7 @@ i2c8 = "/i2c@31e0000"; mclk = "extperiph2"; // gpios -// reset-gpios = <&tegra_main_gpio CAM1_RST GPIO_ACTIVE_HIGH>; + reset-gpios = <&tegra_main_gpio CAM1_RST GPIO_ACTIVE_HIGH>; mode0 { mclk_khz = "24000"; @@ -125,9 +125,7 @@ i2c8 = "/i2c@31e0000"; port@0 { reg = <0x0>; - // daniel's - status="okay"; - + status = "okay"; mt9m021_slave: endpoint { port-index = <0x1>; bus-width = <0x1>; @@ -168,8 +166,7 @@ i2c8 = "/i2c@31e0000"; mclk = "extperiph1"; // gpios -// reset-gpios = <&tegra_main_gpio CAM0_RST GPIO_ACTIVE_HIGH>; - + reset-gpios = <&tegra_main_gpio CAM0_RST GPIO_ACTIVE_HIGH>; mode0 { mclk_khz = "24000"; num_lanes = "1"; diff --git a/kernel/nvidia-spiri/drivers/media/platform/tegra/camera/camera_common.c b/kernel/nvidia-spiri/drivers/media/platform/tegra/camera/camera_common.c deleted file mode 100644 index 58e7ac2..0000000 --- a/kernel/nvidia-spiri/drivers/media/platform/tegra/camera/camera_common.c +++ /dev/null @@ -1,1121 +0,0 @@ -/* - * camera_common.c - utilities for tegra camera driver - * - * Copyright (c) 2015-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, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#define has_s_op(master, op) \ - (master->ops && master->ops->op) -#define call_s_op(master, op) \ - (has_s_op(master, op) ? \ - master->ops->op(master) : 0) -#define call_s_ops(master, op, ...) \ - (has_s_op(master, op) ? \ - master->ops->op(master, __VA_ARGS__) : 0) - -#define HDR_ENABLE 0x1 - -static const struct camera_common_colorfmt camera_common_color_fmts[] = { - { - MEDIA_BUS_FMT_SRGGB12_1X12, - V4L2_COLORSPACE_SRGB, - V4L2_PIX_FMT_SRGGB12, - }, - { - MEDIA_BUS_FMT_SGRBG12_1X12, - V4L2_COLORSPACE_SRGB, - V4L2_PIX_FMT_SGRBG12, - }, - { - MEDIA_BUS_FMT_SRGGB10_1X10, - V4L2_COLORSPACE_SRGB, - V4L2_PIX_FMT_SRGGB10, - }, - { - MEDIA_BUS_FMT_SGRBG10_1X10, - V4L2_COLORSPACE_SRGB, - V4L2_PIX_FMT_SGRBG10, - }, - { - MEDIA_BUS_FMT_SBGGR10_1X10, - V4L2_COLORSPACE_SRGB, - V4L2_PIX_FMT_SBGGR10, - }, - { - MEDIA_BUS_FMT_SRGGB8_1X8, - V4L2_COLORSPACE_SRGB, - V4L2_PIX_FMT_SRGGB8, - }, - { - MEDIA_BUS_FMT_YUYV8_1X16, - V4L2_COLORSPACE_SRGB, - V4L2_PIX_FMT_YUYV, - }, - { - MEDIA_BUS_FMT_YVYU8_1X16, - V4L2_COLORSPACE_SRGB, - V4L2_PIX_FMT_YVYU, - }, - { - MEDIA_BUS_FMT_UYVY8_1X16, - V4L2_COLORSPACE_SRGB, - V4L2_PIX_FMT_UYVY, - }, - { - MEDIA_BUS_FMT_VYUY8_1X16, - V4L2_COLORSPACE_SRGB, - V4L2_PIX_FMT_VYUY, - }, - { - MEDIA_BUS_FMT_YUYV8_2X8, - V4L2_COLORSPACE_SRGB, - V4L2_PIX_FMT_YUYV, - }, - { - MEDIA_BUS_FMT_YVYU8_2X8, - V4L2_COLORSPACE_SRGB, - V4L2_PIX_FMT_YVYU, - }, - { - MEDIA_BUS_FMT_UYVY8_2X8, - V4L2_COLORSPACE_SRGB, - V4L2_PIX_FMT_UYVY, - }, - { - MEDIA_BUS_FMT_VYUY8_2X8, - V4L2_COLORSPACE_SRGB, - V4L2_PIX_FMT_VYUY, - }, - /* - * The below two formats are not supported by VI4, - * keep them at the last to ensure they get discarded - */ - { - MEDIA_BUS_FMT_XRGGB10P_3X10, - V4L2_COLORSPACE_SRGB, - V4L2_PIX_FMT_XRGGB10P, - }, - { - MEDIA_BUS_FMT_XBGGR10P_3X10, - V4L2_COLORSPACE_SRGB, - V4L2_PIX_FMT_XRGGB10P, - }, -}; - -struct camera_common_csi_io_pad_ctx { - const char *name; - atomic_t ref; -}; - -static struct camera_common_csi_io_pad_ctx camera_common_csi_io_pads[] = { - {"csia", ATOMIC_INIT(0)}, - {"csib", ATOMIC_INIT(0)}, - {"csic", ATOMIC_INIT(0)}, - {"csid", ATOMIC_INIT(0)}, - {"csie", ATOMIC_INIT(0)}, - {"csif", ATOMIC_INIT(0)}, - {"csig", ATOMIC_INIT(0)}, - {"csih", ATOMIC_INIT(0)}, -}; - -static bool camera_common_verify_code( - struct tegra_channel *chan, unsigned int code) -{ - int i; - - for (i = 0; i < chan->num_video_formats; i++) { - if (chan->video_formats[i]->code == code) - return true; - } - - return false; -} - -int camera_common_g_ctrl(struct camera_common_data *s_data, - struct v4l2_control *control) -{ - int i; - - for (i = 0; i < s_data->numctrls; i++) { - if (s_data->ctrls[i]->id == control->id) { - control->value = s_data->ctrls[i]->val; - dev_dbg(s_data->dev, - "%s: found control %s\n", __func__, - s_data->ctrls[i]->name); - return 0; - } - } - - return -EFAULT; -} -EXPORT_SYMBOL_GPL(camera_common_g_ctrl); - -int camera_common_regulator_get(struct device *dev, - struct regulator **vreg, const char *vreg_name) -{ - struct regulator *reg = NULL; - int err = 0; - - reg = devm_regulator_get(dev, vreg_name); - if (unlikely(IS_ERR(reg))) { - dev_err(dev, "%s %s ERR: %p\n", - __func__, vreg_name, reg); - err = PTR_ERR(reg); - reg = NULL; - } else - dev_dbg(dev, "%s: %s\n", - __func__, vreg_name); - - *vreg = reg; - return err; -} -EXPORT_SYMBOL_GPL(camera_common_regulator_get); - -int camera_common_parse_clocks(struct device *dev, - struct camera_common_pdata *pdata) -{ - struct device_node *np = dev->of_node; - const char *prop; - int proplen = 0; - int i = 0; - int numclocks = 0; - int mclk_index = 0; - int parentclk_index = -1; - int err = 0; - - - pdata->mclk_name = NULL; - pdata->parentclk_name = NULL; - err = of_property_read_string(np, "mclk", &pdata->mclk_name); - if (!err) { - dev_dbg(dev, "mclk in DT %s\n", pdata->mclk_name); - of_property_read_string(np, "parent-clk", - &pdata->parentclk_name); - return 0; - } - - prop = (const char *)of_get_property(np, "clock-names", &proplen); - if (!prop) - return -ENODATA; - - /* find length of clock-names string array */ - for (i = 0; i < proplen; i++) { - if (prop[i] == '\0') - numclocks++; - } - - if (numclocks > 1) { - err = of_property_read_u32(np, "mclk-index", &mclk_index); - if (err) { - dev_err(dev, "Failed to find mclk index\n"); - return err; - } - err = of_property_read_u32(np, "parent-clk-index", - &parentclk_index); - } - - for (i = 0; i < numclocks; i++) { - if (i == mclk_index) { - pdata->mclk_name = prop; - dev_dbg(dev, "%s: mclk_name is %s\n", - __func__, pdata->mclk_name); - } else if (i == parentclk_index) { - pdata->parentclk_name = prop; - dev_dbg(dev, "%s: parentclk_name is %s\n", - __func__, pdata->parentclk_name); - } else - dev_dbg(dev, "%s: %s\n", __func__, prop); - prop += strlen(prop) + 1; - } - - return 0; -} -EXPORT_SYMBOL_GPL(camera_common_parse_clocks); - -int camera_common_parse_ports(struct device *dev, - struct camera_common_data *s_data) -{ - struct device_node *node = dev->of_node; - struct device_node *ep = NULL; - struct device_node *next; - int bus_width = 0; - int err = 0; - int port = 0; - - /* Parse all the remote entities and put them into the list */ - next = of_graph_get_next_endpoint(node, ep); - if (!next) - return -ENODATA; - - of_node_put(ep); - ep = next; - - err = of_property_read_u32(ep, "bus-width", &bus_width); - if (err) { - dev_err(dev, - "Failed to find num of lanes\n"); - return err; - } - s_data->numlanes = bus_width; - - err = of_property_read_u32(ep, "port-index", &port); - if (err) { - dev_err(dev, - "Failed to find port index\n"); - return err; - } - s_data->csi_port = port; - - dev_dbg(dev, "%s: port %d num of lanes %d\n", - __func__, s_data->csi_port, s_data->numlanes); - - return 0; -} -EXPORT_SYMBOL_GPL(camera_common_parse_ports); - -int camera_common_parse_general_properties(struct device *dev, - struct camera_common_data *s_data) -{ - struct device_node *np = dev->of_node; - int err = 0; - const char *str; - - s_data->use_sensor_mode_id = false; - err = of_property_read_string(np, "use_sensor_mode_id", &str); - if (!err) { - if (!strcmp(str, "true")) - s_data->use_sensor_mode_id = true; - } - - return 0; -} -EXPORT_SYMBOL_GPL(camera_common_parse_general_properties); - -int camera_common_debugfs_show(struct seq_file *s, void *unused) -{ - struct camera_common_data *s_data = s->private; - - dev_dbg(s_data->dev, "%s: ++\n", __func__); - - return 0; -} - -ssize_t camera_common_debugfs_write( - struct file *file, - char const __user *buf, - size_t count, - loff_t *offset) -{ - struct camera_common_data *s_data = - ((struct seq_file *)file->private_data)->private; - struct device *dev = s_data->dev; - int err = 0; - char buffer[MAX_BUFFER_SIZE]; - u32 address; - u32 data; - u8 readback = 0; - - dev_dbg(dev, "%s: ++\n", __func__); - - if (copy_from_user(&buffer, buf, sizeof(buffer))) - goto debugfs_write_fail; - - if (sscanf(buffer, "0x%x 0x%x", &address, &data) == 2) - goto set_attr; - if (sscanf(buffer, "0X%x 0X%x", &address, &data) == 2) - goto set_attr; - if (sscanf(buffer, "%d %d", &address, &data) == 2) - goto set_attr; - - if (sscanf(buffer, "0x%x 0x%x", &address, &data) == 1) - goto read; - if (sscanf(buffer, "0X%x 0X%x", &address, &data) == 1) - goto read; - if (sscanf(buffer, "%d %d", &address, &data) == 1) - goto read; - - dev_err(dev, "SYNTAX ERROR: %s\n", buf); - return -EFAULT; - -set_attr: - dev_dbg(dev, - "new address = %x, data = %x\n", address, data); - err |= call_s_ops(s_data, write_reg, address, data); -read: - err |= call_s_ops(s_data, read_reg, address, &readback); - dev_dbg(dev, - "wrote to address 0x%x with value 0x%x\n", - address, readback); - - if (err) - goto debugfs_write_fail; - - return count; - -debugfs_write_fail: - dev_err(dev, - "%s: test pattern write failed\n", __func__); - return -EFAULT; -} - -int camera_common_debugfs_open(struct inode *inode, struct file *file) -{ - struct camera_common_data *s_data = inode->i_private; - struct device *dev = s_data->dev; - - dev_dbg(dev, "%s: ++\n", __func__); - - return single_open(file, camera_common_debugfs_show, inode->i_private); -} - -static const struct file_operations camera_common_debugfs_fops = { - .open = camera_common_debugfs_open, - .read = seq_read, - .write = camera_common_debugfs_write, - .llseek = seq_lseek, - .release = single_release, -}; - -void camera_common_remove_debugfs( - struct camera_common_data *s_data) -{ - struct device *dev = s_data->dev; - - dev_dbg(dev, "%s: ++\n", __func__); - - debugfs_remove_recursive(s_data->debugdir); - s_data->debugdir = NULL; -} -EXPORT_SYMBOL_GPL(camera_common_remove_debugfs); - -void camera_common_create_debugfs( - struct camera_common_data *s_data, - const char *name) -{ - struct dentry *err; - struct device *dev = s_data->dev; - - dev_dbg(dev, "%s %s\n", __func__, name); - - s_data->debugdir = - debugfs_create_dir(name, NULL); - if (!s_data->debugdir) - goto remove_debugfs; - - err = debugfs_create_file("d", - S_IWUSR | S_IRUGO, - s_data->debugdir, s_data, - &camera_common_debugfs_fops); - if (!err) - goto remove_debugfs; - - return; -remove_debugfs: - dev_err(dev, "couldn't create debugfs\n"); - camera_common_remove_debugfs(s_data); -} -EXPORT_SYMBOL_GPL(camera_common_create_debugfs); - -/* Find a data format by a pixel code in an array */ -const struct camera_common_colorfmt *camera_common_find_datafmt( - unsigned int code) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(camera_common_color_fmts); i++) - if (camera_common_color_fmts[i].code == code) - return camera_common_color_fmts + i; - - return NULL; -} -EXPORT_SYMBOL_GPL(camera_common_find_datafmt); - -/* Find a data format by pixel format in an array*/ -const struct camera_common_colorfmt *camera_common_find_pixelfmt( - unsigned int pix_fmt) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(camera_common_color_fmts); i++) - if (camera_common_color_fmts[i].pix_fmt == pix_fmt) - return camera_common_color_fmts + i; - - return NULL; -} -EXPORT_SYMBOL_GPL(camera_common_find_pixelfmt); - -/* Filters for the sensor's supported colors */ -static const struct camera_common_colorfmt *find_matching_color_fmt( - const struct camera_common_data *s_data, - size_t index) -{ - const struct sensor_properties *sensor_props = &s_data->sensor_props; - const size_t num_modes = sensor_props->num_modes; - const size_t common_fmts_size = ARRAY_SIZE(camera_common_color_fmts); - - struct sensor_image_properties *cur_props; - bool matched[ARRAY_SIZE(camera_common_color_fmts)]; - int match_num = -1; - int match_index = -1; - size_t i, j; - - // Clear matched array so no format has been matched - memset(matched, 0, sizeof(matched)); - - // Find and count matching color formats - for (i = 0; i < common_fmts_size; i++) { - for (j = 0; j < num_modes; j++) { - cur_props = &sensor_props->sensor_modes[j]. - image_properties; - if (cur_props->pixel_format == - camera_common_color_fmts[i].pix_fmt && - !matched[i]) { - match_num++; - match_index = i; - // Found index - if (match_num == index) - goto break_loops; - } - } - } -break_loops: - if (match_num < index) - return NULL; - return &camera_common_color_fmts[match_index]; -} - -int camera_common_enum_mbus_code(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_mbus_code_enum *code) -{ - struct camera_common_data *s_data = to_camera_common_data(sd->dev); - struct tegra_channel *chan = v4l2_get_subdev_hostdata(sd); - const struct camera_common_colorfmt *sensor_fmt; - - sensor_fmt = find_matching_color_fmt(s_data, code->index); - - if (sensor_fmt == NULL) - return -EINVAL; - - if (!camera_common_verify_code(chan, sensor_fmt->code)) - return -EINVAL; - - code->code = sensor_fmt->code; - return 0; -} -EXPORT_SYMBOL_GPL(camera_common_enum_mbus_code); - -int camera_common_enum_fmt(struct v4l2_subdev *sd, unsigned int index, - unsigned int *code) -{ - struct camera_common_data *s_data = to_camera_common_data(sd->dev); - const struct camera_common_colorfmt *sensor_fmt; - - sensor_fmt = find_matching_color_fmt(s_data, index); - - if (sensor_fmt == NULL) - return -EINVAL; - *code = sensor_fmt->code; - return 0; -} -EXPORT_SYMBOL_GPL(camera_common_enum_fmt); - -static void select_mode(struct camera_common_data *s_data, - struct v4l2_mbus_framefmt *mf, - unsigned int mode_type) -{ - int i; - const struct camera_common_frmfmt *frmfmt = s_data->frmfmt; - bool flag = 0; - - for (i = 0; i < s_data->numfmts; i++) { - if (mode_type & HDR_ENABLE) - flag = !frmfmt[i].hdr_en; - /* Add more flags for different controls as needed */ - - if (flag) - continue; - - if (mf->width == frmfmt[i].size.width && - mf->height == frmfmt[i].size.height) { - s_data->mode = frmfmt[i].mode; - s_data->mode_prop_idx = i; - break; - } - } -} - -int camera_common_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) -{ - struct camera_common_data *s_data = to_camera_common_data(sd->dev); - struct tegra_channel *chan = v4l2_get_subdev_hostdata(sd); - struct v4l2_control hdr_control; - const struct camera_common_frmfmt *frmfmt = s_data->frmfmt; - unsigned int mode_type = 0; - int err = 0; - int i; - - dev_dbg(sd->dev, "%s: size %i x %i\n", __func__, - mf->width, mf->height); - - /* check hdr enable ctrl */ - hdr_control.id = TEGRA_CAMERA_CID_HDR_EN; - - /* mode_type can be filled in sensor driver */ - if (!(v4l2_g_ctrl(s_data->ctrl_handler, &hdr_control))) - mode_type |= - switch_ctrl_qmenu[hdr_control.value] ? HDR_ENABLE : 0; - - s_data->mode = s_data->def_mode; - s_data->mode_prop_idx = 0; - s_data->fmt_width = s_data->def_width; - s_data->fmt_height = s_data->def_height; - - if (s_data->use_sensor_mode_id && - s_data->sensor_mode_id >= 0 && - s_data->sensor_mode_id < s_data->numfmts) { - dev_dbg(sd->dev, "%s: use_sensor_mode_id %d\n", - __func__, s_data->sensor_mode_id); - s_data->mode = frmfmt[s_data->sensor_mode_id].mode; - s_data->mode_prop_idx = s_data->sensor_mode_id; - s_data->fmt_width = mf->width; - s_data->fmt_height = mf->height; - } else { - /* select mode based on format match first */ - for (i = 0; i < s_data->numfmts; i++) { - if (mf->width == frmfmt[i].size.width && - mf->height == frmfmt[i].size.height) { - s_data->mode = frmfmt[i].mode; - s_data->mode_prop_idx = i; - s_data->fmt_width = mf->width; - s_data->fmt_height = mf->height; - break; - } - } - - if (i == s_data->numfmts) { - mf->width = s_data->fmt_width; - mf->height = s_data->fmt_height; - dev_dbg(sd->dev, - "%s: invalid resolution supplied to set mode %d %d\n", - __func__, mf->width, mf->height); - goto verify_code; - } - /* update mode based on special mode types */ - if (mode_type) - select_mode(s_data, mf, mode_type); - } - - if (!camera_common_verify_code(chan, mf->code)) - err = -EINVAL; - -verify_code: - mf->field = V4L2_FIELD_NONE; - mf->colorspace = V4L2_COLORSPACE_SRGB; - mf->xfer_func = V4L2_XFER_FUNC_DEFAULT; - mf->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; - mf->quantization = V4L2_QUANTIZATION_DEFAULT; - - return err; -} -EXPORT_SYMBOL_GPL(camera_common_try_fmt); - -int camera_common_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) -{ - struct camera_common_data *s_data = to_camera_common_data(sd->dev); - int ret; - - dev_dbg(sd->dev, "%s(%u) size %i x %i\n", __func__, - mf->code, mf->width, mf->height); - - /* MIPI CSI could have changed the format, double-check */ - if (!camera_common_find_datafmt(mf->code)) - return -EINVAL; - - ret = camera_common_try_fmt(sd, mf); - - s_data->colorfmt = camera_common_find_datafmt(mf->code); - - return ret; -} -EXPORT_SYMBOL_GPL(camera_common_s_fmt); - -int camera_common_g_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) -{ - struct camera_common_data *s_data = to_camera_common_data(sd->dev); - const struct camera_common_colorfmt *fmt = s_data->colorfmt; - - dev_dbg(sd->dev, "%s++\n", __func__); - - mf->code = fmt->code; - mf->colorspace = fmt->colorspace; - mf->width = s_data->fmt_width; - mf->height = s_data->fmt_height; - mf->field = V4L2_FIELD_NONE; - mf->xfer_func = fmt->xfer_func; - mf->ycbcr_enc = fmt->ycbcr_enc; - mf->quantization = fmt->quantization; - - return 0; -} -EXPORT_SYMBOL_GPL(camera_common_g_fmt); - -static int camera_common_evaluate_color_format(struct v4l2_subdev *sd, - int code) -{ - struct camera_common_data *s_data = to_camera_common_data(sd->dev); - const size_t common_fmts_size = ARRAY_SIZE(camera_common_color_fmts); - struct sensor_image_properties *cur_props; - struct sensor_properties *sensor_props; - size_t sensor_num_modes; - int i, pixelformat; - - if (!s_data) - return -EINVAL; - - sensor_props = &s_data->sensor_props; - sensor_num_modes = sensor_props->num_modes; - - for (i = 0; i < common_fmts_size; i++) { - if (camera_common_color_fmts[i].code == code) - break; - } - - if (i == common_fmts_size) { - dev_dbg(s_data->dev, - "%s: unsupported color format(%08x) for vi\n" - , __func__, code); - return -EINVAL; - } - - pixelformat = camera_common_color_fmts[i].pix_fmt; - - for (i = 0; i < sensor_num_modes; i++) { - cur_props = &sensor_props->sensor_modes[i].image_properties; - if (cur_props->pixel_format == pixelformat) - return 0; - } - - if (i == sensor_num_modes) { - dev_dbg(s_data->dev, - "%s: unsupported color format(%08x) for sensor\n" - , __func__, code); - return -EINVAL; - } - - return 0; -} - -int camera_common_enum_framesizes(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_frame_size_enum *fse) -{ - struct camera_common_data *s_data = to_camera_common_data(sd->dev); - int ret; - - if (!s_data || !s_data->frmfmt) - return -EINVAL; - - if (fse->index >= s_data->numfmts) - return -EINVAL; - fse->index = array_index_nospec(fse->index, s_data->numfmts); - - ret = camera_common_evaluate_color_format(sd, fse->code); - if (ret) - return ret; - - fse->min_width = fse->max_width = - s_data->frmfmt[fse->index].size.width; - fse->min_height = fse->max_height = - s_data->frmfmt[fse->index].size.height; - return 0; -} -EXPORT_SYMBOL_GPL(camera_common_enum_framesizes); - -int camera_common_enum_frameintervals(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_frame_interval_enum *fie) -{ - struct camera_common_data *s_data = to_camera_common_data(sd->dev); - int i, ret; - - if (!s_data || !s_data->frmfmt) - return -EINVAL; - - /* Check color format */ - ret = camera_common_evaluate_color_format(sd, fie->code); - if (ret) - return ret; - - /* Check resolution sizes */ - for (i = 0; i < s_data->numfmts; i++) { - if (s_data->frmfmt[i].size.width == fie->width && - s_data->frmfmt[i].size.height == fie->height) - break; - } - if (i >= s_data->numfmts) - return -EINVAL; - - /* Check index is in the rage of framerates array index */ - if (fie->index >= s_data->frmfmt[i].num_framerates) - return -EINVAL; - fie->index = array_index_nospec(fie->index, - s_data->frmfmt[i].num_framerates); - - fie->interval.numerator = 1; - fie->interval.denominator = - s_data->frmfmt[i].framerates[fie->index]; - - return 0; -} -EXPORT_SYMBOL_GPL(camera_common_enum_frameintervals); - -void camera_common_mclk_disable(struct camera_common_data *s_data) -{ - struct camera_common_power_rail *pw = s_data->power; - - if (!pw) { - dev_err(s_data->dev, "%s: no device power rail\n", - __func__); - return; - } - - dev_dbg(s_data->dev, "%s: disable MCLK\n", __func__); - clk_disable_unprepare(pw->mclk); -} -EXPORT_SYMBOL_GPL(camera_common_mclk_disable); - -int camera_common_mclk_enable(struct camera_common_data *s_data) -{ - int err; - struct camera_common_power_rail *pw = s_data->power; - unsigned long mclk_init_rate = s_data->def_clk_freq; - - if (!pw) { - dev_err(s_data->dev, "%s: no device power rail\n", - __func__); - return -ENODEV; - } - - dev_dbg(s_data->dev, "%s: enable MCLK with %lu Hz\n", - __func__, mclk_init_rate); - - err = clk_set_rate(pw->mclk, mclk_init_rate); - if (!err) - err = clk_prepare_enable(pw->mclk); - - return err; -} -EXPORT_SYMBOL_GPL(camera_common_mclk_enable); - -void camera_common_dpd_disable(struct camera_common_data *s_data) -{ - int i; - int io_idx; - /* 2 lanes per port, divide by two to get numports */ - int numports = (s_data->numlanes + 1) >> 1; - - /* disable CSI IOs DPD mode to turn on camera */ - for (i = 0; i < numports; i++) { - io_idx = s_data->csi_port + i; - if (atomic_inc_return( - &camera_common_csi_io_pads[io_idx].ref) == 1) - tegra_pmc_io_pad_low_power_disable( - camera_common_csi_io_pads[io_idx].name); - dev_dbg(s_data->dev, - "%s: csi %d\n", __func__, io_idx); - } -} - -void camera_common_dpd_enable(struct camera_common_data *s_data) -{ - int i; - int io_idx; - /* 2 lanes per port, divide by two to get numports */ - int numports = (s_data->numlanes + 1) >> 1; - - /* disable CSI IOs DPD mode to turn on camera */ - for (i = 0; i < numports; i++) { - io_idx = s_data->csi_port + i; - if (atomic_dec_return( - &camera_common_csi_io_pads[io_idx].ref) == 0) - tegra_pmc_io_pad_low_power_enable( - camera_common_csi_io_pads[io_idx].name); - dev_dbg(s_data->dev, - "%s: csi %d\n", __func__, io_idx); - } -} - -int camera_common_s_power(struct v4l2_subdev *sd, int on) -{ - int err = 0; - struct camera_common_data *s_data = to_camera_common_data(sd->dev); - - trace_camera_common_s_power("status", on); - if (on) { - if (tegra_platform_is_silicon()) { - err = camera_common_mclk_enable(s_data); - if (err) - return err; - - camera_common_dpd_disable(s_data); - } - err = call_s_op(s_data, power_on); - if (err) { - dev_err(s_data->dev, - "%s: error power on\n", __func__); - if (tegra_platform_is_silicon()) { - camera_common_dpd_enable(s_data); - camera_common_mclk_disable(s_data); - } - } - } else { - call_s_op(s_data, power_off); - if (tegra_platform_is_silicon()) { - camera_common_dpd_enable(s_data); - camera_common_mclk_disable(s_data); - } - } - - return err; -} -EXPORT_SYMBOL_GPL(camera_common_s_power); - -int camera_common_g_mbus_config(struct v4l2_subdev *sd, - struct v4l2_mbus_config *cfg) -{ - cfg->type = V4L2_MBUS_CSI2; - cfg->flags = V4L2_MBUS_CSI2_4_LANE | - V4L2_MBUS_CSI2_CHANNEL_0 | - V4L2_MBUS_CSI2_CONTINUOUS_CLOCK; - - return 0; -} -EXPORT_SYMBOL_GPL(camera_common_g_mbus_config); - -int camera_common_get_framesync(struct v4l2_subdev *sd, - struct camera_common_framesync *fs) -{ - struct camera_common_data *s_data = to_camera_common_data(sd->dev); - int err = -ENOTSUPP; - - if (has_s_op(s_data, get_framesync)) - err = call_s_ops(s_data, get_framesync, fs); - - return err; -} -EXPORT_SYMBOL_GPL(camera_common_get_framesync); - -int camera_common_focuser_s_power(struct v4l2_subdev *sd, int on) -{ - int err = 0; - struct camera_common_focuser_data *s_data = - to_camera_common_focuser_data(sd->dev); - - if (on) { - err = call_s_op(s_data, power_on); - if (err) - dev_err(s_data->dev, - "%s: error power on\n", __func__); - } else - err = call_s_op(s_data, power_off); - - return err; -} -EXPORT_SYMBOL_GPL(camera_common_focuser_s_power); - -int camera_common_initialize(struct camera_common_data *s_data, - const char *dev_name) -{ - int err = 0; - char debugfs_name[50]; - - if (s_data->dev == NULL) - return -EINVAL; - - err = camera_common_parse_ports(s_data->dev, s_data); - if (err) { - dev_err(s_data->dev, "Failed to find port info.\n"); - return err; - } - - err = camera_common_parse_general_properties(s_data->dev, s_data); - if (err) { - dev_err(s_data->dev, "Failed to find general properties.\n"); - return err; - } - - err = sensor_common_init_sensor_properties(s_data->dev, - s_data->dev->of_node, - &s_data->sensor_props); - if (err) { - dev_err(s_data->dev, - "Could not initialize sensor properties.\n"); - return err; - } - - sprintf(debugfs_name, "%s_%c", dev_name, s_data->csi_port + 'a'); - dev_dbg(s_data->dev, "%s_probe: name %s\n", dev_name, debugfs_name); - - camera_common_create_debugfs(s_data, debugfs_name); - - return 0; -} -EXPORT_SYMBOL_GPL(camera_common_initialize); - -void camera_common_cleanup(struct camera_common_data *s_data) -{ - camera_common_remove_debugfs(s_data); -} -EXPORT_SYMBOL_GPL(camera_common_cleanup); - -int camera_common_focuser_init(struct camera_common_focuser_data *s_data) -{ - int err = 0; - - /* power on */ - err = call_s_op(s_data, power_on); - if (err) { - dev_err(s_data->dev, - "%s: error power on\n", __func__); - return err; - } - - /* load default configuration */ - err = call_s_op(s_data, load_config); - if (err) { - dev_err(s_data->dev, - "%s: error loading config\n", __func__); - goto fail; - } - - /* set controls */ - err = call_s_op(s_data, ctrls_init); - if (err) - dev_err(s_data->dev, - "%s: error initializing controls\n", __func__); - -fail: - /* power off */ - err |= call_s_op(s_data, power_off); - - return err; -} -EXPORT_SYMBOL_GPL(camera_common_focuser_init); - -/* - * Regmap / RTCPU I2C driver interface - */ - -int camera_common_i2c_init( - struct camera_common_i2c *sensor, - struct i2c_client *client, - struct regmap_config *regmap_config, - const struct tegra_i2c_rtcpu_config *rtcpu_config) -{ - sensor->regmap = devm_regmap_init_i2c(client, regmap_config); - if (IS_ERR(sensor->regmap)) { - dev_err(&client->dev, - "regmap init failed: %ld\n", PTR_ERR(sensor->regmap)); - return -ENODEV; - } - - sensor->rt_sensor = tegra_i2c_rtcpu_register_sensor( - client, rtcpu_config); - - return 0; -} -EXPORT_SYMBOL(camera_common_i2c_init); - -int camera_common_i2c_aggregate( - struct camera_common_i2c *sensor, - bool start) -{ - if (sensor->rt_sensor) - return tegra_i2c_rtcpu_aggregate(sensor->rt_sensor, start); - - return 0; -} -EXPORT_SYMBOL(camera_common_i2c_aggregate); - -int camera_common_i2c_set_frame_id( - struct camera_common_i2c *sensor, - int frame_id) -{ - if (sensor->rt_sensor) - return tegra_i2c_rtcpu_set_frame_id( - sensor->rt_sensor, frame_id); - - return 0; -} -EXPORT_SYMBOL(camera_common_i2c_set_frame_id); - -int camera_common_i2c_read_reg8( - struct camera_common_i2c *sensor, - unsigned int addr, - u8 *data, - unsigned int count) -{ - if (sensor->rt_sensor) - return tegra_i2c_rtcpu_read_reg8(sensor->rt_sensor, - addr, data, count); - else - return regmap_bulk_read(sensor->regmap, addr, data, count); -} -EXPORT_SYMBOL(camera_common_i2c_read_reg8); - -int camera_common_i2c_write_reg8( - struct camera_common_i2c *sensor, - unsigned int addr, - const u8 *data, - unsigned int count) -{ - if (sensor->rt_sensor) - return tegra_i2c_rtcpu_write_reg8(sensor->rt_sensor, - addr, data, count); - else - return regmap_bulk_write(sensor->regmap, addr, data, count); -} -EXPORT_SYMBOL(camera_common_i2c_write_reg8); - -int camera_common_i2c_write_table_8( - struct camera_common_i2c *sensor, - const struct reg_8 table[], - const struct reg_8 override_list[], - int num_override_regs, u16 wait_ms_addr, u16 end_addr) -{ - if (sensor->rt_sensor) - return tegra_i2c_rtcpu_write_table_8(sensor->rt_sensor, - table, override_list, num_override_regs, - wait_ms_addr, end_addr); - else - return regmap_util_write_table_8(sensor->regmap, - table, override_list, num_override_regs, - wait_ms_addr, end_addr); -} -EXPORT_SYMBOL(camera_common_i2c_write_table_8); diff --git a/kernel/nvidia-spiri/drivers/media/platform/tegra/camera/tegracam_ctrls.c b/kernel/nvidia-spiri/drivers/media/platform/tegra/camera/tegracam_ctrls.c deleted file mode 100644 index d1c7dce..0000000 --- a/kernel/nvidia-spiri/drivers/media/platform/tegra/camera/tegracam_ctrls.c +++ /dev/null @@ -1,786 +0,0 @@ -/* - * tegracam_ctrls - control framework for tegra camera drivers - * - * Copyright (c) 2017-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, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -#include -#include -#include -#include - -#define CTRL_U32_MIN 0 -#define CTRL_U32_MAX 0x7FFFFFFF -#define CTRL_U64_MIN 0 -#define CTRL_U64_MAX 0x7FFFFFFFFFFFFFFFLL -#define CTRL_S32_MIN 0x80000000 -#define CTRL_S32_MAX 0x7FFFFFFF -#define CTRL_S64_MIN 0x8000000000000000LL -#define CTRL_S64_MAX 0x7FFFFFFFFFFFFFFFLL -#define CTRL_MAX_STR_SIZE 4096 - -#define TEGRACAM_DEF_CTRLS 1 - -/* MT9M021 Controls Information */ -#define MT9M021_DEFAULT_ANALOG_GAIN (0x0) -#define MT9M021_MAX_ANALOG_GAIN (0x3) - -static const char * const mt9m021_test_pattern_menu[] = { - "0:Disabled", - "1:Solid color test pattern", - "2:color bar test pattern", - "3:Fade to gray color bar test pattern", - "256:Walking 1s test pattern (12 bit)" -}; - -static int tegracam_s_ctrl(struct v4l2_ctrl *ctrl); -static const struct v4l2_ctrl_ops tegracam_ctrl_ops = { - .s_ctrl = tegracam_s_ctrl, -}; - -static const u32 tegracam_def_cids[] = { - TEGRA_CAMERA_CID_GROUP_HOLD, -}; - -/* - * For auto control, the states of the previous controls must - * be applied to get optimal quality faster. List all the controls - * which must be overriden - */ -static const u32 tegracam_override_cids[] = { - TEGRA_CAMERA_CID_GAIN, - TEGRA_CAMERA_CID_EXPOSURE, - TEGRA_CAMERA_CID_FRAME_RATE, -}; -#define NUM_OVERRIDE_CTRLS ARRAY_SIZE(tegracam_override_cids) - -static struct v4l2_ctrl_config ctrl_cfg_list[] = { -/* Do not change the name field for the controls! */ - { - .ops = &tegracam_ctrl_ops, - .id = TEGRA_CAMERA_CID_GAIN, - .name = "Gain", - .type = V4L2_CTRL_TYPE_INTEGER64, - .flags = V4L2_CTRL_FLAG_SLIDER, - .min = CTRL_U64_MIN, - .max = CTRL_U64_MAX, - .def = CTRL_U64_MIN, - .step = 1, - }, - { - .ops = &tegracam_ctrl_ops, - .id = TEGRA_CAMERA_CID_EXPOSURE, - .name = "Exposure", - .type = V4L2_CTRL_TYPE_INTEGER64, - .flags = V4L2_CTRL_FLAG_SLIDER, - .min = CTRL_U64_MIN, - .max = CTRL_U64_MAX, - .def = CTRL_U64_MIN, - .step = 1, - }, - { - .ops = &tegracam_ctrl_ops, - .id = TEGRA_CAMERA_CID_EXPOSURE_SHORT, - .name = "Exposure Short", - .type = V4L2_CTRL_TYPE_INTEGER64, - .flags = V4L2_CTRL_FLAG_SLIDER, - .min = CTRL_U64_MIN, - .max = CTRL_U64_MAX, - .def = CTRL_U64_MIN, - .step = 1, - }, - { - .ops = &tegracam_ctrl_ops, - .id = TEGRA_CAMERA_CID_FRAME_RATE, - .name = "Frame Rate", - .type = V4L2_CTRL_TYPE_INTEGER64, - .flags = V4L2_CTRL_FLAG_SLIDER, - .min = CTRL_U64_MIN, - .max = CTRL_U64_MAX, - .def = CTRL_U64_MIN, - .step = 1, - }, - { - .ops = &tegracam_ctrl_ops, - .id = TEGRA_CAMERA_CID_GROUP_HOLD, - .name = "Group Hold", - .type = V4L2_CTRL_TYPE_BOOLEAN, - .flags = V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, - .min = 0, - .max = 1, - .def = 0, - .step = 1, - }, - { - .ops = &tegracam_ctrl_ops, - .id = TEGRA_CAMERA_CID_EEPROM_DATA, - .name = "EEPROM Data", - .type = V4L2_CTRL_TYPE_STRING, - .flags = V4L2_CTRL_FLAG_READ_ONLY, - .min = 0, - .max = CTRL_MAX_STR_SIZE, - .step = 2, - }, - { - .ops = &tegracam_ctrl_ops, - .id = TEGRA_CAMERA_CID_FUSE_ID, - .name = "Fuse ID", - .type = V4L2_CTRL_TYPE_STRING, - .flags = V4L2_CTRL_FLAG_READ_ONLY, - .min = 0, - .max = CTRL_MAX_STR_SIZE, - .step = 2, - }, - { - .ops = &tegracam_ctrl_ops, - .id = TEGRA_CAMERA_CID_SENSOR_MODE_ID, - .name = "Sensor Mode", - .type = V4L2_CTRL_TYPE_INTEGER64, - .flags = V4L2_CTRL_FLAG_SLIDER, - .min = CTRL_U32_MIN, - .max = CTRL_U32_MAX, - .def = CTRL_U32_MIN, - .step = 1, - }, - { - .ops = &tegracam_ctrl_ops, - .id = TEGRA_CAMERA_CID_HDR_EN, - .name = "HDR enable", - .type = V4L2_CTRL_TYPE_INTEGER_MENU, - .min = 0, - .max = ARRAY_SIZE(switch_ctrl_qmenu) - 1, - .menu_skip_mask = 0, - .def = 0, - .qmenu_int = switch_ctrl_qmenu, - }, - { - .ops = &tegracam_ctrl_ops, - .id = TEGRA_CAMERA_CID_OTP_DATA, - .name = "OTP Data", - .type = V4L2_CTRL_TYPE_STRING, - .flags = V4L2_CTRL_FLAG_READ_ONLY, - .min = 0, - .max = CTRL_MAX_STR_SIZE, - .step = 2, - }, - - /* Controls extension for MT9M021 */ - { - .ops = &tegracam_ctrl_ops, - .id = V4L2_CID_ANALOGUE_GAIN, - .name = "Analog Gain", - .type = V4L2_CTRL_TYPE_INTEGER64, - .flags = V4L2_CTRL_FLAG_SLIDER, - .min = CTRL_U64_MIN, - .max = MT9M021_MAX_ANALOG_GAIN, - .def = MT9M021_DEFAULT_ANALOG_GAIN, - .step = 1, - }, - { - .ops = &tegracam_ctrl_ops, - .id = V4L2_CID_GAIN_RED, - .name = "Red Gain", - .type = V4L2_CTRL_TYPE_INTEGER64, - .flags = V4L2_CTRL_FLAG_SLIDER, - .min = CTRL_U64_MIN, - .max = CTRL_U64_MAX, - .def = CTRL_U64_MIN, - .step = 1, - }, - { - .ops = &tegracam_ctrl_ops, - .id = V4L2_CID_GAIN_GREENR, - .name = "GreenR Gain", - .type = V4L2_CTRL_TYPE_INTEGER64, - .flags = V4L2_CTRL_FLAG_SLIDER, - .min = CTRL_U64_MIN, - .max = CTRL_U64_MAX, - .def = CTRL_U64_MIN, - .step = 1, - }, - { - .ops = &tegracam_ctrl_ops, - .id = V4L2_CID_GAIN_GREENB, - .name = "GreenB Gain", - .type = V4L2_CTRL_TYPE_INTEGER64, - .flags = V4L2_CTRL_FLAG_SLIDER, - .min = CTRL_U64_MIN, - .max = CTRL_U64_MAX, - .def = CTRL_U64_MIN, - .step = 1, - }, - { - .ops = &tegracam_ctrl_ops, - .id = V4L2_CID_GAIN_BLUE, - .name = "Blue Gain", - .type = V4L2_CTRL_TYPE_INTEGER64, - .flags = V4L2_CTRL_FLAG_SLIDER, - .min = CTRL_U64_MIN, - .max = CTRL_U64_MAX, - .def = CTRL_U64_MIN, - .step = 1, - }, - { - .ops = &tegracam_ctrl_ops, - .id = V4L2_CID_TEST_PATTERN, - .type = V4L2_CTRL_TYPE_MENU, - .name = "Test Pattern", - .min = 0, - .max = ARRAY_SIZE(mt9m021_test_pattern_menu) - 1, - .step = 0, - .def = 0, - .flags = 0, - .menu_skip_mask = 0, - .qmenu = mt9m021_test_pattern_menu, - }, - { - .ops = &tegracam_ctrl_ops, - .id = V4L2_CID_FLASH_LED_MODE, - .name = "Flash", - .type = V4L2_CTRL_TYPE_INTEGER, - .flags = 0, - .min = V4L2_FLASH_LED_MODE_NONE, - .max = V4L2_FLASH_LED_MODE_FLASH, - .def = V4L2_FLASH_LED_MODE_FLASH, - .step = 1, - }, - { - .ops = &tegracam_ctrl_ops, - .id = V4L2_CID_HFLIP, - .name = "Horizontal Flip", - .type = V4L2_CTRL_TYPE_INTEGER_MENU, - .min = 0, - .max = ARRAY_SIZE(switch_ctrl_qmenu) - 1, - .menu_skip_mask = 0, - .def = 0, - .qmenu_int = switch_ctrl_qmenu, - }, - { - .ops = &tegracam_ctrl_ops, - .id = V4L2_CID_VFLIP, - .name = "Vertical Flip", - .type = V4L2_CTRL_TYPE_INTEGER_MENU, - .min = 0, - .max = ARRAY_SIZE(switch_ctrl_qmenu) - 1, - .menu_skip_mask = 0, - .def = 0, - .qmenu_int = switch_ctrl_qmenu, - }, -}; - -static int tegracam_get_ctrl_index(u32 cid) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(ctrl_cfg_list); i++) { - if (ctrl_cfg_list[i].id == cid) - return i; - } - - return -EINVAL; -} - -static int tegracam_get_string_ctrl_size(u32 cid, - const struct tegracam_ctrl_ops *ops) -{ - u32 index = 0; - - switch (cid) { - case TEGRA_CAMERA_CID_EEPROM_DATA: - index = TEGRA_CAM_STRING_CTRL_EEPROM_INDEX; - break; - case TEGRA_CAMERA_CID_FUSE_ID: - index = TEGRA_CAM_STRING_CTRL_FUSEID_INDEX; - break; - case TEGRA_CAMERA_CID_OTP_DATA: - index = TEGRA_CAM_STRING_CTRL_OTP_INDEX; - break; - default: - return -EINVAL; - } - - return ops->string_ctrl_size[index]; -} - -static int tegracam_setup_string_ctrls(struct tegracam_device *tc_dev, - struct tegracam_ctrl_handler *handler) -{ - const struct tegracam_ctrl_ops *ops = handler->ctrl_ops; - u32 numctrls = ops->numctrls; - int i; - int err = 0; - - for (i = 0; i < numctrls; i++) { - struct v4l2_ctrl *ctrl = handler->ctrls[i]; - - if (ctrl->type == V4L2_CTRL_TYPE_STRING) { - err = ops->fill_string_ctrl(tc_dev, ctrl); - if (err) - return err; - } - } - - return 0; -} - -static int tegracam_set_ctrls(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; - int err = 0; - u32 status = 0; - - /* For controls that are independent of power state */ - switch (ctrl->id) { - case TEGRA_CAMERA_CID_SENSOR_MODE_ID: - s_data->sensor_mode_id = (int) (*ctrl->p_new.p_s64); - return 0; - case TEGRA_CAMERA_CID_HDR_EN: - return 0; - } - - if (v4l2_subdev_call(&s_data->subdev, video, - g_input_status, &status)) { - dev_err(s_data->dev, "power status query unsupported\n"); - return -ENOTTY; - } - - /* power state is turned off, do not program sensor now */ - if (!status) - return 0; - - /* For controls that require sensor to be on */ - switch (ctrl->id) { - case TEGRA_CAMERA_CID_GAIN: - err = ops->set_gain(tc_dev, *ctrl->p_new.p_s64); - break; - case TEGRA_CAMERA_CID_FRAME_RATE: - err = ops->set_frame_rate(tc_dev, *ctrl->p_new.p_s64); - break; - case TEGRA_CAMERA_CID_EXPOSURE: - err = ops->set_exposure(tc_dev, *ctrl->p_new.p_s64); - break; - case TEGRA_CAMERA_CID_EXPOSURE_SHORT: - err = ops->set_exposure_short(tc_dev, *ctrl->p_new.p_s64); - break; - case TEGRA_CAMERA_CID_GROUP_HOLD: - err = ops->set_group_hold(tc_dev, ctrl->val); - break; - case V4L2_CID_ANALOGUE_GAIN: - err = ops->set_analog_gain(tc_dev, *ctrl->p_new.p_s64); - break; - case V4L2_CID_GAIN_RED: - case V4L2_CID_GAIN_GREENR: - case V4L2_CID_GAIN_GREENB: - case V4L2_CID_GAIN_BLUE: - err = ops->set_digital_gain(tc_dev, *ctrl->p_new.p_s64, - ctrl->id); - break; - case V4L2_CID_TEST_PATTERN: - err = ops->set_test_pattern(tc_dev, ctrl->val); - break; - case V4L2_CID_FLASH_LED_MODE: - err = ops->set_flash(tc_dev, ctrl->val); - break; - case V4L2_CID_HFLIP: - case V4L2_CID_VFLIP: - err = ops->set_flip(tc_dev, ctrl->val, ctrl->id); - break; - default: - pr_err("%s: unknown ctrl id.\n", __func__); - return -EINVAL; - } - - return err; -} - -static int tegracam_set_grouphold_ex(struct tegracam_device *tc_dev, - struct sensor_blob *blob, - bool status) -{ - const struct tegracam_ctrl_ops *ops = tc_dev->tcctrl_ops; - struct camera_common_data *s_data = tc_dev->s_data; - int err = 0; - - /* - * when grouphold is set, reset control blob - * set grouphold register using set API - * start packetize commands for delivering the blob - * when grouphold is unset, unset grouphold register - * and write the blob only if sensor is streaming. - */ - if (status) { - memset(blob, 0, sizeof(struct sensor_blob)); - err = ops->set_group_hold_ex(tc_dev, blob, status); - if (err) - return err; - } else { - err = ops->set_group_hold_ex(tc_dev, blob, status); - if (err) - return err; - - /* TODO: block this write selectively from VI5 */ - if (tc_dev->is_streaming) { - err = write_sensor_blob(s_data->regmap, blob); - if (err) - return err; - } - } - - return 0; -} - -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 = tegracam_set_grouphold_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; - struct v4l2_ext_control control; - struct tegracam_device *tc_dev = hdl->tc_dev; - struct device *dev = tc_dev->dev; - const struct tegracam_ctrl_ops *ops = hdl->ctrl_ops; - struct tegracam_sensor_data *sensor_data = &hdl->sensor_data; - struct sensor_blob *blob = &sensor_data->ctrls_blob; - bool is_blob_supported = ops->is_blob_supported; - int err, result = 0; - int i; - - /* - * write list of override regs for the asking frame length, - * coarse integration time, and gain. Failures to write - * overrides are non-fatal - */ - memset(&ctrls, 0, sizeof(ctrls)); -#if LINUX_VERSION_CODE > KERNEL_VERSION(4, 9, 0) - ctrls.which = V4L2_CTRL_ID2WHICH(TEGRA_CAMERA_CID_BASE); -#else - ctrls.ctrl_class = V4L2_CTRL_ID2CLASS(TEGRA_CAMERA_CID_BASE); -#endif - ctrls.count = 1; - ctrls.controls = &control; - - for (i = 0; i < NUM_OVERRIDE_CTRLS; i++) { - s64 val = 0; - - control.id = tegracam_override_cids[i]; - result = v4l2_g_ext_ctrls(&hdl->ctrl_handler, &ctrls); - if (result == 0) { - val = control.value64; - switch (control.id) { - case TEGRA_CAMERA_CID_GAIN: - if (is_blob_supported) - err = ops->set_gain_ex(tc_dev, - blob, val); - else - err = ops->set_gain(tc_dev, val); - break; - case TEGRA_CAMERA_CID_EXPOSURE: - if (is_blob_supported) - err = ops->set_exposure_ex(tc_dev, - blob, val); - else - err = ops->set_exposure(tc_dev, val); - break; - case TEGRA_CAMERA_CID_FRAME_RATE: - if (is_blob_supported) - err = ops->set_frame_rate_ex(tc_dev, - blob, val); - else - err = ops->set_frame_rate(tc_dev, val); - break; - default: - dev_err(dev, "%s: unsupported override %x\n", - __func__, control.id); - return -EINVAL; - } - - if (err) { - dev_err(dev, "%s: error to set %d override\n", - __func__, control.id); - return err; - } - } - } - - return 0; -} - -int tegracam_init_ctrl_ranges_by_mode( - struct tegracam_ctrl_handler *handler, - u32 modeidx) -{ - struct tegracam_device *tc_dev = handler->tc_dev; - struct camera_common_data *s_data = tc_dev->s_data; - struct sensor_control_properties *ctrlprops = NULL; - s64 min_short_exp_time = 0; - s64 max_short_exp_time = 0; - s64 default_short_exp_time = 0; - int i; - - if (modeidx >= s_data->sensor_props.num_modes) - return -EINVAL; - - ctrlprops = - &s_data->sensor_props.sensor_modes[modeidx].control_properties; - - for (i = 0; i < handler->numctrls; i++) { - struct v4l2_ctrl *ctrl = handler->ctrls[i]; - int err = 0; - - switch (ctrl->id) { - case TEGRA_CAMERA_CID_GAIN: - case V4L2_CID_GAIN_RED: - case V4L2_CID_GAIN_GREENR: - case V4L2_CID_GAIN_GREENB: - case V4L2_CID_GAIN_BLUE: - err = v4l2_ctrl_modify_range(ctrl, - ctrlprops->min_gain_val, - ctrlprops->max_gain_val, - ctrlprops->step_gain_val, - ctrlprops->default_gain); - break; - case TEGRA_CAMERA_CID_FRAME_RATE: - err = v4l2_ctrl_modify_range(ctrl, - ctrlprops->min_framerate, - ctrlprops->max_framerate, - ctrlprops->step_framerate, - ctrlprops->default_framerate); - break; - case TEGRA_CAMERA_CID_EXPOSURE: - err = v4l2_ctrl_modify_range(ctrl, - ctrlprops->min_exp_time.val, - ctrlprops->max_exp_time.val, - ctrlprops->step_exp_time.val, - ctrlprops->default_exp_time.val); - break; - case TEGRA_CAMERA_CID_EXPOSURE_SHORT: - /* - * min_hdr_ratio should be equal to max_hdr_ratio. - * This will ensure consistent short exposure - * limit calculations. - */ - min_short_exp_time = - ctrlprops->min_exp_time.val / - ctrlprops->min_hdr_ratio; - max_short_exp_time = - ctrlprops->max_exp_time.val / - ctrlprops->min_hdr_ratio; - default_short_exp_time = - ctrlprops->default_exp_time.val / - ctrlprops->min_hdr_ratio; - err = v4l2_ctrl_modify_range(ctrl, - min_short_exp_time, - max_short_exp_time, - ctrlprops->step_exp_time.val, - default_short_exp_time); - dev_dbg(s_data->dev, - "%s:short_exp_limits[%lld,%lld], default_short_exp_time=%lld\n", - __func__, - min_short_exp_time, - max_short_exp_time, - default_short_exp_time); - break; - default: - /* Not required to modify these control ranges */ - break; - } - - if (err) { - dev_err(s_data->dev, - "ctrl %s range update failed\n", ctrl->name); - return err; - } - } - - return 0; -} -EXPORT_SYMBOL_GPL(tegracam_init_ctrl_ranges_by_mode); - -int tegracam_init_ctrl_ranges(struct tegracam_ctrl_handler *handler) -{ - struct tegracam_device *tc_dev = handler->tc_dev; - struct camera_common_data *s_data = tc_dev->s_data; - struct device *dev = tc_dev->dev; - int i, err = 0; - - /* Updating static control ranges */ - for (i = 0; i < handler->numctrls; i++) { - struct v4l2_ctrl *ctrl = handler->ctrls[i]; - - switch (ctrl->id) { - case TEGRA_CAMERA_CID_SENSOR_MODE_ID: - err = v4l2_ctrl_modify_range(ctrl, - CTRL_U32_MIN, - (s64) s_data->sensor_props.num_modes, - 1, - CTRL_U32_MIN); - break; - default: - /* Not required to modify these control ranges */ - break; - } - - if (err) { - dev_err(s_data->dev, - "ctrl %s range update failed\n", ctrl->name); - return err; - } - } - - /* Use mode 0 control ranges as default */ - if (s_data->sensor_props.num_modes > 0) { - err = tegracam_init_ctrl_ranges_by_mode(handler, 0); - if (err) { - dev_err(dev, - "Error %d updating mode specific control ranges\n", - err); - return err; - } - } - - return 0; -} -EXPORT_SYMBOL_GPL(tegracam_init_ctrl_ranges); - -int tegracam_ctrl_handler_init(struct tegracam_ctrl_handler *handler) -{ - struct tegracam_device *tc_dev = handler->tc_dev; - struct v4l2_ctrl *ctrl; - struct v4l2_ctrl_config *ctrl_cfg; - struct device *dev = tc_dev->dev; - const struct tegracam_ctrl_ops *ops = handler->ctrl_ops; - const u32 *cids = ops->ctrl_cid_list; - u32 numctrls = ops->numctrls + TEGRACAM_DEF_CTRLS; - int i, j; - int err = 0; - - err = v4l2_ctrl_handler_init(&handler->ctrl_handler, numctrls); - - for (i = 0, j = 0; i < numctrls; i++) { - u32 cid = i < ops->numctrls ? cids[i] : tegracam_def_cids[j++]; - int index = tegracam_get_ctrl_index(cid); - int size = 0; - - if (index >= ARRAY_SIZE(ctrl_cfg_list)) { - dev_err(dev, "unsupported control in the list\n"); - return -ENOTTY; - } - - ctrl_cfg = &ctrl_cfg_list[index]; - if (ctrl_cfg->type == V4L2_CTRL_TYPE_STRING) { - size = tegracam_get_string_ctrl_size(ctrl_cfg->id, ops); - if (size < 0) { - dev_err(dev, "Invalid string ctrl size\n"); - return -EINVAL; - } - ctrl_cfg->max = size; - } - ctrl = v4l2_ctrl_new_custom(&handler->ctrl_handler, - ctrl_cfg, NULL); - if (ctrl == NULL) { - dev_err(dev, "Failed to init %s ctrl\n", - ctrl_cfg->name); - return -EINVAL; - } - - if (ctrl_cfg->type == V4L2_CTRL_TYPE_STRING && - ctrl_cfg->flags & V4L2_CTRL_FLAG_READ_ONLY) { - ctrl->p_new.p_char = devm_kzalloc(tc_dev->dev, - size + 1, GFP_KERNEL); - } - handler->ctrls[i] = ctrl; - }; - - handler->numctrls = numctrls; - err = v4l2_ctrl_handler_setup(&handler->ctrl_handler); - if (err) { - dev_err(dev, "Error %d in control hdl setup\n", err); - goto error; - } - - err = handler->ctrl_handler.error; - if (err) { - dev_err(dev, "Error %d adding controls\n", err); - goto error; - } - - err = tegracam_setup_string_ctrls(tc_dev, handler); - if (err) { - dev_err(dev, "setup string controls failed\n"); - goto error; - } - - err = tegracam_init_ctrl_ranges(handler); - if (err) { - dev_err(dev, "Error %d updating control ranges\n", err); - goto error; - } - return 0; -error: - v4l2_ctrl_handler_free(&handler->ctrl_handler); - return err; -} -EXPORT_SYMBOL_GPL(tegracam_ctrl_handler_init); diff --git a/kernel/nvidia-spiri/include/media/camera_common.h b/kernel/nvidia-spiri/include/media/camera_common.h deleted file mode 100644 index 3d8146e..0000000 --- a/kernel/nvidia-spiri/include/media/camera_common.h +++ /dev/null @@ -1,413 +0,0 @@ -/** - * camera_common.h - utilities for tegra camera driver - * - * Copyright (c) 2015-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, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef __camera_common__ -#define __camera_common__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -/* - * Scaling factor for converting a Q10.22 fixed point value - * back to its original floating point value - */ -#define FIXED_POINT_SCALING_FACTOR (1ULL << 22) - -struct reg_8 { - u16 addr; - u8 val; -}; - -struct reg_16 { - u16 addr; - u16 val; -}; - -struct camera_common_power_rail { - struct regulator *dvdd; - struct regulator *avdd; - struct regulator *iovdd; - struct regulator *vcmvdd; - struct clk *mclk; - unsigned int pwdn_gpio; - unsigned int reset_gpio; - unsigned int af_gpio; - bool state; -}; - -struct camera_common_regulators { - const char *avdd; - const char *dvdd; - const char *iovdd; - const char *vcmvdd; -}; - -struct camera_common_pdata { - const char *mclk_name; /* NULL for default default_mclk */ - const char *parentclk_name; /* NULL for no parent clock*/ - unsigned int pwdn_gpio; - unsigned int reset_gpio; - unsigned int af_gpio; - bool ext_reg; - int (*power_on)(struct camera_common_power_rail *pw); - int (*power_off)(struct camera_common_power_rail *pw); - struct camera_common_regulators regulators; - bool use_cam_gpio; - bool has_eeprom; - bool v_flip; - bool h_mirror; - unsigned int fuse_id_addr; -}; - -struct camera_common_eeprom_data { - struct i2c_client *i2c_client; - struct i2c_adapter *adap; - struct i2c_board_info brd; - struct regmap *regmap; -}; - -int -regmap_util_write_table_8(struct regmap *regmap, - const struct reg_8 table[], - const struct reg_8 override_list[], - int num_override_regs, - u16 wait_ms_addr, u16 end_addr); - -int -regmap_util_write_table_16_as_8(struct regmap *regmap, - const struct reg_16 table[], - const struct reg_16 override_list[], - int num_override_regs, - u16 wait_ms_addr, u16 end_addr); - -enum switch_state { - SWITCH_OFF, - SWITCH_ON, -}; - -static const s64 switch_ctrl_qmenu[] = { - SWITCH_OFF, SWITCH_ON -}; - -/* - * The memory buffers allocated from nvrm are aligned to - * fullfill the hardware requirements: - * - size in alignment with a multiple of 128K/64K bytes, - * see CL http://git-master/r/256468 and bug 1321091. - */ -static const s64 size_align_ctrl_qmenu[] = { - 1, (64 * 1024), (128 * 1024), -}; - -struct camera_common_frmfmt { - struct v4l2_frmsize_discrete size; - const int *framerates; - int num_framerates; - bool hdr_en; - int mode; -}; - -struct camera_common_colorfmt { - unsigned int code; - enum v4l2_colorspace colorspace; - int pix_fmt; - enum v4l2_xfer_func xfer_func; - enum v4l2_ycbcr_encoding ycbcr_enc; - enum v4l2_quantization quantization; -}; - -struct camera_common_framesync { - u32 inck; /* kHz */ - u32 xhs; /* in inck */ - u32 xvs; /* in xhs */ - u32 fps; /* frames in 1000 second */ -}; - -struct tegracam_device ; -struct camera_common_data; - -struct camera_common_sensor_ops { - u32 numfrmfmts; - const struct camera_common_frmfmt *frmfmt_table; - int (*power_on)(struct camera_common_data *s_data); - int (*power_off)(struct camera_common_data *s_data); - int (*write_reg)(struct camera_common_data *s_data, - u16 addr, u8 val); - int (*read_reg)(struct camera_common_data *s_data, - u16 addr, u8 *val); - struct camera_common_pdata *(*parse_dt)(struct tegracam_device *tc_dev); - int (*power_get)(struct tegracam_device *tc_dev); - int (*power_put)(struct tegracam_device *tc_dev); - int (*get_framesync)(struct camera_common_data *s_data, - struct camera_common_framesync *vshs); - int (*set_mode)(struct tegracam_device *tc_dev); - int (*start_streaming)(struct tegracam_device *tc_dev); - 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); - 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); - int (*set_analog_gain)(struct tegracam_device *tc_dev, s64 val); - int (*set_digital_gain)(struct tegracam_device *tc_dev, s64 val, - int id); - int (*set_test_pattern)(struct tegracam_device *tc_dev, s32 val); - int (*set_flash)(struct tegracam_device *tc_dev, s32 val); - int (*set_flip)(struct tegracam_device *tc_dev, s32 val, int id); -}; - -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]; -}; - -struct camera_common_data { - struct camera_common_sensor_ops *ops; - struct v4l2_ctrl_handler *ctrl_handler; - struct device *dev; - const struct camera_common_frmfmt *frmfmt; - const struct camera_common_colorfmt *colorfmt; - struct dentry *debugdir; - struct camera_common_power_rail *power; - - struct v4l2_subdev subdev; - struct v4l2_ctrl **ctrls; - - struct sensor_properties sensor_props; - /* TODO: cleanup neeeded once all the sensors adapt new framework */ - struct tegracam_ctrl_handler *tegracam_ctrl_hdl; - struct regmap *regmap; - struct camera_common_pdata *pdata; - /* TODO: cleanup needed for priv once all the sensors adapt new framework */ - void *priv; - int numctrls; - int csi_port; - int numlanes; - int mode; - int mode_prop_idx; - int numfmts; - int def_mode, def_width, def_height; - int def_clk_freq; - int fmt_width, fmt_height; - int sensor_mode_id; - bool use_sensor_mode_id; - bool override_enable; - u32 version; -}; - -struct camera_common_focuser_data; - -struct camera_common_focuser_ops { - int (*power_on)(struct camera_common_focuser_data *s_data); - int (*power_off)(struct camera_common_focuser_data *s_data); - int (*load_config)(struct camera_common_focuser_data *s_data); - int (*ctrls_init)(struct camera_common_focuser_data *s_data); -}; - -struct camera_common_focuser_data { - struct camera_common_focuser_ops *ops; - struct v4l2_ctrl_handler *ctrl_handler; - struct v4l2_subdev subdev; - struct v4l2_ctrl **ctrls; - struct device *dev; - - struct nv_focuser_config config; - void *priv; - int pwr_dev; - int def_position; -}; - -static inline void msleep_range(unsigned int delay_base) -{ - usleep_range(delay_base * 1000, delay_base * 1000 + 500); -} - -static inline struct camera_common_data *to_camera_common_data( - const struct device *dev) -{ - if (sensor_common_parse_num_modes(dev)) - return container_of(dev_get_drvdata(dev), - struct camera_common_data, subdev); - return NULL; -} - -static inline struct camera_common_focuser_data *to_camera_common_focuser_data( - const struct device *dev) -{ - return container_of(dev_get_drvdata(dev), - struct camera_common_focuser_data, subdev); -} - -int camera_common_g_ctrl(struct camera_common_data *s_data, - struct v4l2_control *control); - -int camera_common_regulator_get(struct device *dev, - struct regulator **vreg, const char *vreg_name); -int camera_common_parse_clocks(struct device *dev, - struct camera_common_pdata *pdata); -int camera_common_parse_ports(struct device *dev, - struct camera_common_data *s_data); -int camera_common_mclk_enable(struct camera_common_data *s_data); -void camera_common_mclk_disable(struct camera_common_data *s_data); - - -int camera_common_debugfs_show(struct seq_file *s, void *unused); -ssize_t camera_common_debugfs_write( - struct file *file, - char const __user *buf, - size_t count, - loff_t *offset); -int camera_common_debugfs_open(struct inode *inode, struct file *file); -void camera_common_remove_debugfs(struct camera_common_data *s_data); -void camera_common_create_debugfs(struct camera_common_data *s_data, - const char *name); - -const struct camera_common_colorfmt *camera_common_find_datafmt( - unsigned int code); -int camera_common_enum_mbus_code(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_mbus_code_enum *code); -int camera_common_enum_fmt(struct v4l2_subdev *sd, unsigned int index, - unsigned int *code); -int camera_common_try_fmt(struct v4l2_subdev *sd, - struct v4l2_mbus_framefmt *mf); -int camera_common_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf); -int camera_common_g_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf); -int camera_common_enum_framesizes(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_frame_size_enum *fse); -int camera_common_enum_frameintervals(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_frame_interval_enum *fie); -int camera_common_set_power(struct camera_common_data *data, int on); -int camera_common_s_power(struct v4l2_subdev *sd, int on); -void camera_common_dpd_disable(struct camera_common_data *s_data); -void camera_common_dpd_enable(struct camera_common_data *s_data); -int camera_common_g_mbus_config(struct v4l2_subdev *sd, - struct v4l2_mbus_config *cfg); -int camera_common_get_framesync(struct v4l2_subdev *sd, - struct camera_common_framesync *vshs); - -/* Common initialize and cleanup for camera */ -int camera_common_initialize(struct camera_common_data *s_data, - const char *dev_name); -void camera_common_cleanup(struct camera_common_data *s_data); - -/* Focuser */ -int camera_common_focuser_init(struct camera_common_focuser_data *s_data); -int camera_common_focuser_s_power(struct v4l2_subdev *sd, int on); - -const struct camera_common_colorfmt *camera_common_find_pixelfmt( - unsigned int pix_fmt); - -/* common control layer init */ -int tegracam_ctrl_set_overrides(struct tegracam_ctrl_handler *handler); -int tegracam_ctrl_handler_init(struct tegracam_ctrl_handler *handler); -int tegracam_init_ctrl_ranges(struct tegracam_ctrl_handler *handler); -int tegracam_init_ctrl_ranges_by_mode( - struct tegracam_ctrl_handler *handler, - u32 modeidx); - -/* Regmap / RTCPU I2C driver interface */ -struct tegra_i2c_rtcpu_sensor; -struct tegra_i2c_rtcpu_config; - -struct camera_common_i2c { - struct regmap *regmap; - struct tegra_i2c_rtcpu_sensor *rt_sensor; -}; - -int camera_common_i2c_init( - struct camera_common_i2c *sensor, - struct i2c_client *client, - struct regmap_config *regmap_config, - const struct tegra_i2c_rtcpu_config *rtcpu_config); - -int camera_common_i2c_aggregate( - struct camera_common_i2c *sensor, - bool start); - -int camera_common_i2c_set_frame_id( - struct camera_common_i2c *sensor, - int frame_id); - -int camera_common_i2c_read_reg8( - struct camera_common_i2c *sensor, - unsigned int addr, - u8 *data, - unsigned int count); - -int camera_common_i2c_write_reg8( - struct camera_common_i2c *sensor, - unsigned int addr, - const u8 *data, - unsigned int count); - -int camera_common_i2c_write_table_8( - struct camera_common_i2c *sensor, - const struct reg_8 table[], - const struct reg_8 override_list[], - int num_override_regs, u16 wait_ms_addr, u16 end_addr); - -#endif /* __camera_common__ */ diff --git a/kernel/nvidia-spiri/include/media/tegra-v4l2-camera.h b/kernel/nvidia-spiri/include/media/tegra-v4l2-camera.h deleted file mode 100644 index 54f0876..0000000 --- a/kernel/nvidia-spiri/include/media/tegra-v4l2-camera.h +++ /dev/null @@ -1,181 +0,0 @@ -/** - * TEGRA_V4L2_CAMERA.h - utilities for tegra camera driver - * - * Copyright (c) 2017-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, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef __TEGRA_V4L2_CAMERA__ -#define __TEGRA_V4L2_CAMERA__ - -#include - -#define TEGRA_CAMERA_CID_BASE (V4L2_CTRL_CLASS_CAMERA | 0x2000) - -#define TEGRA_CAMERA_CID_FRAME_LENGTH (TEGRA_CAMERA_CID_BASE+0) -#define TEGRA_CAMERA_CID_COARSE_TIME (TEGRA_CAMERA_CID_BASE+1) -#define TEGRA_CAMERA_CID_COARSE_TIME_SHORT (TEGRA_CAMERA_CID_BASE+2) -#define TEGRA_CAMERA_CID_GROUP_HOLD (TEGRA_CAMERA_CID_BASE+3) -#define TEGRA_CAMERA_CID_HDR_EN (TEGRA_CAMERA_CID_BASE+4) -#define TEGRA_CAMERA_CID_EEPROM_DATA (TEGRA_CAMERA_CID_BASE+5) -#define TEGRA_CAMERA_CID_OTP_DATA (TEGRA_CAMERA_CID_BASE+6) -#define TEGRA_CAMERA_CID_FUSE_ID (TEGRA_CAMERA_CID_BASE+7) -#define TEGRA_CAMERA_CID_SENSOR_MODE_ID (TEGRA_CAMERA_CID_BASE+8) - -#define TEGRA_CAMERA_CID_GAIN (TEGRA_CAMERA_CID_BASE+9) -#define TEGRA_CAMERA_CID_EXPOSURE (TEGRA_CAMERA_CID_BASE+10) -#define TEGRA_CAMERA_CID_FRAME_RATE (TEGRA_CAMERA_CID_BASE+11) -#define TEGRA_CAMERA_CID_EXPOSURE_SHORT (TEGRA_CAMERA_CID_BASE+12) - -#define TEGRA_CAMERA_CID_SENSOR_CONFIG (TEGRA_CAMERA_CID_BASE+50) -#define TEGRA_CAMERA_CID_SENSOR_MODE_BLOB (TEGRA_CAMERA_CID_BASE+51) -#define TEGRA_CAMERA_CID_SENSOR_CONTROL_BLOB (TEGRA_CAMERA_CID_BASE+52) - -#define TEGRA_CAMERA_CID_VI_BYPASS_MODE (TEGRA_CAMERA_CID_BASE+100) -#define TEGRA_CAMERA_CID_OVERRIDE_ENABLE (TEGRA_CAMERA_CID_BASE+101) -#define TEGRA_CAMERA_CID_VI_HEIGHT_ALIGN (TEGRA_CAMERA_CID_BASE+102) -#define TEGRA_CAMERA_CID_VI_SIZE_ALIGN (TEGRA_CAMERA_CID_BASE+103) -#define TEGRA_CAMERA_CID_WRITE_ISPFORMAT (TEGRA_CAMERA_CID_BASE+104) - -#define TEGRA_CAMERA_CID_SENSOR_SIGNAL_PROPERTIES (TEGRA_CAMERA_CID_BASE+105) -#define TEGRA_CAMERA_CID_SENSOR_IMAGE_PROPERTIES (TEGRA_CAMERA_CID_BASE+106) -#define TEGRA_CAMERA_CID_SENSOR_CONTROL_PROPERTIES (TEGRA_CAMERA_CID_BASE+107) -#define TEGRA_CAMERA_CID_SENSOR_DV_TIMINGS (TEGRA_CAMERA_CID_BASE+108) -#define TEGRA_CAMERA_CID_LOW_LATENCY (TEGRA_CAMERA_CID_BASE+109) - -/* Custom Controls */ -#define V4L2_CID_GAIN_RED V4L2_CID_USER_BASE -#define V4L2_CID_GAIN_GREENR V4L2_CID_USER_BASE + 1 -#define V4L2_CID_GAIN_GREENB V4L2_CID_USER_BASE + 2 -#define V4L2_CID_GAIN_BLUE V4L2_CID_USER_BASE + 3 - -/** - * This is temporary with the current v4l2 infrastructure - * currently discussing with upstream maintainers our proposals and - * better approaches to resolve this - */ -#define TEGRA_CAMERA_CID_SENSOR_MODES (TEGRA_CAMERA_CID_BASE + 130) - -#define MAX_BUFFER_SIZE 32 -#define MAX_CID_CONTROLS 32 -#define MAX_NUM_SENSOR_MODES 30 -#define OF_MAX_STR_LEN 256 -#define OF_SENSORMODE_PREFIX ("mode") - -/* - * Scaling factor for converting a Q10.22 fixed point value - * back to its original floating point value - */ -#define FIXED_POINT_SCALING_FACTOR (1ULL << 22) - -#define TEGRA_CAM_MAX_STRING_CONTROLS 8 -#define TEGRA_CAM_STRING_CTRL_EEPROM_INDEX 0 -#define TEGRA_CAM_STRING_CTRL_FUSEID_INDEX 1 -#define TEGRA_CAM_STRING_CTRL_OTP_INDEX 2 - -#define CSI_PHY_MODE_DPHY 0 -#define CSI_PHY_MODE_CPHY 1 -#define SLVS_EC 2 - -struct unpackedU64 { - __u32 high; - __u32 low; -}; - -union __u64val { - struct unpackedU64 unpacked; - __u64 val; -}; - -struct sensor_signal_properties { - __u32 readout_orientation; - __u32 num_lanes; - __u32 mclk_freq; - union __u64val pixel_clock; - __u32 cil_settletime; - __u32 discontinuous_clk; - __u32 dpcm_enable; - __u32 tegra_sinterface; - __u32 phy_mode; - __u32 deskew_initial_enable; - __u32 deskew_periodic_enable; - union __u64val serdes_pixel_clock; - __u32 reserved[2]; -}; - -struct sensor_image_properties { - __u32 width; - __u32 height; - __u32 line_length; - __u32 pixel_format; - __u32 embedded_metadata_height; - __u32 reserved[11]; -}; - -struct sensor_dv_timings { - __u32 hfrontporch; - __u32 hsync; - __u32 hbackporch; - __u32 vfrontporch; - __u32 vsync; - __u32 vbackporch; - __u32 reserved[10]; -}; - -struct sensor_control_properties { - __u32 gain_factor; - __u32 framerate_factor; - __u32 inherent_gain; - __u32 min_gain_val; - __u32 max_gain_val; - __u32 min_hdr_ratio; - __u32 max_hdr_ratio; - __u32 min_framerate; - __u32 max_framerate; - union __u64val min_exp_time; - union __u64val max_exp_time; - __u32 step_gain_val; - __u32 step_framerate; - __u32 exposure_factor; - union __u64val step_exp_time; - __u32 default_gain; - __u32 default_framerate; - union __u64val default_exp_time; - __u32 reserved[10]; -}; - -struct sensor_mode_properties { - struct sensor_signal_properties signal_properties; - struct sensor_image_properties image_properties; - struct sensor_control_properties control_properties; - struct sensor_dv_timings dv_timings; -}; - -#define SENSOR_SIGNAL_PROPERTIES_CID_SIZE \ - (sizeof(struct sensor_signal_properties) / sizeof(__u32)) -#define SENSOR_IMAGE_PROPERTIES_CID_SIZE \ - (sizeof(struct sensor_image_properties) / sizeof(__u32)) -#define SENSOR_CONTROL_PROPERTIES_CID_SIZE \ - (sizeof(struct sensor_control_properties) / sizeof(__u32)) -#define SENSOR_DV_TIMINGS_CID_SIZE \ - (sizeof(struct sensor_dv_timings) / sizeof(__u32)) -#define SENSOR_MODE_PROPERTIES_CID_SIZE \ - (sizeof(struct sensor_mode_properties) / sizeof(__u32)) -#define SENSOR_CONFIG_SIZE \ - (sizeof(struct sensor_cfg) / sizeof(__u32)) -#define SENSOR_MODE_BLOB_SIZE \ - (sizeof(struct sensor_blob) / sizeof(__u32)) -#define SENSOR_CTRL_BLOB_SIZE \ - (sizeof(struct sensor_blob) / sizeof(__u32)) -#endif /* __TEGRA_V4L2_CAMERA__ */ From a606c4ece1c00195ea7fcaaf9ced561fb9bf992f Mon Sep 17 00:00:00 2001 From: dchvs Date: Fri, 19 Feb 2021 20:41:12 -0600 Subject: [PATCH 2/2] documentation: Update README --- README.md | 72 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index e6c90ff..0e8689c 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,7 @@ # Leopard Imaging LI-M021C-MIPI Stereo-Optic Cameras -## Kernel Changes -The source code we have modified or added and is pertinent to these cameras is in the following files: -* controls-utility.sh -* hardware/nvidia/platform/t18x/common/kernel-dts/t18x-common-platforms/tegra186-tx2-spiri-camera-base.dtsi -* hardware/nvidia/platform/t18x/common/kernel-dts/t18x-common-platforms/tegra186-tx2-spiri-camera.dtsi -* hardware/nvidia/platform/t18x/quill/kernel-dts/Makefile -* hardware/nvidia/platform/t18x/quill/kernel-dts/tegra186-tx2-spiri-USB3.dts -* hardware/nvidia/platform/t18x/quill/kernel-dts/tegra186-tx2-spiri-base.dts -* hardware/nvidia/platform/t18x/quill/kernel-dts/tegra186-tx2-spiri-mPCIe.dts -* hardware/nvidia/platform/t18x/quill/kernel-dts/tegra186-tx2-spiri-revF+.dts -* nvidia/drivers/media/i2c/mt9m021.c -* nvidia/drivers/media/i2c/mt9m021_mode_tbls.h -* nvidia/drivers/media/platform/tegra/camera/camera_common.c -* nvidia/drivers/media/platform/tegra/camera/tegracam_ctrls.c -* nvidia/include/media/camera_common.h -* nvidia/include/media/tegra-v4l2-camera.h - -All these modifications and additions are part of the Spiri Mu kernel, and are represented by symbolic links from this repository into https://git.spirirobotics.com/Spiri/mu_kernel_sources, with the exception of the controls-utility.sh script, which is transferred in the spiri_scripts folder of the rootfs. +## Cameras setup +The camera sensors should be conencted to a ConnectTech's Elroy board. ## Features @@ -90,7 +74,57 @@ v4l2-ctl -d /dev/video0 --set-fmt-video=width=1280,height=720,pixelformat=RG12 - v4l2-ctl -d /dev/video01 --set-fmt-video=width=1280,height=720,pixelformat=RG12 --set-ctrl bypass_mode=0 --stream-mmap ``` -## Documentation +## Appends + +#### Kernel Changes + +The Driver for the MT9M021 cameras consists on the following structure, that adds the DTB and Kernel sources, along with its Makefiles that lead its portability to a Kernel source. +```bash +. +├── hardware +│ └── nvidia-spiri +│ └── platform +│ └── t18x +│ ├── common +│ │ └── kernel-dts +│ │ └── t18x-common-platforms +│ │ ├── tegra186-tx2-spiri-camera-base.dtsi +│ │ └── tegra186-tx2-spiri-camera.dtsi +│ └── quill +│ └── kernel-dts +│ ├── Makefile +│ ├── tegra186-tx2-spiri-base.dts +│ ├── tegra186-tx2-spiri-mPCIe.dts +│ ├── tegra186-tx2-spiri-revF+.dts +│ └── tegra186-tx2-spiri-USB3.dts +├── kernel +│ ├── kernel-4.9 +│ │ └── arch +│ │ └── arm64 +│ │ └── configs +│ │ └── tegra_defconfig +│ └── nvidia-spiri +│ ├── drivers +│ │ └── media +│ │ ├── i2c +│ │ │ ├── Kconfig +│ │ │ ├── Makefile +│ │ │ ├── mt9m021.c +│ │ │ └── mt9m021_mode_tbls.h +│ └── include +│ └── media +│ └── mt9m021.h +└── README.md +``` +In order to add the Driver to the Kernel, the following reference Kernel files are patched for adding custom controls that the camera implements. + +* kernel/nvidia/drivers/media/platform/tegra/camera/camera_common.c +* kernel/nvidia/drivers/media/platform/tegra/camera/tegracam_ctrls.c +* kernel/nvidia/include/media/camera_common.h +* kernel/nvidia/include/media/tegra-v4l2-camera.h + + +#### Documentation * CSI2 adapter board guide * Camera module data sheet * Camera sensor data sheet