diff options
| -rw-r--r-- | drivers/media/platform/tegra/camera/Makefile | 2 | ||||
| -rw-r--r-- | drivers/media/platform/tegra/camera/tegracam_core.c | 3 | ||||
| -rw-r--r-- | drivers/media/platform/tegra/camera/tegracam_utils.c | 212 | ||||
| -rw-r--r-- | include/media/camera_common.h | 1 | ||||
| -rw-r--r-- | include/media/tegracam_utils.h | 48 |
5 files changed, 264 insertions, 2 deletions
diff --git a/drivers/media/platform/tegra/camera/Makefile b/drivers/media/platform/tegra/camera/Makefile index 8072676a8..a67a6a0cc 100644 --- a/drivers/media/platform/tegra/camera/Makefile +++ b/drivers/media/platform/tegra/camera/Makefile | |||
| @@ -8,7 +8,7 @@ ccflags-y += -Werror | |||
| 8 | obj-y += vi/ | 8 | obj-y += vi/ |
| 9 | obj-y += csi/ | 9 | obj-y += csi/ |
| 10 | obj-y += camera_common.o camera_gpio.o sensor_common.o camera_version_utils.o \ | 10 | obj-y += camera_common.o camera_gpio.o sensor_common.o camera_version_utils.o \ |
| 11 | tegracam_ctrls.o tegracam_core.o tegracam_v4l2.o | 11 | tegracam_ctrls.o tegracam_core.o tegracam_v4l2.o tegracam_utils.o |
| 12 | obj-$(CONFIG_TEGRA_CAMERA_RTCPU) += capture_common.o | 12 | obj-$(CONFIG_TEGRA_CAMERA_RTCPU) += capture_common.o |
| 13 | obj-$(CONFIG_TEGRA_CAMERA_RTCPU) += isp/isp_channel.o | 13 | obj-$(CONFIG_TEGRA_CAMERA_RTCPU) += isp/isp_channel.o |
| 14 | obj-$(CONFIG_TEGRA_CAMERA_RTCPU) += isp/capture_isp.o | 14 | obj-$(CONFIG_TEGRA_CAMERA_RTCPU) += isp/capture_isp.o |
diff --git a/drivers/media/platform/tegra/camera/tegracam_core.c b/drivers/media/platform/tegra/camera/tegracam_core.c index 5a17322ff..9df1c3ea4 100644 --- a/drivers/media/platform/tegra/camera/tegracam_core.c +++ b/drivers/media/platform/tegra/camera/tegracam_core.c | |||
| @@ -22,7 +22,7 @@ | |||
| 22 | /* use semantic versioning convention */ | 22 | /* use semantic versioning convention */ |
| 23 | #define TEGRACAM_MAJOR_VERSION 2 | 23 | #define TEGRACAM_MAJOR_VERSION 2 |
| 24 | #define TEGRACAM_MINOR_VERSION 0 | 24 | #define TEGRACAM_MINOR_VERSION 0 |
| 25 | #define TEGRACAM_PATCH_VERSION 1 | 25 | #define TEGRACAM_PATCH_VERSION 2 |
| 26 | 26 | ||
| 27 | u32 tegracam_version(u8 major, u8 minor, u8 patch) | 27 | u32 tegracam_version(u8 major, u8 minor, u8 patch) |
| 28 | { | 28 | { |
| @@ -133,6 +133,7 @@ int tegracam_device_register(struct tegracam_device *tc_dev) | |||
| 133 | /* add version info to identify the right feature set */ | 133 | /* add version info to identify the right feature set */ |
| 134 | tc_dev->version = tegracam_version(TEGRACAM_MAJOR_VERSION, | 134 | tc_dev->version = tegracam_version(TEGRACAM_MAJOR_VERSION, |
| 135 | TEGRACAM_MINOR_VERSION, TEGRACAM_PATCH_VERSION); | 135 | TEGRACAM_MINOR_VERSION, TEGRACAM_PATCH_VERSION); |
| 136 | s_data->version = tc_dev->version; | ||
| 136 | dev_info(dev, "tegracam sensor driver:%s_v%d.%d.%d\n", | 137 | dev_info(dev, "tegracam sensor driver:%s_v%d.%d.%d\n", |
| 137 | tc_dev->name, TEGRACAM_MAJOR_VERSION, | 138 | tc_dev->name, TEGRACAM_MAJOR_VERSION, |
| 138 | TEGRACAM_MINOR_VERSION, TEGRACAM_PATCH_VERSION); | 139 | TEGRACAM_MINOR_VERSION, TEGRACAM_PATCH_VERSION); |
diff --git a/drivers/media/platform/tegra/camera/tegracam_utils.c b/drivers/media/platform/tegra/camera/tegracam_utils.c new file mode 100644 index 000000000..1339addcc --- /dev/null +++ b/drivers/media/platform/tegra/camera/tegracam_utils.c | |||
| @@ -0,0 +1,212 @@ | |||
| 1 | /* | ||
| 2 | * tegracam_utils - tegra camera framework utilities | ||
| 3 | * | ||
| 4 | * Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved. | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify it | ||
| 7 | * under the terms and conditions of the GNU General Public License, | ||
| 8 | * version 2, as published by the Free Software Foundation. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
| 11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| 12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
| 13 | * more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
| 17 | */ | ||
| 18 | |||
| 19 | #include <linux/types.h> | ||
| 20 | #include <linux/regmap.h> | ||
| 21 | #include <media/tegracam_core.h> | ||
| 22 | #include <media/tegracam_utils.h> | ||
| 23 | |||
| 24 | bool is_tvcf_supported(u32 version) | ||
| 25 | { | ||
| 26 | /* 2.0.0 is the base tvcf version sensor driver*/ | ||
| 27 | return (version >= tegracam_version(2, 0, 0) ? true : false); | ||
| 28 | } | ||
| 29 | EXPORT_SYMBOL_GPL(is_tvcf_supported); | ||
| 30 | |||
| 31 | void conv_u32_u8arr(u32 input, u8 *output) | ||
| 32 | { | ||
| 33 | output[0] = (input >> 24) & 0xFF; | ||
| 34 | output[1] = (input >> 16) & 0xFF; | ||
| 35 | output[2] = (input >> 8) & 0xFF; | ||
| 36 | output[3] = input & 0xFF; | ||
| 37 | } | ||
| 38 | EXPORT_SYMBOL_GPL(conv_u32_u8arr); | ||
| 39 | |||
| 40 | void conv_u16_u8arr(u16 input, u8 *output) | ||
| 41 | { | ||
| 42 | output[0] = (input >> 8) & 0xFF; | ||
| 43 | output[1] = input & 0xFF; | ||
| 44 | } | ||
| 45 | EXPORT_SYMBOL_GPL(conv_u16_u8arr); | ||
| 46 | |||
| 47 | static inline int is_valid_blob(struct sensor_blob *blob, u32 size) | ||
| 48 | { | ||
| 49 | if (!blob) | ||
| 50 | return -EINVAL; | ||
| 51 | |||
| 52 | if ((blob->num_cmds >= MAX_COMMANDS) || | ||
| 53 | ((blob->buf_size + size) >= MAX_BLOB_SIZE)) | ||
| 54 | return -ENOMEM; | ||
| 55 | |||
| 56 | return 0; | ||
| 57 | } | ||
| 58 | |||
| 59 | int prepare_write_cmd(struct sensor_blob *blob, | ||
| 60 | u32 size, u32 addr, u8 *buf) | ||
| 61 | { | ||
| 62 | struct sensor_cmd *cmd = NULL; | ||
| 63 | int err = 0; | ||
| 64 | |||
| 65 | err = is_valid_blob(blob, size); | ||
| 66 | if (err) | ||
| 67 | return err; | ||
| 68 | |||
| 69 | cmd = &blob->cmds[blob->num_cmds++]; | ||
| 70 | cmd->opcode = ((SENSOR_OPCODE_WRITE << 24) | size); | ||
| 71 | cmd->addr = addr; | ||
| 72 | |||
| 73 | memcpy(&blob->buf[blob->buf_size], buf, size); | ||
| 74 | |||
| 75 | blob->buf_size += size; | ||
| 76 | |||
| 77 | return 0; | ||
| 78 | } | ||
| 79 | EXPORT_SYMBOL_GPL(prepare_write_cmd); | ||
| 80 | |||
| 81 | int prepare_read_cmd(struct sensor_blob *blob, | ||
| 82 | u32 size, u32 addr) | ||
| 83 | { | ||
| 84 | struct sensor_cmd *cmd = NULL; | ||
| 85 | int err = 0; | ||
| 86 | |||
| 87 | err = is_valid_blob(blob, size); | ||
| 88 | if (err) | ||
| 89 | return err; | ||
| 90 | |||
| 91 | cmd = &blob->cmds[blob->num_cmds++]; | ||
| 92 | cmd->opcode = ((SENSOR_OPCODE_READ << 24) | size); | ||
| 93 | cmd->addr = addr; | ||
| 94 | |||
| 95 | blob->buf_size += size; | ||
| 96 | |||
| 97 | return 0; | ||
| 98 | } | ||
| 99 | EXPORT_SYMBOL_GPL(prepare_read_cmd); | ||
| 100 | |||
| 101 | int prepare_sleep_cmd(struct sensor_blob *blob, u32 time_in_us) | ||
| 102 | { | ||
| 103 | struct sensor_cmd *cmd = NULL; | ||
| 104 | int err = 0; | ||
| 105 | |||
| 106 | err = is_valid_blob(blob, 0); | ||
| 107 | if (err) | ||
| 108 | return err; | ||
| 109 | |||
| 110 | cmd = &blob->cmds[blob->num_cmds++]; | ||
| 111 | cmd->opcode = (SENSOR_OPCODE_SLEEP << 24) | time_in_us; | ||
| 112 | |||
| 113 | return 0; | ||
| 114 | } | ||
| 115 | EXPORT_SYMBOL_GPL(prepare_sleep_cmd); | ||
| 116 | |||
| 117 | int prepare_done_cmd(struct sensor_blob *blob) | ||
| 118 | { | ||
| 119 | struct sensor_cmd *cmd = NULL; | ||
| 120 | int err = 0; | ||
| 121 | |||
| 122 | err = is_valid_blob(blob, 0); | ||
| 123 | if (err) | ||
| 124 | return err; | ||
| 125 | |||
| 126 | cmd = &blob->cmds[blob->num_cmds++]; | ||
| 127 | cmd->opcode = SENSOR_OPCODE_DONE; | ||
| 128 | |||
| 129 | return 0; | ||
| 130 | } | ||
| 131 | EXPORT_SYMBOL_GPL(prepare_done_cmd); | ||
| 132 | |||
| 133 | int convert_table_to_blob(struct sensor_blob *blob, | ||
| 134 | const struct reg_8 table[], | ||
| 135 | u16 wait_ms_addr, u16 end_addr) | ||
| 136 | { | ||
| 137 | const struct reg_8 *next; | ||
| 138 | u16 addr; | ||
| 139 | u8 val; | ||
| 140 | int range_start = -1; | ||
| 141 | int range_count = 0; | ||
| 142 | u8 buf[16]; | ||
| 143 | |||
| 144 | for (next = table;; next++) { | ||
| 145 | val = next->val; | ||
| 146 | addr = next->addr; | ||
| 147 | if (range_start == -1) | ||
| 148 | range_start = next->addr; | ||
| 149 | |||
| 150 | if (range_count == 16 || | ||
| 151 | (addr != (range_start + range_count))) { | ||
| 152 | /* write opcode and size for store index*/ | ||
