1 /*
2 * A V4L2 driver for nvp6324 cameras and AHD Coax protocol.
3 *
4 * Copyright (c) 2017 by Allwinnertech Co., Ltd. http://www.allwinnertech.com
5 *
6 * Authors: Li Huiyu <lihuiyu@allwinnertech.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12
13 #include <linux/string.h>
14 #include <linux/delay.h>
15
16 #include "jaguar1_common.h"
17 #include "jaguar1_video_eq.h"
18 #include "jaguar1_cableA_video_eq_table.h"
19 #include "jaguar1_reg_set_def.h"
20 #include "jaguar1_video.h"
21 #include "../sensor_helper.h"
22
23 #define SENSOR_NAME "nvp6324_mipi"
24
NC_VD_EQ_FindFormatDef(NC_VIVO_CH_FORMATDEF format_standard,NC_ANALOG_INPUT analog_input)25 NC_JAGUAR1_EQ NC_VD_EQ_FindFormatDef(NC_VIVO_CH_FORMATDEF format_standard, NC_ANALOG_INPUT analog_input)
26 {
27 int ii;
28
29 for (ii = 0; ii < NC_EQ_SETTING_FMT_MAX; ii++) {
30 _jaguar1_video_eq_value_table_s *pFmt = &equalizer_value_fmtdef_cableA[ii];
31
32 if (pFmt->video_fmt == format_standard)
33 if (pFmt->analog_input == analog_input)
34 return ii;
35 }
36
37 sensor_dbg("NC_VD_EQ_FindFormatDef UNKNOWN format!!!\n");
38
39 return NC_EQ_SETTING_FMT_UNKNOWN;
40 }
41
__eq_base_set_value(video_equalizer_info_s * pvin_eq_set,video_equalizer_base_s * pbase)42 void __eq_base_set_value(video_equalizer_info_s *pvin_eq_set, video_equalizer_base_s *pbase)
43 {
44 unsigned char ch = pvin_eq_set->Ch;
45 unsigned char dist = pvin_eq_set->stage;
46
47 REG_SET_5x65_0_8_EQ_BYPASS(ch, pbase->eq_bypass[dist]);
48 REG_SET_5x58_0_8_EQ_BAND_SEL(ch, pbase->eq_band_sel[dist]);
49 REG_SET_5x5C_0_8_EQ_GAIN_SEL(ch, pbase->eq_gain_sel[dist]);
50 REG_SET_Ax3D_0_8_EQ_DEQ_A_ON(ch, pbase->deq_a_on[dist]);
51 REG_SET_Ax3C_0_8_EQ_DEQ_A_SEL(ch, pbase->deq_a_sel[dist]);
52
53 }
54
__eq_coeff_set_value(video_equalizer_info_s * pvin_eq_set,video_equalizer_coeff_s * pcoeff)55 void __eq_coeff_set_value(video_equalizer_info_s *pvin_eq_set, video_equalizer_coeff_s *pcoeff)
56 {
57
58 unsigned char ch = pvin_eq_set->Ch;
59 unsigned char dist = pvin_eq_set->stage;
60
61 REG_SET_Ax30_0_8_EQ_DEQ_A_01(ch, pcoeff->deqA_01[dist]);
62 REG_SET_Ax31_0_8_EQ_DEQ_A_02(ch, pcoeff->deqA_02[dist]);
63 REG_SET_Ax32_0_8_EQ_DEQ_A_03(ch, pcoeff->deqA_03[dist]);
64 REG_SET_Ax33_0_8_EQ_DEQ_A_04(ch, pcoeff->deqA_04[dist]);
65 REG_SET_Ax34_0_8_EQ_DEQ_A_05(ch, pcoeff->deqA_05[dist]);
66 REG_SET_Ax35_0_8_EQ_DEQ_A_06(ch, pcoeff->deqA_06[dist]);
67 REG_SET_Ax36_0_8_EQ_DEQ_A_07(ch, pcoeff->deqA_07[dist]);
68 REG_SET_Ax37_0_8_EQ_DEQ_A_08(ch, pcoeff->deqA_08[dist]);
69 REG_SET_Ax38_0_8_EQ_DEQ_A_09(ch, pcoeff->deqA_09[dist]);
70 REG_SET_Ax39_0_8_EQ_DEQ_A_10(ch, pcoeff->deqA_10[dist]);
71 REG_SET_Ax3A_0_8_EQ_DEQ_A_11(ch, pcoeff->deqA_11[dist]);
72 REG_SET_Ax3B_0_8_EQ_DEQ_A_12(ch, pcoeff->deqA_12[dist]);
73
74 }
75
__eq_color_set_value(video_equalizer_info_s * pvin_eq_set,video_equalizer_color_s * pcolor)76 void __eq_color_set_value(video_equalizer_info_s *pvin_eq_set, video_equalizer_color_s *pcolor)
77 {
78 unsigned char ch = pvin_eq_set->Ch;
79 unsigned char dist = pvin_eq_set->stage;
80
81 REG_SET_0x24_0_8_EQ_COLOR_CONTRAST(ch, pcolor->contrast[dist]);
82 REG_SET_0x30_0_8_EQ_COLOR_H_PEAKING_1(ch, pcolor->y_peaking_mode[dist]);
83 REG_SET_0x34_0_8_EQ_COLOR_H_PEAKING_2(ch, pcolor->y_fir_mode[dist]);
84
85
86 REG_SET_5x31_0_8_EQ_COLOR_C_FILTER(ch, pcolor->c_filter[dist]);
87
88
89 REG_SET_0x5c_0_8_EQ_PAL_CM_OFF(ch, pcolor->pal_cm_off[dist]);
90
91 REG_SET_0x40_0_8_EQ_COLOR_HUE(ch, pcolor->hue[dist]);
92 REG_SET_0x44_0_8_EQ_COLOR_U_GAIN(ch, pcolor->u_gain[dist]);
93 REG_SET_0x48_0_8_EQ_COLOR_V_GAIN(ch, pcolor->v_gain[dist]);
94 REG_SET_0x4C_0_8_EQ_COLOR_U_OFFSET(ch, pcolor->u_offset[dist]);
95 REG_SET_0x50_0_8_EQ_COLOR_V_OFFSET(ch, pcolor->v_offset[dist]);
96 REG_SET_0x28_0_8_EQ_COLOR_BLACK_LEVEL(ch, pcolor->black_level[dist]);
97
98 REG_SET_5x27_0_8_EQ_COLOR_ACC_REF(ch, pcolor->acc_ref[dist]);
99 REG_SET_5x28_0_8_EQ_COLOR_CTI_DELAY(ch, pcolor->cti_delay[dist]);
100 REG_SET_5x2b_0_8_EQ_COLOR_SUB_SATURATION(ch, pcolor->saturation_b[dist]);
101 REG_SET_5x24_0_8_EQ_COLOR_BURST_DEC_A(ch, pcolor->burst_dec_a[dist]);
102 REG_SET_5x5F_0_8_EQ_COLOR_BURST_DEC_B(ch, pcolor->burst_dec_b[dist]);
103 REG_SET_5xD1_0_8_EQ_COLOR_BURST_DEC_C(ch, pcolor->burst_dec_c[dist]);
104 REG_SET_5xD5_0_8_EQ_COLOR_C_OPTION(ch, pcolor->c_option[dist]);
105 REG_SET_Ax25_0_8_EQ_COLOR_Y_FILTER_B(ch, pcolor->y_filter_b[dist]);
106 REG_SET_Ax27_0_8_EQ_COLOR_Y_FILTER_B_SEL(ch, pcolor->y_filter_b_sel[dist]);
107
108 }
109
__eq_timing_a_set_value(video_equalizer_info_s * pvin_eq_set,video_equalizer_timing_a_s * ptiming_a)110 void __eq_timing_a_set_value(video_equalizer_info_s *pvin_eq_set, video_equalizer_timing_a_s *ptiming_a)
111 {
112 unsigned char ch = pvin_eq_set->Ch;
113 unsigned char dist = pvin_eq_set->stage;
114
115 REG_SET_0x68_0_8_EQ_TIMING_A_H_DELAY_A(ch, ptiming_a->h_delay_a[dist]);
116 REG_SET_5x38_0_8_EQ_TIMING_A_H_DELAY_B(ch, ptiming_a->h_delay_b[dist]);
117 REG_SET_0x6C_0_4_EQ_TIMING_A_H_DELAY_C(ch, ptiming_a->h_delay_c[dist]);
118
119 REG_SET_0x64_0_8_EQ_TIMING_A_Y_DELAY(ch, ptiming_a->y_delay[dist]);
120
121 }
122
__eq_clk_set_value(video_equalizer_info_s * pvin_eq_set,video_equalizer_clk_s * pclk)123 void __eq_clk_set_value(video_equalizer_info_s *pvin_eq_set, video_equalizer_clk_s *pclk)
124 {
125 unsigned char ch = pvin_eq_set->Ch;
126 unsigned char dist = pvin_eq_set->stage;
127
128 REG_SET_1x84_0_8_EQ_CLOCK_ADC_CLK(ch, pclk->clk_adc[dist]);
129 REG_SET_1x88_0_8_EQ_CLOCK_PRE_CLK(ch, pclk->clk_adc_pre[dist]);
130 REG_SET_1x8C_0_8_EQ_CLOCK_POST_CLK(ch, pclk->clk_adc_post[dist]);
131
132 }
__eq_timing_b_set_value(video_equalizer_info_s * pvin_eq_set,video_equalizer_timing_b_s * ptiming_b)133 static void __eq_timing_b_set_value(video_equalizer_info_s *pvin_eq_set, video_equalizer_timing_b_s *ptiming_b)
134 {
135 unsigned char ch = pvin_eq_set->Ch;
136 unsigned char dist = pvin_eq_set->stage;
137
138 REG_SET_9x96_0_8_EQ_TIMING_B_HSCALER_1(ch, ptiming_b->h_scaler1[dist]);
139 REG_SET_9x97_0_8_EQ_TIMING_B_HSCALER_2(ch, ptiming_b->h_scaler2[dist]);
140 REG_SET_9x98_0_8_EQ_TIMING_B_HSCALER_3(ch, ptiming_b->h_scaler3[dist]);
141 REG_SET_9x99_0_8_EQ_TIMING_B_HSCALER_4(ch, ptiming_b->h_scaler4[dist]);
142 REG_SET_9x9A_0_8_EQ_TIMING_B_HSCALER_5(ch, ptiming_b->h_scaler5[dist]);
143 REG_SET_9x9B_0_8_EQ_TIMING_B_HSCALER_6(ch, ptiming_b->h_scaler6[dist]);
144 REG_SET_9x9C_0_8_EQ_TIMING_B_HSCALER_7(ch, ptiming_b->h_scaler7[dist]);
145 REG_SET_9x9D_0_8_EQ_TIMING_B_HSCALER_8(ch, ptiming_b->h_scaler8[dist]);
146 REG_SET_9x9E_0_8_EQ_TIMING_B_HSCALER_9(ch, ptiming_b->h_scaler9[dist]);
147 REG_SET_9x40_0_8_EQ_TIMING_B_PN_AUTO(ch, ptiming_b->pn_auto[dist]);
148 REG_SET_5x90_0_8_EQ_TIMINING_B_COMB_MODE(ch, ptiming_b->comb_mode[dist]);
149 REG_SET_5xB9_0_8_EQ_TIMING_B_HPLL_OP_A(ch, ptiming_b->h_pll_op_a[dist]);
150 REG_SET_5x57_0_8_EQ_TIMING_B_MEM_PATH(ch, ptiming_b->mem_path[dist]);
151 REG_SET_5x25_0_8_EQ_TIMING_B_FSC_LOCK_SPD(ch, ptiming_b->fsc_lock_speed[dist]);
152
153 REG_SET_0x04_0_8_EQ_TIMING_B_SD_MD(ch, ptiming_b->sd_mode[dist]);
154 REG_SET_0x08_0_8_EQ_TIMING_B_AHD_MD(ch, ptiming_b->ahd_mode[dist]);
155 REG_SET_0x0C_0_8_EQ_TIMING_B_SPECIAL_MD(ch, ptiming_b->spl_mode[dist]);
156 REG_SET_0x78_0_8_EQ_TIMING_B_VBLK_END(ch, ptiming_b->vblk_end[dist]);
157
158 REG_SET_5x1D_0_8_EQ_AFE_G_SEL(ch, ptiming_b->afe_g_sel[dist]);
159 REG_SET_5x01_0_8_EQ_AFE_CTR_CLP(ch, ptiming_b->afe_ctr_clp[dist]);
160 REG_SET_5x05_0_8_EQ_D_AGC_OPTION(ch, ptiming_b->d_agc_option[dist]);
161
162 }
163
video_input_eq_val_set(video_equalizer_info_s * pvin_eq_set)164 void video_input_eq_val_set(video_equalizer_info_s *pvin_eq_set)
165 {
166 NC_JAGUAR1_EQ eq_fmt;
167 __maybe_unused unsigned char ch = pvin_eq_set->Ch;
168 int fmt = pvin_eq_set->FmtDef;
169 int input = pvin_eq_set->Input;
170 int cable = pvin_eq_set->Cable;
171 /*int stage = pvin_eq_set->stage;*/
172 _jaguar1_video_eq_value_table_s eq_value;
173
174 eq_fmt = NC_VD_EQ_FindFormatDef(fmt, input);
175
176 if (cable == CABLE_A)
177 eq_value = (_jaguar1_video_eq_value_table_s)equalizer_value_fmtdef_cableA[eq_fmt];
178 else if (cable == CABLE_B)
179 eq_value = (_jaguar1_video_eq_value_table_s)equalizer_value_fmtdef_cableA[eq_fmt];
180 else if (cable == CABLE_C)
181 eq_value = (_jaguar1_video_eq_value_table_s)equalizer_value_fmtdef_cableA[eq_fmt];
182 else if (cable == CABLE_D)
183 eq_value = (_jaguar1_video_eq_value_table_s)equalizer_value_fmtdef_cableA[eq_fmt];
184 else
185 eq_value = (_jaguar1_video_eq_value_table_s)equalizer_value_fmtdef_cableA[eq_fmt];
186
187 if (eq_value.name == NULL) {
188 sensor_dbg("[drv_eq]Error - Unknown EQ Table!!\n");
189 return;
190 } else {
191 /* set_eq_value */
192 __eq_base_set_value(pvin_eq_set, &eq_value.eq_base);
193 __eq_coeff_set_value(pvin_eq_set, &eq_value.eq_coeff);
194 __eq_color_set_value(pvin_eq_set, &eq_value.eq_color);
195 __eq_timing_a_set_value(pvin_eq_set, &eq_value.eq_timing_a);
196 __eq_clk_set_value(pvin_eq_set, &eq_value.eq_clk);
197 __eq_timing_b_set_value(pvin_eq_set, &eq_value.eq_timing_b);
198
199 if (AHD20_SD_H960_2EX_Btype_NT_SINGLE_ENDED || AHD20_SD_H960_2EX_Btype_NT_DIFFERENTIAL) {
200
201 } else if (AHD20_SD_H960_2EX_Btype_PAL_SINGLE_ENDED || AHD20_SD_H960_2EX_Btype_PAL_DIFFERENTIAL) {
202
203 } else {
204
205 }
206 sensor_dbg("[drv_eq]ch::%d >>> fmt::%s\n", ch, eq_value.name);
207 }
208 }
209
210
video_input_eq_cable_set(video_equalizer_info_s * pvin_eq_set)211 void video_input_eq_cable_set(video_equalizer_info_s *pvin_eq_set)
212 {
213 /*unsigned char ch = pvin_eq_set->Ch;
214 int cable = pvin_eq_set->Cable;
215
216 sensor_dbg("[DRV]video_input_eq_cable_set::ch(%d) cable(%d)\n", ch, cable); */
217 }
218
video_input_eq_analog_input_set(video_equalizer_info_s * pvin_eq_set)219 void video_input_eq_analog_input_set(video_equalizer_info_s *pvin_eq_set)
220 {
221 unsigned char ch = pvin_eq_set->Ch;
222 int input = pvin_eq_set->Input;
223
224 REG_SET_0x18_0_8_EX_CBAR_ON(ch, 0x13);
225
226 if (input == DIFFERENTIAL) {
227 REG_SET_5x00_0_8_CMP(ch, 0xd0);
228 REG_SET_5x01_0_8_CML(ch, 0x2c);
229 REG_SET_5x1D_0_8_AFE(ch, 0x8c);
230 REG_SET_5x92_0_8_PWM(ch, 0x00);
231 } else if (input == SINGLE_ENDED) {
232 REG_SET_5x00_0_8_CMP(ch, 0xd0);
233 REG_SET_5x01_0_8_CML(ch, 0xa2);
234 REG_SET_5x92_0_8_PWM(ch, 0x00);
235 } else {
236 sensor_dbg("Jaguar1 Analog Input Setting Fail !!!\n");
237 }
238
239 sensor_dbg("[DRV]video_input_eq_analog_input_set::ch(%d) input(%d)\n", ch, input);
240 }
241
242