2 cx231xx_avcore.c - driver for Conexant Cx23100/101/102 USB video capture devices
4 Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
6 This program contains the specific code to control the avdecoder chip and
7 other related usb control functions for cx231xx based chipset.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include <linux/init.h>
25 #include <linux/list.h>
26 #include <linux/module.h>
27 #include <linux/kernel.h>
28 #include <linux/bitmap.h>
29 #include <linux/usb.h>
30 #include <linux/i2c.h>
31 #include <linux/version.h>
33 #include <linux/mutex.h>
35 #include <media/v4l2-common.h>
36 #include <media/v4l2-ioctl.h>
37 #include <media/v4l2-chip-ident.h>
42 /*************************************************************************************
43 * C O L I B R I - B L O C K C O N T R O L functions *
44 *************************************************************************************/
45 int cx231xx_colibri_init_super_block(struct cx231xx *dev, u32 ref_count)
49 u32 colibri_power_status = 0;
52 /* super block initialize */
53 temp = (u8)(ref_count & 0xff);
54 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, SUP_BLK_TUNE2, 2, temp, 1);
56 status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS, SUP_BLK_TUNE2, 2, &colibri_power_status, 1);
58 temp = (u8)((ref_count & 0x300) >> 8);
60 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, SUP_BLK_TUNE1, 2, temp, 1);
61 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, SUP_BLK_PLL2, 2, 0x0f, 1);
64 while(colibri_power_status != 0x18)
66 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, SUP_BLK_PWRDN, 2, 0x18, 1);
67 status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS, SUP_BLK_PWRDN, 2, &colibri_power_status, 1);
68 colibri_power_status &= 0xff;
70 cx231xx_info(": Init Super Block failed in sending/receiving cmds\n");
75 cx231xx_info(": Init Super Block force break in loop !!!!\n");
84 /* start tuning filter */
85 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, SUP_BLK_TUNE3, 2, 0x40, 1);
89 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, SUP_BLK_TUNE3, 2, 0x00, 1);
94 int cx231xx_colibri_init_channels(struct cx231xx *dev)
98 /* power up all 3 channels, clear pd_buffer */
99 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_PWRDN_CLAMP_CH1, 2, 0x00, 1);
100 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_PWRDN_CLAMP_CH2, 2, 0x00, 1);
101 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_PWRDN_CLAMP_CH3, 2, 0x00, 1);
103 /* Enable quantizer calibration */
104 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_COM_QUANT, 2, 0x02, 1);
106 /* channel initialize, force modulator (fb) reset */
107 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_FB_FRCRST_CH1, 2, 0x17, 1);
108 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_FB_FRCRST_CH2, 2, 0x17, 1);
109 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_FB_FRCRST_CH3, 2, 0x17, 1);
111 /* start quantilizer calibration */
112 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_CAL_ATEST_CH1, 2, 0x10, 1);
113 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_CAL_ATEST_CH2, 2, 0x10, 1);
114 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_CAL_ATEST_CH3, 2, 0x10, 1);
117 /* exit modulator (fb) reset */
118 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_FB_FRCRST_CH1, 2, 0x07, 1);
119 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_FB_FRCRST_CH2, 2, 0x07, 1);
120 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_FB_FRCRST_CH3, 2, 0x07, 1);
122 /* enable the pre_clamp in each channel for single-ended input */
123 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_NTF_PRECLMP_EN_CH1, 2, 0xf0, 1);
124 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_NTF_PRECLMP_EN_CH2, 2, 0xf0, 1);
125 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_NTF_PRECLMP_EN_CH3, 2, 0xf0, 1);
127 /* use diode instead of resistor, so set term_en to 0, res_en to 0 */
128 status = cx231xx_reg_mask_write(dev, Colibri_DEVICE_ADDRESS, 8, ADC_QGAIN_RES_TRM_CH1, 3, 7, 0x00);
129 status = cx231xx_reg_mask_write(dev, Colibri_DEVICE_ADDRESS, 8, ADC_QGAIN_RES_TRM_CH2, 3, 7, 0x00);
130 status = cx231xx_reg_mask_write(dev, Colibri_DEVICE_ADDRESS, 8, ADC_QGAIN_RES_TRM_CH3, 3, 7, 0x00);
132 /* dynamic element matching off */
133 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_DCSERVO_DEM_CH1, 2, 0x03, 1);
134 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_DCSERVO_DEM_CH2, 2, 0x03, 1);
135 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_DCSERVO_DEM_CH3, 2, 0x03, 1);
140 int cx231xx_colibri_setup_AFE_for_baseband(struct cx231xx *dev)
145 status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_PWRDN_CLAMP_CH2, 2, &c_value, 1);
146 c_value &= (~(0x50));
147 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_PWRDN_CLAMP_CH2, 2, c_value, 1);
154 channel 1 ----- pin 1 to pin4(in reg is 1-4)
155 channel 2 ----- pin 5 to pin8(in reg is 5-8)
156 channel 3 ----- pin 9 to pin 12(in reg is 9-11)
158 int cx231xx_colibri_set_input_mux(struct cx231xx *dev, u32 input_mux)
160 u8 ch1_setting = (u8)input_mux;
161 u8 ch2_setting = (u8)(input_mux >> 8);
162 u8 ch3_setting = (u8)(input_mux >> 16);
168 status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_INPUT_CH1, 2, &value, 1);
169 value &= (!INPUT_SEL_MASK);
170 value |= (ch1_setting-1)<<4;
172 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_INPUT_CH1, 2, value, 1);
177 status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_INPUT_CH2, 2, &value, 1);
178 value &= (!INPUT_SEL_MASK);
179 value |= (ch2_setting-1)<<4;
181 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_INPUT_CH2, 2, value, 1);
184 /* For ch3_setting, the value to put in the register is 7 less than the input number */
187 status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_INPUT_CH3, 2, &value, 1);
188 value &= (!INPUT_SEL_MASK);
189 value |= (ch3_setting-1)<<4;
191 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_INPUT_CH3, 2, value, 1);
197 int cx231xx_colibri_set_mode(struct cx231xx *dev, enum AFE_MODE mode)
202 case AFE_MODE_LOW_IF:
203 /* SetupAFEforLowIF(); */
205 case AFE_MODE_BASEBAND:
206 status = cx231xx_colibri_setup_AFE_for_baseband(dev);
208 case AFE_MODE_EU_HI_IF:
209 /* SetupAFEforEuHiIF(); */
211 case AFE_MODE_US_HI_IF:
212 /* SetupAFEforUsHiIF(); */
214 case AFE_MODE_JAPAN_HI_IF:
215 /* SetupAFEforJapanHiIF(); */
219 if((mode != dev->colibri_mode) && (dev->video_input == CX231XX_VMUX_TELEVISION)) {
220 status = cx231xx_colibri_adjust_ref_count(dev, CX231XX_VMUX_TELEVISION);
223 dev->colibri_mode = mode;
228 /* For power saving in the EVK */
229 int cx231xx_colibri_update_power_control(struct cx231xx *dev, AV_MODE avmode)
231 u32 colibri_power_status = 0;
234 switch (dev->model) {
235 case CX231XX_BOARD_CNXT_RDE_250:
236 case CX231XX_BOARD_CNXT_RDU_250:
238 if(avmode==POLARIS_AVMODE_ANALOGT_TV)
240 while(colibri_power_status != 0x18) {
241 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
242 SUP_BLK_PWRDN, 2, 0x18, 1);
243 status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS,
244 SUP_BLK_PWRDN, 2, &colibri_power_status, 1);
249 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
250 ADC_PWRDN_CLAMP_CH1, 2, 0x00, 1);
251 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
252 ADC_PWRDN_CLAMP_CH2, 2, 0x00, 1);
253 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
254 ADC_PWRDN_CLAMP_CH3, 2, 0x00, 1);
256 else if(avmode==POLARIS_AVMODE_DIGITAL) {
257 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
258 ADC_PWRDN_CLAMP_CH1, 2, 0x70, 1);
259 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
260 ADC_PWRDN_CLAMP_CH2, 2, 0x70, 1);
261 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
262 ADC_PWRDN_CLAMP_CH3, 2, 0x70, 1);
264 status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS,
265 SUP_BLK_PWRDN, 2, &colibri_power_status, 1);
266 colibri_power_status |=0x07;
267 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
268 SUP_BLK_PWRDN, 2, colibri_power_status, 1);
270 else if(avmode==POLARIS_AVMODE_ENXTERNAL_AV) {
272 while(colibri_power_status != 0x18) {
273 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
274 SUP_BLK_PWRDN, 2, 0x18, 1);
275 status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS,
276 SUP_BLK_PWRDN, 2, &colibri_power_status, 1);
281 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
282 ADC_PWRDN_CLAMP_CH1, 2, 0x00, 1);
283 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
284 ADC_PWRDN_CLAMP_CH2, 2, 0x00, 1);
285 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
286 ADC_PWRDN_CLAMP_CH3, 2, 0x00, 1);
289 cx231xx_info("Invalid AV mode input\n");
294 if(avmode==POLARIS_AVMODE_ANALOGT_TV)
296 while(colibri_power_status != 0x18) {
297 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
298 SUP_BLK_PWRDN, 2, 0x18, 1);
299 status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS,
300 SUP_BLK_PWRDN, 2, &colibri_power_status, 1);
305 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
306 ADC_PWRDN_CLAMP_CH1, 2, 0x40, 1);
307 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
308 ADC_PWRDN_CLAMP_CH2, 2, 0x40, 1);
309 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
310 ADC_PWRDN_CLAMP_CH3, 2, 0x00, 1);
312 else if(avmode==POLARIS_AVMODE_DIGITAL) {
313 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
314 ADC_PWRDN_CLAMP_CH1, 2, 0x70, 1);
315 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
316 ADC_PWRDN_CLAMP_CH2, 2, 0x70, 1);
317 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
318 ADC_PWRDN_CLAMP_CH3, 2, 0x70, 1);
320 status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS,
321 SUP_BLK_PWRDN, 2, &colibri_power_status, 1);
322 colibri_power_status |=0x07;
323 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
324 SUP_BLK_PWRDN, 2, colibri_power_status, 1);
326 else if(avmode==POLARIS_AVMODE_ENXTERNAL_AV) {
327 while(colibri_power_status != 0x18) {
328 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
329 SUP_BLK_PWRDN, 2, 0x18, 1);
330 status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS,
331 SUP_BLK_PWRDN, 2, &colibri_power_status, 1);
336 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
337 ADC_PWRDN_CLAMP_CH1, 2, 0x00, 1);
338 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
339 ADC_PWRDN_CLAMP_CH2, 2, 0x00, 1);
340 status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
341 ADC_PWRDN_CLAMP_CH3, 2, 0x40, 1);
344 cx231xx_info("Invalid AV mode input\n");
352 int cx231xx_colibri_adjust_ref_count(struct cx231xx *dev, u32 video_input)
358 dev->video_input = video_input;
360 if(video_input == CX231XX_VMUX_TELEVISION) {
361 status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_INPUT_CH3, 2, &input_mode, 1);
362 status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS,
363 ADC_NTF_PRECLMP_EN_CH3, 2, &ntf_mode, 1);
366 status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_INPUT_CH1, 2, &input_mode, 1);
367 status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS,
368 ADC_NTF_PRECLMP_EN_CH1, 2, &ntf_mode, 1);
371 input_mode = (ntf_mode & 0x3) | ((input_mode & 0x6) << 1);
376 dev->colibri_ref_count = 0x23C;
379 dev->colibri_ref_count = 0x24C;
382 dev->colibri_ref_count = 0x258;
385 dev->colibri_ref_count = 0x260;
391 status = cx231xx_colibri_init_super_block(dev, dev->colibri_ref_count);
398 /*************************************************************************************
399 * V I D E O / A U D I O D E C O D E R C O N T R O L functions *
400 *************************************************************************************/
401 int cx231xx_set_video_input_mux(struct cx231xx *dev, u8 input)
405 switch(INPUT(input)->type) {
406 case CX231XX_VMUX_COMPOSITE1:
407 case CX231XX_VMUX_SVIDEO:
408 if((dev->current_pcb_config.type == USB_BUS_POWER) &&
409 (dev->power_mode != POLARIS_AVMODE_ENXTERNAL_AV)) {
410 status = cx231xx_set_power_mode(dev, POLARIS_AVMODE_ENXTERNAL_AV); /* External AV */
412 cx231xx_errdev("%s: cx231xx_set_power_mode : Failed to set Power - errCode [%d]!\n",
417 status = cx231xx_set_decoder_video_input(dev, INPUT(input)->type, INPUT(input)->vmux);
419 case CX231XX_VMUX_TELEVISION:
420 case CX231XX_VMUX_CABLE:
421 if((dev->current_pcb_config.type == USB_BUS_POWER) &&
422 (dev->power_mode != POLARIS_AVMODE_ANALOGT_TV)) {
423 status = cx231xx_set_power_mode(dev, POLARIS_AVMODE_ANALOGT_TV); /* Tuner */
425 cx231xx_errdev("%s: cx231xx_set_power_mode : Failed to set Power - errCode [%d]!\n",
430 status = cx231xx_set_decoder_video_input(dev, CX231XX_VMUX_COMPOSITE1, INPUT(input)->vmux);
433 cx231xx_errdev("%s: cx231xx_set_power_mode : Unknown Input %d !\n",
434 __func__, INPUT(input)->type);
438 /* save the selection */
439 dev->video_input = input;
444 int cx231xx_set_decoder_video_input(struct cx231xx *dev, u8 pin_type, u8 input)
449 if(pin_type != dev->video_input) {
450 status = cx231xx_colibri_adjust_ref_count(dev, pin_type);
452 cx231xx_errdev("%s: cx231xx_colibri_adjust_ref_count :Failed to set Colibri input mux - errCode [%d]!\n",
458 /* call colibri block to set video inputs */
459 status = cx231xx_colibri_set_input_mux(dev, input);
461 cx231xx_errdev("%s: cx231xx_colibri_set_input_mux :Failed to set Colibri input mux - errCode [%d]!\n",
467 case CX231XX_VMUX_COMPOSITE1:
469 status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AFE_CTRL, 2, &value, 4);
470 value |= (0<<13)|(1<<4);
473 value &= (~(0x1FF8000)); /* set [24:23] [22:15] to 0 */
474 value |= 0x1000000; /* set FUNC_MODE[24:23] = 2 IF_MOD[22:15] = 0 */
475 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AFE_CTRL, 2, value, 4);
477 status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, OUT_CTRL1, 2, &value, 4);
479 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, OUT_CTRL1, 2, value, 4);
481 /* Set vip 1.1 output mode */
482 status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
483 OUT_CTRL1, FLD_OUT_MODE, OUT_MODE_VIP11);
485 /* Tell DIF object to go to baseband mode */
486 status = cx231xx_dif_set_standard(dev, DIF_USE_BASEBAND);
488 cx231xx_errdev("%s: cx231xx_dif set to By pass mode - errCode [%d]!\n",
493 /* Read the DFE_CTRL1 register */
494 status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DFE_CTRL1, 2, &value, 4);
496 /* enable the VBI_GATE_EN */
497 value |= FLD_VBI_GATE_EN;
499 /* Enable the auto-VGA enable */
500 value |= FLD_VGA_AUTO_EN;
503 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DFE_CTRL1, 2, value, 4);
505 /* Disable auto config of registers */
506 status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
507 MODE_CTRL, FLD_ACFG_DIS, cx231xx_set_field(FLD_ACFG_DIS, 1));
509 /* Set CVBS input mode */
510 status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
511 MODE_CTRL, FLD_INPUT_MODE,
512 cx231xx_set_field(FLD_INPUT_MODE, INPUT_MODE_CVBS_0));
515 case CX231XX_VMUX_SVIDEO:
517 /* Disable the use of DIF */
519 status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AFE_CTRL, 2, &value, 4);
521 value &= (~(0x1FF8000)); /* set [24:23] [22:15] to 0 */
522 value |= 0x1000010; /* set FUNC_MODE[24:23] = 2
523 IF_MOD[22:15] = 0 DCR_BYP_CH2[4:4] = 1; */
524 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AFE_CTRL, 2, value, 4);
526 /* Tell DIF object to go to baseband mode */
527 status = cx231xx_dif_set_standard(dev, DIF_USE_BASEBAND);
529 cx231xx_errdev("%s: cx231xx_dif set to By pass mode - errCode [%d]!\n",
534 /* Read the DFE_CTRL1 register */
535 status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DFE_CTRL1, 2, &value, 4);
537 /* enable the VBI_GATE_EN */
538 value |= FLD_VBI_GATE_EN;
540 /* Enable the auto-VGA enable */
541 value |= FLD_VGA_AUTO_EN;
544 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DFE_CTRL1, 2, value, 4);
546 /* Disable auto config of registers */
547 status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
548 MODE_CTRL, FLD_ACFG_DIS, cx231xx_set_field(FLD_ACFG_DIS, 1));
550 /* Set YC input mode */
551 status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
552 MODE_CTRL, FLD_INPUT_MODE,
553 cx231xx_set_field(FLD_INPUT_MODE, INPUT_MODE_YC_1));
556 status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AFE_CTRL, 2, &value, 4);
557 value |= FLD_CHROMA_IN_SEL; /* set the chroma in select */
559 /* Clear VGA_SEL_CH2 and VGA_SEL_CH3 (bits 7 and 8) This sets them to use video
560 rather than audio. Only one of the two will be in use. */
561 value &= ~(FLD_VGA_SEL_CH2 | FLD_VGA_SEL_CH3);
563 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AFE_CTRL, 2, value, 4);
565 status = cx231xx_colibri_set_mode(dev, AFE_MODE_BASEBAND);
568 case CX231XX_VMUX_TELEVISION:
569 case CX231XX_VMUX_CABLE:
573 case CX231XX_BOARD_CNXT_RDE_250:
574 case CX231XX_BOARD_CNXT_RDU_250:
576 /* Disable the use of DIF */
578 status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AFE_CTRL, 2, &value, 4);
579 value |= (0<<13)|(1<<4);
582 value &= (~(0x1FF8000)); /* set [24:23] [22:15] to 0 */
583 value |= 0x1000000; /* set FUNC_MODE[24:23] = 2 IF_MOD[22:15] = 0 */
584 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AFE_CTRL, 2, value, 4);
586 status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, OUT_CTRL1, 2, &value, 4);
588 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, OUT_CTRL1, 2, value, 4);
590 /* Set vip 1.1 output mode */
591 status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
592 OUT_CTRL1, FLD_OUT_MODE, OUT_MODE_VIP11);
594 /* Tell DIF object to go to baseband mode */
595 status = cx231xx_dif_set_standard(dev, DIF_USE_BASEBAND);
597 cx231xx_errdev("%s: cx231xx_dif set to By pass mode - errCode [%d]!\n",
602 /* Read the DFE_CTRL1 register */
603 status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DFE_CTRL1, 2, &value, 4);
605 /* enable the VBI_GATE_EN */
606 value |= FLD_VBI_GATE_EN;
608 /* Enable the auto-VGA enable */
609 value |= FLD_VGA_AUTO_EN;
612 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DFE_CTRL1, 2, value, 4);
614 /* Disable auto config of registers */
615 status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
616 MODE_CTRL, FLD_ACFG_DIS, cx231xx_set_field(FLD_ACFG_DIS, 1));
618 /* Set CVBS input mode */
619 status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
620 MODE_CTRL, FLD_INPUT_MODE,
621 cx231xx_set_field(FLD_INPUT_MODE, INPUT_MODE_CVBS_0));
626 /* Enable the DIF for the tuner */
628 /* Reinitialize the DIF */
629 status = cx231xx_dif_set_standard(dev, dev->norm);
631 cx231xx_errdev("%s: cx231xx_dif set to By pass mode - errCode [%d]!\n",
636 /* Make sure bypass is cleared */
637 status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_MISC_CTRL, 2, &value, 4);
639 /* Clear the bypass bit */
640 value &= ~FLD_DIF_DIF_BYPASS;
642 /* Enable the use of the DIF block */
643 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_MISC_CTRL, 2, value, 4);
645 /* Read the DFE_CTRL1 register */
646 status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DFE_CTRL1, 2, &value, 4);
648 /* Disable the VBI_GATE_EN */
649 value &= ~FLD_VBI_GATE_EN;
651 /* Enable the auto-VGA enable, AGC, and set the skip count to 2 */
652 value |= FLD_VGA_AUTO_EN | FLD_AGC_AUTO_EN | 0x00200000;
655 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DFE_CTRL1, 2, value, 4);
660 /* Disable the auto-VGA enable AGC */
661 value &= ~(FLD_VGA_AUTO_EN);
664 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DFE_CTRL1, 2, value, 4);
666 /* Enable Polaris B0 AGC output */
667 status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, PIN_CTRL, 2, &value, 4);
668 value |=(FLD_OEF_AGC_RF)|(FLD_OEF_AGC_IFVGA)|(FLD_OEF_AGC_IF);
669 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, PIN_CTRL, 2, value, 4);
671 /* Set vip 1.1 output mode */
672 status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
673 OUT_CTRL1, FLD_OUT_MODE, OUT_MODE_VIP11);
675 /* Disable auto config of registers */
676 status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
677 MODE_CTRL, FLD_ACFG_DIS, cx231xx_set_field(FLD_ACFG_DIS, 1));
679 /* Set CVBS input mode */
680 status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
681 MODE_CTRL, FLD_INPUT_MODE,
682 cx231xx_set_field(FLD_INPUT_MODE, INPUT_MODE_CVBS_0));
684 /* Set some bits in AFE_CTRL so that channel 2 or 3 is ready to receive audio */
685 /* Clear clamp for channels 2 and 3 (bit 16-17) */
686 /* Clear droop comp (bit 19-20) */
687 /* Set VGA_SEL (for audio control) (bit 7-8) */
688 status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AFE_CTRL, 2, &value, 4);
690 value |= FLD_VGA_SEL_CH3 | FLD_VGA_SEL_CH2;
692 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AFE_CTRL, 2, value, 4);
701 /* Set raw VBI mode */
702 status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
703 OUT_CTRL1, FLD_VBIHACTRAW_EN,
704 cx231xx_set_field(FLD_VBIHACTRAW_EN, 1));
706 status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, OUT_CTRL1, 2, &value, 4);
709 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, OUT_CTRL1, 2, value, 4);
716 * Handle any video-mode specific overrides that are different on a per video standards
717 * basis after touching the MODE_CTRL register which resets many values for autodetect
719 int cx231xx_do_mode_ctrl_overrides(struct cx231xx *dev)
723 cx231xx_info("do_mode_ctrl_overrides : 0x%x\n", (unsigned int)dev->norm);
725 /* Change the DFE_CTRL3 bp_percent to fix flagging */
726 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DFE_CTRL3, 2, 0xCD3F0280, 4);
728 if( dev->norm & (V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_JP | V4L2_STD_PAL_M) ) {
729 cx231xx_info("do_mode_ctrl_overrides NTSC\n");
731 /* Move the close caption lines out of active video, adjust the active video start point */
732 status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
733 VERT_TIM_CTRL, FLD_VBLANK_CNT,0x18);
734 status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
735 VERT_TIM_CTRL, FLD_VACTIVE_CNT,0x1E6000);
736 status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
737 VERT_TIM_CTRL, FLD_V656BLANK_CNT,0x1E000000);
739 status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
740 HORIZ_TIM_CTRL, FLD_HBLANK_CNT,
741 cx231xx_set_field(FLD_HBLANK_CNT, 0x79));
742 } else if ( dev->norm & ( V4L2_STD_PAL_B | V4L2_STD_PAL_G | V4L2_STD_PAL_D |
743 V4L2_STD_PAL_I | V4L2_STD_PAL_N | V4L2_STD_PAL_Nc) ) {
744 cx231xx_info("do_mode_ctrl_overrides PAL\n");
745 status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
746 VERT_TIM_CTRL, FLD_VBLANK_CNT,0x24);
747 /* Adjust the active video horizontal start point */
748 status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
749 HORIZ_TIM_CTRL, FLD_HBLANK_CNT,
750 cx231xx_set_field(FLD_HBLANK_CNT, 0x85));
751 } else if (dev->norm & ( V4L2_STD_SECAM_B | V4L2_STD_SECAM_D | V4L2_STD_SECAM_G |
752 V4L2_STD_SECAM_K | V4L2_STD_SECAM_K1 | V4L2_STD_SECAM_L |
753 V4L2_STD_SECAM_LC) ) {
754 cx231xx_info("do_mode_ctrl_overrides SECAM\n");
755 status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
756 VERT_TIM_CTRL, FLD_VBLANK_CNT,0x24);
757 /* Adjust the active video horizontal start point */
758 status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
759 HORIZ_TIM_CTRL, FLD_HBLANK_CNT,
760 cx231xx_set_field(FLD_HBLANK_CNT, 0x85));
766 int cx231xx_set_audio_input(struct cx231xx *dev, u8 input)
769 enum AUDIO_INPUT ainput = AUDIO_INPUT_LINE;
771 switch(INPUT(input)->amux) {
772 case CX231XX_AMUX_VIDEO:
773 ainput = AUDIO_INPUT_TUNER_TV;
775 case CX231XX_AMUX_LINE_IN:
776 status = cx231xx_flatiron_set_audio_input(dev, input);
777 ainput = AUDIO_INPUT_LINE;
783 status = cx231xx_set_audio_decoder_input(dev, ainput);
788 int cx231xx_set_audio_decoder_input(struct cx231xx *dev, enum AUDIO_INPUT audio_input)
795 /* Put it in soft reset */
796 status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, GENERAL_CTL, 2, &gen_ctrl, 1);
798 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, GENERAL_CTL, 2, gen_ctrl, 1);
802 case AUDIO_INPUT_LINE:
804 /* setup AUD_IO control from Merlin paralle output */
805 value = cx231xx_set_field(FLD_AUD_CHAN1_SRC, AUD_CHAN_SRC_PARALLEL);
806 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AUD_IO_CTRL, 2, value, 4);
808 /* setup input to Merlin, SRC2 connect to AC97
809 bypass upsample-by-2, slave mode, sony mode, left justify
810 adr 091c, dat 01000000 */
811 status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AC97_CTL, 2, &dwval, 4);
813 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AC97_CTL, 2, (dwval | FLD_AC97_UP2X_BYPASS), 4);
815 /* select the parallel1 and SRC3 */
816 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, BAND_OUT_SEL, 2,
817 cx231xx_set_field(FLD_SRC3_IN_SEL, 0x0)|
818 cx231xx_set_field(FLD_SRC3_CLK_SEL, 0x0)|
819 cx231xx_set_field(FLD_PARALLEL1_SRC_SEL, 0x0), 4);
821 /* unmute all, AC97 in, independence mode
822 adr 08d0, data 0x00063073 */
823 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, PATH1_CTL1, 2, 0x00063073, 4);
825 /* set AVC maximum threshold, adr 08d4, dat ffff0024 */
826 status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, PATH1_VOL_CTL, 2, &dwval, 4);
827 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, PATH1_VOL_CTL, 2,
828 (dwval | FLD_PATH1_AVC_THRESHOLD), 4);
830 /* set SC maximum threshold, adr 08ec, dat ffffb3a3 */
831 status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, PATH1_SC_CTL, 2, &dwval, 4);
832 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, PATH1_SC_CTL, 2,
833 (dwval | FLD_PATH1_SC_THRESHOLD), 4);
836 case AUDIO_INPUT_TUNER_TV:
839 /* Setup SRC sources and clocks */
840 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, BAND_OUT_SEL, 2,
841 cx231xx_set_field(FLD_SRC6_IN_SEL, 0x00)|
842 cx231xx_set_field(FLD_SRC6_CLK_SEL, 0x01)|
843 cx231xx_set_field(FLD_SRC5_IN_SEL, 0x00)|
844 cx231xx_set_field(FLD_SRC5_CLK_SEL, 0x02)|
845 cx231xx_set_field(FLD_SRC4_IN_SEL, 0x02)|
846 cx231xx_set_field(FLD_SRC4_CLK_SEL, 0x03)|
847 cx231xx_set_field(FLD_SRC3_IN_SEL, 0x00)|
848 cx231xx_set_field(FLD_SRC3_CLK_SEL, 0x00)|
849 cx231xx_set_field(FLD_BASEBAND_BYPASS_CTL, 0x00)|
850 cx231xx_set_field(FLD_AC97_SRC_SEL, 0x03)|
851 cx231xx_set_field(FLD_I2S_SRC_SEL, 0x00)|
852 cx231xx_set_field(FLD_PARALLEL2_SRC_SEL, 0x02)|
853 cx231xx_set_field(FLD_PARALLEL1_SRC_SEL, 0x01) , 4);
855 /* Setup the AUD_IO control */
856 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AUD_IO_CTRL, 2,
857 cx231xx_set_field(FLD_I2S_PORT_DIR, 0x00)|
858 cx231xx_set_field(FLD_I2S_OUT_SRC, 0x00)|
859 cx231xx_set_field(FLD_AUD_CHAN3_SRC,0x00)|
860 cx231xx_set_field(FLD_AUD_CHAN2_SRC, 0x00)|
861 cx231xx_set_field(FLD_AUD_CHAN1_SRC,0x03 ), 4);
863 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, PATH1_CTL1, 2, 0x1F063870, 4);
865 /* setAudioStandard(_audio_standard); */
867 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, PATH1_CTL1, 2, 0x00063870, 4);
870 case CX231XX_BOARD_CNXT_RDE_250:
871 case CX231XX_BOARD_CNXT_RDU_250:
872 status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
873 CHIP_CTRL, FLD_SIF_EN,
874 cx231xx_set_field(FLD_SIF_EN, 1));
881 case AUDIO_INPUT_TUNER_FM:
882 /* use SIF for FM radio
884 setAudioStandard(_audio_standard);
888 case AUDIO_INPUT_MUTE:
889 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, PATH1_CTL1, 2, 0x1F011012, 4);
893 /* Take it out of soft reset */
894 status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, GENERAL_CTL, 2, &gen_ctrl, 1);
896 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, GENERAL_CTL, 2, gen_ctrl, 1);
903 /* Set resolution of the video */
904 int cx231xx_resolution_set(struct cx231xx *dev)
911 height = dev->height;
913 get_scale(dev,width, height,&hscale, &vscale);
915 /* set horzontal scale */
916 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, HSCALE_CTRL, 2, hscale, 4);
918 /* set vertical scale */
919 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, VSCALE_CTRL, 2, vscale, 4);
924 /*************************************************************************************
925 * C H I P Specific C O N T R O L functions *
926 *************************************************************************************/
927 int cx231xx_init_ctrl_pin_status(struct cx231xx *dev)
932 status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, PIN_CTRL, 2, &value, 4);
933 value |=(~dev->board.ctl_pin_status_mask);
934 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, PIN_CTRL, 2, value, 4);
939 int cx231xx_set_agc_analog_digital_mux_select(struct cx231xx *dev, u8 analog_or_digital)
943 /* first set the direction to output */
944 status = cx231xx_set_gpio_direction(dev, dev->board.agc_analog_digital_select_gpio, 1);
946 /* 0 - demod ; 1 - Analog mode */
947 status = cx231xx_set_gpio_value(dev, dev->board.agc_analog_digital_select_gpio,
953 int cx231xx_enable_i2c_for_tuner(struct cx231xx *dev, u8 I2CIndex)
955 u8 value[4] ={0,0,0,0};
958 cx231xx_info("Changing the i2c port for tuner to %d\n",I2CIndex);
960 status = cx231xx_read_ctrl_reg(dev,VRT_GET_REGISTER, PWR_CTL_EN, value, 4);
964 if(I2CIndex==I2C_1) {
965 if(value[0] & I2C_DEMOD_EN) {
966 value[0] &= ~I2C_DEMOD_EN;
967 status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
970 if(!(value[0] & I2C_DEMOD_EN)) {
971 value[0] |= I2C_DEMOD_EN;
972 status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
981 /*************************************************************************************
982 * D I F - B L O C K C O N T R O L functions *
983 *************************************************************************************/
984 int cx231xx_dif_configure_C2HH_for_low_IF(struct cx231xx *dev, u32 mode,
985 u32 function_mode, u32 standard)
989 if(mode == V4L2_TUNER_RADIO) {
991 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
992 AFE_CTRL_C2HH_SRC_CTRL, 30, 31, 0x1); /* lo if big signal */
993 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
994 AFE_CTRL_C2HH_SRC_CTRL, 23, 24, function_mode); /* FUNC_MODE = DIF */
995 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
996 AFE_CTRL_C2HH_SRC_CTRL, 15, 22, 0xFF); /* IF_MODE */
997 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
998 AFE_CTRL_C2HH_SRC_CTRL, 9, 9, 0x1); /* no inv */
1002 case V4L2_STD_NTSC_M: /* 75 IRE Setup */
1003 case V4L2_STD_NTSC_M_JP: /* Japan, 0 IRE Setup */
1004 case V4L2_STD_PAL_M:
1005 case V4L2_STD_PAL_N:
1006 case V4L2_STD_PAL_Nc:
1007 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
1008 AFE_CTRL_C2HH_SRC_CTRL, 30, 31, 0x1); /* lo if big signal */
1009 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
1010 AFE_CTRL_C2HH_SRC_CTRL, 23, 24, function_mode); /* FUNC_MODE = DIF */
1011 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
1012 AFE_CTRL_C2HH_SRC_CTRL, 15, 22, 0xb); /* IF_MODE */
1013 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
1014 AFE_CTRL_C2HH_SRC_CTRL, 9, 9, 0x1); /* no inv */
1015 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
1016 AUD_IO_CTRL, 0, 31, 0x00000003); /* 0x124, AUD_CHAN1_SRC = 0x3 */
1019 case V4L2_STD_PAL_B:
1020 case V4L2_STD_PAL_G:
1022 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
1023 AFE_CTRL_C2HH_SRC_CTRL, 30, 31, 0x1); /* lo if big signal */
1024 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
1025 AFE_CTRL_C2HH_SRC_CTRL, 23, 24, function_mode); /* FUNC_MODE = DIF */
1026 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
1027 AFE_CTRL_C2HH_SRC_CTRL, 15, 22, 0xE); /* IF_MODE */
1028 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
1029 AFE_CTRL_C2HH_SRC_CTRL, 9, 9, 0x1); /* no inv */
1032 case V4L2_STD_PAL_D:
1033 case V4L2_STD_PAL_I:
1034 case V4L2_STD_SECAM_L:
1035 case V4L2_STD_SECAM_LC:
1036 case V4L2_STD_SECAM_B:
1037 case V4L2_STD_SECAM_D:
1038 case V4L2_STD_SECAM_G:
1039 case V4L2_STD_SECAM_K:
1040 case V4L2_STD_SECAM_K1:
1042 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
1043 AFE_CTRL_C2HH_SRC_CTRL, 30, 31, 0x1); /* lo if big signal */
1044 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
1045 AFE_CTRL_C2HH_SRC_CTRL, 23, 24, function_mode); /* FUNC_MODE = DIF */
1046 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
1047 AFE_CTRL_C2HH_SRC_CTRL, 15, 22, 0xF); /* IF_MODE */
1048 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
1049 AFE_CTRL_C2HH_SRC_CTRL, 9, 9, 0x1); /* no inv */
1052 case DIF_USE_BASEBAND:
1054 /* do nothing to config C2HH for baseband */
1062 int cx231xx_dif_set_standard(struct cx231xx *dev, u32 standard)
1065 u32 dif_misc_ctrl_value = 0;
1068 cx231xx_info("%s: setStandard to %x\n",__func__,standard);
1070 status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
1071 DIF_MISC_CTRL, 2, &dif_misc_ctrl_value, 4);
1072 if(standard != DIF_USE_BASEBAND )
1073 dev->norm = standard;
1075 switch (dev->model) {
1076 case CX231XX_BOARD_CNXT_RDE_250:
1077 case CX231XX_BOARD_CNXT_RDU_250:
1084 status = cx231xx_dif_configure_C2HH_for_low_IF(dev, dev->active_mode, func_mode, standard);
1087 if(standard == DIF_USE_BASEBAND ) { /* base band */
1089 /* There is a different SRC_PHASE_INC value for baseband vs. DIF */
1090 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
1091 DIF_SRC_PHASE_INC, 2, 0xDF7DF83, 4);
1092 status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
1093 DIF_MISC_CTRL, 2, &dif_misc_ctrl_value, 4);
1094 dif_misc_ctrl_value |= FLD_DIF_DIF_BYPASS;
1095 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
1096 DIF_MISC_CTRL, 2, dif_misc_ctrl_value, 4);
1098 } else if ( standard & (V4L2_STD_PAL_B | V4L2_STD_PAL_G) ) {
1100 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
1101 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
1102 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
1103 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL3, 0, 31, 0x00008800);
1104 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_IF_REF, 0, 31, 0x444C1380);
1105 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_IF, 0, 31, 0xDA302600);
1106 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_INT, 0, 31, 0xDA261700);
1107 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_RF, 0, 31, 0xDA262600);
1108 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_IF_INT_CURRENT, 0, 31, 0x26001700);
1109 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_RF_CURRENT, 0, 31, 0x00002660);
1110 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_VIDEO_AGC_CTRL, 0, 31, 0x72500800);
1111 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_VID_AUD_OVERRIDE, 0, 31, 0x27000100);
1112 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AV_SEP_CTRL, 0, 31, 0x3F3530EC);
1113 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_COMP_FLT_CTRL, 0, 31, 0x00A653A8);
1114 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_SRC_PHASE_INC, 0, 31, 0x1befbf06);
1115 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_SRC_GAIN_CONTROL, 0, 31, 0x000035e8);
1116 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_RPT_VARIANCE, 0, 31, 0x00000000);
1117 /* Save the Spec Inversion value */
1118 dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
1119 dif_misc_ctrl_value |=0x3a013F11;
1121 } else if( standard & V4L2_STD_PAL_D ) {
1123 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
1124 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
1125 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
1126 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL3, 0, 31, 0x00008800);
1127 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_IF_REF, 0, 31, 0x444C1380);
1128 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_IF, 0, 31, 0xDA302600);
1129 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_INT, 0, 31, 0xDA261700);
1130 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_RF, 0, 31, 0xDA262600);
1131 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_IF_INT_CURRENT, 0, 31, 0x26001700);
1132 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_RF_CURRENT, 0, 31, 0x00002660);
1133 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_VIDEO_AGC_CTRL, 0, 31, 0x72500800);
1134 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_VID_AUD_OVERRIDE, 0, 31, 0x27000100);
1135 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AV_SEP_CTRL, 0, 31, 0x3F3934EA);
1136 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_COMP_FLT_CTRL, 0, 31, 0x00000000);
1137 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_SRC_PHASE_INC, 0, 31, 0x1befbf06);
1138 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_SRC_GAIN_CONTROL, 0, 31, 0x000035e8);
1139 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_RPT_VARIANCE, 0, 31, 0x00000000);
1140 /* Save the Spec Inversion value */
1141 dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
1142 dif_misc_ctrl_value |=0x3a023F11;
1144 } else if( standard & V4L2_STD_PAL_I ) {
1146 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
1147 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
1148 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
1149 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL3, 0, 31, 0x00008800);
1150 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_IF_REF, 0, 31, 0x444C1380);
1151 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_IF, 0, 31, 0xDA302600);
1152 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_INT, 0, 31, 0xDA261700);
1153 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_RF, 0, 31, 0xDA262600);
1154 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_IF_INT_CURRENT, 0, 31, 0x26001700);
1155 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_RF_CURRENT, 0, 31, 0x00002660);
1156 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_VIDEO_AGC_CTRL, 0, 31, 0x72500800);
1157 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_VID_AUD_OVERRIDE, 0, 31, 0x27000100);
1158 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AV_SEP_CTRL, 0, 31, 0x5F39A934);
1159 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_COMP_FLT_CTRL, 0, 31, 0x00000000);
1160 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_SRC_PHASE_INC, 0, 31, 0x1befbf06);
1161 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_SRC_GAIN_CONTROL, 0, 31, 0x000035e8);
1162 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_RPT_VARIANCE, 0, 31, 0x00000000);
1163 /* Save the Spec Inversion value */
1164 dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
1165 dif_misc_ctrl_value |=0x3a033F11;
1167 } else if( standard & V4L2_STD_PAL_M ) {
1169 /* improved Low Frequency Phase Noise */
1170 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
1171 DIF_PLL_CTRL, 2, 0xFF01FF0C, 4);
1172 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
1173 DIF_PLL_CTRL1, 2, 0xbd038c85, 4);
1174 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
1175 DIF_PLL_CTRL2, 2, 0x1db4640a, 4);
1176 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
1177 DIF_PLL_CTRL3, 2, 0x00008800, 4);
1178 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
1179 DIF_AGC_IF_REF, 2, 0x444C1380, 4);
1180 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
1181 DIF_AGC_IF_INT_CURRENT, 2, 0x26001700, 4);
1182 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
1183 DIF_AGC_RF_CURRENT, 2, 0x00002660, 4);
1184 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
1185 DIF_VIDEO_AGC_CTRL, 2, 0x72500800, 4);
1186 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
1187 DIF_VID_AUD_OVERRIDE, 2, 0x27000100, 4);
1188 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
1189 DIF_AV_SEP_CTRL, 2, 0x012c405d, 4);
1190 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
1191 DIF_COMP_FLT_CTRL, 2, 0x009f50c1, 4);
1192 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
1193 DIF_SRC_PHASE_INC, 2, 0x1befbf06, 4);
1194 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
1195 DIF_SRC_GAIN_CONTROL, 2, 0x000035e8, 4);
1196 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
1197 DIF_SOFT_RST_CTRL_REVB, 2, 0x00000000, 4);
1199 /* Save the Spec Inversion value */
1200 dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
1201 dif_misc_ctrl_value |= 0x3A0A3F10;
1203 } else if( standard & (V4L2_STD_PAL_N | V4L2_STD_PAL_Nc) ) {
1205 /* improved Low Frequency Phase Noise */
1206 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_PLL_CTRL, 2, 0xFF01FF0C, 4);
1207 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_PLL_CTRL1, 2, 0xbd038c85, 4);
1208 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_PLL_CTRL2, 2, 0x1db4640a, 4);
1209 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_PLL_CTRL3, 2, 0x00008800, 4);
1210 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_AGC_IF_REF, 2, 0x444C1380, 4);
1211 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_AGC_IF_INT_CURRENT, 2, 0x26001700, 4);
1212 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_AGC_RF_CURRENT, 2, 0x00002660, 4);
1213 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_VIDEO_AGC_CTRL, 2, 0x72500800, 4);
1214 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_VID_AUD_OVERRIDE, 2, 0x27000100, 4);
1215 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_AV_SEP_CTRL, 2, 0x012c405d, 4);
1216 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_COMP_FLT_CTRL, 2, 0x009f50c1, 4);
1217 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_SRC_PHASE_INC, 2, 0x1befbf06, 4);
1218 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_SRC_GAIN_CONTROL, 2, 0x000035e8, 4);
1219 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_SOFT_RST_CTRL_REVB, 2, 0x00000000, 4);
1221 /* Save the Spec Inversion value */
1222 dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
1223 dif_misc_ctrl_value = 0x3A093F10;
1225 } else if( standard & ( V4L2_STD_SECAM_B | V4L2_STD_SECAM_D | V4L2_STD_SECAM_G |
1226 V4L2_STD_SECAM_K | V4L2_STD_SECAM_K1) ) {
1228 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
1229 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
1230 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
1231 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL3, 0, 31, 0x00008800);
1232 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_IF_REF, 0, 31, 0x888C0380);
1233 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_IF, 0, 31, 0xe0262600);
1234 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_INT, 0, 31, 0xc2171700);
1235 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_RF, 0, 31, 0xc2262600);
1236 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_IF_INT_CURRENT, 0, 31, 0x26001700);
1237 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_RF_CURRENT, 0, 31, 0x00002660);
1238 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_VID_AUD_OVERRIDE, 0, 31, 0x27000100);
1239 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AV_SEP_CTRL, 0, 31, 0x3F3530ec);
1240 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_COMP_FLT_CTRL, 0, 31, 0x00000000);
1241 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_SRC_PHASE_INC, 0, 31, 0x1befbf06);
1242 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_SRC_GAIN_CONTROL, 0, 31, 0x000035e8);
1243 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_RPT_VARIANCE, 0, 31, 0x00000000);
1244 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_VIDEO_AGC_CTRL, 0, 31, 0xf4000000);
1246 /* Save the Spec Inversion value */
1247 dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
1248 dif_misc_ctrl_value |=0x3a023F11;
1250 } else if( standard & (V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC) ) {
1252 /* Is it SECAM_L1? */
1253 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
1254 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
1255 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
1256 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL3, 0, 31, 0x00008800);
1257 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_IF_REF, 0, 31, 0x888C0380);
1258 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_IF, 0, 31, 0xe0262600);
1259 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_INT, 0, 31, 0xc2171700);
1260 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_RF, 0, 31, 0xc2262600);
1261 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_IF_INT_CURRENT, 0, 31, 0x26001700);
1262 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_RF_CURRENT, 0, 31, 0x00002660);
1263 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_VID_AUD_OVERRIDE, 0, 31, 0x27000100);
1264 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AV_SEP_CTRL, 0, 31, 0x3F3530ec);
1265 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_COMP_FLT_CTRL, 0, 31, 0x00000000);
1266 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_SRC_PHASE_INC, 0, 31, 0x1befbf06);
1267 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_SRC_GAIN_CONTROL, 0, 31, 0x000035e8);
1268 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_RPT_VARIANCE, 0, 31, 0x00000000);
1269 status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_VIDEO_AGC_CTRL, 0, 31, 0xf2560000);
1271 /* Save the Spec Inversion value */
1272 dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
1273 dif_misc_ctrl_value |=0x3a023F11;
1275 } else { /* V4L2_STD_NTSC_M (75 IRE Setup) Or V4L2_STD_NTSC_M_JP (Japan, 0 IRE Setup) */
1277 /* For NTSC the centre frequency of video coming out of sidewinder is
1278 around 7.1MHz or 3.6MHz depending on the spectral inversion.
1279 so for a non spectrally inverted channel the pll freq word is 0x03420c49
1282 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_PLL_CTRL, 2, 0x6503BC0C, 4);
1283 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_PLL_CTRL1, 2, 0xBD038C85, 4);
1284 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_PLL_CTRL2, 2, 0x1DB4640A, 4);
1285 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_PLL_CTRL3, 2, 0x00008800, 4);
1286 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_AGC_IF_REF, 2, 0x444C0380, 4);
1287 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_AGC_IF_INT_CURRENT, 2, 0x26001700, 4);
1288 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_AGC_RF_CURRENT, 2, 0x00002660, 4);
1289 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_VIDEO_AGC_CTRL, 2, 0x04000800, 4);
1290 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_VID_AUD_OVERRIDE, 2, 0x27000100, 4);
1291 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_AV_SEP_CTRL, 2, 0x01296e1f, 4);
1293 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_COMP_FLT_CTRL, 2, 0x009f50c1, 4);
1294 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_SRC_PHASE_INC, 2, 0x1befbf06, 4);
1295 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_SRC_GAIN_CONTROL, 2, 0x000035e8, 4);
1297 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_AGC_CTRL_IF, 2, 0xC2262600, 4);
1298 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_AGC_CTRL_INT, 2, 0xC2262600, 4);
1299 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_AGC_CTRL_RF, 2, 0xC2262600, 4);
1301 /* Save the Spec Inversion value */
1302 dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
1303 dif_misc_ctrl_value |= 0x3a003F10;
1307 /* The AGC values should be the same for all standards,
1308 AUD_SRC_SEL[19] should always be disabled */
1309 dif_misc_ctrl_value &= ~FLD_DIF_AUD_SRC_SEL;
1311 /* It is still possible to get Set Standard calls even when we are in FM mode
1312 This is done to override the value for FM. */
1313 if (dev->active_mode == V4L2_TUNER_RADIO)
1314 dif_misc_ctrl_value = 0x7a080000;
1316 /* Write the calculated value for misc ontrol register */
1317 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_MISC_CTRL, 2, dif_misc_ctrl_value, 4);
1322 int cx231xx_tuner_pre_channel_change(struct cx231xx *dev)
1327 /* Set the RF and IF k_agc values to 3 */
1328 status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
1329 DIF_AGC_IF_REF, 2, &dwval, 4);
1330 dwval &= ~(FLD_DIF_K_AGC_RF | FLD_DIF_K_AGC_IF);
1331 dwval |= 0x33000000;
1333 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
1334 DIF_AGC_IF_REF, 2, dwval, 4);
1339 int cx231xx_tuner_post_channel_change(struct cx231xx *dev)
1344 /* Set the RF and IF k_agc values to 4 for PAL/NTSC and 8 for SECAM */
1345 status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
1346 DIF_AGC_IF_REF, 2, &dwval, 4);
1347 dwval &= ~(FLD_DIF_K_AGC_RF | FLD_DIF_K_AGC_IF);
1349 if(dev->norm & ( V4L2_STD_SECAM_L | V4L2_STD_SECAM_B | V4L2_STD_SECAM_D) ) {
1350 dwval |= 0x88000000;
1352 dwval |= 0x44000000;
1355 status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
1356 DIF_AGC_IF_REF, 2, dwval, 4);
1363 /*************************************************************************************
1364 * F L A T I R O N - B L O C K C O N T R O L functions *
1365 *************************************************************************************/
1366 int cx231xx_flatiron_initialize(struct cx231xx *dev)
1371 status = cx231xx_read_i2c_data(dev, Flatrion_DEVICE_ADDRESS, CH_PWR_CTRL1, 1, &value, 1);
1372 /* enables clock to delta-sigma and decimation filter */
1374 status = cx231xx_write_i2c_data(dev, Flatrion_DEVICE_ADDRESS,
1375 CH_PWR_CTRL1, 1, value, 1);
1376 /* power up all channel */
1377 status = cx231xx_write_i2c_data(dev, Flatrion_DEVICE_ADDRESS,
1378 CH_PWR_CTRL2, 1, 0x00, 1);
1383 int cx231xx_flatiron_update_power_control(struct cx231xx *dev, AV_MODE avmode)
1388 if(avmode!=POLARIS_AVMODE_ENXTERNAL_AV) {
1389 status = cx231xx_read_i2c_data(dev, Flatrion_DEVICE_ADDRESS, CH_PWR_CTRL2, 1, &value, 1);
1391 status = cx231xx_write_i2c_data(dev, Flatrion_DEVICE_ADDRESS,
1392 CH_PWR_CTRL2, 1, value, 1);
1395 status = cx231xx_write_i2c_data(dev, Flatrion_DEVICE_ADDRESS,
1396 CH_PWR_CTRL2, 1, 0x00, 1);
1402 /* set flatiron for audio input types */
1403 int cx231xx_flatiron_set_audio_input(struct cx231xx *dev, u8 audio_input)
1407 switch(audio_input) {
1408 case CX231XX_AMUX_LINE_IN:
1410 status = cx231xx_write_i2c_data(dev, Flatrion_DEVICE_ADDRESS,
1411 CH_PWR_CTRL2, 1, 0x00, 1);
1412 status = cx231xx_write_i2c_data(dev, Flatrion_DEVICE_ADDRESS,
1413 CH_PWR_CTRL1, 1, 0x80, 1);
1415 case CX231XX_AMUX_VIDEO:
1420 dev->ctl_ainput = audio_input;
1425 /*************************************************************************************
1426 * P O W E R C O N T R O L functions *
1427 *************************************************************************************/
1428 int cx231xx_set_power_mode(struct cx231xx *dev, AV_MODE mode)
1430 u8 value[4] ={0,0,0,0};
1434 if(dev->power_mode != mode)
1435 dev->power_mode = mode;
1437 cx231xx_info(" setPowerMode::mode = %d, No Change req.\n",mode);
1441 cx231xx_info(" setPowerMode::mode = %d\n",mode);
1443 status = cx231xx_read_ctrl_reg(dev,VRT_GET_REGISTER, PWR_CTL_EN, value, 4);
1447 tmp = *((u32 *)value);
1450 case POLARIS_AVMODE_ENXTERNAL_AV:
1452 tmp &= (~PWR_MODE_MASK);
1456 value[1]=(u8)(tmp>>8);
1457 value[2]=(u8)(tmp>>16);
1458 value[3]=(u8)(tmp>>24);
1459 status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
1460 msleep(PWR_SLEEP_INTERVAL);
1464 value[1]=(u8)(tmp>>8);
1465 value[2]=(u8)(tmp>>16);
1466 value[3]=(u8)(tmp>>24);
1467 status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
1468 msleep(PWR_SLEEP_INTERVAL);
1470 tmp |=POLARIS_AVMODE_ENXTERNAL_AV;
1472 value[1]=(u8)(tmp>>8);
1473 value[2]=(u8)(tmp>>16);
1474 value[3]=(u8)(tmp>>24);
1475 status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
1477 dev->xc_fw_load_done = 0; /* reset state of xceive tuner */
1480 case POLARIS_AVMODE_ANALOGT_TV:
1482 tmp &= (~PWR_DEMOD_EN);
1483 tmp |= (I2C_DEMOD_EN);
1485 value[1]=(u8)(tmp>>8);
1486 value[2]=(u8)(tmp>>16);
1487 value[3]=(u8)(tmp>>24);
1488 status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
1489 msleep(PWR_SLEEP_INTERVAL);
1491 if(!(tmp & PWR_TUNER_EN)) {
1492 tmp |= (PWR_TUNER_EN);
1494 value[1]=(u8)(tmp>>8);
1495 value[2]=(u8)(tmp>>16);
1496 value[3]=(u8)(tmp>>24);
1497 status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
1498 msleep(PWR_SLEEP_INTERVAL);
1501 if(!(tmp & PWR_AV_EN)) {
1504 value[1]=(u8)(tmp>>8);
1505 value[2]=(u8)(tmp>>16);
1506 value[3]=(u8)(tmp>>24);
1507 status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
1508 msleep(PWR_SLEEP_INTERVAL);
1510 if(!(tmp & PWR_ISO_EN )) {
1513 value[1]=(u8)(tmp>>8);
1514 value[2]=(u8)(tmp>>16);
1515 value[3]=(u8)(tmp>>24);
1516 status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
1517 msleep(PWR_SLEEP_INTERVAL);
1520 if(!(tmp & POLARIS_AVMODE_ANALOGT_TV )) {
1521 tmp |= POLARIS_AVMODE_ANALOGT_TV;
1523 value[1]=(u8)(tmp>>8);
1524 value[2]=(u8)(tmp>>16);
1525 value[3]=(u8)(tmp>>24);
1526 status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
1527 msleep(PWR_SLEEP_INTERVAL);
1530 if( (dev->model == CX231XX_BOARD_CNXT_RDE_250) ||
1531 (dev->model == CX231XX_BOARD_CNXT_RDU_250)) {
1533 /* tuner path to channel 1 from port 3 */
1534 cx231xx_enable_i2c_for_tuner(dev, I2C_3);
1536 if(dev->cx231xx_reset_analog_tuner)
1537 dev->cx231xx_reset_analog_tuner(dev);
1541 case POLARIS_AVMODE_DIGITAL:
1543 if(!(tmp & PWR_TUNER_EN)) {
1544 tmp |= (PWR_TUNER_EN);
1546 value[1]=(u8)(tmp>>8);
1547 value[2]=(u8)(tmp>>16);
1548 value[3]=(u8)(tmp>>24);
1549 status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
1550 msleep(PWR_SLEEP_INTERVAL);
1552 if(!(tmp & PWR_AV_EN)) {
1555 value[1]=(u8)(tmp>>8);
1556 value[2]=(u8)(tmp>>16);
1557 value[3]=(u8)(tmp>>24);
1558 status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
1559 msleep(PWR_SLEEP_INTERVAL);
1561 if(!(tmp & PWR_ISO_EN)) {
1564 value[1]=(u8)(tmp>>8);
1565 value[2]=(u8)(tmp>>16);
1566 value[3]=(u8)(tmp>>24);
1567 status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
1568 msleep(PWR_SLEEP_INTERVAL);
1571 tmp |= POLARIS_AVMODE_DIGITAL|I2C_DEMOD_EN;
1573 value[1]=(u8)(tmp>>8);
1574 value[2]=(u8)(tmp>>16);
1575 value[3]=(u8)(tmp>>24);
1576 status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
1577 msleep(PWR_SLEEP_INTERVAL);
1579 if(!(tmp & PWR_DEMOD_EN)) {
1580 tmp |= PWR_DEMOD_EN;
1582 value[1]=(u8)(tmp>>8);
1583 value[2]=(u8)(tmp>>16);
1584 value[3]=(u8)(tmp>>24);
1585 status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
1586 msleep(PWR_SLEEP_INTERVAL);
1589 if( (dev->model == CX231XX_BOARD_CNXT_RDE_250) ||
1590 (dev->model == CX231XX_BOARD_CNXT_RDU_250)) {
1592 /* tuner path to channel 1 from port 3 */
1593 cx231xx_enable_i2c_for_tuner(dev, I2C_3);
1595 if(dev->cx231xx_reset_analog_tuner)
1596 dev->cx231xx_reset_analog_tuner(dev);
1604 msleep(PWR_SLEEP_INTERVAL);
1606 /* For power saving, only enable Pwr_resetout_n when digital TV is selected. */
1607 if(mode == POLARIS_AVMODE_DIGITAL) {
1608 tmp |= PWR_RESETOUT_EN;
1610 value[1]=(u8)(tmp>>8);
1611 value[2]=(u8)(tmp>>16);
1612 value[3]=(u8)(tmp>>24);
1613 status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
1614 msleep(PWR_SLEEP_INTERVAL);
1617 /* update power control for colibri */
1618 status = cx231xx_colibri_update_power_control(dev, mode);
1620 /* update power control for flatiron */
1621 status = cx231xx_flatiron_update_power_control(dev, mode);
1623 status = cx231xx_read_ctrl_reg(dev,VRT_GET_REGISTER, PWR_CTL_EN, value, 4);
1624 cx231xx_info(" The data of PWR_CTL_EN register 0x74=0x%0x,0x%0x,0x%0x,0x%0x\n",value[0],value[1],value[2],value[3]);
1629 int cx231xx_power_suspend(struct cx231xx *dev)
1631 u8 value[4] ={0,0,0,0};
1635 status = cx231xx_read_ctrl_reg(dev,VRT_GET_REGISTER, PWR_CTL_EN, value, 4);
1639 tmp = *((u32 *)value);
1640 tmp &= (~PWR_MODE_MASK);
1643 value[1]=(u8)(tmp>>8);
1644 value[2]=(u8)(tmp>>16);
1645 value[3]=(u8)(tmp>>24);
1646 status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
1652 /*************************************************************************************
1653 * S T R E A M C O N T R O L functions *
1654 *************************************************************************************/
1655 int cx231xx_start_stream(struct cx231xx *dev, u32 ep_mask)
1657 u8 value[4] = {0x0, 0x0, 0x0, 0x0};
1661 cx231xx_info("cx231xx_start_stream():: ep_mask = %x\n", ep_mask);
1662 status = cx231xx_read_ctrl_reg(dev,VRT_GET_REGISTER, EP_MODE_SET,value,4);
1666 tmp = *((u32 *)value);
1669 value[1]=(u8)(tmp>>8);
1670 value[2]=(u8)(tmp>>16);
1671 value[3]=(u8)(tmp>>24);
1673 status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, EP_MODE_SET,value,4);
1678 int cx231xx_stop_stream(struct cx231xx *dev, u32 ep_mask)
1680 u8 value[4] = {0x0, 0x0, 0x0, 0x0};
1684 cx231xx_info("cx231xx_stop_stream():: ep_mask = %x\n", ep_mask);
1685 status = cx231xx_read_ctrl_reg(dev,VRT_GET_REGISTER, EP_MODE_SET,value,4);
1689 tmp = *((u32 *)value);
1692 value[1]=(u8)(tmp>>8);
1693 value[2]=(u8)(tmp>>16);
1694 value[3]=(u8)(tmp>>24);
1696 status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, EP_MODE_SET,value,4);
1701 int cx231xx_initialize_stream_xfer(struct cx231xx *dev, u32 media_type)
1705 if(dev->udev->speed == USB_SPEED_HIGH)
1709 case 81: /* audio */
1710 cx231xx_info("%s: Audio enter HANC\n",__func__);
1711 status = cx231xx_mode_register(dev, TS_MODE_REG, 0x9300);
1715 cx231xx_info("%s: set vanc registers\n",__func__);
1716 status = cx231xx_mode_register(dev, TS_MODE_REG, 0x300);
1719 case 3: /* sliced cc */
1720 cx231xx_info("%s: set hanc registers\n",__func__);
1721 status = cx231xx_mode_register(dev, TS_MODE_REG, 0x1300);
1725 cx231xx_info("%s: set video registers\n",__func__);
1726 status = cx231xx_mode_register(dev, TS_MODE_REG, 0x100);
1730 cx231xx_info("%s: set ts1 registers\n",__func__);
1731 status = cx231xx_mode_register(dev, TS_MODE_REG, 0x101);
1732 status = cx231xx_mode_register(dev, TS1_CFG_REG, 0x400);
1734 case 6: /* ts1 parallel mode */
1735 cx231xx_info("%s: set ts1 parrallel mode registers\n",__func__);
1736 status = cx231xx_mode_register(dev, TS_MODE_REG, 0x100);
1737 status = cx231xx_mode_register(dev, TS1_CFG_REG, 0x400);
1743 status = cx231xx_mode_register(dev, TS_MODE_REG, 0x101);
1752 int cx231xx_capture_start(struct cx231xx *dev, int start, u8 media_type)
1756 PPCB_CONFIG pcb_config;
1758 /* get EP for media type */
1759 pcb_config = &dev->current_pcb_config;
1761 if(pcb_config->config_num==1)
1766 ep_mask =ENABLE_EP4; /* ep4 [00:1000] */
1769 ep_mask =ENABLE_EP3; /* ep3 [00:0100] */
1772 ep_mask = ENABLE_EP5; /* ep5 [01:0000] */
1774 case 3: /* Sliced_cc */
1775 ep_mask = ENABLE_EP6; /* ep6 [10:0000] */
1778 case 6: /* ts1 parallel mode */
1779 ep_mask = ENABLE_EP1; /* ep1 [00:0001] */
1782 ep_mask = ENABLE_EP2; /* ep2 [00:0010] */
1787 else if(pcb_config->config_num>1)
1792 ep_mask = ENABLE_EP4; /* ep4 [00:1000] */
1795 ep_mask = ENABLE_EP3; /* ep3 [00:0100] */
1798 ep_mask = ENABLE_EP5; /* ep5 [01:0000] */
1800 case 3: /* Sliced_cc */
1801 ep_mask = ENABLE_EP6; /* ep6 [10:0000] */
1804 case 6: /* ts1 parallel mode */
1805 ep_mask = ENABLE_EP1; /* ep1 [00:0001] */
1808 ep_mask = ENABLE_EP2; /* ep2 [00:0010] */
1815 rc = cx231xx_initialize_stream_xfer(dev, media_type);
1821 /* enable video capture */
1823 rc = cx231xx_start_stream(dev, ep_mask);
1826 /* disable video capture */
1828 rc = cx231xx_stop_stream(dev, ep_mask);
1831 if (dev->mode == CX231XX_ANALOG_MODE){
1832 /* do any in Analog mode */
1835 /* do any in digital mode */
1840 EXPORT_SYMBOL_GPL(cx231xx_capture_start);
1843 /************************************************************************************
1844 * G P I O B I T control functions *
1845 *************************************************************************************/
1846 int cx231xx_set_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u8* gpio_val)
1850 status = cx231xx_send_gpio_cmd(dev, gpio_bit, gpio_val, 4, 0, 0);
1855 int cx231xx_get_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u8* gpio_val)
1859 status = cx231xx_send_gpio_cmd(dev, gpio_bit, gpio_val, 4, 0, 1);
1865 * cx231xx_set_gpio_direction
1866 * Sets the direction of the GPIO pin to input or output
1869 * pin_number : The GPIO Pin number to program the direction for
1871 * pin_value : The Direction of the GPIO Pin under reference.
1872 * 0 = Input direction
1873 * 1 = Output direction
1875 int cx231xx_set_gpio_direction(struct cx231xx *dev,
1882 /* Check for valid pin_number - if 32 , bail out */
1883 if (pin_number >= 32) {
1887 if (pin_value == 0) { /* input */
1888 value = dev->gpio_dir &(~(1<<pin_number)) ; /* clear */
1890 value = dev->gpio_dir | (1<<pin_number) ;
1893 status = cx231xx_set_gpio_bit(dev, value, (u8*) & dev->gpio_val);
1895 /* cache the value for future */
1896 dev->gpio_dir = value;
1903 * SetGpioPinLogicValue
1904 * Sets the value of the GPIO pin to Logic high or low. The Pin under
1905 * reference should ALREADY BE SET IN OUTPUT MODE !!!!!!!!!
1908 * pin_number : The GPIO Pin number to program the direction for
1909 * pin_value : The value of the GPIO Pin under reference.
1913 int cx231xx_set_gpio_value(struct cx231xx *dev,
1920 /* Check for valid pin_number - if 0xFF , bail out */
1921 if (pin_number >= 32)
1924 /* first do a sanity check - if the Pin is not output, make it output */
1925 if ((dev->gpio_dir & (1<<pin_number)) == 0x00)
1927 /* It was in input mode */
1928 value = dev->gpio_dir | (1<<pin_number) ;
1929 dev->gpio_dir = value;
1930 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
1934 if (pin_value == 0) {
1935 value = dev->gpio_val & (~(1<<pin_number));
1937 value = dev->gpio_val | (1<<pin_number);
1940 /* store the value */
1941 dev->gpio_val=value;
1943 /* toggle bit0 of GP_IO */
1944 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
1950 /************************************************************************************
1951 * G P I O I2C related functions *
1952 *************************************************************************************/
1953 int cx231xx_gpio_i2c_start(struct cx231xx *dev)
1957 /* set SCL to output 1 ; set SDA to output 1 */
1958 dev->gpio_dir |= 1<< dev->board.tuner_scl_gpio;
1959 dev->gpio_dir |= 1<<dev->board.tuner_sda_gpio;
1960 dev->gpio_val |= 1<<dev->board.tuner_scl_gpio;
1961 dev->gpio_val |= 1<<dev->board.tuner_sda_gpio;
1963 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
1968 /* set SCL to output 1; set SDA to output 0 */
1969 dev->gpio_val |= 1<<dev->board.tuner_scl_gpio;
1970 dev->gpio_val &= ~(1<<dev->board.tuner_sda_gpio);
1972 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
1977 /* set SCL to output 0; set SDA to output 0 */
1978 dev->gpio_val &= ~(1<<dev->board.tuner_scl_gpio);
1979 dev->gpio_val &= ~(1<<dev->board.tuner_sda_gpio);
1981 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
1990 int cx231xx_gpio_i2c_end(struct cx231xx *dev)
1994 /* set SCL to output 0; set SDA to output 0 */
1995 dev->gpio_dir |= 1<<dev->board.tuner_scl_gpio;
1996 dev->gpio_dir |= 1<<dev->board.tuner_sda_gpio;
1998 dev->gpio_val &= ~(1<<dev->board.tuner_scl_gpio);
1999 dev->gpio_val &= ~(1<<dev->board.tuner_sda_gpio);
2001 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2006 /* set SCL to output 1; set SDA to output 0 */
2007 dev->gpio_val |= 1<<dev->board.tuner_scl_gpio;
2008 dev->gpio_val &= ~(1<<dev->board.tuner_sda_gpio);
2010 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2015 /* set SCL to input ,release SCL cable control
2016 set SDA to input ,release SDA cable control */
2017 dev->gpio_dir &= ~(1<<dev->board.tuner_scl_gpio);
2018 dev->gpio_dir &= ~(1<<dev->board.tuner_sda_gpio);
2020 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2028 int cx231xx_gpio_i2c_write_byte(struct cx231xx *dev, u8 data)
2033 /* set SCL to output ; set SDA to output */
2034 dev->gpio_dir |= 1<<dev->board.tuner_scl_gpio;
2035 dev->gpio_dir |= 1<<dev->board.tuner_sda_gpio;
2037 for(i = 0;i<8;i++) {
2038 if(((data<<i) & 0x80) == 0) {
2039 /* set SCL to output 0; set SDA to output 0 */
2040 dev->gpio_val &= ~(1<<dev->board.tuner_scl_gpio);
2041 dev->gpio_val &= ~(1<<dev->board.tuner_sda_gpio);
2042 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2044 /* set SCL to output 1; set SDA to output 0 */
2045 dev->gpio_val |= 1<<dev->board.tuner_scl_gpio;
2046 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2048 /* set SCL to output 0; set SDA to output 0 */
2049 dev->gpio_val &= ~(1<<dev->board.tuner_scl_gpio);
2050 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2052 /* set SCL to output 0; set SDA to output 1 */
2053 dev->gpio_val &= ~(1<<dev->board.tuner_scl_gpio);
2054 dev->gpio_val |= 1<<dev->board.tuner_sda_gpio;
2055 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2057 /* set SCL to output 1; set SDA to output 1 */
2058 dev->gpio_val |= 1<<dev->board.tuner_scl_gpio;
2059 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2061 /* set SCL to output 0; set SDA to output 1 */
2062 dev->gpio_val &= ~(1<<dev->board.tuner_scl_gpio);
2063 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2069 int cx231xx_gpio_i2c_read_byte(struct cx231xx *dev, u8 *buf)
2073 u32 gpio_logic_value =0;
2077 for(i=0;i<8;i++) { /* send write I2c addr */
2079 /* set SCL to output 0; set SDA to input */
2080 dev->gpio_val &= ~(1<<dev->board.tuner_scl_gpio);
2081 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2083 /* set SCL to output 1; set SDA to input */
2084 dev->gpio_val |= 1<<dev->board.tuner_scl_gpio;
2085 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2087 /* get SDA data bit */
2088 gpio_logic_value = dev->gpio_val;
2089 status = cx231xx_get_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2090 if((dev->gpio_val & (1<<dev->board.tuner_sda_gpio)) != 0) {
2091 value |= (1<<(8-i-1));
2094 dev->gpio_val = gpio_logic_value;
2097 /* set SCL to output 0,finish the read latest SCL signal.
2098 !!!set SDA to input,never to modify SDA direction at the same times */
2099 dev->gpio_val &= ~(1<<dev->board.tuner_scl_gpio);
2100 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2102 /* store the value */
2103 *buf = value & 0xff;
2108 int cx231xx_gpio_i2c_read_ack(struct cx231xx *dev)
2111 u32 gpio_logic_value = 0;
2115 /* clock stretch; set SCL to input; set SDA to input; get SCL value till SCL = 1 */
2116 dev->gpio_dir &= ~(1<<dev->board.tuner_sda_gpio);
2117 dev->gpio_dir &= ~(1<<dev->board.tuner_scl_gpio);
2119 gpio_logic_value = dev->gpio_val;
2120 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2124 status = cx231xx_get_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2126 }while(((dev->gpio_val & (1<<dev->board.tuner_scl_gpio)) == 0) && (nCnt>0));
2129 cx231xx_info("No ACK after %d msec for clock stretch. GPIO I2C operation failed!",nInit*10);
2133 throuth clock stretch ,slave has given a SCL signal,so the SDA data can be directly read. */
2134 status = cx231xx_get_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2136 if((dev->gpio_val & 1<< dev->board.tuner_sda_gpio) == 0){
2137 dev->gpio_val = gpio_logic_value;
2138 dev->gpio_val &= ~(1<< dev->board.tuner_sda_gpio);
2141 dev->gpio_val = gpio_logic_value;
2142 dev->gpio_val |= (1<< dev->board.tuner_sda_gpio);
2145 /* read SDA end, set the SCL to output 0, after this operation, SDA direction can be changed. */
2146 dev->gpio_val = gpio_logic_value;
2147 dev->gpio_dir |= (1<<dev->board.tuner_scl_gpio);
2148 dev->gpio_val &= ~(1<<dev->board.tuner_scl_gpio);
2149 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2155 int cx231xx_gpio_i2c_write_ack(struct cx231xx *dev)
2159 /* set SDA to ouput */
2160 dev->gpio_dir |= 1<<dev->board.tuner_sda_gpio;
2161 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2163 /* set SCL = 0 (output); set SDA = 0 (output) */
2164 dev->gpio_val &= ~(1<<dev->board.tuner_sda_gpio);
2165 dev->gpio_val &= ~(1<<dev->board.tuner_scl_gpio);
2166 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2168 /* set SCL = 1 (output); set SDA = 0 (output) */
2169 dev->gpio_val |= 1<<dev->board.tuner_scl_gpio;
2170 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2172 /* set SCL = 0 (output); set SDA = 0 (output) */
2173 dev->gpio_val &= ~(1<<dev->board.tuner_scl_gpio);
2174 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2176 /* set SDA to input,and then the slave will read data from SDA. */
2177 dev->gpio_dir &= ~(1<<dev->board.tuner_sda_gpio);
2178 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2183 int cx231xx_gpio_i2c_write_nak(struct cx231xx *dev)
2187 /* set scl to output ; set sda to input */
2188 dev->gpio_dir |= 1<<dev->board.tuner_scl_gpio;
2189 dev->gpio_dir &= ~(1<<dev->board.tuner_sda_gpio);
2190 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2192 /* set scl to output 0; set sda to input */
2193 dev->gpio_val &= ~(1<<dev->board.tuner_scl_gpio);
2194 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2196 /* set scl to output 1; set sda to input */
2197 dev->gpio_val |= 1<<dev->board.tuner_scl_gpio;
2198 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
2205 /************************************************************************************
2206 * G P I O I2C related functions *
2207 *************************************************************************************/
2208 /* cx231xx_gpio_i2c_read
2209 * Function to read data from gpio based I2C interface
2211 int cx231xx_gpio_i2c_read(struct cx231xx *dev, u8 dev_addr, u8 *buf ,u8 len)
2217 mutex_lock(&dev->gpio_i2c_lock);
2220 status = cx231xx_gpio_i2c_start(dev);
2222 /* write dev_addr */
2223 status = cx231xx_gpio_i2c_write_byte(dev, (dev_addr << 1) +1);
2226 status = cx231xx_gpio_i2c_read_ack(dev);
2229 for(i = 0; i < len; i++ ) {
2232 status = cx231xx_gpio_i2c_read_byte(dev, & buf[i]);
2235 /* only do write ack if we more length */
2236 status = cx231xx_gpio_i2c_write_ack(dev);
2240 /* write NAK - inform reads are complete */
2241 status = cx231xx_gpio_i2c_write_nak(dev);
2244 status = cx231xx_gpio_i2c_end(dev);
2246 /* release the lock */
2247 mutex_unlock(&dev->gpio_i2c_lock);
2253 /* cx231xx_gpio_i2c_write
2254 * Function to write data to gpio based I2C interface
2256 int cx231xx_gpio_i2c_write(struct cx231xx *dev, u8 dev_addr, u8 *buf ,u8 len)
2262 mutex_lock(&dev->gpio_i2c_lock);
2265 status = cx231xx_gpio_i2c_start(dev);
2267 /* write dev_addr */
2268 status = cx231xx_gpio_i2c_write_byte(dev, dev_addr << 1);
2271 status = cx231xx_gpio_i2c_read_ack(dev);
2273 for(i = 0; i < len; i++ ) {
2275 status = cx231xx_gpio_i2c_write_byte(dev, buf[i]);
2278 status = cx231xx_gpio_i2c_read_ack(dev);
2282 status = cx231xx_gpio_i2c_end(dev);
2284 /* release the lock */
2285 mutex_unlock(&dev->gpio_i2c_lock);