• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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