2 * Samsung Exynos5 SoC series Sensor driver
5 * Copyright (c) 2016 Samsung Electronics Co., Ltd
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
12 #include <linux/i2c.h>
13 #include <linux/slab.h>
14 #include <linux/irq.h>
15 #include <linux/interrupt.h>
16 #include <linux/delay.h>
17 #include <linux/version.h>
18 #include <linux/gpio.h>
19 #include <linux/clk.h>
20 #include <linux/regulator/consumer.h>
21 #include <linux/videodev2.h>
22 #include <linux/videodev2_exynos_camera.h>
23 #include <linux/module.h>
24 #include <linux/moduleparam.h>
25 #include <linux/platform_device.h>
26 #include <linux/of_gpio.h>
27 #include <media/v4l2-ctrls.h>
28 #include <media/v4l2-device.h>
29 #include <media/v4l2-subdev.h>
31 #include <exynos-fimc-is-sensor.h>
32 #include "fimc-is-hw.h"
33 #include "fimc-is-core.h"
34 #include "fimc-is-param.h"
35 #include "fimc-is-device-sensor.h"
36 #include "fimc-is-device-sensor-peri.h"
37 #include "fimc-is-resourcemgr.h"
38 #include "fimc-is-dt.h"
39 #include "fimc-is-cis-3p8sp.h"
40 #include "fimc-is-cis-3p8sp-setA.h"
41 #include "fimc-is-cis-3p8sp-setB.h"
43 #include "fimc-is-helper-i2c.h"
45 #define SENSOR_NAME "S5K3P8SP"
46 /* #define DEBUG_3P8SP_PLL */
48 static const struct v4l2_subdev_ops subdev_ops
;
50 static const u32
*sensor_3p8sp_global
;
51 static u32 sensor_3p8sp_global_size
;
52 static const u32
**sensor_3p8sp_setfiles
;
53 static const u32
*sensor_3p8sp_setfile_sizes
;
54 static u32 sensor_3p8sp_max_setfile_num
;
55 static const struct sensor_pll_info
**sensor_3p8sp_pllinfos
;
57 static void sensor_3p8sp_cis_data_calculation(const struct sensor_pll_info
*pll_info
, cis_shared_data
*cis_data
)
59 u32 pll_voc_a
= 0, vt_pix_clk_hz
= 0;
60 u32 frame_rate
= 0, max_fps
= 0, frame_valid_us
= 0;
65 /* 1. pixel rate calculation (Mpps) */
66 pll_voc_a
= pll_info
->ext_clk
/ pll_info
->pre_pll_clk_div
* pll_info
->pll_multiplier
;
67 vt_pix_clk_hz
= (pll_voc_a
/ pll_info
->vt_pix_clk_div
) * 4;
69 dbg_sensor("ext_clock(%d) / pre_pll_clk_div(%d) * pll_multiplier(%d) = pll_voc_a(%d)\n",
70 pll_info
->ext_clk
, pll_info
->pre_pll_clk_div
,
71 pll_info
->pll_multiplier
, pll_voc_a
);
72 dbg_sensor("pll_voc_a(%d) / (vt_sys_clk_div(%d) * vt_pix_clk_div(%d)) = pixel clock (%d hz)\n",
73 pll_voc_a
, pll_info
->vt_sys_clk_div
,
74 pll_info
->vt_pix_clk_div
, vt_pix_clk_hz
);
76 /* 2. the time of processing one frame calculation (us) */
77 cis_data
->min_frame_us_time
= (pll_info
->frame_length_lines
* pll_info
->line_length_pck
78 / (vt_pix_clk_hz
/ (1000 * 1000)));
79 cis_data
->cur_frame_us_time
= cis_data
->min_frame_us_time
;
81 /* 3. FPS calculation */
82 frame_rate
= vt_pix_clk_hz
/ (pll_info
->frame_length_lines
* pll_info
->line_length_pck
);
83 dbg_sensor("frame_rate (%d) = vt_pix_clk_hz(%d) / (frame_length_lines(%d) * line_length_pck(%d))\n",
84 frame_rate
, vt_pix_clk_hz
, pll_info
->frame_length_lines
, pll_info
->line_length_pck
);
86 /* calculate max fps */
87 max_fps
= (vt_pix_clk_hz
* 10) / (pll_info
->frame_length_lines
* pll_info
->line_length_pck
);
88 max_fps
= (max_fps
% 10 >= 5 ? frame_rate
+ 1 : frame_rate
);
90 cis_data
->pclk
= vt_pix_clk_hz
;
91 cis_data
->max_fps
= max_fps
;
92 cis_data
->frame_length_lines
= pll_info
->frame_length_lines
;
93 cis_data
->line_length_pck
= pll_info
->line_length_pck
;
95 num
= (u64
)cis_data
->line_length_pck
* (u64
)(1000 * 1000 * 1000);
96 cis_data
->line_readOut_time
= sensor_cis_do_div64(num
, cis_data
->pclk
);
98 cis_data
->rolling_shutter_skew
= (cis_data
->cur_height
- 1) * cis_data
->line_readOut_time
;
99 cis_data
->stream_on
= false;
101 /* Frame valid time calcuration */
102 num
= (u64
)cis_data
->cur_height
* (u64
)cis_data
->line_length_pck
* (u64
)(1000 * 1000);
103 frame_valid_us
= sensor_cis_do_div64(num
, cis_data
->pclk
);
104 cis_data
->frame_valid_us_time
= (int)frame_valid_us
;
106 dbg_sensor("%s\n", __func__
);
107 dbg_sensor("Sensor size(%d x %d) setting: SUCCESS!\n",
108 cis_data
->cur_width
, cis_data
->cur_height
);
109 dbg_sensor("Frame Valid(us): %d\n", frame_valid_us
);
110 dbg_sensor("rolling_shutter_skew: %lld\n", cis_data
->rolling_shutter_skew
);
112 dbg_sensor("Fps: %d, max fps(%d)\n", frame_rate
, cis_data
->max_fps
);
113 dbg_sensor("min_frame_time(%d us)\n", cis_data
->min_frame_us_time
);
114 dbg_sensor("Pixel rate(Mbps): %d\n", cis_data
->pclk
/ 1000000);
116 /* Frame period calculation */
117 cis_data
->frame_time
= (cis_data
->line_readOut_time
* cis_data
->cur_height
/ 1000);
118 cis_data
->rolling_shutter_skew
= (cis_data
->cur_height
- 1) * cis_data
->line_readOut_time
;
120 dbg_sensor("[%s] frame_time(%d), rolling_shutter_skew(%lld)\n",
121 __func__
, cis_data
->frame_time
, cis_data
->rolling_shutter_skew
);
123 /* Constant values */
124 cis_data
->min_fine_integration_time
= SENSOR_3P8SP_FINE_INTEGRATION_TIME_MIN
;
125 cis_data
->max_fine_integration_time
= SENSOR_3P8SP_FINE_INTEGRATION_TIME_MAX
;
126 cis_data
->min_coarse_integration_time
= SENSOR_3P8SP_COARSE_INTEGRATION_TIME_MIN
;
127 cis_data
->max_margin_coarse_integration_time
= SENSOR_3P8SP_COARSE_INTEGRATION_TIME_MAX_MARGIN
;
130 static int sensor_3p8sp_wait_stream_off_status(cis_shared_data
*cis_data
)
137 #define STREAM_OFF_WAIT_TIME 250
138 while (timeout
< STREAM_OFF_WAIT_TIME
) {
139 if (cis_data
->is_active_area
== false &&
140 cis_data
->stream_on
== false) {
141 pr_debug("actual stream off\n");
147 if (timeout
== STREAM_OFF_WAIT_TIME
) {
148 pr_err("actual stream off wait timeout\n");
156 int sensor_3p8sp_cis_init(struct v4l2_subdev
*subdev
)
159 struct fimc_is_cis
*cis
;
160 u32 setfile_index
= 0;
161 cis_setting_info setinfo
;
163 setinfo
.param
= NULL
;
165 setinfo
.return_value
= 0;
169 cis
= (struct fimc_is_cis
*)v4l2_get_subdevdata(subdev
);
176 FIMC_BUG(!cis
->cis_data
);
177 memset(cis
->cis_data
, 0, sizeof(cis_shared_data
));
178 cis
->rev_flag
= false;
180 ret
= sensor_cis_check_rev(cis
);
182 warn("sensor_3p8sp_check_rev is fail when cis init");
183 cis
->rev_flag
= true;
187 cis
->cis_data
->cur_width
= SENSOR_3P8SP_MAX_WIDTH
;
188 cis
->cis_data
->cur_height
= SENSOR_3P8SP_MAX_HEIGHT
;
189 cis
->cis_data
->low_expo_start
= 33000;
190 cis
->need_mode_change
= false;
192 sensor_3p8sp_cis_data_calculation(sensor_3p8sp_pllinfos
[setfile_index
], cis
->cis_data
);
194 setinfo
.return_value
= 0;
195 CALL_CISOPS(cis
, cis_get_min_exposure_time
, subdev
, &setinfo
.return_value
);
196 dbg_sensor("[%s] min exposure time : %d\n", __func__
, setinfo
.return_value
);
197 setinfo
.return_value
= 0;
198 CALL_CISOPS(cis
, cis_get_max_exposure_time
, subdev
, &setinfo
.return_value
);
199 dbg_sensor("[%s] max exposure time : %d\n", __func__
, setinfo
.return_value
);
200 setinfo
.return_value
= 0;
201 CALL_CISOPS(cis
, cis_get_min_analog_gain
, subdev
, &setinfo
.return_value
);
202 dbg_sensor("[%s] min again : %d\n", __func__
, setinfo
.return_value
);
203 setinfo
.return_value
= 0;
204 CALL_CISOPS(cis
, cis_get_max_analog_gain
, subdev
, &setinfo
.return_value
);
205 dbg_sensor("[%s] max again : %d\n", __func__
, setinfo
.return_value
);
206 setinfo
.return_value
= 0;
207 CALL_CISOPS(cis
, cis_get_min_digital_gain
, subdev
, &setinfo
.return_value
);
208 dbg_sensor("[%s] min dgain : %d\n", __func__
, setinfo
.return_value
);
209 setinfo
.return_value
= 0;
210 CALL_CISOPS(cis
, cis_get_max_digital_gain
, subdev
, &setinfo
.return_value
);
211 dbg_sensor("[%s] max dgain : %d\n", __func__
, setinfo
.return_value
);
213 #ifdef DEBUG_SENSOR_TIME
214 do_gettimeofday(&end
);
215 dbg_sensor("[%s] time %lu us\n", __func__
, (end
.tv_sec
- st
.tv_sec
)*1000000 + (end
.tv_usec
- st
.tv_usec
));
222 int sensor_3p8sp_cis_log_status(struct v4l2_subdev
*subdev
)
225 struct fimc_is_cis
*cis
;
226 struct i2c_client
*client
= NULL
;
232 cis
= (struct fimc_is_cis
*)v4l2_get_subdevdata(subdev
);
239 client
= cis
->client
;
240 if (unlikely(!client
)) {
241 err("client is NULL");
246 pr_err("[SEN:DUMP] *******************************\n");
247 ret
= fimc_is_sensor_read16(client
, 0x0000, &data16
);
249 dbg_sensor("[SEN:DUMP] model_id(%x)\n", data16
);
251 ret
= fimc_is_sensor_read8(client
, 0x0002, &data8
);
253 dbg_sensor("[SEN:DUMP] revision_number(%x)\n", data8
);
255 ret
= fimc_is_sensor_read8(client
, 0x0005, &data8
);
257 dbg_sensor("[SEN:DUMP] frame_count(%x)\n", data8
);
259 ret
= fimc_is_sensor_read8(client
, 0x0100, &data8
);
261 dbg_sensor("[SEN:DUMP] mode_select(%x)\n", data8
);
263 sensor_cis_dump_registers(subdev
, sensor_3p8sp_setfiles
[0], sensor_3p8sp_setfile_sizes
[0]);
265 pr_err("[SEN:DUMP] *******************************\n");
271 #if USE_GROUP_PARAM_HOLD
272 static int sensor_3p8sp_cis_group_param_hold_func(struct v4l2_subdev
*subdev
, unsigned int hold
)
275 struct fimc_is_cis
*cis
= NULL
;
276 struct i2c_client
*client
= NULL
;
280 cis
= (struct fimc_is_cis
*)v4l2_get_subdevdata(subdev
);
283 FIMC_BUG(!cis
->cis_data
);
285 client
= cis
->client
;
286 if (unlikely(!client
)) {
287 err("client is NULL");
292 if (hold
== cis
->cis_data
->group_param_hold
) {
293 pr_debug("already group_param_hold (%d)\n", cis
->cis_data
->group_param_hold
);
297 ret
= fimc_is_sensor_write8(client
, 0x0104, hold
);
301 cis
->cis_data
->group_param_hold
= hold
;
307 static inline int sensor_3p8sp_cis_group_param_hold_func(struct v4l2_subdev
*subdev
, unsigned int hold
)
312 * hold : true - hold, flase - no hold
314 * return: 0 - no effect(already hold or no hold)
315 * positive - setted by request
316 * negative - ERROR value
318 int sensor_3p8sp_cis_group_param_hold(struct v4l2_subdev
*subdev
, bool hold
)
321 struct fimc_is_cis
*cis
= NULL
;
325 cis
= (struct fimc_is_cis
*)v4l2_get_subdevdata(subdev
);
328 FIMC_BUG(!cis
->cis_data
);
330 ret
= sensor_3p8sp_cis_group_param_hold_func(subdev
, hold
);
338 int sensor_3p8sp_cis_set_global_setting(struct v4l2_subdev
*subdev
)
341 struct fimc_is_cis
*cis
= NULL
;
345 cis
= (struct fimc_is_cis
*)v4l2_get_subdevdata(subdev
);
349 ret
= fimc_is_sensor_write16(cis
->client
, 0xFCFC, 0x4000);
350 ret
= fimc_is_sensor_write16(cis
->client
, 0x6010, 0x0001);
351 /* 3ms delay to operate sensor FW */
352 usleep_range(2900, 3000);
354 ret
= sensor_cis_set_registers(subdev
, sensor_3p8sp_global
, sensor_3p8sp_global_size
);
357 err("sensor_3p8sp_set_registers fail!!");
361 dbg_sensor("[%s] global setting done\n", __func__
);
367 int sensor_3p8sp_cis_mode_change(struct v4l2_subdev
*subdev
, u32 mode
)
370 u32 max_setfile_num
= 0;
371 struct fimc_is_cis
*cis
= NULL
;
375 cis
= (struct fimc_is_cis
*)v4l2_get_subdevdata(subdev
);
377 FIMC_BUG(!cis
->cis_data
);
379 max_setfile_num
= sensor_3p8sp_max_setfile_num
;
381 if (mode
> max_setfile_num
) {
382 err("invalid mode(%d)!!", mode
);
387 /* If check_rev fail when cis_init, one more check_rev in mode_change */
388 if (cis
->rev_flag
== true) {
389 cis
->rev_flag
= false;
390 ret
= sensor_cis_check_rev(cis
);
392 err("sensor_3p8sp_check_rev is fail");
397 sensor_3p8sp_cis_data_calculation(sensor_3p8sp_pllinfos
[mode
], cis
->cis_data
);
399 ret
= sensor_cis_set_registers(subdev
, sensor_3p8sp_setfiles
[mode
], sensor_3p8sp_setfile_sizes
[mode
]);
401 err("sensor_3p8sp_set_registers fail!!");
405 dbg_sensor("[%s] mode changed(%d)\n", __func__
, mode
);
411 /* TODO: Sensor set size sequence(sensor done, sensor stop, 3AA done in FW case */
412 int sensor_3p8sp_cis_set_size(struct v4l2_subdev
*subdev
, cis_shared_data
*cis_data
)
415 bool binning
= false;
416 u32 ratio_w
= 0, ratio_h
= 0, start_x
= 0, start_y
= 0, end_x
= 0, end_y
= 0;
417 u32 even_x
= 0, odd_x
= 0, even_y
= 0, odd_y
= 0;
418 struct i2c_client
*client
= NULL
;
419 struct fimc_is_cis
*cis
= NULL
;
420 #ifdef DEBUG_SENSOR_TIME
421 struct timeval st
, end
;
423 do_gettimeofday(&st
);
428 cis
= (struct fimc_is_cis
*)v4l2_get_subdevdata(subdev
);
431 dbg_sensor("[MOD:D:%d] %s\n", cis
->id
, __func__
);
433 if (unlikely(!cis_data
)) {
434 err("cis data is NULL");
435 if (unlikely(!cis
->cis_data
)) {
439 cis_data
= cis
->cis_data
;
443 client
= cis
->client
;
444 if (unlikely(!client
)) {
445 err("client is NULL");
450 /* Wait actual stream off */
451 ret
= sensor_3p8sp_wait_stream_off_status(cis_data
);
453 err("Must stream off\n");
458 binning
= cis_data
->binning
;
460 ratio_w
= (SENSOR_3P8SP_MAX_WIDTH
/ cis_data
->cur_width
);
461 ratio_h
= (SENSOR_3P8SP_MAX_HEIGHT
/ cis_data
->cur_height
);
467 if (((cis_data
->cur_width
* ratio_w
) > SENSOR_3P8SP_MAX_WIDTH
) ||
468 ((cis_data
->cur_height
* ratio_h
) > SENSOR_3P8SP_MAX_HEIGHT
)) {
469 err("Config max sensor size over~!!\n");
475 ret
= fimc_is_sensor_write16(client
, 0x6028, 0x2000);
479 /* 2. pixel address region setting */
480 start_x
= ((SENSOR_3P8SP_MAX_WIDTH
- cis_data
->cur_width
* ratio_w
) / 2) & (~0x1);
481 start_y
= ((SENSOR_3P8SP_MAX_HEIGHT
- cis_data
->cur_height
* ratio_h
) / 2) & (~0x1);
482 end_x
= start_x
+ (cis_data
->cur_width
* ratio_w
- 1);
483 end_y
= start_y
+ (cis_data
->cur_height
* ratio_h
- 1);
485 if (!(end_x
& (0x1)) || !(end_y
& (0x1))) {
486 err("Sensor pixel end address must odd\n");
491 ret
= fimc_is_sensor_write16(client
, 0x0344, start_x
);
494 ret
= fimc_is_sensor_write16(client
, 0x0346, start_y
);
497 ret
= fimc_is_sensor_write16(client
, 0x0348, end_x
);
500 ret
= fimc_is_sensor_write16(client
, 0x034A, end_y
);
504 /* 3. output address setting */
505 ret
= fimc_is_sensor_write16(client
, 0x034C, cis_data
->cur_width
);
508 ret
= fimc_is_sensor_write16(client
, 0x034E, cis_data
->cur_height
);
512 /* If not use to binning, sensor image should set only crop */
514 dbg_sensor("Sensor size set is not binning\n");
518 /* 4. sub sampling setting */
519 even_x
= 1; /* 1: not use to even sampling */
521 odd_x
= (ratio_w
* 2) - even_x
;
522 odd_y
= (ratio_h
* 2) - even_y
;
524 ret
= fimc_is_sensor_write16(client
, 0x0380, even_x
);
527 ret
= fimc_is_sensor_write16(client
, 0x0382, odd_x
);
530 ret
= fimc_is_sensor_write16(client
, 0x0384, even_y
);
533 ret
= fimc_is_sensor_write16(client
, 0x0386, odd_y
);
537 /* 5. binnig setting */
538 ret
= fimc_is_sensor_write8(client
, 0x0900, binning
); /* 1: binning enable, 0: disable */
541 ret
= fimc_is_sensor_write8(client
, 0x0901, (ratio_w
<< 4) | ratio_h
);
545 /* 6. scaling setting: but not use */
546 /* scaling_mode (0: No scaling, 1: Horizontal, 2: Full) */
547 ret
= fimc_is_sensor_write16(client
, 0x0400, 0x0000);
550 /* down_scale_m: 1 to 16 upwards (scale_n: 16(fixed)) */
551 /* down scale factor = down_scale_m / down_scale_n */
552 ret
= fimc_is_sensor_write16(client
, 0x0404, 0x0010);
556 cis_data
->frame_time
= (cis_data
->line_readOut_time
* cis_data
->cur_height
/ 1000);
557 cis
->cis_data
->rolling_shutter_skew
= (cis
->cis_data
->cur_height
- 1) * cis
->cis_data
->line_readOut_time
;
558 dbg_sensor("[%s] frame_time(%d), rolling_shutter_skew(%lld)\n", __func__
,
559 cis
->cis_data
->frame_time
, cis
->cis_data
->rolling_shutter_skew
);
561 #ifdef DEBUG_SENSOR_TIME
562 do_gettimeofday(&end
);
563 dbg_sensor("[%s] time %lu us\n", __func__
, (end
.tv_sec
- st
.tv_sec
) * 1000000 + (end
.tv_usec
- st
.tv_usec
));
570 int sensor_3p8sp_cis_stream_on(struct v4l2_subdev
*subdev
)
573 struct fimc_is_cis
*cis
;
574 struct i2c_client
*client
;
575 cis_shared_data
*cis_data
;
577 #ifdef DEBUG_SENSOR_TIME
578 struct timeval st
, end
;
580 do_gettimeofday(&st
);
584 cis
= (struct fimc_is_cis
*)v4l2_get_subdevdata(subdev
);
587 FIMC_BUG(!cis
->cis_data
);
589 client
= cis
->client
;
590 if (unlikely(!client
)) {
591 err("client is NULL");
596 cis_data
= cis
->cis_data
;
598 dbg_sensor("[MOD:D:%d] %s\n", cis
->id
, __func__
);
600 ret
= sensor_3p8sp_cis_group_param_hold_func(subdev
, 0x00);
602 err("[%s] sensor_3p8sp_cis_group_param_hold_func fail\n", __func__
);
604 #ifdef DEBUG_3P8SP_PLL
608 ret
= fimc_is_sensor_read16(client
, 0x0300, &pll
);
609 dbg_sensor("______ vt_pix_clk_div(%x)\n", pll
);
610 ret
= fimc_is_sensor_read16(client
, 0x0302, &pll
);
611 dbg_sensor("______ vt_sys_clk_div(%x)\n", pll
);
612 ret
= fimc_is_sensor_read16(client
, 0x0304, &pll
);
613 dbg_sensor("______ pre_pll_clk_div(%x)\n", pll
);
614 ret
= fimc_is_sensor_read16(client
, 0x0306, &pll
);
615 dbg_sensor("______ pll_multiplier(%x)\n", pll
);
616 ret
= fimc_is_sensor_read16(client
, 0x0308, &pll
);
617 dbg_sensor("______ op_pix_clk_div(%x)\n", pll
);
618 ret
= fimc_is_sensor_read16(client
, 0x030a, &pll
);
619 dbg_sensor("______ op_sys_clk_div(%x)\n", pll
);
621 ret
= fimc_is_sensor_read16(client
, 0x030c, &pll
);
622 dbg_sensor("______ secnd_pre_pll_clk_div(%x)\n", pll
);
623 ret
= fimc_is_sensor_read16(client
, 0x030e, &pll
);
624 dbg_sensor("______ secnd_pll_multiplier(%x)\n", pll
);
625 ret
= fimc_is_sensor_read16(client
, 0x0340, &pll
);
626 dbg_sensor("______ frame_length_lines(%x)\n", pll
);
627 ret
= fimc_is_sensor_read16(client
, 0x0342, &pll
);
628 dbg_sensor("______ line_length_pck(%x)\n", pll
);
632 /* Sensor stream on */
633 ret
= fimc_is_sensor_write16(client
, 0x6028, 0x4000);
635 err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x6028, 0x4000, ret
);
636 ret
= fimc_is_sensor_write16(client
, 0x0100, 0x0100);
638 err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x0100, 0x0100, ret
);
640 cis_data
->stream_on
= true;
642 #ifdef DEBUG_SENSOR_TIME
643 do_gettimeofday(&end
);
644 dbg_sensor("[%s] time %lu us\n", __func__
, (end
.tv_sec
- st
.tv_sec
)*1000000 + (end
.tv_usec
- st
.tv_usec
));
651 int sensor_3p8sp_cis_stream_off(struct v4l2_subdev
*subdev
)
654 struct fimc_is_cis
*cis
;
655 struct i2c_client
*client
;
656 cis_shared_data
*cis_data
;
658 #ifdef DEBUG_SENSOR_TIME
659 struct timeval st
, end
;
661 do_gettimeofday(&st
);
666 cis
= (struct fimc_is_cis
*)v4l2_get_subdevdata(subdev
);
669 FIMC_BUG(!cis
->cis_data
);
671 client
= cis
->client
;
672 if (unlikely(!client
)) {
673 err("client is NULL");
678 cis_data
= cis
->cis_data
;
680 dbg_sensor("[MOD:D:%d] %s\n", cis
->id
, __func__
);
682 ret
= sensor_3p8sp_cis_group_param_hold_func(subdev
, 0x00);
684 err("[%s] sensor_3p8sp_cis_group_param_hold_func fail\n", __func__
);
686 /* Sensor stream off */
687 ret
= fimc_is_sensor_write16(client
, 0x6028, 0x4000);
689 err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x6028, 0x4000, ret
);
690 ret
= fimc_is_sensor_write16(client
, 0x0100, 0x0000);
692 err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x0100, 0x00, ret
);
694 cis_data
->stream_on
= false;
696 #ifdef DEBUG_SENSOR_TIME
697 do_gettimeofday(&end
);
698 dbg_sensor("[%s] time %lu us\n", __func__
, (end
.tv_sec
- st
.tv_sec
)*1000000 + (end
.tv_usec
- st
.tv_usec
));
705 int sensor_3p8sp_cis_set_exposure_time(struct v4l2_subdev
*subdev
, struct ae_param
*target_exposure
)
709 struct fimc_is_cis
*cis
;
710 struct i2c_client
*client
;
711 cis_shared_data
*cis_data
;
713 u32 vt_pic_clk_freq_mhz
= 0;
714 u16 long_coarse_int
= 0;
715 u16 short_coarse_int
= 0;
716 u32 line_length_pck
= 0;
717 u32 min_fine_int
= 0;
719 #ifdef DEBUG_SENSOR_TIME
720 struct timeval st
, end
;
722 do_gettimeofday(&st
);
726 FIMC_BUG(!target_exposure
);
728 cis
= (struct fimc_is_cis
*)v4l2_get_subdevdata(subdev
);
731 FIMC_BUG(!cis
->cis_data
);
733 client
= cis
->client
;
734 if (unlikely(!client
)) {
735 err("client is NULL");
740 if ((target_exposure
->long_val
<= 0) || (target_exposure
->short_val
<= 0)) {
741 err("[%s] invalid target exposure(%d, %d)\n", __func__
,
742 target_exposure
->long_val
, target_exposure
->short_val
);
747 cis_data
= cis
->cis_data
;
749 dbg_sensor("[MOD:D:%d] %s, vsync_cnt(%d), target long(%d), short(%d)\n", cis
->id
, __func__
,
750 cis_data
->sen_vsync_count
, target_exposure
->long_val
, target_exposure
->short_val
);
752 vt_pic_clk_freq_mhz
= cis_data
->pclk
/ (1000 * 1000);
753 line_length_pck
= cis_data
->line_length_pck
;
754 min_fine_int
= cis_data
->min_fine_integration_time
;
756 long_coarse_int
= ((target_exposure
->long_val
* vt_pic_clk_freq_mhz
) - min_fine_int
) / line_length_pck
;
757 short_coarse_int
= ((target_exposure
->short_val
* vt_pic_clk_freq_mhz
) - min_fine_int
) / line_length_pck
;
759 if (long_coarse_int
> cis_data
->max_coarse_integration_time
) {
760 dbg_sensor("[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) max(%d)\n", cis
->id
, __func__
,
761 cis_data
->sen_vsync_count
, long_coarse_int
, cis_data
->max_coarse_integration_time
);
762 long_coarse_int
= cis_data
->max_coarse_integration_time
;
765 if (short_coarse_int
> cis_data
->max_coarse_integration_time
) {
766 dbg_sensor("[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) max(%d)\n", cis
->id
, __func__
,
767 cis_data
->sen_vsync_count
, short_coarse_int
, cis_data
->max_coarse_integration_time
);
768 short_coarse_int
= cis_data
->max_coarse_integration_time
;
771 if (long_coarse_int
< cis_data
->min_coarse_integration_time
) {
772 dbg_sensor("[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) min(%d)\n", cis
->id
, __func__
,
773 cis_data
->sen_vsync_count
, long_coarse_int
, cis_data
->min_coarse_integration_time
);
774 long_coarse_int
= cis_data
->min_coarse_integration_time
;
777 if (short_coarse_int
< cis_data
->min_coarse_integration_time
) {
778 dbg_sensor("[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) min(%d)\n", cis
->id
, __func__
,
779 cis_data
->sen_vsync_count
, short_coarse_int
, cis_data
->min_coarse_integration_time
);
780 short_coarse_int
= cis_data
->min_coarse_integration_time
;
783 hold
= sensor_3p8sp_cis_group_param_hold_func(subdev
, 0x01);
790 ret
= fimc_is_sensor_write16(client
, 0x0202, short_coarse_int
);
794 dbg_sensor("[MOD:D:%d] %s, vsync_cnt(%d), vt_pic_clk_freq_mhz (%d), line_length_pck(%d), min_fine_int (%d)\n",
795 cis
->id
, __func__
, cis_data
->sen_vsync_count
, vt_pic_clk_freq_mhz
, line_length_pck
, min_fine_int
);
796 dbg_sensor("[MOD:D:%d] %s, vsync_cnt(%d), frame_length_lines(%#x), long_coarse_int %#x, short_coarse_int %#x\n",
797 cis
->id
, __func__
, cis_data
->sen_vsync_count
, cis_data
->frame_length_lines
,
798 long_coarse_int
, short_coarse_int
);
800 #ifdef DEBUG_SENSOR_TIME
801 do_gettimeofday(&end
);
802 dbg_sensor("[%s] time %lu us\n", __func__
, (end
.tv_sec
- st
.tv_sec
)*1000000 + (end
.tv_usec
- st
.tv_usec
));
807 hold
= sensor_3p8sp_cis_group_param_hold_func(subdev
, 0x00);
815 int sensor_3p8sp_cis_get_min_exposure_time(struct v4l2_subdev
*subdev
, u32
*min_expo
)
818 struct fimc_is_cis
*cis
= NULL
;
819 cis_shared_data
*cis_data
= NULL
;
820 u32 min_integration_time
= 0;
823 u32 vt_pic_clk_freq_mhz
= 0;
824 u32 line_length_pck
= 0;
826 #ifdef DEBUG_SENSOR_TIME
827 struct timeval st
, end
;
829 do_gettimeofday(&st
);
835 cis
= (struct fimc_is_cis
*)v4l2_get_subdevdata(subdev
);
838 FIMC_BUG(!cis
->cis_data
);
840 cis_data
= cis
->cis_data
;
842 vt_pic_clk_freq_mhz
= cis_data
->pclk
/ (1000 * 1000);
843 if (vt_pic_clk_freq_mhz
== 0) {
844 pr_err("[MOD:D:%d] %s, Invalid vt_pic_clk_freq_mhz(%d)\n", cis
->id
, __func__
, vt_pic_clk_freq_mhz
);
847 line_length_pck
= cis_data
->line_length_pck
;
848 min_coarse
= cis_data
->min_coarse_integration_time
;
849 min_fine
= cis_data
->min_fine_integration_time
;
851 min_integration_time
= ((line_length_pck
* min_coarse
) + min_fine
) / vt_pic_clk_freq_mhz
;
852 *min_expo
= min_integration_time
;
854 dbg_sensor("[%s] min integration time %d\n", __func__
, min_integration_time
);
856 #ifdef DEBUG_SENSOR_TIME
857 do_gettimeofday(&end
);
858 dbg_sensor("[%s] time %lu us\n", __func__
, (end
.tv_sec
- st
.tv_sec
)*1000000 + (end
.tv_usec
- st
.tv_usec
));
865 int sensor_3p8sp_cis_get_max_exposure_time(struct v4l2_subdev
*subdev
, u32
*max_expo
)
868 struct fimc_is_cis
*cis
;
869 cis_shared_data
*cis_data
;
870 u32 max_integration_time
= 0;
871 u32 max_coarse_margin
= 0;
872 u32 max_fine_margin
= 0;
875 u32 vt_pic_clk_freq_mhz
= 0;
876 u32 line_length_pck
= 0;
877 u32 frame_length_lines
= 0;
879 #ifdef DEBUG_SENSOR_TIME
880 struct timeval st
, end
;
882 do_gettimeofday(&st
);
888 cis
= (struct fimc_is_cis
*)v4l2_get_subdevdata(subdev
);
891 FIMC_BUG(!cis
->cis_data
);
893 cis_data
= cis
->cis_data
;
895 vt_pic_clk_freq_mhz
= cis_data
->pclk
/ (1000 * 1000);
896 if (vt_pic_clk_freq_mhz
== 0) {
897 pr_err("[MOD:D:%d] %s, Invalid vt_pic_clk_freq_mhz(%d)\n", cis
->id
, __func__
, vt_pic_clk_freq_mhz
);
900 line_length_pck
= cis_data
->line_length_pck
;
901 frame_length_lines
= cis_data
->frame_length_lines
;
903 max_coarse_margin
= cis_data
->max_margin_coarse_integration_time
;
904 max_fine_margin
= line_length_pck
- cis_data
->min_fine_integration_time
;
905 max_coarse
= frame_length_lines
- max_coarse_margin
;
906 max_fine
= cis_data
->max_fine_integration_time
;
908 max_integration_time
= ((line_length_pck
* max_coarse
) + max_fine
) / vt_pic_clk_freq_mhz
;
910 *max_expo
= max_integration_time
;
912 /* TODO: Is this values update hear? */
913 cis_data
->max_margin_fine_integration_time
= max_fine_margin
;
914 cis_data
->max_coarse_integration_time
= max_coarse
;
916 dbg_sensor("[%s] max integration time %d, max margin fine integration %d, max coarse integration %d\n",
917 __func__
, max_integration_time
, cis_data
->max_margin_fine_integration_time
,
918 cis_data
->max_coarse_integration_time
);
920 #ifdef DEBUG_SENSOR_TIME
921 do_gettimeofday(&end
);
922 dbg_sensor("[%s] time %lu us\n", __func__
, (end
.tv_sec
- st
.tv_sec
)*1000000 + (end
.tv_usec
- st
.tv_usec
));
929 int sensor_3p8sp_cis_adjust_frame_duration(struct v4l2_subdev
*subdev
,
930 u32 input_exposure_time
,
931 u32
*target_duration
)
934 struct fimc_is_cis
*cis
;
935 cis_shared_data
*cis_data
;
937 u32 vt_pic_clk_freq_mhz
= 0;
938 u32 line_length_pck
= 0;
939 u32 frame_length_lines
= 0;
940 u32 frame_duration
= 0;
942 #ifdef DEBUG_SENSOR_TIME
943 struct timeval st
, end
;
945 do_gettimeofday(&st
);
949 FIMC_BUG(!target_duration
);
951 cis
= (struct fimc_is_cis
*)v4l2_get_subdevdata(subdev
);
954 FIMC_BUG(!cis
->cis_data
);
956 cis_data
= cis
->cis_data
;
958 vt_pic_clk_freq_mhz
= cis_data
->pclk
/ (1000 * 1000);
959 line_length_pck
= cis_data
->line_length_pck
;
960 frame_length_lines
= ((vt_pic_clk_freq_mhz
* input_exposure_time
) / line_length_pck
);
961 frame_length_lines
+= cis_data
->max_margin_coarse_integration_time
;
963 frame_duration
= (frame_length_lines
* line_length_pck
) / vt_pic_clk_freq_mhz
;
965 dbg_sensor("[%s](vsync cnt = %d) input exp(%d), adj duration, frame duraion(%d), min_frame_us(%d)\n",
966 __func__
, cis_data
->sen_vsync_count
, input_exposure_time
,
967 frame_duration
, cis_data
->min_frame_us_time
);
968 dbg_sensor("[%s](vsync cnt = %d) adj duration, frame duraion(%d), min_frame_us(%d)\n",
969 __func__
, cis_data
->sen_vsync_count
, frame_duration
, cis_data
->min_frame_us_time
);
971 *target_duration
= MAX(frame_duration
, cis_data
->min_frame_us_time
);
973 #ifdef DEBUG_SENSOR_TIME
974 do_gettimeofday(&end
);
975 dbg_sensor("[%s] time %lu us\n", __func__
, (end
.tv_sec
- st
.tv_sec
)*1000000 + (end
.tv_usec
- st
.tv_usec
));
981 int sensor_3p8sp_cis_set_frame_duration(struct v4l2_subdev
*subdev
, u32 frame_duration
)
985 struct fimc_is_cis
*cis
;
986 struct i2c_client
*client
;
987 cis_shared_data
*cis_data
;
989 u32 vt_pic_clk_freq_mhz
= 0;
990 u32 line_length_pck
= 0;
991 u16 frame_length_lines
= 0;
993 u32 max_coarse_integration_time
= 0;
995 #ifdef DEBUG_SENSOR_TIME
996 struct timeval st
, end
;
998 do_gettimeofday(&st
);
1003 cis
= (struct fimc_is_cis
*)v4l2_get_subdevdata(subdev
);
1006 FIMC_BUG(!cis
->cis_data
);
1008 client
= cis
->client
;
1009 if (unlikely(!client
)) {
1010 err("client is NULL");
1015 cis_data
= cis
->cis_data
;
1017 if (frame_duration
< cis_data
->min_frame_us_time
) {
1018 dbg_sensor("frame duration is less than min(%d)\n", frame_duration
);
1019 frame_duration
= cis_data
->min_frame_us_time
;
1022 vt_pic_clk_freq_mhz
= cis_data
->pclk
/ (1000 * 1000);
1023 line_length_pck
= cis_data
->line_length_pck
;
1025 frame_length_lines
= (u16
)((vt_pic_clk_freq_mhz
* frame_duration
) / line_length_pck
);
1027 dbg_sensor("[MOD:D:%d] %s, vt_pic_clk_freq_mhz(%#x) frame_duration = %d us, "
1028 KERN_CONT
"(line_length_pck%#x), frame_length_lines(%#x)\n",
1029 cis
->id
, __func__
, vt_pic_clk_freq_mhz
, frame_duration
, line_length_pck
, frame_length_lines
);
1031 hold
= sensor_3p8sp_cis_group_param_hold_func(subdev
, 0x01);
1037 ret
= fimc_is_sensor_write16(client
, 0x0340, frame_length_lines
);
1041 cis_data
->cur_frame_us_time
= frame_duration
;
1042 cis_data
->frame_length_lines
= frame_length_lines
;
1044 max_coarse_integration_time
= cis_data
->frame_length_lines
- cis_data
->max_margin_coarse_integration_time
;
1045 cis_data
->max_coarse_integration_time
= max_coarse_integration_time
;
1047 #ifdef DEBUG_SENSOR_TIME
1048 do_gettimeofday(&end
);
1049 dbg_sensor("[%s] time %lu us\n", __func__
, (end
.tv_sec
- st
.tv_sec
)*1000000 + (end
.tv_usec
- st
.tv_usec
));
1054 hold
= sensor_3p8sp_cis_group_param_hold_func(subdev
, 0x00);
1062 int sensor_3p8sp_cis_set_frame_rate(struct v4l2_subdev
*subdev
, u32 min_fps
)
1065 struct fimc_is_cis
*cis
;
1066 cis_shared_data
*cis_data
;
1068 u32 frame_duration
= 0;
1070 #ifdef DEBUG_SENSOR_TIME
1071 struct timeval st
, end
;
1073 do_gettimeofday(&st
);
1078 cis
= (struct fimc_is_cis
*)v4l2_get_subdevdata(subdev
);
1081 FIMC_BUG(!cis
->cis_data
);
1083 cis_data
= cis
->cis_data
;
1085 if (min_fps
> cis_data
->max_fps
) {
1086 err("[MOD:D:%d] %s, request FPS is too high(%d), set to max(%d)\n",
1087 cis
->id
, __func__
, min_fps
, cis_data
->max_fps
);
1088 min_fps
= cis_data
->max_fps
;
1092 err("[MOD:D:%d] %s, request FPS is 0, set to min FPS(1)\n",
1097 frame_duration
= (1 * 1000 * 1000) / min_fps
;
1099 dbg_sensor("[MOD:D:%d] %s, set FPS(%d), frame duration(%d)\n",
1100 cis
->id
, __func__
, min_fps
, frame_duration
);
1102 ret
= sensor_3p8sp_cis_set_frame_duration(subdev
, frame_duration
);
1104 err("[MOD:D:%d] %s, set frame duration is fail(%d)\n",
1105 cis
->id
, __func__
, ret
);
1109 cis_data
->min_frame_us_time
= frame_duration
;
1111 #ifdef DEBUG_SENSOR_TIME
1112 do_gettimeofday(&end
);
1113 dbg_sensor("[%s] time %lu us\n", __func__
, (end
.tv_sec
- st
.tv_sec
)*1000000 + (end
.tv_usec
- st
.tv_usec
));
1121 int sensor_3p8sp_cis_adjust_analog_gain(struct v4l2_subdev
*subdev
, u32 input_again
, u32
*target_permile
)
1124 struct fimc_is_cis
*cis
;
1125 cis_shared_data
*cis_data
;
1128 u32 again_permile
= 0;
1130 #ifdef DEBUG_SENSOR_TIME
1131 struct timeval st
, end
;
1133 do_gettimeofday(&st
);
1137 FIMC_BUG(!target_permile
);
1139 cis
= (struct fimc_is_cis
*)v4l2_get_subdevdata(subdev
);
1142 FIMC_BUG(!cis
->cis_data
);
1144 cis_data
= cis
->cis_data
;
1146 again_code
= sensor_cis_calc_again_code(input_again
);
1148 if (again_code
> cis_data
->max_analog_gain
[0])
1149 again_code
= cis_data
->max_analog_gain
[0];
1150 else if (again_code
< cis_data
->min_analog_gain
[0])
1151 again_code
= cis_data
->min_analog_gain
[0];
1153 again_permile
= sensor_cis_calc_again_permile(again_code
);
1155 dbg_sensor("[%s] min again(%d), max(%d), input_again(%d), code(%d), permile(%d)\n", __func__
,
1156 cis_data
->max_analog_gain
[0],
1157 cis_data
->min_analog_gain
[0],
1162 *target_permile
= again_permile
;
1167 int sensor_3p8sp_cis_set_analog_gain(struct v4l2_subdev
*subdev
, struct ae_param
*again
)
1171 struct fimc_is_cis
*cis
;
1172 struct i2c_client
*client
;
1174 u16 analog_gain
= 0;
1176 #ifdef DEBUG_SENSOR_TIME
1177 struct timeval st
, end
;
1179 do_gettimeofday(&st
);
1185 cis
= (struct fimc_is_cis
*)v4l2_get_subdevdata(subdev
);
1189 client
= cis
->client
;
1190 if (unlikely(!client
)) {
1191 err("client is NULL");
1196 analog_gain
= (u16
)sensor_cis_calc_again_code(again
->val
);
1198 if (analog_gain
< cis
->cis_data
->min_analog_gain
[0])
1199 analog_gain
= cis
->cis_data
->min_analog_gain
[0];
1201 if (analog_gain
> cis
->cis_data
->max_analog_gain
[0])
1202 analog_gain
= cis
->cis_data
->max_analog_gain
[0];
1204 dbg_sensor("[MOD:D:%d] %s(vsync cnt = %d), input_again = %d us, analog_gain(%#x)\n",
1205 cis
->id
, __func__
, cis
->cis_data
->sen_vsync_count
, again
->val
, analog_gain
);
1207 hold
= sensor_3p8sp_cis_group_param_hold_func(subdev
, 0x01);
1213 ret
= fimc_is_sensor_write16(client
, 0x0204, analog_gain
);
1217 #ifdef DEBUG_SENSOR_TIME
1218 do_gettimeofday(&end
);
1219 dbg_sensor("[%s] time %lu us\n", __func__
, (end
.tv_sec
- st
.tv_sec
)*1000000 + (end
.tv_usec
- st
.tv_usec
));
1224 hold
= sensor_3p8sp_cis_group_param_hold_func(subdev
, 0x00);
1232 int sensor_3p8sp_cis_get_analog_gain(struct v4l2_subdev
*subdev
, u32
*again
)
1236 struct fimc_is_cis
*cis
;
1237 struct i2c_client
*client
;
1239 u16 analog_gain
= 0;
1241 #ifdef DEBUG_SENSOR_TIME
1242 struct timeval st
, end
;
1244 do_gettimeofday(&st
);
1250 cis
= (struct fimc_is_cis
*)v4l2_get_subdevdata(subdev
);
1254 client
= cis
->client
;
1255 if (unlikely(!client
)) {
1256 err("client is NULL");
1261 hold
= sensor_3p8sp_cis_group_param_hold_func(subdev
, 0x01);
1267 ret
= fimc_is_sensor_read16(client
, 0x0204, &analog_gain
);
1271 *again
= sensor_cis_calc_again_permile(analog_gain
);
1273 dbg_sensor("[MOD:D:%d] %s, cur_again = %d us, analog_gain(%#x)\n",
1274 cis
->id
, __func__
, *again
, analog_gain
);
1276 #ifdef DEBUG_SENSOR_TIME
1277 do_gettimeofday(&end
);
1278 dbg_sensor("[%s] time %lu us\n", __func__
, (end
.tv_sec
- st
.tv_sec
)*1000000 + (end
.tv_usec
- st
.tv_usec
));
1283 hold
= sensor_3p8sp_cis_group_param_hold_func(subdev
, 0x00);
1291 int sensor_3p8sp_cis_get_min_analog_gain(struct v4l2_subdev
*subdev
, u32
*min_again
)
1294 struct fimc_is_cis
*cis
;
1295 struct i2c_client
*client
;
1296 cis_shared_data
*cis_data
;
1300 #ifdef DEBUG_SENSOR_TIME
1301 struct timeval st
, end
;
1303 do_gettimeofday(&st
);
1307 FIMC_BUG(!min_again
);
1309 cis
= (struct fimc_is_cis
*)v4l2_get_subdevdata(subdev
);
1312 FIMC_BUG(!cis
->cis_data
);
1314 client
= cis
->client
;
1315 if (unlikely(!client
)) {
1316 err("client is NULL");
1321 cis_data
= cis
->cis_data
;
1323 ret
= fimc_is_sensor_read16(client
, 0x0084, &read_value
);
1325 err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x0084, read_value
, ret
);
1327 cis_data
->min_analog_gain
[0] = read_value
;
1329 cis_data
->min_analog_gain
[1] = sensor_cis_calc_again_permile(read_value
);
1331 *min_again
= cis_data
->min_analog_gain
[1];
1333 dbg_sensor("[%s] code %d, permile %d\n", __func__
, cis_data
->min_analog_gain
[0], cis_data
->min_analog_gain
[1]);
1335 #ifdef DEBUG_SENSOR_TIME
1336 do_gettimeofday(&end
);
1337 dbg_sensor("[%s] time %lu us\n", __func__
, (end
.tv_sec
- st
.tv_sec
)*1000000 + (end
.tv_usec
- st
.tv_usec
));
1344 int sensor_3p8sp_cis_get_max_analog_gain(struct v4l2_subdev
*subdev
, u32
*max_again
)
1347 struct fimc_is_cis
*cis
;
1348 struct i2c_client
*client
;
1349 cis_shared_data
*cis_data
;
1353 #ifdef DEBUG_SENSOR_TIME
1354 struct timeval st
, end
;
1356 do_gettimeofday(&st
);
1360 FIMC_BUG(!max_again
);
1362 cis
= (struct fimc_is_cis
*)v4l2_get_subdevdata(subdev
);
1365 FIMC_BUG(!cis
->cis_data
);
1367 client
= cis
->client
;
1368 if (unlikely(!client
)) {
1369 err("client is NULL");
1374 cis_data
= cis
->cis_data
;
1376 ret
= fimc_is_sensor_read16(client
, 0x0086, &read_value
);
1378 err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x0086, read_value
, ret
);
1380 cis_data
->max_analog_gain
[0] = read_value
;
1382 cis_data
->max_analog_gain
[1] = sensor_cis_calc_again_permile(read_value
);
1384 *max_again
= cis_data
->max_analog_gain
[1];
1386 dbg_sensor("[%s] code %d, permile %d\n", __func__
, cis_data
->max_analog_gain
[0], cis_data
->max_analog_gain
[1]);
1388 #ifdef DEBUG_SENSOR_TIME
1389 do_gettimeofday(&end
);
1390 dbg_sensor("[%s] time %lu us\n", __func__
, (end
.tv_sec
- st
.tv_sec
)*1000000 + (end
.tv_usec
- st
.tv_usec
));
1397 int sensor_3p8sp_cis_set_digital_gain(struct v4l2_subdev
*subdev
, struct ae_param
*dgain
)
1401 struct fimc_is_cis
*cis
;
1402 struct i2c_client
*client
;
1403 cis_shared_data
*cis_data
;
1407 u16 dgains
[4] = {0};
1409 #ifdef DEBUG_SENSOR_TIME
1410 struct timeval st
, end
;
1412 do_gettimeofday(&st
);
1418 cis
= (struct fimc_is_cis
*)v4l2_get_subdevdata(subdev
);
1421 FIMC_BUG(!cis
->cis_data
);
1423 client
= cis
->client
;
1424 if (unlikely(!client
)) {
1425 err("client is NULL");
1430 cis_data
= cis
->cis_data
;
1432 long_gain
= (u16
)sensor_cis_calc_dgain_code(dgain
->long_val
);
1433 short_gain
= (u16
)sensor_cis_calc_dgain_code(dgain
->short_val
);
1435 if (long_gain
< cis
->cis_data
->min_digital_gain
[0])
1436 long_gain
= cis
->cis_data
->min_digital_gain
[0];
1438 if (long_gain
> cis
->cis_data
->max_digital_gain
[0])
1439 long_gain
= cis
->cis_data
->max_digital_gain
[0];
1441 if (short_gain
< cis
->cis_data
->min_digital_gain
[0])
1442 short_gain
= cis
->cis_data
->min_digital_gain
[0];
1444 if (short_gain
> cis
->cis_data
->max_digital_gain
[0])
1445 short_gain
= cis
->cis_data
->max_digital_gain
[0];
1447 dbg_sensor("[MOD:D:%d] %s(vsync cnt = %d), input_dgain = %d/%d us, long_gain(%#x), short_gain(%#x)\n",
1448 cis
->id
, __func__
, cis
->cis_data
->sen_vsync_count
, dgain
->long_val
, dgain
->short_val
,
1449 long_gain
, short_gain
);
1451 hold
= sensor_3p8sp_cis_group_param_hold_func(subdev
, 0x01);
1457 dgains
[0] = dgains
[1] = dgains
[2] = dgains
[3] = short_gain
;
1458 /* Short digital gain */
1459 ret
= fimc_is_sensor_write16_array(client
, 0x020E, dgains
, 4);
1463 #ifdef DEBUG_SENSOR_TIME
1464 do_gettimeofday(&end
);
1465 dbg_sensor("[%s] time %lu us\n", __func__
, (end
.tv_sec
- st
.tv_sec
)*1000000 + (end
.tv_usec
- st
.tv_usec
));
1470 hold
= sensor_3p8sp_cis_group_param_hold_func(subdev
, 0x00);
1478 int sensor_3p8sp_cis_get_digital_gain(struct v4l2_subdev
*subdev
, u32
*dgain
)
1482 struct fimc_is_cis
*cis
;
1483 struct i2c_client
*client
;
1485 u16 digital_gain
= 0;
1487 #ifdef DEBUG_SENSOR_TIME
1488 struct timeval st
, end
;
1490 do_gettimeofday(&st
);
1496 cis
= (struct fimc_is_cis
*)v4l2_get_subdevdata(subdev
);
1500 client
= cis
->client
;
1501 if (unlikely(!client
)) {
1502 err("client is NULL");
1507 hold
= sensor_3p8sp_cis_group_param_hold_func(subdev
, 0x01);
1513 ret
= fimc_is_sensor_read16(client
, 0x020E, &digital_gain
);
1517 *dgain
= sensor_cis_calc_dgain_permile(digital_gain
);
1519 dbg_sensor("[MOD:D:%d] %s, cur_dgain = %d us, digital_gain(%#x)\n",
1520 cis
->id
, __func__
, *dgain
, digital_gain
);
1522 #ifdef DEBUG_SENSOR_TIME
1523 do_gettimeofday(&end
);
1524 dbg_sensor("[%s] time %lu us\n", __func__
, (end
.tv_sec
- st
.tv_sec
)*1000000 + (end
.tv_usec
- st
.tv_usec
));
1529 hold
= sensor_3p8sp_cis_group_param_hold_func(subdev
, 0x00);
1537 int sensor_3p8sp_cis_get_min_digital_gain(struct v4l2_subdev
*subdev
, u32
*min_dgain
)
1540 struct fimc_is_cis
*cis
;
1541 cis_shared_data
*cis_data
;
1543 #ifdef DEBUG_SENSOR_TIME
1544 struct timeval st
, end
;
1546 do_gettimeofday(&st
);
1550 FIMC_BUG(!min_dgain
);
1552 cis
= (struct fimc_is_cis
*)v4l2_get_subdevdata(subdev
);
1555 FIMC_BUG(!cis
->cis_data
);
1557 cis_data
= cis
->cis_data
;
1559 /* 3P8SP cannot read min/max digital gain */
1560 cis_data
->min_digital_gain
[0] = 0x0100;
1562 cis_data
->min_digital_gain
[1] = 1000;
1564 *min_dgain
= cis_data
->min_digital_gain
[1];
1566 dbg_sensor("[%s] code %d, permile %d\n", __func__
,
1567 cis_data
->min_digital_gain
[0], cis_data
->min_digital_gain
[1]);
1569 #ifdef DEBUG_SENSOR_TIME
1570 do_gettimeofday(&end
);
1571 dbg_sensor("[%s] time %lu us\n", __func__
, (end
.tv_sec
- st
.tv_sec
)*1000000 + (end
.tv_usec
- st
.tv_usec
));
1577 int sensor_3p8sp_cis_get_max_digital_gain(struct v4l2_subdev
*subdev
, u32
*max_dgain
)
1580 struct fimc_is_cis
*cis
;
1581 cis_shared_data
*cis_data
;
1583 #ifdef DEBUG_SENSOR_TIME
1584 struct timeval st
, end
;
1586 do_gettimeofday(&st
);
1590 FIMC_BUG(!max_dgain
);
1592 cis
= (struct fimc_is_cis
*)v4l2_get_subdevdata(subdev
);
1595 FIMC_BUG(!cis
->cis_data
);
1597 cis_data
= cis
->cis_data
;
1599 /* 3P8SP cannot read min/max digital gain */
1600 cis_data
->max_digital_gain
[0] = 0x1000;
1602 cis_data
->max_digital_gain
[1] = 16000;
1604 *max_dgain
= cis_data
->max_digital_gain
[1];
1606 dbg_sensor("[%s] code %d, permile %d\n", __func__
,
1607 cis_data
->max_digital_gain
[0], cis_data
->max_digital_gain
[1]);
1609 #ifdef DEBUG_SENSOR_TIME
1610 do_gettimeofday(&end
);
1611 dbg_sensor("[%s] time %lu us\n", __func__
, (end
.tv_sec
- st
.tv_sec
)*1000000 + (end
.tv_usec
- st
.tv_usec
));
1617 static struct fimc_is_cis_ops cis_ops
= {
1618 .cis_init
= sensor_3p8sp_cis_init
,
1619 .cis_log_status
= sensor_3p8sp_cis_log_status
,
1620 .cis_group_param_hold
= sensor_3p8sp_cis_group_param_hold
,
1621 .cis_set_global_setting
= sensor_3p8sp_cis_set_global_setting
,
1622 .cis_mode_change
= sensor_3p8sp_cis_mode_change
,
1623 .cis_set_size
= sensor_3p8sp_cis_set_size
,
1624 .cis_stream_on
= sensor_3p8sp_cis_stream_on
,
1625 .cis_stream_off
= sensor_3p8sp_cis_stream_off
,
1626 .cis_set_exposure_time
= sensor_3p8sp_cis_set_exposure_time
,
1627 .cis_get_min_exposure_time
= sensor_3p8sp_cis_get_min_exposure_time
,
1628 .cis_get_max_exposure_time
= sensor_3p8sp_cis_get_max_exposure_time
,
1629 .cis_adjust_frame_duration
= sensor_3p8sp_cis_adjust_frame_duration
,
1630 .cis_set_frame_duration
= sensor_3p8sp_cis_set_frame_duration
,
1631 .cis_set_frame_rate
= sensor_3p8sp_cis_set_frame_rate
,
1632 .cis_adjust_analog_gain
= sensor_3p8sp_cis_adjust_analog_gain
,
1633 .cis_set_analog_gain
= sensor_3p8sp_cis_set_analog_gain
,
1634 .cis_get_analog_gain
= sensor_3p8sp_cis_get_analog_gain
,
1635 .cis_get_min_analog_gain
= sensor_3p8sp_cis_get_min_analog_gain
,
1636 .cis_get_max_analog_gain
= sensor_3p8sp_cis_get_max_analog_gain
,
1637 .cis_set_digital_gain
= sensor_3p8sp_cis_set_digital_gain
,
1638 .cis_get_digital_gain
= sensor_3p8sp_cis_get_digital_gain
,
1639 .cis_get_min_digital_gain
= sensor_3p8sp_cis_get_min_digital_gain
,
1640 .cis_get_max_digital_gain
= sensor_3p8sp_cis_get_max_digital_gain
,
1641 .cis_compensate_gain_for_extremely_br
= sensor_cis_compensate_gain_for_extremely_br
,
1642 .cis_wait_streamoff
= sensor_cis_wait_streamoff
,
1643 .cis_wait_streamon
= sensor_cis_wait_streamon
,
1646 static int cis_3p8sp_probe(struct i2c_client
*client
,
1647 const struct i2c_device_id
*id
)
1651 struct fimc_is_core
*core
= NULL
;
1652 struct v4l2_subdev
*subdev_cis
= NULL
;
1653 struct fimc_is_cis
*cis
= NULL
;
1654 struct fimc_is_device_sensor
*device
= NULL
;
1655 struct fimc_is_device_sensor_peri
*sensor_peri
= NULL
;
1657 char const *setfile
;
1659 struct device_node
*dnode
;
1662 FIMC_BUG(!fimc_is_dev
);
1664 core
= (struct fimc_is_core
*)dev_get_drvdata(fimc_is_dev
);
1666 probe_info("core device is not yet probed");
1667 return -EPROBE_DEFER
;
1671 dnode
= dev
->of_node
;
1673 ret
= of_property_read_u32(dnode
, "id", &sensor_id
);
1675 err("sensor id read is fail(%d)\n", ret
);
1679 probe_info("%s sensor id %d\n", __func__
, sensor_id
);
1681 device
= &core
->sensor
[sensor_id
];
1683 sensor_peri
= find_peri_by_cis_id(device
, SENSOR_NAME_S5K3P8SP
);
1685 probe_info("sensor peri is net yet probed");
1686 return -EPROBE_DEFER
;
1689 cis
= &sensor_peri
->cis
;
1696 subdev_cis
= kzalloc(sizeof(struct v4l2_subdev
), GFP_KERNEL
);
1698 probe_err("subdev_cis NULL");
1702 sensor_peri
->subdev_cis
= subdev_cis
;
1704 cis
->id
= SENSOR_NAME_S5K3P8SP
;
1705 cis
->subdev
= subdev_cis
;
1707 cis
->client
= client
;
1708 sensor_peri
->module
->client
= cis
->client
;
1709 cis
->ctrl_delay
= N_PLUS_TWO_FRAME
;
1711 cis
->cis_data
= kzalloc(sizeof(cis_shared_data
), GFP_KERNEL
);
1712 if (!cis
->cis_data
) {
1713 err("cis_data is NULL");
1717 cis
->cis_ops
= &cis_ops
;
1719 /* belows are depend on sensor cis. MUST check sensor spec */
1720 cis
->bayer_order
= OTF_INPUT_ORDER_BAYER_GR_BG
;
1722 if (of_property_read_bool(dnode
, "sensor_f_number")) {
1723 ret
= of_property_read_u32(dnode
, "sensor_f_number", &cis
->aperture_num
);
1725 warn("f-number read is fail(%d)", ret
);
1727 cis
->aperture_num
= F1_9
;
1730 probe_info("%s f-number %d\n", __func__
, cis
->aperture_num
);
1732 cis
->use_dgain
= true;
1733 cis
->hdr_ctrl_by_again
= false;
1735 ret
= of_property_read_string(dnode
, "setfile", &setfile
);
1737 err("setfile index read fail(%d), take default setfile!!", ret
);
1738 setfile
= "default";
1741 if (strcmp(setfile
, "default") == 0 ||
1742 strcmp(setfile
, "setA") == 0) {
1743 probe_info("%s : setfile_A for Non-PDAF\n", __func__
);
1744 sensor_3p8sp_global
= sensor_3p8sp_setfile_A_Global
;
1745 sensor_3p8sp_global_size
= ARRAY_SIZE(sensor_3p8sp_setfile_A_Global
);
1746 sensor_3p8sp_setfiles
= sensor_3p8sp_setfiles_A
;
1747 sensor_3p8sp_setfile_sizes
= sensor_3p8sp_setfile_A_sizes
;
1748 sensor_3p8sp_max_setfile_num
= ARRAY_SIZE(sensor_3p8sp_setfiles_A
);
1749 sensor_3p8sp_pllinfos
= sensor_3p8sp_pllinfos_A
;
1750 } else if (strcmp(setfile
, "setB") == 0) {
1751 probe_info("%s setfile_B for PDAF\n", __func__
);
1752 sensor_3p8sp_global
= sensor_3p8sp_setfile_B_Global
;
1753 sensor_3p8sp_global_size
= ARRAY_SIZE(sensor_3p8sp_setfile_B_Global
);
1754 sensor_3p8sp_setfiles
= sensor_3p8sp_setfiles_B
;
1755 sensor_3p8sp_setfile_sizes
= sensor_3p8sp_setfile_B_sizes
;
1756 sensor_3p8sp_max_setfile_num
= ARRAY_SIZE(sensor_3p8sp_setfiles_B
);
1757 sensor_3p8sp_pllinfos
= sensor_3p8sp_pllinfos_B
;
1759 err("%s setfile index out of bound, take default (setfile_A)", __func__
);
1760 sensor_3p8sp_global
= sensor_3p8sp_setfile_A_Global
;
1761 sensor_3p8sp_global_size
= ARRAY_SIZE(sensor_3p8sp_setfile_A_Global
);
1762 sensor_3p8sp_setfiles
= sensor_3p8sp_setfiles_A
;
1763 sensor_3p8sp_setfile_sizes
= sensor_3p8sp_setfile_A_sizes
;
1764 sensor_3p8sp_max_setfile_num
= ARRAY_SIZE(sensor_3p8sp_setfiles_A
);
1765 sensor_3p8sp_pllinfos
= sensor_3p8sp_pllinfos_A
;
1768 v4l2_i2c_subdev_init(subdev_cis
, client
, &subdev_ops
);
1769 v4l2_set_subdevdata(subdev_cis
, cis
);
1770 v4l2_set_subdev_hostdata(subdev_cis
, device
);
1771 snprintf(subdev_cis
->name
, V4L2_SUBDEV_NAME_SIZE
, "cis-subdev.%d", cis
->id
);
1773 probe_info("%s done\n", __func__
);
1779 static const struct of_device_id sensor_cis_3p8sp_match
[] = {
1781 .compatible
= "samsung,exynos5-fimc-is-cis-3p8sp",
1785 MODULE_DEVICE_TABLE(of
, sensor_cis_3p8sp_match
);
1787 static const struct i2c_device_id sensor_cis_3p8sp_idt
[] = {
1792 static struct i2c_driver sensor_cis_3p8sp_driver
= {
1793 .probe
= cis_3p8sp_probe
,
1795 .name
= SENSOR_NAME
,
1796 .owner
= THIS_MODULE
,
1797 .of_match_table
= sensor_cis_3p8sp_match
,
1798 .suppress_bind_attrs
= true,
1800 .id_table
= sensor_cis_3p8sp_idt
1803 static int __init
sensor_cis_3p8sp_init(void)
1807 ret
= i2c_add_driver(&sensor_cis_3p8sp_driver
);
1809 err("failed to add %s driver: %d\n",
1810 sensor_cis_3p8sp_driver
.driver
.name
, ret
);
1814 late_initcall_sync(sensor_cis_3p8sp_init
);