2 * imx230.c - imx230 sensor driver
4 * Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
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.
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
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/>.
19 #include <linux/slab.h>
20 #include <linux/uaccess.h>
21 #include <linux/gpio.h>
22 #include <linux/module.h>
24 #include <linux/seq_file.h>
26 #include <linux/of_device.h>
27 #include <linux/of_gpio.h>
29 #include <media/v4l2-chip-ident.h>
30 #include <media/tegra_v4l2_camera.h>
31 #include <media/camera_common.h>
32 #include <media/imx230.h>
34 #include "imx230_mode_tbls.h"
36 #define IMX230_MAX_COARSE_DIFF 10
38 /* gain values are common among sensor modes */
39 #define IMX230_GAIN_SHIFT 8
40 #define IMX230_MIN_GAIN (1 << IMX230_GAIN_SHIFT)
41 #define IMX230_MAX_GAIN (16 << IMX230_GAIN_SHIFT)
42 #define IMX230_DEFAULT_GAIN IMX230_MIN_GAIN
44 /* common FL/CT values among sensor modes */
45 #define IMX230_MIN_FRAME_LENGTH (0x0)
46 #define IMX230_MAX_FRAME_LENGTH (0xffff)
47 #define IMX230_MIN_EXPOSURE_COARSE (0x0001)
48 #define IMX230_MAX_EXPOSURE_COARSE \
49 (IMX230_MAX_FRAME_LENGTH-IMX230_MAX_COARSE_DIFF)
51 /* Definitions for full sensor mode that matches full mode's sequence */
52 #define IMX230_MIN_FRAME_LENGTH_5344x4016 (0x1022)
53 #define IMX230_DEFAULT_WIDTH_5344x4016 5344
54 #define IMX230_DEFAULT_HEIGHT_5344x4016 4016
56 /* Use full sensor mode settings as default values */
57 #define IMX230_DEFAULT_MODE IMX230_MODE_5344x4016
58 #define IMX230_DEFAULT_WIDTH IMX230_DEFAULT_WIDTH_5344x4016
59 #define IMX230_DEFAULT_HEIGHT IMX230_DEFAULT_HEIGHT_5344x4016
60 #define IMX230_DEFAULT_FRAME_LENGTH IMX230_MIN_FRAME_LENGTH_5344x4016
61 #define IMX230_DEFAULT_EXPOSURE_COARSE \
62 (IMX230_DEFAULT_FRAME_LENGTH-IMX230_MAX_COARSE_DIFF)
64 /* Some other common default values */
65 #define IMX230_DEFAULT_DATAFMT V4L2_MBUS_FMT_SRGGB10_1X10
66 #define IMX230_DEFAULT_CLK_FREQ 24000000
69 #define IMX230_NUM_CROP_REGS 8
72 struct camera_common_power_rail power;
74 struct v4l2_ctrl_handler ctrl_handler;
75 #ifdef IMX230_EEPROM_PRESENT
76 struct camera_common_eeprom_data eeprom[IMX230_EEPROM_NUM_BLOCKS];
77 u8 eeprom_buf[IMX230_EEPROM_SIZE];
78 #endif /* if IMX230_EEPROM_PRESENT */
79 struct i2c_client *i2c_client;
80 struct v4l2_subdev *subdev;
84 struct regmap *regmap;
85 struct camera_common_data *s_data;
86 struct camera_common_pdata *pdata;
87 struct v4l2_ctrl *ctrls[];
90 static const struct regmap_config sensor_regmap_config = {
93 .cache_type = REGCACHE_RBTREE,
96 static int imx230_g_volatile_ctrl(struct v4l2_ctrl *ctrl);
97 static int imx230_s_ctrl(struct v4l2_ctrl *ctrl);
99 static const struct v4l2_ctrl_ops imx230_ctrl_ops = {
100 .g_volatile_ctrl = imx230_g_volatile_ctrl,
101 .s_ctrl = imx230_s_ctrl,
104 static struct v4l2_ctrl_config ctrl_config_list[] = {
105 /* Do not change the name field for the controls! */
107 .ops = &imx230_ctrl_ops,
110 .type = V4L2_CTRL_TYPE_INTEGER,
111 .flags = V4L2_CTRL_FLAG_SLIDER,
112 .min = IMX230_MIN_GAIN,
113 .max = IMX230_MAX_GAIN,
114 .def = IMX230_DEFAULT_GAIN,
118 .ops = &imx230_ctrl_ops,
119 .id = V4L2_CID_FRAME_LENGTH,
120 .name = "Frame Length",
121 .type = V4L2_CTRL_TYPE_INTEGER,
122 .flags = V4L2_CTRL_FLAG_SLIDER,
123 .min = IMX230_MIN_FRAME_LENGTH,
124 .max = IMX230_MAX_FRAME_LENGTH,
125 .def = IMX230_DEFAULT_FRAME_LENGTH,
129 .ops = &imx230_ctrl_ops,
130 .id = V4L2_CID_COARSE_TIME,
131 .name = "Coarse Time",
132 .type = V4L2_CTRL_TYPE_INTEGER,
133 .flags = V4L2_CTRL_FLAG_SLIDER,
134 .min = IMX230_MIN_EXPOSURE_COARSE,
135 .max = IMX230_MAX_EXPOSURE_COARSE,
136 .def = IMX230_DEFAULT_EXPOSURE_COARSE,
140 .ops = &imx230_ctrl_ops,
141 .id = V4L2_CID_COARSE_TIME_SHORT,
142 .name = "Coarse Time Short",
143 .type = V4L2_CTRL_TYPE_INTEGER,
144 .flags = V4L2_CTRL_FLAG_SLIDER,
145 .min = IMX230_MIN_EXPOSURE_COARSE,
146 .max = IMX230_MAX_EXPOSURE_COARSE,
147 .def = IMX230_DEFAULT_EXPOSURE_COARSE,
151 .ops = &imx230_ctrl_ops,
152 .id = V4L2_CID_GROUP_HOLD,
153 .name = "Group Hold",
154 .type = V4L2_CTRL_TYPE_INTEGER_MENU,
156 .max = ARRAY_SIZE(switch_ctrl_qmenu) - 1,
159 .qmenu_int = switch_ctrl_qmenu,
162 .ops = &imx230_ctrl_ops,
163 .id = V4L2_CID_HDR_EN,
164 .name = "HDR enable",
165 .type = V4L2_CTRL_TYPE_INTEGER_MENU,
167 .max = ARRAY_SIZE(switch_ctrl_qmenu) - 1,
170 .qmenu_int = switch_ctrl_qmenu,
172 #ifdef IMX230_EEPROM_PRESENT
174 .ops = &imx230_ctrl_ops,
175 .id = V4L2_CID_EEPROM_DATA,
176 .name = "EEPROM Data",
177 .type = V4L2_CTRL_TYPE_STRING,
178 .flags = V4L2_CTRL_FLAG_VOLATILE,
180 .max = IMX230_EEPROM_STR_SIZE,
183 #endif /* if IMX230_EEPROM_PRESENT */
185 .ops = &imx230_ctrl_ops,
186 .id = V4L2_CID_OTP_DATA,
188 .type = V4L2_CTRL_TYPE_STRING,
189 .flags = V4L2_CTRL_FLAG_READ_ONLY,
191 .max = IMX230_OTP_STR_SIZE,
195 .ops = &imx230_ctrl_ops,
196 .id = V4L2_CID_FUSE_ID,
198 .type = V4L2_CTRL_TYPE_STRING,
199 .flags = V4L2_CTRL_FLAG_READ_ONLY,
201 .max = IMX230_FUSE_ID_STR_SIZE,
206 static inline void imx230_get_frame_length_regs(imx230_reg *regs,
209 regs->addr = IMX230_FRAME_LENGTH_ADDR_MSB;
210 regs->val = (frame_length >> 8) & 0xff;
211 (regs + 1)->addr = IMX230_FRAME_LENGTH_ADDR_LSB;
212 (regs + 1)->val = (frame_length) & 0xff;
215 static inline void imx230_get_coarse_time_regs(imx230_reg *regs,
218 regs->addr = IMX230_COARSE_TIME_ADDR_MSB;
219 regs->val = (coarse_time >> 8) & 0xff;
220 (regs + 1)->addr = IMX230_COARSE_TIME_ADDR_LSB;
221 (regs + 1)->val = (coarse_time) & 0xff;
224 static inline void imx230_get_coarse_time_short_regs(imx230_reg *regs,
227 regs->addr = IMX230_COARSE_TIME_SHORT_ADDR_MSB;
228 regs->val = (coarse_time >> 8) & 0xff;
229 (regs + 1)->addr = IMX230_COARSE_TIME_SHORT_ADDR_LSB;
230 (regs + 1)->val = (coarse_time) & 0xff;
233 static inline void imx230_get_gain_reg(imx230_reg *regs,
236 regs->addr = IMX230_GAIN_ADDR_MSB;
237 regs->val = (gain >> 8) & 0xff;
238 (regs + 1)->addr = IMX230_GAIN_ADDR_LSB;
239 (regs + 1)->val = (gain) & 0xff;
242 static inline void imx230_get_gain_short_reg(imx230_reg *regs,
245 regs->addr = IMX230_GAIN_SHORT_ADDR_MSB;
246 regs->val = (gain >> 8) & 0xff;
247 (regs + 1)->addr = IMX230_GAIN_SHORT_ADDR_LSB;
248 (regs + 1)->val = (gain) & 0xff;
251 static void imx230_get_crop_regs(imx230_reg *regs,
252 struct v4l2_rect *rect)
254 u32 x_start, y_start;
256 x_start = rect->left;
258 x_end = x_start + rect->width - 1;
259 y_end = y_start + rect->height - 1;
261 regs->addr = IMX230_CROP_X_START_ADDR_MSB;
262 regs->val = (x_start >> 8) & 0xff;
263 (regs + 1)->addr = IMX230_CROP_X_START_ADDR_LSB;
264 (regs + 1)->val = (x_start) & 0xff;
266 (regs + 2)->addr = IMX230_CROP_Y_START_ADDR_MSB;
267 (regs + 2)->val = (y_start >> 8) & 0xff;
268 (regs + 3)->addr = IMX230_CROP_Y_START_ADDR_LSB;
269 (regs + 3)->val = (y_start) & 0xff;
271 (regs + 4)->addr = IMX230_CROP_X_END_ADDR_MSB;
272 (regs + 4)->val = (x_end >> 8) & 0xff;
273 (regs + 5)->addr = IMX230_CROP_X_END_ADDR_LSB;
274 (regs + 5)->val = (x_end) & 0xff;
276 (regs + 6)->addr = IMX230_CROP_Y_END_ADDR_MSB;
277 (regs + 6)->val = (y_end >> 8) & 0xff;
278 (regs + 7)->addr = IMX230_CROP_Y_END_ADDR_LSB;
279 (regs + 7)->val = (y_end) & 0xff;
282 static int test_mode;
283 module_param(test_mode, int, 0644);
285 static inline int imx230_read_reg(struct camera_common_data *s_data,
288 struct imx230 *priv = (struct imx230 *)s_data->priv;
289 return regmap_read(priv->regmap, addr, (unsigned int *) val);
292 static int imx230_write_reg(struct camera_common_data *s_data, u16 addr, u8 val)
295 struct imx230 *priv = (struct imx230 *)s_data->priv;
297 err = regmap_write(priv->regmap, addr, val);
299 pr_err("%s:i2c write failed, %x = %x\n",
300 __func__, addr, val);
305 static int imx230_write_table(struct imx230 *priv,
306 const imx230_reg table[])
308 return regmap_util_write_table_8(priv->regmap,
311 IMX230_TABLE_WAIT_MS,
315 static int imx230_power_on(struct camera_common_data *s_data)
318 struct imx230 *priv = (struct imx230 *)s_data->priv;
319 struct camera_common_power_rail *pw = &priv->power;
321 dev_dbg(&priv->i2c_client->dev, "%s: power on\n", __func__);
323 if (priv->pdata->power_on) {
324 err = priv->pdata->power_on(pw);
326 pr_err("%s failed.\n", __func__);
328 pw->state = SWITCH_ON;
334 gpio_set_value(pw->reset_gpio, 0);
335 usleep_range(10, 20);
337 /* It's used to switch on 2V5_CAM_H and 1V1_CAM_H */
339 gpio_set_value(pw->pwdn_gpio, 1);
342 err = regulator_enable(pw->avdd);
344 goto imx230_avdd_fail;
347 err = regulator_enable(pw->iovdd);
349 goto imx230_iovdd_fail;
351 usleep_range(11, 20);
353 gpio_set_value(pw->reset_gpio, 1);
355 usleep_range(1000, 1010);
357 pw->state = SWITCH_ON;
361 regulator_disable(pw->avdd);
365 pr_err("%s failed.\n", __func__);
369 static int imx230_power_off(struct camera_common_data *s_data)
372 struct imx230 *priv = (struct imx230 *)s_data->priv;
373 struct camera_common_power_rail *pw = &priv->power;
375 dev_dbg(&priv->i2c_client->dev, "%s: power off\n", __func__);
377 if (priv->pdata->power_off) {
378 err = priv->pdata->power_off(pw);
380 pr_err("%s failed.\n", __func__);
389 gpio_set_value(pw->reset_gpio, 0);
393 gpio_set_value(pw->pwdn_gpio, 0);
396 regulator_disable(pw->iovdd);
398 regulator_disable(pw->avdd);
402 pw->state = SWITCH_OFF;
406 static int imx230_power_put(struct imx230 *priv)
408 struct camera_common_power_rail *pw = &priv->power;
412 if (likely(pw->avdd))
413 regulator_put(pw->avdd);
415 if (likely(pw->iovdd))
416 regulator_put(pw->iovdd);
424 static int imx230_power_get(struct imx230 *priv)
426 struct camera_common_power_rail *pw = &priv->power;
427 struct camera_common_pdata *pdata = priv->pdata;
428 const char *mclk_name;
431 mclk_name = priv->pdata->mclk_name ?
432 priv->pdata->mclk_name : "cam_mclk1";
433 pw->mclk = devm_clk_get(&priv->i2c_client->dev, mclk_name);
434 if (IS_ERR(pw->mclk)) {
435 dev_err(&priv->i2c_client->dev,
436 "unable to get clock %s\n", mclk_name);
437 return PTR_ERR(pw->mclk);
441 err |= camera_common_regulator_get(priv->i2c_client,
442 &pw->avdd, pdata->regulators.avdd);
444 err |= camera_common_regulator_get(priv->i2c_client,
445 &pw->iovdd, pdata->regulators.iovdd);
448 pw->reset_gpio = pdata->reset_gpio;
449 pw->pwdn_gpio = pdata->pwdn_gpio;
452 pw->state = SWITCH_OFF;
456 static int imx230_set_gain(struct imx230 *priv, s32 val);
457 static int imx230_set_frame_length(struct imx230 *priv, s32 val);
458 static int imx230_set_coarse_time(struct imx230 *priv, s32 val);
459 static int imx230_set_coarse_time_short(struct imx230 *priv, s32 val);
460 static int imx230_set_crop_data(struct imx230 *priv, struct v4l2_rect *rect);
461 static int imx230_get_crop_data(struct imx230 *priv, struct v4l2_rect *rect);
463 static int imx230_s_stream(struct v4l2_subdev *sd, int enable)
465 struct i2c_client *client = v4l2_get_subdevdata(sd);
466 struct camera_common_data *s_data = to_camera_common_data(client);
467 struct imx230 *priv = (struct imx230 *)s_data->priv;
468 struct v4l2_control control;
471 dev_dbg(&client->dev, "%s++ enable %d mode %d\n",
472 __func__, enable, s_data->mode);
475 return imx230_write_table(priv,
476 mode_table[IMX230_MODE_STOP_STREAM]);
478 err = imx230_write_table(priv, mode_table[IMX230_MODE_COMMON]);
481 err = imx230_write_table(priv, mode_table[s_data->mode]);
485 /* write list of override regs for the asking frame length, */
486 /* coarse integration time, and gain. */
487 control.id = V4L2_CID_GAIN;
488 err = v4l2_g_ctrl(&priv->ctrl_handler, &control);
489 err |= imx230_set_gain(priv, control.value);
491 dev_dbg(&client->dev, "%s: error gain override\n", __func__);
493 control.id = V4L2_CID_FRAME_LENGTH;
494 err = v4l2_g_ctrl(&priv->ctrl_handler, &control);
495 err |= imx230_set_frame_length(priv, control.value);
497 dev_dbg(&client->dev,
498 "%s: error frame length override\n", __func__);
500 control.id = V4L2_CID_COARSE_TIME;
501 err = v4l2_g_ctrl(&priv->ctrl_handler, &control);
502 err |= imx230_set_coarse_time(priv, control.value);
504 dev_dbg(&client->dev,
505 "%s: error coarse time override\n", __func__);
507 control.id = V4L2_CID_COARSE_TIME_SHORT;
508 err = v4l2_g_ctrl(&priv->ctrl_handler, &control);
509 err |= imx230_set_coarse_time_short(priv, control.value);
511 dev_dbg(&client->dev,
512 "%s: error coarse time short override\n", __func__);
514 err = imx230_write_table(priv, mode_table[IMX230_MODE_START_STREAM]);
519 err = imx230_write_table(priv,
520 mode_table[IMX230_MODE_TEST_PATTERN]);
522 dev_dbg(&client->dev, "%s: success setting stream\n", __func__);
525 dev_dbg(&client->dev, "%s: error setting stream\n", __func__);
529 static int imx230_s_crop(struct v4l2_subdev *sd, const struct v4l2_crop *crop)
531 struct i2c_client *client = v4l2_get_subdevdata(sd);
532 struct camera_common_data *s_data = to_camera_common_data(client);
533 struct imx230 *priv = (struct imx230 *)s_data->priv;
534 struct v4l2_rect *rect = &crop->c;
540 width = s_data->fmt_width;
541 height = s_data->fmt_height;
543 if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
546 if ((width != rect->width) || (height != rect->height)) {
547 dev_err(&client->dev,
548 "%s: CROP Resolution Mismatch: %dx%d\n",
549 __func__, rect->width, rect->height);
552 if (rect->top < 0 || rect->left < 0) {
553 dev_err(&client->dev,
554 "%s: CROP Bound Error: left:%d, top:%d\n",
555 __func__, rect->left, rect->top);
558 right = rect->left + width - 1;
559 bottom = rect->top + height - 1;
561 /* Crop window is within the full mode's active */
562 if ((right > IMX230_DEFAULT_WIDTH_5344x4016) ||
563 (bottom > IMX230_DEFAULT_HEIGHT_5344x4016)) {
564 dev_err(&client->dev,
565 "%s: CROP Bound Error: right:%d, bottom:%d)\n",
566 __func__, right, bottom);
569 err = imx230_set_crop_data(priv, rect);
574 static int imx230_g_crop(struct v4l2_subdev *sd, struct v4l2_crop *crop)
576 struct i2c_client *client = v4l2_get_subdevdata(sd);
577 struct camera_common_data *s_data = to_camera_common_data(client);
578 struct imx230 *priv = (struct imx230 *)s_data->priv;
579 struct v4l2_rect *rect = &crop->c;
582 if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
585 err = imx230_get_crop_data(priv, rect);
590 static struct v4l2_subdev_video_ops imx230_subdev_video_ops = {
591 .s_stream = imx230_s_stream,
592 .s_crop = imx230_s_crop,
593 .g_crop = imx230_g_crop,
594 .s_mbus_fmt = camera_common_s_fmt,
595 .g_mbus_fmt = camera_common_g_fmt,
596 .try_mbus_fmt = camera_common_try_fmt,
597 .enum_mbus_fmt = camera_common_enum_fmt,
598 .g_mbus_config = camera_common_g_mbus_config,
601 static struct v4l2_subdev_core_ops imx230_subdev_core_ops = {
602 .g_chip_ident = camera_common_g_chip_ident,
603 .s_power = camera_common_s_power,
606 static struct v4l2_subdev_ops imx230_subdev_ops = {
607 .core = &imx230_subdev_core_ops,
608 .video = &imx230_subdev_video_ops,
611 static struct of_device_id imx230_of_match[] = {
612 { .compatible = "nvidia,imx230", },
616 static struct camera_common_sensor_ops imx230_common_ops = {
617 .power_on = imx230_power_on,
618 .power_off = imx230_power_off,
619 .write_reg = imx230_write_reg,
620 .read_reg = imx230_read_reg,
623 static int imx230_set_group_hold(struct imx230 *priv)
626 int gh_prev = switch_ctrl_qmenu[priv->group_hold_prev];
628 if (priv->group_hold_en == true && gh_prev == SWITCH_OFF) {
629 err = imx230_write_reg(priv->s_data,
630 IMX230_GROUP_HOLD_ADDR, 0x1);
633 priv->group_hold_prev = 1;
634 } else if (priv->group_hold_en == false && gh_prev == SWITCH_ON) {
635 err = imx230_write_reg(priv->s_data,
636 IMX230_GROUP_HOLD_ADDR, 0x0);
639 priv->group_hold_prev = 0;
645 dev_dbg(&priv->i2c_client->dev,
646 "%s: Group hold control error\n", __func__);
650 int imx230_to_gain(u32 rep, int shift)
655 int min_int = (1 << shift);
658 /* last 4 bit of rep is
659 * decimal representation of gain */
660 gain_int = (int)(rep >> shift);
661 gain_dec = (int)(rep & ~(0xffff << shift));
663 denom = gain_int * min_int + gain_dec;
664 gain = 512 - ((512 * min_int + (denom - 1)) / denom);
669 static int imx230_set_gain(struct imx230 *priv, s32 val)
671 imx230_reg reg_list[2];
672 imx230_reg reg_list_short[2];
677 /* translate value */
678 gain = (u16)imx230_to_gain(val, IMX230_GAIN_SHIFT);
680 dev_dbg(&priv->i2c_client->dev,
681 "%s: val: %d gain: %x\n", __func__, val, gain);
683 imx230_get_gain_reg(reg_list, gain);
684 imx230_get_gain_short_reg(reg_list_short, gain);
685 imx230_set_group_hold(priv);
687 /* writing long gain */
688 for (i = 0; i < 2; i++) {
689 err = imx230_write_reg(priv->s_data, reg_list[i].addr,
694 /* writing short gain */
695 for (i = 0; i < 2; i++) {
696 err = imx230_write_reg(priv->s_data, reg_list_short[i].addr,
697 reg_list_short[i].val);
705 dev_dbg(&priv->i2c_client->dev,
706 "%s: GAIN control error\n", __func__);
710 static int imx230_set_frame_length(struct imx230 *priv, s32 val)
712 imx230_reg reg_list[2];
719 dev_dbg(&priv->i2c_client->dev,
720 "%s: val: %d\n", __func__, frame_length);
722 imx230_get_frame_length_regs(reg_list, frame_length);
723 imx230_set_group_hold(priv);
725 for (i = 0; i < 2; i++) {
726 err = imx230_write_reg(priv->s_data, reg_list[i].addr,
735 dev_dbg(&priv->i2c_client->dev,
736 "%s: FRAME_LENGTH control error\n", __func__);
740 static int imx230_set_coarse_time(struct imx230 *priv, s32 val)
742 imx230_reg reg_list[2];
749 dev_dbg(&priv->i2c_client->dev,
750 "%s: val: %d\n", __func__, coarse_time);
752 imx230_get_coarse_time_regs(reg_list, coarse_time);
753 imx230_set_group_hold(priv);
755 for (i = 0; i < 2; i++) {
756 err = imx230_write_reg(priv->s_data, reg_list[i].addr,
765 dev_dbg(&priv->i2c_client->dev,
766 "%s: COARSE_TIME control error\n", __func__);
770 static int imx230_set_coarse_time_short(struct imx230 *priv, s32 val)
772 imx230_reg reg_list[2];
774 struct v4l2_control hdr_control;
776 u32 coarse_time_short;
779 /* check hdr enable ctrl */
780 hdr_control.id = V4L2_CID_HDR_EN;
782 err = v4l2_g_ctrl(&priv->ctrl_handler, &hdr_control);
784 dev_err(&priv->i2c_client->dev,
785 "could not find device ctrl.\n");
789 hdr_en = switch_ctrl_qmenu[hdr_control.value];
790 if (hdr_en == SWITCH_OFF)
793 coarse_time_short = val;
795 dev_dbg(&priv->i2c_client->dev,
796 "%s: val: %d\n", __func__, coarse_time_short);
798 imx230_get_coarse_time_short_regs(reg_list, coarse_time_short);
799 imx230_set_group_hold(priv);
801 for (i = 0; i < 2; i++) {
802 err = imx230_write_reg(priv->s_data, reg_list[i].addr,
811 dev_dbg(&priv->i2c_client->dev,
812 "%s: COARSE_TIME_SHORT control error\n", __func__);
816 static int imx230_set_crop_data(struct imx230 *priv, struct v4l2_rect *rect)
818 imx230_reg reg_list_crop[IMX230_NUM_CROP_REGS];
822 dev_dbg(&priv->i2c_client->dev,
823 "%s: crop->left:%d, crop->top:%d, crop->res: %dx%d\n",
824 __func__, rect->left, rect->top, rect->width, rect->height);
826 imx230_get_crop_regs(reg_list_crop, rect);
827 imx230_set_group_hold(priv);
829 for (i = 0; i < IMX230_NUM_CROP_REGS; i++) {
830 err = imx230_write_reg(priv->s_data, reg_list_crop[i].addr,
831 reg_list_crop[i].val);
833 dev_dbg(&priv->i2c_client->dev,
834 "%s: SENSOR_CROP control error\n", __func__);
842 static int imx230_get_crop_data(struct imx230 *priv, struct v4l2_rect *rect)
844 imx230_reg reg_list_crop[IMX230_NUM_CROP_REGS];
849 for (i = 0; i < IMX230_NUM_CROP_REGS; i++) {
850 reg_list_crop[i].addr = (IMX230_CROP_X_START_ADDR_MSB + i);
851 err = imx230_read_reg(priv->s_data, reg_list_crop[i].addr,
852 ®_list_crop[i].val);
854 dev_dbg(&priv->i2c_client->dev,
855 "%s: SENSOR_CROP control error\n", __func__);
860 a = reg_list_crop[0].val & 0x00ff;
861 b = reg_list_crop[1].val & 0x00ff;
862 rect->left = (a << 8) | b;
864 a = reg_list_crop[2].val & 0x00ff;
865 b = reg_list_crop[3].val & 0x00ff;
866 rect->top = (a << 8) | b;
868 a = reg_list_crop[4].val & 0x00ff;
869 b = reg_list_crop[5].val & 0x00ff;
870 right = (a << 8) | b;
871 rect->width = right - rect->left + 1;
873 a = reg_list_crop[6].val & 0x00ff;
874 b = reg_list_crop[7].val & 0x00ff;
875 bottom = (a << 8) | b;
876 rect->height = bottom - rect->top + 1;
881 #ifdef IMX230_EEPROM_PRESENT
882 static int imx230_eeprom_device_release(struct imx230 *priv)
886 for (i = 0; i < IMX230_EEPROM_NUM_BLOCKS; i++) {
887 if (priv->eeprom[i].i2c_client != NULL) {
888 i2c_unregister_device(priv->eeprom[i].i2c_client);
889 priv->eeprom[i].i2c_client = NULL;
896 static int imx230_eeprom_device_init(struct imx230 *priv)
898 char *dev_name = "eeprom_imx230";
899 static struct regmap_config eeprom_regmap_config = {
906 for (i = 0; i < IMX230_EEPROM_NUM_BLOCKS; i++) {
907 priv->eeprom[i].adap = i2c_get_adapter(
908 priv->i2c_client->adapter->nr);
909 memset(&priv->eeprom[i].brd, 0, sizeof(priv->eeprom[i].brd));
910 strncpy(priv->eeprom[i].brd.type, dev_name,
911 sizeof(priv->eeprom[i].brd.type));
912 priv->eeprom[i].brd.addr = IMX230_EEPROM_ADDRESS + i;
913 priv->eeprom[i].i2c_client = i2c_new_device(
914 priv->eeprom[i].adap, &priv->eeprom[i].brd);
916 priv->eeprom[i].regmap = devm_regmap_init_i2c(
917 priv->eeprom[i].i2c_client, &eeprom_regmap_config);
918 if (IS_ERR(priv->eeprom[i].regmap)) {
919 err = PTR_ERR(priv->eeprom[i].regmap);
920 imx230_eeprom_device_release(priv);
928 static int imx230_read_eeprom(struct imx230 *priv,
929 struct v4l2_ctrl *ctrl)
933 for (i = 0; i < IMX230_EEPROM_NUM_BLOCKS; i++) {
934 err = regmap_bulk_read(priv->eeprom[i].regmap, 0,
935 &priv->eeprom_buf[i * IMX230_EEPROM_BLOCK_SIZE],
936 IMX230_EEPROM_BLOCK_SIZE);
941 for (i = 0; i < IMX230_EEPROM_SIZE; i++)
942 sprintf(&ctrl->string[i*2], "%02x",
943 priv->eeprom_buf[i]);
947 static int imx230_write_eeprom(struct imx230 *priv,
955 for (i = 0; i < IMX230_EEPROM_SIZE; i++) {
956 curr[0] = string[i*2];
957 curr[1] = string[i*2+1];
960 err = kstrtol(curr, 16, &data);
962 dev_err(&priv->i2c_client->dev,
963 "invalid eeprom string\n");
967 priv->eeprom_buf[i] = (u8)data;
968 err = regmap_write(priv->eeprom[i >> 8].regmap,
976 #endif /* if IMX230_EEPROM_PRESENT */
978 static int imx230_read_otp_page(struct imx230 *priv,
979 u8 *buf, int page, u16 addr, int size)
984 err = imx230_write_reg(priv->s_data, IMX230_OTP_PAGE_NUM_ADDR, page);
987 err = imx230_write_reg(priv->s_data, IMX230_OTP_CTRL_ADDR, 0x01);
990 err = imx230_read_reg(priv->s_data, IMX230_OTP_STATUS_ADDR, &status);
993 if (status == IMX230_OTP_STATUS_IN_PROGRESS) {
994 dev_err(&priv->i2c_client->dev,
995 "another OTP read in progress\n");
999 err = regmap_bulk_read(priv->regmap, addr, buf, size);
1003 err = imx230_read_reg(priv->s_data, IMX230_OTP_STATUS_ADDR, &status);
1006 if (status == IMX230_OTP_STATUS_READ_FAIL) {
1007 dev_err(&priv->i2c_client->dev, "fuse id read error\n");
1014 static int imx230_otp_setup(struct imx230 *priv)
1018 struct v4l2_ctrl *ctrl;
1019 u8 otp_buf[IMX230_OTP_SIZE];
1021 err = camera_common_s_power(priv->subdev, true);
1026 for (i = 0; i < IMX230_OTP_NUM_PAGES; i++) {
1027 err = imx230_read_otp_page(priv,
1028 &otp_buf[i * IMX230_OTP_PAGE_SIZE],
1030 IMX230_OTP_PAGE_START_ADDR,
1031 IMX230_OTP_PAGE_SIZE);
1033 dev_err(&priv->i2c_client->dev, "otp read failed\n");
1036 ctrl = v4l2_ctrl_find(&priv->ctrl_handler, V4L2_CID_OTP_DATA);
1038 dev_err(&priv->i2c_client->dev,
1039 "could not find device ctrl.\n");
1043 for (i = 0; i < IMX230_OTP_SIZE; i++)
1044 sprintf(&ctrl->string[i*2], "%02x",
1046 ctrl->cur.string = ctrl->string;
1048 err = camera_common_s_power(priv->subdev, false);
1055 static int imx230_fuse_id_setup(struct imx230 *priv)
1059 struct v4l2_ctrl *ctrl;
1060 u8 fuse_id[IMX230_FUSE_ID_SIZE];
1062 err = camera_common_s_power(priv->subdev, true);
1066 err = imx230_read_otp_page(priv,
1068 IMX230_FUSE_ID_OTP_PAGE,
1069 IMX230_FUSE_ID_OTP_ROW_ADDR,
1070 IMX230_FUSE_ID_SIZE);
1073 dev_err(&priv->i2c_client->dev, "fuse id otp read failed\n");
1075 ctrl = v4l2_ctrl_find(&priv->ctrl_handler, V4L2_CID_FUSE_ID);
1077 dev_err(&priv->i2c_client->dev,
1078 "could not find device ctrl.\n");
1082 for (i = 0; i < IMX230_FUSE_ID_SIZE; i++) {
1083 sprintf(&ctrl->string[i*2], "%02x",
1085 dev_dbg(&priv->i2c_client->dev, "fuse_id[i] %02x\n",
1088 ctrl->cur.string = ctrl->string;
1090 err = camera_common_s_power(priv->subdev, false);
1097 static int imx230_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
1099 struct imx230 *priv =
1100 container_of(ctrl->handler, struct imx230, ctrl_handler);
1103 if (priv->power.state == SWITCH_OFF)
1107 #ifdef IMX230_EEPROM_PRESENT
1108 case V4L2_CID_EEPROM_DATA:
1109 err = imx230_read_eeprom(priv, ctrl);
1113 #endif /* if IMX230_EEPROM_PRESENT */
1115 pr_err("%s: unknown ctrl id.\n", __func__);
1122 static int imx230_s_ctrl(struct v4l2_ctrl *ctrl)
1124 struct imx230 *priv =
1125 container_of(ctrl->handler, struct imx230, ctrl_handler);
1128 if (priv->power.state == SWITCH_OFF)
1133 err = imx230_set_gain(priv, ctrl->val);
1135 case V4L2_CID_FRAME_LENGTH:
1136 err = imx230_set_frame_length(priv, ctrl->val);
1138 case V4L2_CID_COARSE_TIME:
1139 err = imx230_set_coarse_time(priv, ctrl->val);
1141 case V4L2_CID_COARSE_TIME_SHORT:
1142 err = imx230_set_coarse_time_short(priv, ctrl->val);
1144 case V4L2_CID_GROUP_HOLD:
1145 if (switch_ctrl_qmenu[ctrl->val] == SWITCH_ON) {
1146 priv->group_hold_en = true;
1148 priv->group_hold_en = false;
1149 err = imx230_set_group_hold(priv);
1152 #ifdef IMX230_EEPROM_PRESENT
1153 case V4L2_CID_EEPROM_DATA:
1154 pr_debug("%s: eeprom %d\n", __func__, ctrl->id);
1155 if (!ctrl->string[0])
1157 err = imx230_write_eeprom(priv, ctrl->string);
1161 #endif /* if IMX230_EEPROM_PRESENT */
1162 case V4L2_CID_HDR_EN:
1165 pr_err("%s: unknown ctrl id.\n", __func__);
1172 static int imx230_ctrls_init(struct imx230 *priv)
1174 struct i2c_client *client = priv->i2c_client;
1175 struct v4l2_ctrl *ctrl;
1180 dev_dbg(&client->dev, "%s++\n", __func__);
1182 num_ctrls = ARRAY_SIZE(ctrl_config_list);
1183 v4l2_ctrl_handler_init(&priv->ctrl_handler, num_ctrls);
1185 for (i = 0; i < num_ctrls; i++) {
1186 ctrl = v4l2_ctrl_new_custom(&priv->ctrl_handler,
1187 &ctrl_config_list[i], NULL);
1189 dev_err(&client->dev, "Failed to init %s ctrl\n",
1190 ctrl_config_list[i].name);
1194 if (ctrl_config_list[i].type == V4L2_CTRL_TYPE_STRING &&
1195 ctrl_config_list[i].flags & V4L2_CTRL_FLAG_READ_ONLY) {
1196 ctrl->string = devm_kzalloc(&client->dev,
1197 ctrl_config_list[i].max + 1, GFP_KERNEL);
1198 if (!ctrl->string) {
1199 dev_err(&client->dev,
1200 "Failed to allocate otp data\n");
1204 priv->ctrls[i] = ctrl;
1207 priv->num_ctrls = num_ctrls;
1208 priv->subdev->ctrl_handler = &priv->ctrl_handler;
1209 if (priv->ctrl_handler.error) {
1210 dev_err(&client->dev, "Error %d adding controls\n",
1211 priv->ctrl_handler.error);
1212 err = priv->ctrl_handler.error;
1216 err = v4l2_ctrl_handler_setup(&priv->ctrl_handler);
1218 dev_err(&client->dev,
1219 "Error %d setting default controls\n", err);
1223 err = imx230_otp_setup(priv);
1225 dev_err(&client->dev,
1226 "Error %d reading otp data\n", err);
1230 err = imx230_fuse_id_setup(priv);
1232 dev_err(&client->dev,
1233 "Error %d reading fuse id data\n", err);
1240 v4l2_ctrl_handler_free(&priv->ctrl_handler);
1244 MODULE_DEVICE_TABLE(of, imx230_of_match);
1246 static struct camera_common_pdata *imx230_parse_dt(struct i2c_client *client)
1248 struct device_node *np = client->dev.of_node;
1249 struct camera_common_pdata *board_priv_pdata;
1250 const struct of_device_id *match;
1253 match = of_match_device(imx230_of_match, &client->dev);
1255 dev_err(&client->dev, "Failed to find matching dt id\n");
1259 board_priv_pdata = devm_kzalloc(&client->dev,
1260 sizeof(*board_priv_pdata), GFP_KERNEL);
1261 if (!board_priv_pdata) {
1262 dev_err(&client->dev, "Failed to allocate pdata\n");
1266 sts = of_property_read_string(np, "mclk", &board_priv_pdata->mclk_name);
1268 dev_err(&client->dev, "mclk not found %d\n", sts);
1269 sts = of_get_named_gpio(np, "reset-gpios", 0);
1271 board_priv_pdata->reset_gpio = sts;
1272 sts = of_get_named_gpio(np, "pwdn-gpios", 0);
1274 board_priv_pdata->pwdn_gpio = sts;
1276 sts = of_property_read_string(np, "avdd-reg",
1277 &board_priv_pdata->regulators.avdd);
1279 dev_err(&client->dev, "avdd-reg not found %d\n", sts);
1280 sts = of_property_read_string(np, "iovdd-reg",
1281 &board_priv_pdata->regulators.iovdd);
1283 dev_err(&client->dev, "iovdd-reg not found %d\n", sts);
1285 return board_priv_pdata;
1288 static int imx230_probe(struct i2c_client *client,
1289 const struct i2c_device_id *id)
1291 struct camera_common_data *common_data;
1292 struct imx230 *priv;
1293 struct soc_camera_subdev_desc *ssdd = soc_camera_i2c_to_desc(client);
1294 struct tegra_camera_platform_data *imx230_camera_data;
1297 pr_err("[IMX230]: probing v4l2 sensor.\n");
1299 common_data = devm_kzalloc(&client->dev,
1300 sizeof(struct camera_common_data), GFP_KERNEL);
1302 dev_err(&client->dev, "unable to allocate memory!\n");
1306 priv = devm_kzalloc(&client->dev,
1307 sizeof(struct imx230) + sizeof(struct v4l2_ctrl *) *
1308 ARRAY_SIZE(ctrl_config_list),
1311 dev_err(&client->dev, "unable to allocate memory!\n");
1315 priv->regmap = devm_regmap_init_i2c(client, &sensor_regmap_config);
1316 if (IS_ERR(priv->regmap)) {
1317 dev_err(&client->dev,
1318 "regmap init failed: %ld\n", PTR_ERR(priv->regmap));
1322 ssdd = soc_camera_i2c_to_desc(client);
1323 imx230_camera_data = (struct tegra_camera_platform_data *)
1325 if (!imx230_camera_data) {
1326 dev_err(&client->dev, "unable to find platform data\n");
1330 client->dev.of_node = of_find_node_by_name(NULL, "imx230");
1332 if (client->dev.of_node)
1333 priv->pdata = imx230_parse_dt(client);
1335 priv->pdata = ssdd->dev_priv;
1338 dev_err(&client->dev, "unable to get platform data\n");
1342 common_data->ops = &imx230_common_ops;
1343 common_data->ctrl_handler = &priv->ctrl_handler;
1344 common_data->i2c_client = client;
1345 common_data->frmfmt = &imx230_frmfmt[0];
1346 common_data->colorfmt = camera_common_find_datafmt(
1347 IMX230_DEFAULT_DATAFMT);
1348 common_data->ctrls = priv->ctrls;
1349 common_data->power = &priv->power;
1350 common_data->priv = (void *)priv;
1351 common_data->ident = V4L2_IDENT_IMX230;
1352 common_data->numfmts = ARRAY_SIZE(imx230_frmfmt);
1353 common_data->def_mode = IMX230_DEFAULT_MODE;
1354 common_data->def_width = IMX230_DEFAULT_WIDTH;
1355 common_data->def_height = IMX230_DEFAULT_HEIGHT;
1356 common_data->def_clk_freq = IMX230_DEFAULT_CLK_FREQ;
1357 common_data->csi_port = (int)imx230_camera_data->port;
1358 common_data->numlanes = imx230_camera_data->lanes;
1360 priv->i2c_client = client;
1361 priv->s_data = common_data;
1362 priv->subdev = &common_data->subdev;
1364 err = imx230_power_get(priv);
1368 camera_common_create_debugfs(common_data, "imx230");
1370 v4l2_i2c_subdev_init(&common_data->subdev, client, &imx230_subdev_ops);
1372 err = imx230_ctrls_init(priv);
1376 #ifdef IMX230_EEPROM_PRESENT
1377 /* eeprom interface */
1378 err = imx230_eeprom_device_init(priv);
1380 dev_err(&client->dev,
1381 "Failed to allocate eeprom register map: %d\n", err);
1382 #endif /* if IMX230_EEPROM_PRESENT */
1388 imx230_remove(struct i2c_client *client)
1390 struct soc_camera_subdev_desc *ssdd;
1391 struct camera_common_data *s_data = to_camera_common_data(client);
1392 struct imx230 *priv = (struct imx230 *)s_data->priv;
1394 pr_err("[IMX230]: removing v4l2 sensor.\n");
1396 ssdd = soc_camera_i2c_to_desc(client);
1398 ssdd->free_bus(ssdd);
1400 v4l2_ctrl_handler_free(&priv->ctrl_handler);
1401 imx230_power_put(priv);
1402 camera_common_remove_debugfs(s_data);
1407 static const struct i2c_device_id imx230_id[] = {
1408 { "imx230_v4l2", 0 },
1412 MODULE_DEVICE_TABLE(i2c, imx230_id);
1414 static struct i2c_driver imx230_i2c_driver = {
1416 .name = "imx230_v4l2",
1417 .owner = THIS_MODULE,
1419 .probe = imx230_probe,
1420 .remove = imx230_remove,
1421 .id_table = imx230_id,
1424 module_i2c_driver(imx230_i2c_driver);
1426 MODULE_DESCRIPTION("SoC Camera driver for Sony IMX230");
1427 MODULE_AUTHOR("NVIDIA Corporation");
1428 MODULE_LICENSE("GPL v2");