summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrank Chen <frankc@nvidia.com>2018-10-30 19:55:32 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2019-01-17 19:49:35 -0500
commitc179e1eb9d019a8856e018f749aa3bcd45c04641 (patch)
tree183b17767570e25e776e99d2879c8e54d7923dec
parent18a342ed9313d0ff3ff9e9e3f910b69bd2a025f7 (diff)
media: i2c: imx185: Add version 1.0 driver
Add IMX185 version 1.0 driver. Jira CT-1359 Change-Id: Iede09225c657ef7d541faebe33fa1841e26b36a7 Signed-off-by: Frank Chen <frankc@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1939685 (cherry picked from commit 018f5193b6d857f8fc194315399b8e0e42efaf6c) Reviewed-on: https://git-master.nvidia.com/r/1995859 GVS: Gerrit_Virtual_Submit Reviewed-by: Vincent Chung <vincentc@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
-rw-r--r--drivers/media/i2c/Makefile1
-rw-r--r--drivers/media/i2c/imx185_v1.c1124
-rw-r--r--drivers/media/i2c/imx185_v1_mode_tbls.h1018
3 files changed, 2143 insertions, 0 deletions
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index 85c8c0cf7..3e808e1ce 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -4,6 +4,7 @@ ccflags-y += -I$(srctree)/drivers/media/platform/tegra
4ccflags-y += -I$(srctree)/drivers/video/tegra/camera 4ccflags-y += -I$(srctree)/drivers/video/tegra/camera
5 5
6obj-$(CONFIG_VIDEO_IMX185) += imx185.o 6obj-$(CONFIG_VIDEO_IMX185) += imx185.o
7obj-$(CONFIG_VIDEO_IMX185) += imx185_v1.o
7obj-$(CONFIG_VIDEO_IMX219) += imx219.o 8obj-$(CONFIG_VIDEO_IMX219) += imx219.o
8obj-$(CONFIG_VIDEO_IMX268) += imx268.o 9obj-$(CONFIG_VIDEO_IMX268) += imx268.o
9obj-$(CONFIG_VIDEO_IMX274) += imx274.o 10obj-$(CONFIG_VIDEO_IMX274) += imx274.o
diff --git a/drivers/media/i2c/imx185_v1.c b/drivers/media/i2c/imx185_v1.c
new file mode 100644
index 000000000..eea350229
--- /dev/null
+++ b/drivers/media/i2c/imx185_v1.c
@@ -0,0 +1,1124 @@
1/*
2 * imx185.c - imx185 sensor driver
3 *
4 * Copyright (c) 2016-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/slab.h>
20#include <linux/uaccess.h>
21#include <linux/gpio.h>
22#include <linux/module.h>
23
24#include <linux/seq_file.h>
25#include <linux/of.h>
26#include <linux/of_device.h>
27#include <linux/of_gpio.h>
28
29#include <media/tegra_v4l2_camera.h>
30#include <media/tegra-v4l2-camera.h>
31#include <media/camera_common.h>
32#include "imx185_v1_mode_tbls.h"
33
34#define IMX185_DEFAULT_MODE IMX185_MODE_1920X1080_CROP_30FPS
35#define IMX185_DEFAULT_DATAFMT MEDIA_BUS_FMT_SRGGB12_1X12
36
37#define IMX185_MIN_FRAME_LENGTH (1125)
38#define IMX185_MAX_FRAME_LENGTH (0x1FFFF)
39#define IMX185_MIN_SHS1_1080P_HDR (5)
40#define IMX185_MIN_SHS2_1080P_HDR (82)
41#define IMX185_MAX_SHS2_1080P_HDR (IMX185_MAX_FRAME_LENGTH - 5)
42#define IMX185_MAX_SHS1_1080P_HDR (IMX185_MAX_SHS2_1080P_HDR / 16)
43
44#define IMX185_FRAME_LENGTH_ADDR_MSB 0x301A
45#define IMX185_FRAME_LENGTH_ADDR_MID 0x3019
46#define IMX185_FRAME_LENGTH_ADDR_LSB 0x3018
47#define IMX185_COARSE_TIME_SHS1_ADDR_MSB 0x3022
48#define IMX185_COARSE_TIME_SHS1_ADDR_MID 0x3021
49#define IMX185_COARSE_TIME_SHS1_ADDR_LSB 0x3020
50#define IMX185_COARSE_TIME_SHS2_ADDR_MSB 0x3025
51#define IMX185_COARSE_TIME_SHS2_ADDR_MID 0x3024
52#define IMX185_COARSE_TIME_SHS2_ADDR_LSB 0x3023
53#define IMX185_GAIN_ADDR 0x3014
54#define IMX185_GROUP_HOLD_ADDR 0x3001
55#define IMX185_SW_RESET_ADDR 0x3003
56
57#define IMX185_FUSE_ID_ADDR 0x3382
58#define IMX185_FUSE_ID_SIZE 6
59#define IMX185_FUSE_ID_STR_SIZE (IMX185_FUSE_ID_SIZE * 2)
60#define IMX185_DEFAULT_WIDTH 1920
61#define IMX185_DEFAULT_HEIGHT 1080
62#define IMX185_DEFAULT_CLK_FREQ 37125000
63
64struct imx185 {
65 struct camera_common_power_rail power;
66 int numctrls;
67 struct v4l2_ctrl_handler ctrl_handler;
68 struct i2c_client *i2c_client;
69 struct v4l2_subdev *subdev;
70 struct media_pad pad;
71 u32 frame_length;
72 s32 group_hold_prev;
73 bool group_hold_en;
74 s64 last_wdr_et_val;
75 struct regmap *regmap;
76 struct camera_common_data *s_data;
77 struct camera_common_pdata *pdata;
78 struct v4l2_ctrl *ctrls[];
79};
80
81static const struct regmap_config sensor_regmap_config = {
82 .reg_bits = 16,
83 .val_bits = 8,
84 .cache_type = REGCACHE_RBTREE,
85 .use_single_rw = true,
86};
87
88static int imx185_g_volatile_ctrl(struct v4l2_ctrl *ctrl);
89static int imx185_s_ctrl(struct v4l2_ctrl *ctrl);
90
91static const struct v4l2_ctrl_ops imx185_ctrl_ops = {
92 .g_volatile_ctrl = imx185_g_volatile_ctrl,
93 .s_ctrl = imx185_s_ctrl,
94};
95
96static struct v4l2_ctrl_config ctrl_config_list[] = {
97/* Do not change the name field for the controls! */
98 {
99 .ops = &imx185_ctrl_ops,
100 .id = TEGRA_CAMERA_CID_GAIN,
101 .name = "Gain",
102 .type = V4L2_CTRL_TYPE_INTEGER64,
103 .flags = V4L2_CTRL_FLAG_SLIDER,
104 .min = 0 * FIXED_POINT_SCALING_FACTOR,
105 .max = 48 * FIXED_POINT_SCALING_FACTOR,
106 .def = 0 * FIXED_POINT_SCALING_FACTOR,
107 .step = 3 * FIXED_POINT_SCALING_FACTOR / 10, /* 0.3 db */
108 },
109 {
110 .ops = &imx185_ctrl_ops,
111 .id = TEGRA_CAMERA_CID_EXPOSURE,
112 .name = "Exposure",
113 .type = V4L2_CTRL_TYPE_INTEGER64,
114 .flags = V4L2_CTRL_FLAG_SLIDER,
115 .min = 30 * FIXED_POINT_SCALING_FACTOR / 1000000,
116 .max = 1000000LL * FIXED_POINT_SCALING_FACTOR / 1000000,
117 .def = 30 * FIXED_POINT_SCALING_FACTOR / 1000000,
118 .step = 1 * FIXED_POINT_SCALING_FACTOR / 1000000,
119 },
120 {
121 .ops = &imx185_ctrl_ops,
122 .id = TEGRA_CAMERA_CID_FRAME_RATE,
123 .name = "Frame Rate",
124 .type = V4L2_CTRL_TYPE_INTEGER64,
125 .flags = V4L2_CTRL_FLAG_SLIDER,
126 .min = 1 * FIXED_POINT_SCALING_FACTOR,
127 .max = 60 * FIXED_POINT_SCALING_FACTOR,
128 .def = 30 * FIXED_POINT_SCALING_FACTOR,
129 .step = 1 * FIXED_POINT_SCALING_FACTOR,
130 },
131 {
132 .ops = &imx185_ctrl_ops,
133 .id = TEGRA_CAMERA_CID_GROUP_HOLD,
134 .name = "Group Hold",
135 .type = V4L2_CTRL_TYPE_INTEGER_MENU,
136 .min = 0,
137 .max = ARRAY_SIZE(switch_ctrl_qmenu) - 1,
138 .menu_skip_mask = 0,
139 .def = 0,
140 .qmenu_int = switch_ctrl_qmenu,
141 },
142 {
143 .ops = &imx185_ctrl_ops,
144 .id = TEGRA_CAMERA_CID_HDR_EN,
145 .name = "HDR enable",
146 .type = V4L2_CTRL_TYPE_INTEGER_MENU,
147 .min = 0,
148 .max = ARRAY_SIZE(switch_ctrl_qmenu) - 1,
149 .menu_skip_mask = 0,
150 .def = 0,
151 .qmenu_int = switch_ctrl_qmenu,
152 },
153 {
154 .ops = &imx185_ctrl_ops,
155 .id = TEGRA_CAMERA_CID_FUSE_ID,
156 .name = "Fuse ID",
157 .type = V4L2_CTRL_TYPE_STRING,
158 .flags = V4L2_CTRL_FLAG_READ_ONLY,
159 .min = 0,
160 .max = IMX185_FUSE_ID_STR_SIZE,
161 .step = 2,
162 },
163 {
164 .ops = &imx185_ctrl_ops,
165 .id = TEGRA_CAMERA_CID_SENSOR_MODE_ID,
166 .name = "Sensor Mode",
167 .type = V4L2_CTRL_TYPE_INTEGER64,
168 .flags = V4L2_CTRL_FLAG_SLIDER,
169 .min = 0,
170 .max = 0xFF,
171 .def = 0xFE,
172 .step = 1,
173 },
174};
175
176static inline void imx185_get_frame_length_regs(imx185_reg *regs,
177 u32 frame_length)
178{
179 regs->addr = IMX185_FRAME_LENGTH_ADDR_MSB;
180 regs->val = (frame_length >> 16) & 0x01;
181
182 (regs + 1)->addr = IMX185_FRAME_LENGTH_ADDR_MID;
183 (regs + 1)->val = (frame_length >> 8) & 0xff;
184
185 (regs + 2)->addr = IMX185_FRAME_LENGTH_ADDR_LSB;
186 (regs + 2)->val = (frame_length) & 0xff;
187}