1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#include <asm/unaligned.h>
19
20#include <linux/module.h>
21#include <linux/types.h>
22#include <linux/kernel.h>
23#include <linux/mm.h>
24#include <linux/string.h>
25#include <linux/errno.h>
26#include <linux/init.h>
27#include <linux/kmod.h>
28#include <linux/device.h>
29#include <linux/delay.h>
30#include <linux/slab.h>
31#include <linux/i2c.h>
32#include <linux/moduleparam.h>
33#include <media/v4l2-device.h>
34#include <linux/io.h>
35#include <linux/acpi.h>
36#include "../include/linux/atomisp_gmin_platform.h"
37
38#include "ov2680.h"
39
40static int h_flag;
41static int v_flag;
42static enum atomisp_bayer_order ov2680_bayer_order_mapping[] = {
43 atomisp_bayer_order_bggr,
44 atomisp_bayer_order_grbg,
45 atomisp_bayer_order_gbrg,
46 atomisp_bayer_order_rggb,
47};
48
49
50static int ov2680_read_reg(struct i2c_client *client,
51 int len, u16 reg, u32 *val)
52{
53 struct i2c_msg msgs[2];
54 u8 addr_buf[2] = { reg >> 8, reg & 0xff };
55 u8 data_buf[4] = { 0, };
56 int ret;
57
58 if (len > 4)
59 return -EINVAL;
60
61 msgs[0].addr = client->addr;
62 msgs[0].flags = 0;
63 msgs[0].len = ARRAY_SIZE(addr_buf);
64 msgs[0].buf = addr_buf;
65
66 msgs[1].addr = client->addr;
67 msgs[1].flags = I2C_M_RD;
68 msgs[1].len = len;
69 msgs[1].buf = &data_buf[4 - len];
70
71 ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
72 if (ret != ARRAY_SIZE(msgs)) {
73 dev_err(&client->dev, "read error: reg=0x%4x: %d\n", reg, ret);
74 return -EIO;
75 }
76
77 *val = get_unaligned_be32(data_buf);
78
79 return 0;
80}
81
82static int ov2680_write_reg(struct i2c_client *client, unsigned int len,
83 u16 reg, u16 val)
84{
85 u8 buf[6];
86 int ret;
87
88 if (len == 2)
89 put_unaligned_be16(val, buf + 2);
90 else if (len == 1)
91 buf[2] = val;
92 else
93 return -EINVAL;
94
95 put_unaligned_be16(reg, buf);
96
97 ret = i2c_master_send(client, buf, len + 2);
98 if (ret != len + 2) {
99 dev_err(&client->dev, "write error %d reg 0x%04x, val 0x%02x: buf sent: %*ph\n",
100 ret, reg, val, len + 2, &buf);
101 return -EIO;
102 }
103
104 return 0;
105}
106
107static int ov2680_write_reg_array(struct i2c_client *client,
108 const struct ov2680_reg *reglist)
109{
110 const struct ov2680_reg *next = reglist;
111 int ret;
112
113 for (; next->reg != 0; next++) {
114 ret = ov2680_write_reg(client, 1, next->reg, next->val);
115 if (ret)
116 return ret;
117 }
118
119 return 0;
120}
121
122static int ov2680_g_focal(struct v4l2_subdev *sd, s32 *val)
123{
124 *val = (OV2680_FOCAL_LENGTH_NUM << 16) | OV2680_FOCAL_LENGTH_DEM;
125 return 0;
126}
127
128static int ov2680_g_fnumber(struct v4l2_subdev *sd, s32 *val)
129{
130
131
132 *val = (OV2680_F_NUMBER_DEFAULT_NUM << 16) | OV2680_F_NUMBER_DEM;
133 return 0;
134}
135
136static int ov2680_g_fnumber_range(struct v4l2_subdev *sd, s32 *val)
137{
138 *val = (OV2680_F_NUMBER_DEFAULT_NUM << 24) |
139 (OV2680_F_NUMBER_DEM << 16) |
140 (OV2680_F_NUMBER_DEFAULT_NUM << 8) | OV2680_F_NUMBER_DEM;
141 return 0;
142}
143
144static int ov2680_g_bin_factor_x(struct v4l2_subdev *sd, s32 *val)
145{
146 struct ov2680_device *dev = to_ov2680_sensor(sd);
147 struct i2c_client *client = v4l2_get_subdevdata(sd);
148
149 dev_dbg(&client->dev, "++++ov2680_g_bin_factor_x\n");
150 *val = dev->res->bin_factor_x;
151
152 return 0;
153}
154
155static int ov2680_g_bin_factor_y(struct v4l2_subdev *sd, s32 *val)
156{
157 struct ov2680_device *dev = to_ov2680_sensor(sd);
158 struct i2c_client *client = v4l2_get_subdevdata(sd);
159
160 *val = dev->res->bin_factor_y;
161 dev_dbg(&client->dev, "++++ov2680_g_bin_factor_y\n");
162 return 0;
163}
164
165static int ov2680_get_intg_factor(struct i2c_client *client,
166 struct camera_mipi_info *info,
167 const struct ov2680_resolution *res)
168{
169 struct atomisp_sensor_mode_data *buf = &info->data;
170 unsigned int pix_clk_freq_hz;
171 u32 reg_val;
172 int ret;
173
174 dev_dbg(&client->dev, "++++ov2680_get_intg_factor\n");
175 if (!info)
176 return -EINVAL;
177
178
179 pix_clk_freq_hz = res->pix_clk_freq * 1000000;
180
181 buf->vt_pix_clk_freq_mhz = pix_clk_freq_hz;
182
183
184 buf->coarse_integration_time_min = OV2680_COARSE_INTG_TIME_MIN;
185 buf->coarse_integration_time_max_margin =
186 OV2680_COARSE_INTG_TIME_MAX_MARGIN;
187
188 buf->fine_integration_time_min = OV2680_FINE_INTG_TIME_MIN;
189 buf->fine_integration_time_max_margin =
190 OV2680_FINE_INTG_TIME_MAX_MARGIN;
191
192 buf->fine_integration_time_def = OV2680_FINE_INTG_TIME_MIN;
193 buf->frame_length_lines = res->lines_per_frame;
194 buf->line_length_pck = res->pixels_per_line;
195 buf->read_mode = res->bin_mode;
196
197
198 ret = ov2680_read_reg(client, 2,
199 OV2680_HORIZONTAL_START_H, ®_val);
200 if (ret)
201 return ret;
202 buf->crop_horizontal_start = reg_val;
203
204 ret = ov2680_read_reg(client, 2,
205 OV2680_VERTICAL_START_H, ®_val);
206 if (ret)
207 return ret;
208 buf->crop_vertical_start = reg_val;
209
210 ret = ov2680_read_reg(client, 2,
211 OV2680_HORIZONTAL_END_H, ®_val);
212 if (ret)
213 return ret;
214 buf->crop_horizontal_end = reg_val;
215
216 ret = ov2680_read_reg(client, 2,
217 OV2680_VERTICAL_END_H, ®_val);
218 if (ret)
219 return ret;
220 buf->crop_vertical_end = reg_val;
221
222 ret = ov2680_read_reg(client, 2,
223 OV2680_HORIZONTAL_OUTPUT_SIZE_H, ®_val);
224 if (ret)
225 return ret;
226 buf->output_width = reg_val;
227
228 ret = ov2680_read_reg(client, 2,
229 OV2680_VERTICAL_OUTPUT_SIZE_H, ®_val);
230 if (ret)
231 return ret;
232 buf->output_height = reg_val;
233
234 buf->binning_factor_x = res->bin_factor_x ?
235 (res->bin_factor_x * 2) : 1;
236 buf->binning_factor_y = res->bin_factor_y ?
237 (res->bin_factor_y * 2) : 1;
238 return 0;
239}
240
241static long __ov2680_set_exposure(struct v4l2_subdev *sd, int coarse_itg,
242 int gain, int digitgain)
243
244{
245 struct i2c_client *client = v4l2_get_subdevdata(sd);
246 struct ov2680_device *dev = to_ov2680_sensor(sd);
247 u16 vts;
248 int ret, exp_val;
249
250 dev_dbg(&client->dev,
251 "+++++++__ov2680_set_exposure coarse_itg %d, gain %d, digitgain %d++\n",
252 coarse_itg, gain, digitgain);
253
254 vts = dev->res->lines_per_frame;
255
256
257 ret = ov2680_write_reg(client, 1,
258 OV2680_GROUP_ACCESS, 0x00);
259 if (ret) {
260 dev_err(&client->dev, "%s: write 0x%02x: error, aborted\n",
261 __func__, OV2680_GROUP_ACCESS);
262 return ret;
263 }
264
265
266 if (coarse_itg > vts - OV2680_INTEGRATION_TIME_MARGIN)
267 vts = (u16)coarse_itg + OV2680_INTEGRATION_TIME_MARGIN;
268
269 ret = ov2680_write_reg(client, 2, OV2680_TIMING_VTS_H, vts);
270 if (ret) {
271 dev_err(&client->dev, "%s: write 0x%02x: error, aborted\n",
272 __func__, OV2680_TIMING_VTS_H);
273 return ret;
274 }
275
276
277
278
279 exp_val = coarse_itg << 4;
280 ret = ov2680_write_reg(client, 1,
281 OV2680_EXPOSURE_L, exp_val & 0xFF);
282 if (ret) {
283 dev_err(&client->dev, "%s: write 0x%02x: error, aborted\n",
284 __func__, OV2680_EXPOSURE_L);
285 return ret;
286 }
287
288 ret = ov2680_write_reg(client, 1,
289 OV2680_EXPOSURE_M, (exp_val >> 8) & 0xFF);
290 if (ret) {
291 dev_err(&client->dev, "%s: write 0x%02x: error, aborted\n",
292 __func__, OV2680_EXPOSURE_M);
293 return ret;
294 }
295
296 ret = ov2680_write_reg(client, 1,
297 OV2680_EXPOSURE_H, (exp_val >> 16) & 0x0F);
298 if (ret) {
299 dev_err(&client->dev, "%s: write 0x%02x: error, aborted\n",
300 __func__, OV2680_EXPOSURE_H);
301 return ret;
302 }
303
304
305 ret = ov2680_write_reg(client, 2, OV2680_AGC_H, gain);
306 if (ret) {
307 dev_err(&client->dev, "%s: write 0x%02x: error, aborted\n",
308 __func__, OV2680_AGC_H);
309 return ret;
310 }
311
312 if (digitgain) {
313 ret = ov2680_write_reg(client, 2,
314 OV2680_MWB_RED_GAIN_H, digitgain);
315 if (ret) {
316 dev_err(&client->dev,
317 "%s: write 0x%02x: error, aborted\n",
318 __func__, OV2680_MWB_RED_GAIN_H);
319 return ret;
320 }
321
322 ret = ov2680_write_reg(client, 2,
323 OV2680_MWB_GREEN_GAIN_H, digitgain);
324 if (ret) {
325 dev_err(&client->dev,
326 "%s: write 0x%02x: error, aborted\n",
327 __func__, OV2680_MWB_RED_GAIN_H);
328 return ret;
329 }
330
331 ret = ov2680_write_reg(client, 2,
332 OV2680_MWB_BLUE_GAIN_H, digitgain);
333 if (ret) {
334 dev_err(&client->dev,
335 "%s: write 0x%02x: error, aborted\n",
336 __func__, OV2680_MWB_RED_GAIN_H);
337 return ret;
338 }
339 }
340
341
342 ret = ov2680_write_reg(client, 1,
343 OV2680_GROUP_ACCESS, 0x10);
344 if (ret)
345 return ret;
346
347
348 ret = ov2680_write_reg(client, 1,
349 OV2680_GROUP_ACCESS, 0xa0);
350 if (ret)
351 return ret;
352 return ret;
353}
354
355static int ov2680_set_exposure(struct v4l2_subdev *sd, int exposure,
356 int gain, int digitgain)
357{
358 struct ov2680_device *dev = to_ov2680_sensor(sd);
359 int ret = 0;
360
361 mutex_lock(&dev->input_lock);
362
363 dev->exposure = exposure;
364 dev->gain = gain;
365 dev->digitgain = digitgain;
366
367 if (dev->power_on)
368 ret = __ov2680_set_exposure(sd, exposure, gain, digitgain);
369
370 mutex_unlock(&dev->input_lock);
371
372 return ret;
373}
374
375static long ov2680_s_exposure(struct v4l2_subdev *sd,
376 struct atomisp_exposure *exposure)
377{
378 u16 coarse_itg = exposure->integration_time[0];
379 u16 analog_gain = exposure->gain[0];
380 u16 digital_gain = exposure->gain[1];
381
382
383 if (analog_gain == 0) {
384 struct i2c_client *client = v4l2_get_subdevdata(sd);
385
386 v4l2_err(client, "%s: invalid value\n", __func__);
387 return -EINVAL;
388 }
389
390 return ov2680_set_exposure(sd, coarse_itg, analog_gain, digital_gain);
391}
392
393static long ov2680_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
394{
395 switch (cmd) {
396 case ATOMISP_IOC_S_EXPOSURE:
397 return ov2680_s_exposure(sd, arg);
398
399 default:
400 return -EINVAL;
401 }
402 return 0;
403}
404
405
406
407
408
409static int ov2680_q_exposure(struct v4l2_subdev *sd, s32 *value)
410{
411 struct i2c_client *client = v4l2_get_subdevdata(sd);
412 u32 reg_val;
413 int ret;
414
415
416 ret = ov2680_read_reg(client, 3, OV2680_EXPOSURE_H, ®_val);
417 if (ret)
418 return ret;
419
420
421 *value = reg_val >> 4;
422 return 0;
423}
424
425static int ov2680_v_flip(struct v4l2_subdev *sd, s32 value)
426{
427 struct camera_mipi_info *ov2680_info = NULL;
428 struct i2c_client *client = v4l2_get_subdevdata(sd);
429 int ret;
430 u32 val;
431 u8 index;
432
433 dev_dbg(&client->dev, "@%s: value:%d\n", __func__, value);
434 ret = ov2680_read_reg(client, 1, OV2680_FLIP_REG, &val);
435 if (ret)
436 return ret;
437 if (value)
438 val |= OV2680_FLIP_MIRROR_BIT_ENABLE;
439 else
440 val &= ~OV2680_FLIP_MIRROR_BIT_ENABLE;
441
442 ret = ov2680_write_reg(client, 1,
443 OV2680_FLIP_REG, val);
444 if (ret)
445 return ret;
446 index = (v_flag > 0 ? OV2680_FLIP_BIT : 0) | (h_flag > 0 ? OV2680_MIRROR_BIT :
447 0);
448 ov2680_info = v4l2_get_subdev_hostdata(sd);
449 if (ov2680_info) {
450 ov2680_info->raw_bayer_order = ov2680_bayer_order_mapping[index];
451 }
452 return ret;
453}
454
455static int ov2680_h_flip(struct v4l2_subdev *sd, s32 value)
456{
457 struct camera_mipi_info *ov2680_info = NULL;
458 struct i2c_client *client = v4l2_get_subdevdata(sd);
459 int ret;
460 u32 val;
461 u8 index;
462
463 dev_dbg(&client->dev, "@%s: value:%d\n", __func__, value);
464
465 ret = ov2680_read_reg(client, 1, OV2680_MIRROR_REG, &val);
466 if (ret)
467 return ret;
468 if (value)
469 val |= OV2680_FLIP_MIRROR_BIT_ENABLE;
470 else
471 val &= ~OV2680_FLIP_MIRROR_BIT_ENABLE;
472
473 ret = ov2680_write_reg(client, 1,
474 OV2680_MIRROR_REG, val);
475 if (ret)
476 return ret;
477 index = (v_flag > 0 ? OV2680_FLIP_BIT : 0) | (h_flag > 0 ? OV2680_MIRROR_BIT :
478 0);
479 ov2680_info = v4l2_get_subdev_hostdata(sd);
480 if (ov2680_info) {
481 ov2680_info->raw_bayer_order = ov2680_bayer_order_mapping[index];
482 }
483 return ret;
484}
485
486static int ov2680_s_ctrl(struct v4l2_ctrl *ctrl)
487{
488 struct ov2680_device *dev =
489 container_of(ctrl->handler, struct ov2680_device, ctrl_handler);
490 struct i2c_client *client = v4l2_get_subdevdata(&dev->sd);
491 int ret = 0;
492
493 switch (ctrl->id) {
494 case V4L2_CID_VFLIP:
495 dev_dbg(&client->dev, "%s: CID_VFLIP:%d.\n",
496 __func__, ctrl->val);
497 ret = ov2680_v_flip(&dev->sd, ctrl->val);
498 break;
499 case V4L2_CID_HFLIP:
500 dev_dbg(&client->dev, "%s: CID_HFLIP:%d.\n",
501 __func__, ctrl->val);
502 ret = ov2680_h_flip(&dev->sd, ctrl->val);
503 break;
504 default:
505 ret = -EINVAL;
506 }
507 return ret;
508}
509
510static int ov2680_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
511{
512 struct ov2680_device *dev =
513 container_of(ctrl->handler, struct ov2680_device, ctrl_handler);
514 int ret = 0;
515
516 switch (ctrl->id) {
517 case V4L2_CID_EXPOSURE_ABSOLUTE:
518 ret = ov2680_q_exposure(&dev->sd, &ctrl->val);
519 break;
520 case V4L2_CID_FOCAL_ABSOLUTE:
521 ret = ov2680_g_focal(&dev->sd, &ctrl->val);
522 break;
523 case V4L2_CID_FNUMBER_ABSOLUTE:
524 ret = ov2680_g_fnumber(&dev->sd, &ctrl->val);
525 break;
526 case V4L2_CID_FNUMBER_RANGE:
527 ret = ov2680_g_fnumber_range(&dev->sd, &ctrl->val);
528 break;
529 case V4L2_CID_BIN_FACTOR_HORZ:
530 ret = ov2680_g_bin_factor_x(&dev->sd, &ctrl->val);
531 break;
532 case V4L2_CID_BIN_FACTOR_VERT:
533 ret = ov2680_g_bin_factor_y(&dev->sd, &ctrl->val);
534 break;
535 default:
536 ret = -EINVAL;
537 }
538
539 return ret;
540}
541
542static const struct v4l2_ctrl_ops ctrl_ops = {
543 .s_ctrl = ov2680_s_ctrl,
544 .g_volatile_ctrl = ov2680_g_volatile_ctrl
545};
546
547static const struct v4l2_ctrl_config ov2680_controls[] = {
548 {
549 .ops = &ctrl_ops,
550 .id = V4L2_CID_EXPOSURE_ABSOLUTE,
551 .type = V4L2_CTRL_TYPE_INTEGER,
552 .name = "exposure",
553 .min = 0x0,
554 .max = 0xffff,
555 .step = 0x01,
556 .def = 0x00,
557 .flags = 0,
558 },
559 {
560 .ops = &ctrl_ops,
561 .id = V4L2_CID_FOCAL_ABSOLUTE,
562 .type = V4L2_CTRL_TYPE_INTEGER,
563 .name = "focal length",
564 .min = OV2680_FOCAL_LENGTH_DEFAULT,
565 .max = OV2680_FOCAL_LENGTH_DEFAULT,
566 .step = 0x01,
567 .def = OV2680_FOCAL_LENGTH_DEFAULT,
568 .flags = 0,
569 },
570 {
571 .ops = &ctrl_ops,
572 .id = V4L2_CID_FNUMBER_ABSOLUTE,
573 .type = V4L2_CTRL_TYPE_INTEGER,
574 .name = "f-number",
575 .min = OV2680_F_NUMBER_DEFAULT,
576 .max = OV2680_F_NUMBER_DEFAULT,
577 .step = 0x01,
578 .def = OV2680_F_NUMBER_DEFAULT,
579 .flags = 0,
580 },
581 {
582 .ops = &ctrl_ops,
583 .id = V4L2_CID_FNUMBER_RANGE,
584 .type = V4L2_CTRL_TYPE_INTEGER,
585 .name = "f-number range",
586 .min = OV2680_F_NUMBER_RANGE,
587 .max = OV2680_F_NUMBER_RANGE,
588 .step = 0x01,
589 .def = OV2680_F_NUMBER_RANGE,
590 .flags = 0,
591 },
592 {
593 .ops = &ctrl_ops,
594 .id = V4L2_CID_BIN_FACTOR_HORZ,
595 .type = V4L2_CTRL_TYPE_INTEGER,
596 .name = "horizontal binning factor",
597 .min = 0,
598 .max = OV2680_BIN_FACTOR_MAX,
599 .step = 1,
600 .def = 0,
601 .flags = 0,
602 },
603 {
604 .ops = &ctrl_ops,
605 .id = V4L2_CID_BIN_FACTOR_VERT,
606 .type = V4L2_CTRL_TYPE_INTEGER,
607 .name = "vertical binning factor",
608 .min = 0,
609 .max = OV2680_BIN_FACTOR_MAX,
610 .step = 1,
611 .def = 0,
612 .flags = 0,
613 },
614 {
615 .ops = &ctrl_ops,
616 .id = V4L2_CID_VFLIP,
617 .type = V4L2_CTRL_TYPE_BOOLEAN,
618 .name = "Flip",
619 .min = 0,
620 .max = 1,
621 .step = 1,
622 .def = 0,
623 },
624 {
625 .ops = &ctrl_ops,
626 .id = V4L2_CID_HFLIP,
627 .type = V4L2_CTRL_TYPE_BOOLEAN,
628 .name = "Mirror",
629 .min = 0,
630 .max = 1,
631 .step = 1,
632 .def = 0,
633 },
634};
635
636static int ov2680_init_registers(struct v4l2_subdev *sd)
637{
638 struct i2c_client *client = v4l2_get_subdevdata(sd);
639 int ret;
640
641 ret = ov2680_write_reg(client, 1, OV2680_SW_RESET, 0x01);
642 ret |= ov2680_write_reg_array(client, ov2680_global_setting);
643
644 return ret;
645}
646
647static int power_ctrl(struct v4l2_subdev *sd, bool flag)
648{
649 int ret = 0;
650 struct ov2680_device *dev = to_ov2680_sensor(sd);
651 struct i2c_client *client = v4l2_get_subdevdata(sd);
652
653 if (!dev || !dev->platform_data)
654 return -ENODEV;
655
656 dev_dbg(&client->dev, "%s: %s", __func__, flag ? "on" : "off");
657
658 if (flag) {
659 ret |= dev->platform_data->v1p8_ctrl(sd, 1);
660 ret |= dev->platform_data->v2p8_ctrl(sd, 1);
661 usleep_range(10000, 15000);
662 }
663
664 if (!flag || ret) {
665 ret |= dev->platform_data->v1p8_ctrl(sd, 0);
666 ret |= dev->platform_data->v2p8_ctrl(sd, 0);
667 }
668 return ret;
669}
670
671static int gpio_ctrl(struct v4l2_subdev *sd, bool flag)
672{
673 int ret;
674 struct ov2680_device *dev = to_ov2680_sensor(sd);
675
676 if (!dev || !dev->platform_data)
677 return -ENODEV;
678
679
680
681
682
683
684
685
686 if (flag) {
687 ret = dev->platform_data->gpio0_ctrl(sd, 1);
688 usleep_range(10000, 15000);
689
690 dev->platform_data->gpio1_ctrl(sd, 1);
691 usleep_range(10000, 15000);
692 } else {
693 dev->platform_data->gpio1_ctrl(sd, 0);
694 ret = dev->platform_data->gpio0_ctrl(sd, 0);
695 }
696 return ret;
697}
698
699static int power_up(struct v4l2_subdev *sd)
700{
701 struct ov2680_device *dev = to_ov2680_sensor(sd);
702 struct i2c_client *client = v4l2_get_subdevdata(sd);
703 int ret;
704
705 if (!dev->platform_data) {
706 dev_err(&client->dev,
707 "no camera_sensor_platform_data");
708 return -ENODEV;
709 }
710
711 if (dev->power_on)
712 return 0;
713
714
715 ret = power_ctrl(sd, 1);
716 if (ret)
717 goto fail_power;
718
719
720 usleep_range(5000, 6000);
721
722
723 ret = gpio_ctrl(sd, 1);
724 if (ret) {
725 ret = gpio_ctrl(sd, 1);
726 if (ret)
727 goto fail_power;
728 }
729
730
731 ret = dev->platform_data->flisclk_ctrl(sd, 1);
732 if (ret)
733 goto fail_clk;
734
735
736 msleep(20);
737
738 ret = ov2680_init_registers(sd);
739 if (ret)
740 goto fail_init_registers;
741
742 ret = __ov2680_set_exposure(sd, dev->exposure, dev->gain, dev->digitgain);
743 if (ret)
744 goto fail_init_registers;
745
746 dev->power_on = true;
747 return 0;
748
749fail_init_registers:
750 dev->platform_data->flisclk_ctrl(sd, 0);
751fail_clk:
752 gpio_ctrl(sd, 0);
753fail_power:
754 power_ctrl(sd, 0);
755 dev_err(&client->dev, "sensor power-up failed\n");
756
757 return ret;
758}
759
760static int power_down(struct v4l2_subdev *sd)
761{
762 struct ov2680_device *dev = to_ov2680_sensor(sd);
763 struct i2c_client *client = v4l2_get_subdevdata(sd);
764 int ret = 0;
765
766 h_flag = 0;
767 v_flag = 0;
768 if (!dev->platform_data) {
769 dev_err(&client->dev,
770 "no camera_sensor_platform_data");
771 return -ENODEV;
772 }
773
774 if (!dev->power_on)
775 return 0;
776
777 ret = dev->platform_data->flisclk_ctrl(sd, 0);
778 if (ret)
779 dev_err(&client->dev, "flisclk failed\n");
780
781
782 ret = gpio_ctrl(sd, 0);
783 if (ret) {
784 ret = gpio_ctrl(sd, 0);
785 if (ret)
786 dev_err(&client->dev, "gpio failed 2\n");
787 }
788
789
790 ret = power_ctrl(sd, 0);
791 if (ret) {
792 dev_err(&client->dev, "vprog failed.\n");
793 return ret;
794 }
795
796 dev->power_on = false;
797 return 0;
798}
799
800static int ov2680_s_power(struct v4l2_subdev *sd, int on)
801{
802 struct ov2680_device *dev = to_ov2680_sensor(sd);
803 int ret;
804
805 mutex_lock(&dev->input_lock);
806
807 if (on == 0) {
808 ret = power_down(sd);
809 } else {
810 ret = power_up(sd);
811 }
812
813 mutex_unlock(&dev->input_lock);
814
815 return ret;
816}
817
818static int ov2680_set_fmt(struct v4l2_subdev *sd,
819 struct v4l2_subdev_state *sd_state,
820 struct v4l2_subdev_format *format)
821{
822 struct v4l2_mbus_framefmt *fmt = &format->format;
823 struct ov2680_device *dev = to_ov2680_sensor(sd);
824 struct i2c_client *client = v4l2_get_subdevdata(sd);
825 struct camera_mipi_info *ov2680_info = NULL;
826 struct ov2680_resolution *res;
827 int vts, ret = 0;
828
829 dev_dbg(&client->dev, "%s: %s: pad: %d, fmt: %p\n",
830 __func__,
831 (format->which == V4L2_SUBDEV_FORMAT_TRY) ? "try" : "set",
832 format->pad, fmt);
833
834 if (format->pad)
835 return -EINVAL;
836
837 if (!fmt)
838 return -EINVAL;
839
840 ov2680_info = v4l2_get_subdev_hostdata(sd);
841 if (!ov2680_info)
842 return -EINVAL;
843
844 mutex_lock(&dev->input_lock);
845
846 res = v4l2_find_nearest_size(ov2680_res_preview,
847 ARRAY_SIZE(ov2680_res_preview), width,
848 height, fmt->width, fmt->height);
849 if (!res)
850 res = &ov2680_res_preview[N_RES_PREVIEW - 1];
851
852 fmt->width = res->width;
853 fmt->height = res->height;
854
855 fmt->code = MEDIA_BUS_FMT_SBGGR10_1X10;
856 if (format->which == V4L2_SUBDEV_FORMAT_TRY) {
857 sd_state->pads->try_fmt = *fmt;
858 mutex_unlock(&dev->input_lock);
859 return 0;
860 }
861
862 dev_dbg(&client->dev, "%s: %dx%d\n",
863 __func__, fmt->width, fmt->height);
864
865
866 power_up(sd);
867 ret = ov2680_write_reg_array(client, dev->res->regs);
868 if (ret)
869 dev_err(&client->dev,
870 "ov2680 write resolution register err: %d\n", ret);
871
872 vts = dev->res->lines_per_frame;
873
874
875 if (dev->exposure > vts - OV2680_INTEGRATION_TIME_MARGIN)
876 vts = dev->exposure + OV2680_INTEGRATION_TIME_MARGIN;
877
878 ret = ov2680_write_reg(client, 2, OV2680_TIMING_VTS_H, vts);
879 if (ret)
880 dev_err(&client->dev, "ov2680 write vts err: %d\n", ret);
881
882 ret = ov2680_get_intg_factor(client, ov2680_info, res);
883 if (ret) {
884 dev_err(&client->dev, "failed to get integration factor\n");
885 goto err;
886 }
887
888
889
890
891
892 if (h_flag)
893 ov2680_h_flip(sd, h_flag);
894 if (v_flag)
895 ov2680_v_flip(sd, v_flag);
896
897
898
899
900
901
902err:
903 mutex_unlock(&dev->input_lock);
904 return ret;
905}
906
907static int ov2680_get_fmt(struct v4l2_subdev *sd,
908 struct v4l2_subdev_state *sd_state,
909 struct v4l2_subdev_format *format)
910{
911 struct v4l2_mbus_framefmt *fmt = &format->format;
912 struct ov2680_device *dev = to_ov2680_sensor(sd);
913
914 if (format->pad)
915 return -EINVAL;
916
917 if (!fmt)
918 return -EINVAL;
919
920 fmt->width = dev->res->width;
921 fmt->height = dev->res->height;
922 fmt->code = MEDIA_BUS_FMT_SBGGR10_1X10;
923
924 return 0;
925}
926
927static int ov2680_detect(struct i2c_client *client)
928{
929 struct i2c_adapter *adapter = client->adapter;
930 u32 high, low;
931 int ret;
932 u16 id;
933 u8 revision;
934
935 if (!i2c_check_functionality(adapter, I2C_FUNC_I2C))
936 return -ENODEV;
937
938 ret = ov2680_read_reg(client, 1,
939 OV2680_SC_CMMN_CHIP_ID_H, &high);
940 if (ret) {
941 dev_err(&client->dev, "sensor_id_high = 0x%x\n", high);
942 return -ENODEV;
943 }
944 ret = ov2680_read_reg(client, 1,
945 OV2680_SC_CMMN_CHIP_ID_L, &low);
946 id = ((((u16)high) << 8) | (u16)low);
947
948 if (id != OV2680_ID) {
949 dev_err(&client->dev, "sensor ID error 0x%x\n", id);
950 return -ENODEV;
951 }
952
953 ret = ov2680_read_reg(client, 1,
954 OV2680_SC_CMMN_SUB_ID, &high);
955 revision = (u8)high & 0x0f;
956
957 dev_info(&client->dev, "sensor_revision id = 0x%x, rev= %d\n",
958 id, revision);
959
960 return 0;
961}
962
963static int ov2680_s_stream(struct v4l2_subdev *sd, int enable)
964{
965 struct ov2680_device *dev = to_ov2680_sensor(sd);
966 struct i2c_client *client = v4l2_get_subdevdata(sd);
967 int ret;
968
969 mutex_lock(&dev->input_lock);
970 if (enable)
971 dev_dbg(&client->dev, "ov2680_s_stream one\n");
972 else
973 dev_dbg(&client->dev, "ov2680_s_stream off\n");
974
975 ret = ov2680_write_reg(client, 1, OV2680_SW_STREAM,
976 enable ? OV2680_START_STREAMING :
977 OV2680_STOP_STREAMING);
978
979
980
981
982
983 mutex_unlock(&dev->input_lock);
984
985 return ret;
986}
987
988static int ov2680_s_config(struct v4l2_subdev *sd,
989 int irq, void *platform_data)
990{
991 struct ov2680_device *dev = to_ov2680_sensor(sd);
992 struct i2c_client *client = v4l2_get_subdevdata(sd);
993 int ret = 0;
994
995 if (!platform_data)
996 return -ENODEV;
997
998 dev->platform_data =
999 (struct camera_sensor_platform_data *)platform_data;
1000
1001 mutex_lock(&dev->input_lock);
1002
1003 ret = power_up(sd);
1004 if (ret) {
1005 dev_err(&client->dev, "ov2680 power-up err.\n");
1006 goto fail_power_on;
1007 }
1008
1009 ret = dev->platform_data->csi_cfg(sd, 1);
1010 if (ret)
1011 goto fail_csi_cfg;
1012
1013
1014 ret = ov2680_detect(client);
1015 if (ret) {
1016 dev_err(&client->dev, "ov2680_detect err s_config.\n");
1017 goto fail_csi_cfg;
1018 }
1019
1020
1021 ret = power_down(sd);
1022 if (ret) {
1023 dev_err(&client->dev, "ov2680 power-off err.\n");
1024 goto fail_csi_cfg;
1025 }
1026 mutex_unlock(&dev->input_lock);
1027
1028 return 0;
1029
1030fail_csi_cfg:
1031 dev->platform_data->csi_cfg(sd, 0);
1032fail_power_on:
1033 power_down(sd);
1034 dev_err(&client->dev, "sensor power-gating failed\n");
1035 mutex_unlock(&dev->input_lock);
1036 return ret;
1037}
1038
1039static int ov2680_g_frame_interval(struct v4l2_subdev *sd,
1040 struct v4l2_subdev_frame_interval *interval)
1041{
1042 struct ov2680_device *dev = to_ov2680_sensor(sd);
1043
1044 interval->interval.numerator = 1;
1045 interval->interval.denominator = dev->res->fps;
1046
1047 return 0;
1048}
1049
1050static int ov2680_enum_mbus_code(struct v4l2_subdev *sd,
1051 struct v4l2_subdev_state *sd_state,
1052 struct v4l2_subdev_mbus_code_enum *code)
1053{
1054 if (code->index >= MAX_FMTS)
1055 return -EINVAL;
1056
1057 code->code = MEDIA_BUS_FMT_SBGGR10_1X10;
1058 return 0;
1059}
1060
1061static int ov2680_enum_frame_size(struct v4l2_subdev *sd,
1062 struct v4l2_subdev_state *sd_state,
1063 struct v4l2_subdev_frame_size_enum *fse)
1064{
1065 int index = fse->index;
1066
1067 if (index >= N_RES_PREVIEW)
1068 return -EINVAL;
1069
1070 fse->min_width = ov2680_res_preview[index].width;
1071 fse->min_height = ov2680_res_preview[index].height;
1072 fse->max_width = ov2680_res_preview[index].width;
1073 fse->max_height = ov2680_res_preview[index].height;
1074
1075 return 0;
1076}
1077
1078static int ov2680_enum_frame_interval(struct v4l2_subdev *sd,
1079 struct v4l2_subdev_state *sd_state,
1080 struct v4l2_subdev_frame_interval_enum *fie)
1081{
1082 struct v4l2_fract fract;
1083
1084 if (fie->index >= N_RES_PREVIEW ||
1085 fie->width > ov2680_res_preview[0].width ||
1086 fie->height > ov2680_res_preview[0].height ||
1087 fie->which > V4L2_SUBDEV_FORMAT_ACTIVE)
1088 return -EINVAL;
1089
1090 fract.denominator = ov2680_res_preview[fie->index].fps;
1091 fract.numerator = 1;
1092
1093 fie->interval = fract;
1094
1095 return 0;
1096}
1097
1098static int ov2680_g_skip_frames(struct v4l2_subdev *sd, u32 *frames)
1099{
1100 struct ov2680_device *dev = to_ov2680_sensor(sd);
1101
1102 mutex_lock(&dev->input_lock);
1103 *frames = dev->res->skip_frames;
1104 mutex_unlock(&dev->input_lock);
1105
1106 return 0;
1107}
1108
1109static const struct v4l2_subdev_video_ops ov2680_video_ops = {
1110 .s_stream = ov2680_s_stream,
1111 .g_frame_interval = ov2680_g_frame_interval,
1112};
1113
1114static const struct v4l2_subdev_sensor_ops ov2680_sensor_ops = {
1115 .g_skip_frames = ov2680_g_skip_frames,
1116};
1117
1118static const struct v4l2_subdev_core_ops ov2680_core_ops = {
1119 .s_power = ov2680_s_power,
1120 .ioctl = ov2680_ioctl,
1121};
1122
1123static const struct v4l2_subdev_pad_ops ov2680_pad_ops = {
1124 .enum_mbus_code = ov2680_enum_mbus_code,
1125 .enum_frame_size = ov2680_enum_frame_size,
1126 .enum_frame_interval = ov2680_enum_frame_interval,
1127 .get_fmt = ov2680_get_fmt,
1128 .set_fmt = ov2680_set_fmt,
1129};
1130
1131static const struct v4l2_subdev_ops ov2680_ops = {
1132 .core = &ov2680_core_ops,
1133 .video = &ov2680_video_ops,
1134 .pad = &ov2680_pad_ops,
1135 .sensor = &ov2680_sensor_ops,
1136};
1137
1138static int ov2680_remove(struct i2c_client *client)
1139{
1140 struct v4l2_subdev *sd = i2c_get_clientdata(client);
1141 struct ov2680_device *dev = to_ov2680_sensor(sd);
1142
1143 dev_dbg(&client->dev, "ov2680_remove...\n");
1144
1145 dev->platform_data->csi_cfg(sd, 0);
1146
1147 v4l2_device_unregister_subdev(sd);
1148 media_entity_cleanup(&dev->sd.entity);
1149 v4l2_ctrl_handler_free(&dev->ctrl_handler);
1150 kfree(dev);
1151
1152 return 0;
1153}
1154
1155static int ov2680_probe(struct i2c_client *client)
1156{
1157 struct ov2680_device *dev;
1158 int ret;
1159 void *pdata;
1160 unsigned int i;
1161
1162 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1163 if (!dev)
1164 return -ENOMEM;
1165
1166 mutex_init(&dev->input_lock);
1167
1168 dev->res = &ov2680_res_preview[0];
1169 dev->exposure = dev->res->lines_per_frame - OV2680_INTEGRATION_TIME_MARGIN;
1170 dev->gain = 250;
1171 v4l2_i2c_subdev_init(&dev->sd, client, &ov2680_ops);
1172
1173 pdata = gmin_camera_platform_data(&dev->sd,
1174 ATOMISP_INPUT_FORMAT_RAW_10,
1175 atomisp_bayer_order_bggr);
1176 if (!pdata) {
1177 ret = -EINVAL;
1178 goto out_free;
1179 }
1180
1181 ret = ov2680_s_config(&dev->sd, client->irq, pdata);
1182 if (ret)
1183 goto out_free;
1184
1185 ret = atomisp_register_i2c_module(&dev->sd, pdata, RAW_CAMERA);
1186 if (ret)
1187 goto out_free;
1188
1189 dev->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
1190 dev->pad.flags = MEDIA_PAD_FL_SOURCE;
1191 dev->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
1192 ret =
1193 v4l2_ctrl_handler_init(&dev->ctrl_handler,
1194 ARRAY_SIZE(ov2680_controls));
1195 if (ret) {
1196 ov2680_remove(client);
1197 return ret;
1198 }
1199
1200 for (i = 0; i < ARRAY_SIZE(ov2680_controls); i++)
1201 v4l2_ctrl_new_custom(&dev->ctrl_handler, &ov2680_controls[i],
1202 NULL);
1203
1204 if (dev->ctrl_handler.error) {
1205 ov2680_remove(client);
1206 return dev->ctrl_handler.error;
1207 }
1208
1209
1210 dev->ctrl_handler.lock = &dev->input_lock;
1211 dev->sd.ctrl_handler = &dev->ctrl_handler;
1212
1213 ret = media_entity_pads_init(&dev->sd.entity, 1, &dev->pad);
1214 if (ret) {
1215 ov2680_remove(client);
1216 dev_dbg(&client->dev, "+++ remove ov2680\n");
1217 }
1218 return ret;
1219out_free:
1220 dev_dbg(&client->dev, "+++ out free\n");
1221 v4l2_device_unregister_subdev(&dev->sd);
1222 kfree(dev);
1223 return ret;
1224}
1225
1226static const struct acpi_device_id ov2680_acpi_match[] = {
1227 {"XXOV2680"},
1228 {"OVTI2680"},
1229 {},
1230};
1231MODULE_DEVICE_TABLE(acpi, ov2680_acpi_match);
1232
1233static struct i2c_driver ov2680_driver = {
1234 .driver = {
1235 .name = "ov2680",
1236 .acpi_match_table = ov2680_acpi_match,
1237 },
1238 .probe_new = ov2680_probe,
1239 .remove = ov2680_remove,
1240};
1241module_i2c_driver(ov2680_driver);
1242
1243MODULE_AUTHOR("Jacky Wang <Jacky_wang@ovt.com>");
1244MODULE_DESCRIPTION("A low-level driver for OmniVision 2680 sensors");
1245MODULE_LICENSE("GPL");
1246