Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / media / usb / cx231xx / cx231xx-avcore.c
1 /*
2    cx231xx_avcore.c - driver for Conexant Cx23100/101/102
3                       USB video capture devices
4
5    Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
6
7    This program contains the specific code to control the avdecoder chip and
8    other related usb control functions for cx231xx based chipset.
9
10    This program is free software; you can redistribute it and/or modify
11    it under the terms of the GNU General Public License as published by
12    the Free Software Foundation; either version 2 of the License, or
13    (at your option) any later version.
14
15    This program is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, write to the Free Software
22    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23  */
24
25 #include "cx231xx.h"
26 #include <linux/init.h>
27 #include <linux/list.h>
28 #include <linux/module.h>
29 #include <linux/kernel.h>
30 #include <linux/bitmap.h>
31 #include <linux/i2c.h>
32 #include <linux/mm.h>
33 #include <linux/mutex.h>
34 #include <media/tuner.h>
35
36 #include <media/v4l2-common.h>
37 #include <media/v4l2-ioctl.h>
38
39 #include "cx231xx-dif.h"
40
41 #define TUNER_MODE_FM_RADIO 0
42 /******************************************************************************
43                         -: BLOCK ARRANGEMENT :-
44         I2S block ----------------------|
45         [I2S audio]                     |
46                                         |
47         Analog Front End --> Direct IF -|-> Cx25840 --> Audio
48         [video & audio]                 |   [Audio]
49                                         |
50                                         |-> Cx25840 --> Video
51                                             [Video]
52
53 *******************************************************************************/
54 /******************************************************************************
55  *                    VERVE REGISTER                                          *
56  *                                                                            *
57  ******************************************************************************/
58 static int verve_write_byte(struct cx231xx *dev, u8 saddr, u8 data)
59 {
60         return cx231xx_write_i2c_data(dev, VERVE_I2C_ADDRESS,
61                                         saddr, 1, data, 1);
62 }
63
64 static int verve_read_byte(struct cx231xx *dev, u8 saddr, u8 *data)
65 {
66         int status;
67         u32 temp = 0;
68
69         status = cx231xx_read_i2c_data(dev, VERVE_I2C_ADDRESS,
70                                         saddr, 1, &temp, 1);
71         *data = (u8) temp;
72         return status;
73 }
74 void initGPIO(struct cx231xx *dev)
75 {
76         u32 _gpio_direction = 0;
77         u32 value = 0;
78         u8 val = 0;
79
80         _gpio_direction = _gpio_direction & 0xFC0003FF;
81         _gpio_direction = _gpio_direction | 0x03FDFC00;
82         cx231xx_send_gpio_cmd(dev, _gpio_direction, (u8 *)&value, 4, 0, 0);
83
84         verve_read_byte(dev, 0x07, &val);
85         dev_dbg(dev->dev, "verve_read_byte address0x07=0x%x\n", val);
86         verve_write_byte(dev, 0x07, 0xF4);
87         verve_read_byte(dev, 0x07, &val);
88         dev_dbg(dev->dev, "verve_read_byte address0x07=0x%x\n", val);
89
90         cx231xx_capture_start(dev, 1, Vbi);
91
92         cx231xx_mode_register(dev, EP_MODE_SET, 0x0500FE00);
93         cx231xx_mode_register(dev, GBULK_BIT_EN, 0xFFFDFFFF);
94
95 }
96 void uninitGPIO(struct cx231xx *dev)
97 {
98         u8 value[4] = { 0, 0, 0, 0 };
99
100         cx231xx_capture_start(dev, 0, Vbi);
101         verve_write_byte(dev, 0x07, 0x14);
102         cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
103                         0x68, value, 4);
104 }
105
106 /******************************************************************************
107  *                    A F E - B L O C K    C O N T R O L   functions          *
108  *                              [ANALOG FRONT END]                            *
109  ******************************************************************************/
110 static int afe_write_byte(struct cx231xx *dev, u16 saddr, u8 data)
111 {
112         return cx231xx_write_i2c_data(dev, AFE_DEVICE_ADDRESS,
113                                         saddr, 2, data, 1);
114 }
115
116 static int afe_read_byte(struct cx231xx *dev, u16 saddr, u8 *data)
117 {
118         int status;
119         u32 temp = 0;
120
121         status = cx231xx_read_i2c_data(dev, AFE_DEVICE_ADDRESS,
122                                         saddr, 2, &temp, 1);
123         *data = (u8) temp;
124         return status;
125 }
126
127 int cx231xx_afe_init_super_block(struct cx231xx *dev, u32 ref_count)
128 {
129         int status = 0;
130         u8 temp = 0;
131         u8 afe_power_status = 0;
132         int i = 0;
133
134         /* super block initialize */
135         temp = (u8) (ref_count & 0xff);
136         status = afe_write_byte(dev, SUP_BLK_TUNE2, temp);
137         if (status < 0)
138                 return status;
139
140         status = afe_read_byte(dev, SUP_BLK_TUNE2, &afe_power_status);
141         if (status < 0)
142                 return status;
143
144         temp = (u8) ((ref_count & 0x300) >> 8);
145         temp |= 0x40;
146         status = afe_write_byte(dev, SUP_BLK_TUNE1, temp);
147         if (status < 0)
148                 return status;
149
150         status = afe_write_byte(dev, SUP_BLK_PLL2, 0x0f);
151         if (status < 0)
152                 return status;
153
154         /* enable pll     */
155         while (afe_power_status != 0x18) {
156                 status = afe_write_byte(dev, SUP_BLK_PWRDN, 0x18);
157                 if (status < 0) {
158                         dev_dbg(dev->dev,
159                                 "%s: Init Super Block failed in send cmd\n",
160                                 __func__);
161                         break;
162                 }
163
164                 status = afe_read_byte(dev, SUP_BLK_PWRDN, &afe_power_status);
165                 afe_power_status &= 0xff;
166                 if (status < 0) {
167                         dev_dbg(dev->dev,
168                                 "%s: Init Super Block failed in receive cmd\n",
169                                 __func__);
170                         break;
171                 }
172                 i++;
173                 if (i == 10) {
174                         dev_dbg(dev->dev,
175                                 "%s: Init Super Block force break in loop !!!!\n",
176                                 __func__);
177                         status = -1;
178                         break;
179                 }
180         }
181
182         if (status < 0)
183                 return status;
184
185         /* start tuning filter */
186         status = afe_write_byte(dev, SUP_BLK_TUNE3, 0x40);
187         if (status < 0)
188                 return status;
189
190         msleep(5);
191
192         /* exit tuning */
193         status = afe_write_byte(dev, SUP_BLK_TUNE3, 0x00);
194
195         return status;
196 }
197
198 int cx231xx_afe_init_channels(struct cx231xx *dev)
199 {
200         int status = 0;
201
202         /* power up all 3 channels, clear pd_buffer */
203         status = afe_write_byte(dev, ADC_PWRDN_CLAMP_CH1, 0x00);
204         status = afe_write_byte(dev, ADC_PWRDN_CLAMP_CH2, 0x00);
205         status = afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3, 0x00);
206
207         /* Enable quantizer calibration */
208         status = afe_write_byte(dev, ADC_COM_QUANT, 0x02);
209
210         /* channel initialize, force modulator (fb) reset */
211         status = afe_write_byte(dev, ADC_FB_FRCRST_CH1, 0x17);
212         status = afe_write_byte(dev, ADC_FB_FRCRST_CH2, 0x17);
213         status = afe_write_byte(dev, ADC_FB_FRCRST_CH3, 0x17);
214
215         /* start quantilizer calibration  */
216         status = afe_write_byte(dev, ADC_CAL_ATEST_CH1, 0x10);
217         status = afe_write_byte(dev, ADC_CAL_ATEST_CH2, 0x10);
218         status = afe_write_byte(dev, ADC_CAL_ATEST_CH3, 0x10);
219         msleep(5);
220
221         /* exit modulator (fb) reset */
222         status = afe_write_byte(dev, ADC_FB_FRCRST_CH1, 0x07);
223         status = afe_write_byte(dev, ADC_FB_FRCRST_CH2, 0x07);
224         status = afe_write_byte(dev, ADC_FB_FRCRST_CH3, 0x07);
225
226         /* enable the pre_clamp in each channel for single-ended input */
227         status = afe_write_byte(dev, ADC_NTF_PRECLMP_EN_CH1, 0xf0);
228         status = afe_write_byte(dev, ADC_NTF_PRECLMP_EN_CH2, 0xf0);
229         status = afe_write_byte(dev, ADC_NTF_PRECLMP_EN_CH3, 0xf0);
230
231         /* use diode instead of resistor, so set term_en to 0, res_en to 0  */
232         status = cx231xx_reg_mask_write(dev, AFE_DEVICE_ADDRESS, 8,
233                                    ADC_QGAIN_RES_TRM_CH1, 3, 7, 0x00);
234         status = cx231xx_reg_mask_write(dev, AFE_DEVICE_ADDRESS, 8,
235                                    ADC_QGAIN_RES_TRM_CH2, 3, 7, 0x00);
236         status = cx231xx_reg_mask_write(dev, AFE_DEVICE_ADDRESS, 8,
237                                    ADC_QGAIN_RES_TRM_CH3, 3, 7, 0x00);
238
239         /* dynamic element matching off */
240         status = afe_write_byte(dev, ADC_DCSERVO_DEM_CH1, 0x03);
241         status = afe_write_byte(dev, ADC_DCSERVO_DEM_CH2, 0x03);
242         status = afe_write_byte(dev, ADC_DCSERVO_DEM_CH3, 0x03);
243
244         return status;
245 }
246
247 int cx231xx_afe_setup_AFE_for_baseband(struct cx231xx *dev)
248 {
249         u8 c_value = 0;
250         int status = 0;
251
252         status = afe_read_byte(dev, ADC_PWRDN_CLAMP_CH2, &c_value);
253         c_value &= (~(0x50));
254         status = afe_write_byte(dev, ADC_PWRDN_CLAMP_CH2, c_value);
255
256         return status;
257 }
258
259 /*
260         The Analog Front End in Cx231xx has 3 channels. These
261         channels are used to share between different inputs
262         like tuner, s-video and composite inputs.
263
264         channel 1 ----- pin 1  to pin4(in reg is 1-4)
265         channel 2 ----- pin 5  to pin8(in reg is 5-8)
266         channel 3 ----- pin 9 to pin 12(in reg is 9-11)
267 */
268 int cx231xx_afe_set_input_mux(struct cx231xx *dev, u32 input_mux)
269 {
270         u8 ch1_setting = (u8) input_mux;
271         u8 ch2_setting = (u8) (input_mux >> 8);
272         u8 ch3_setting = (u8) (input_mux >> 16);
273         int status = 0;
274         u8 value = 0;
275
276         if (ch1_setting != 0) {
277                 status = afe_read_byte(dev, ADC_INPUT_CH1, &value);
278                 value &= ~INPUT_SEL_MASK;
279                 value |= (ch1_setting - 1) << 4;
280                 value &= 0xff;
281                 status = afe_write_byte(dev, ADC_INPUT_CH1, value);
282         }
283
284         if (ch2_setting != 0) {
285                 status = afe_read_byte(dev, ADC_INPUT_CH2, &value);
286                 value &= ~INPUT_SEL_MASK;
287                 value |= (ch2_setting - 1) << 4;
288                 value &= 0xff;
289                 status = afe_write_byte(dev, ADC_INPUT_CH2, value);
290         }
291
292         /* For ch3_setting, the value to put in the register is
293            7 less than the input number */
294         if (ch3_setting != 0) {
295                 status = afe_read_byte(dev, ADC_INPUT_CH3, &value);
296                 value &= ~INPUT_SEL_MASK;
297                 value |= (ch3_setting - 1) << 4;
298                 value &= 0xff;
299                 status = afe_write_byte(dev, ADC_INPUT_CH3, value);
300         }
301
302         return status;
303 }
304
305 int cx231xx_afe_set_mode(struct cx231xx *dev, enum AFE_MODE mode)
306 {
307         int status = 0;
308
309         /*
310         * FIXME: We need to implement the AFE code for LOW IF and for HI IF.
311         * Currently, only baseband works.
312         */
313
314         switch (mode) {
315         case AFE_MODE_LOW_IF:
316                 cx231xx_Setup_AFE_for_LowIF(dev);
317                 break;
318         case AFE_MODE_BASEBAND:
319                 status = cx231xx_afe_setup_AFE_for_baseband(dev);
320                 break;
321         case AFE_MODE_EU_HI_IF:
322                 /* SetupAFEforEuHiIF(); */
323                 break;
324         case AFE_MODE_US_HI_IF:
325                 /* SetupAFEforUsHiIF(); */
326                 break;
327         case AFE_MODE_JAPAN_HI_IF:
328                 /* SetupAFEforJapanHiIF(); */
329                 break;
330         }
331
332         if ((mode != dev->afe_mode) &&
333                 (dev->video_input == CX231XX_VMUX_TELEVISION))
334                 status = cx231xx_afe_adjust_ref_count(dev,
335                                                      CX231XX_VMUX_TELEVISION);
336
337         dev->afe_mode = mode;
338
339         return status;
340 }
341
342 int cx231xx_afe_update_power_control(struct cx231xx *dev,
343                                         enum AV_MODE avmode)
344 {
345         u8 afe_power_status = 0;
346         int status = 0;
347
348         switch (dev->model) {
349         case CX231XX_BOARD_CNXT_CARRAERA:
350         case CX231XX_BOARD_CNXT_RDE_250:
351         case CX231XX_BOARD_CNXT_SHELBY:
352         case CX231XX_BOARD_CNXT_RDU_250:
353         case CX231XX_BOARD_CNXT_RDE_253S:
354         case CX231XX_BOARD_CNXT_RDU_253S:
355         case CX231XX_BOARD_CNXT_VIDEO_GRABBER:
356         case CX231XX_BOARD_HAUPPAUGE_EXETER:
357         case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
358         case CX231XX_BOARD_HAUPPAUGE_USBLIVE2:
359         case CX231XX_BOARD_PV_PLAYTV_USB_HYBRID:
360         case CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL:
361         case CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC:
362         case CX231XX_BOARD_OTG102:
363                 if (avmode == POLARIS_AVMODE_ANALOGT_TV) {
364                         while (afe_power_status != (FLD_PWRDN_TUNING_BIAS |
365                                                 FLD_PWRDN_ENABLE_PLL)) {
366                                 status = afe_write_byte(dev, SUP_BLK_PWRDN,
367                                                         FLD_PWRDN_TUNING_BIAS |
368                                                         FLD_PWRDN_ENABLE_PLL);
369                                 status |= afe_read_byte(dev, SUP_BLK_PWRDN,
370                                                         &afe_power_status);
371                                 if (status < 0)
372                                         break;
373                         }
374
375                         status = afe_write_byte(dev, ADC_PWRDN_CLAMP_CH1,
376                                                         0x00);
377                         status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH2,
378                                                         0x00);
379                         status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3,
380                                                         0x00);
381                 } else if (avmode == POLARIS_AVMODE_DIGITAL) {
382                         status = afe_write_byte(dev, ADC_PWRDN_CLAMP_CH1,
383                                                         0x70);
384                         status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH2,
385                                                         0x70);
386                         status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3,
387                                                         0x70);
388
389                         status |= afe_read_byte(dev, SUP_BLK_PWRDN,
390                                                   &afe_power_status);
391                         afe_power_status |= FLD_PWRDN_PD_BANDGAP |
392                                                 FLD_PWRDN_PD_BIAS |
393                                                 FLD_PWRDN_PD_TUNECK;
394                         status |= afe_write_byte(dev, SUP_BLK_PWRDN,
395                                                    afe_power_status);
396                 } else if (avmode == POLARIS_AVMODE_ENXTERNAL_AV) {
397                         while (afe_power_status != (FLD_PWRDN_TUNING_BIAS |
398                                                 FLD_PWRDN_ENABLE_PLL)) {
399                                 status = afe_write_byte(dev, SUP_BLK_PWRDN,
400                                                         FLD_PWRDN_TUNING_BIAS |
401                                                         FLD_PWRDN_ENABLE_PLL);
402                                 status |= afe_read_byte(dev, SUP_BLK_PWRDN,
403                                                         &afe_power_status);
404                                 if (status < 0)
405                                         break;
406                         }
407
408                         status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH1,
409                                                 0x00);
410                         status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH2,
411                                                 0x00);
412                         status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3,
413                                                 0x00);
414                 } else {
415                         dev_dbg(dev->dev, "Invalid AV mode input\n");
416                         status = -1;
417                 }
418                 break;
419         default:
420                 if (avmode == POLARIS_AVMODE_ANALOGT_TV) {
421                         while (afe_power_status != (FLD_PWRDN_TUNING_BIAS |
422                                                 FLD_PWRDN_ENABLE_PLL)) {
423                                 status = afe_write_byte(dev, SUP_BLK_PWRDN,
424                                                         FLD_PWRDN_TUNING_BIAS |
425                                                         FLD_PWRDN_ENABLE_PLL);
426                                 status |= afe_read_byte(dev, SUP_BLK_PWRDN,
427                                                         &afe_power_status);
428                                 if (status < 0)
429                                         break;
430                         }
431
432                         status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH1,
433                                                         0x40);
434                         status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH2,
435                                                         0x40);
436                         status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3,
437                                                         0x00);
438                 } else if (avmode == POLARIS_AVMODE_DIGITAL) {
439                         status = afe_write_byte(dev, ADC_PWRDN_CLAMP_CH1,
440                                                         0x70);
441                         status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH2,
442                                                         0x70);
443                         status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3,
444                                                         0x70);
445
446                         status |= afe_read_byte(dev, SUP_BLK_PWRDN,
447                                                        &afe_power_status);
448                         afe_power_status |= FLD_PWRDN_PD_BANDGAP |
449                                                 FLD_PWRDN_PD_BIAS |
450                                                 FLD_PWRDN_PD_TUNECK;
451                         status |= afe_write_byte(dev, SUP_BLK_PWRDN,
452                                                         afe_power_status);
453                 } else if (avmode == POLARIS_AVMODE_ENXTERNAL_AV) {
454                         while (afe_power_status != (FLD_PWRDN_TUNING_BIAS |
455                                                 FLD_PWRDN_ENABLE_PLL)) {
456                                 status = afe_write_byte(dev, SUP_BLK_PWRDN,
457                                                         FLD_PWRDN_TUNING_BIAS |
458                                                         FLD_PWRDN_ENABLE_PLL);
459                                 status |= afe_read_byte(dev, SUP_BLK_PWRDN,
460                                                         &afe_power_status);
461                                 if (status < 0)
462                                         break;
463                         }
464
465                         status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH1,
466                                                         0x00);
467                         status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH2,
468                                                         0x00);
469                         status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3,
470                                                         0x40);
471                 } else {
472                         dev_dbg(dev->dev, "Invalid AV mode input\n");
473                         status = -1;
474                 }
475         }                       /* switch  */
476
477         return status;
478 }
479
480 int cx231xx_afe_adjust_ref_count(struct cx231xx *dev, u32 video_input)
481 {
482         u8 input_mode = 0;
483         u8 ntf_mode = 0;
484         int status = 0;
485
486         dev->video_input = video_input;
487
488         if (video_input == CX231XX_VMUX_TELEVISION) {
489                 status = afe_read_byte(dev, ADC_INPUT_CH3, &input_mode);
490                 status = afe_read_byte(dev, ADC_NTF_PRECLMP_EN_CH3,
491                                         &ntf_mode);
492         } else {
493                 status = afe_read_byte(dev, ADC_INPUT_CH1, &input_mode);
494                 status = afe_read_byte(dev, ADC_NTF_PRECLMP_EN_CH1,
495                                         &ntf_mode);
496         }
497
498         input_mode = (ntf_mode & 0x3) | ((input_mode & 0x6) << 1);
499
500         switch (input_mode) {
501         case SINGLE_ENDED:
502                 dev->afe_ref_count = 0x23C;
503                 break;
504         case LOW_IF:
505                 dev->afe_ref_count = 0x24C;
506                 break;
507         case EU_IF:
508                 dev->afe_ref_count = 0x258;
509                 break;
510         case US_IF:
511                 dev->afe_ref_count = 0x260;
512                 break;
513         default:
514                 break;
515         }
516
517         status = cx231xx_afe_init_super_block(dev, dev->afe_ref_count);
518
519         return status;
520 }
521
522 /******************************************************************************
523  *     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    *
524  ******************************************************************************/
525 static int vid_blk_write_byte(struct cx231xx *dev, u16 saddr, u8 data)
526 {
527         return cx231xx_write_i2c_data(dev, VID_BLK_I2C_ADDRESS,
528                                         saddr, 2, data, 1);
529 }
530
531 static int vid_blk_read_byte(struct cx231xx *dev, u16 saddr, u8 *data)
532 {
533         int status;
534         u32 temp = 0;
535
536         status = cx231xx_read_i2c_data(dev, VID_BLK_I2C_ADDRESS,
537                                         saddr, 2, &temp, 1);
538         *data = (u8) temp;
539         return status;
540 }
541
542 static int vid_blk_write_word(struct cx231xx *dev, u16 saddr, u32 data)
543 {
544         return cx231xx_write_i2c_data(dev, VID_BLK_I2C_ADDRESS,
545                                         saddr, 2, data, 4);
546 }
547
548 static int vid_blk_read_word(struct cx231xx *dev, u16 saddr, u32 *data)
549 {
550         return cx231xx_read_i2c_data(dev, VID_BLK_I2C_ADDRESS,
551                                         saddr, 2, data, 4);
552 }
553 int cx231xx_check_fw(struct cx231xx *dev)
554 {
555         u8 temp = 0;
556         int status = 0;
557         status = vid_blk_read_byte(dev, DL_CTL_ADDRESS_LOW, &temp);
558         if (status < 0)
559                 return status;
560         else
561                 return temp;
562
563 }
564
565 int cx231xx_set_video_input_mux(struct cx231xx *dev, u8 input)
566 {
567         int status = 0;
568
569         switch (INPUT(input)->type) {
570         case CX231XX_VMUX_COMPOSITE1:
571         case CX231XX_VMUX_SVIDEO:
572                 if ((dev->current_pcb_config.type == USB_BUS_POWER) &&
573                     (dev->power_mode != POLARIS_AVMODE_ENXTERNAL_AV)) {
574                         /* External AV */
575                         status = cx231xx_set_power_mode(dev,
576                                         POLARIS_AVMODE_ENXTERNAL_AV);
577                         if (status < 0) {
578                                 dev_err(dev->dev,
579                                         "%s: Failed to set Power - errCode [%d]!\n",
580                                         __func__, status);
581                                 return status;
582                         }
583                 }
584                 status = cx231xx_set_decoder_video_input(dev,
585                                                          INPUT(input)->type,
586                                                          INPUT(input)->vmux);
587                 break;
588         case CX231XX_VMUX_TELEVISION:
589         case CX231XX_VMUX_CABLE:
590                 if ((dev->current_pcb_config.type == USB_BUS_POWER) &&
591                     (dev->power_mode != POLARIS_AVMODE_ANALOGT_TV)) {
592                         /* Tuner */
593                         status = cx231xx_set_power_mode(dev,
594                                                 POLARIS_AVMODE_ANALOGT_TV);
595                         if (status < 0) {
596                                 dev_err(dev->dev,
597                                         "%s: Failed to set Power - errCode [%d]!\n",
598                                         __func__, status);
599                                 return status;
600                         }
601                 }
602                 if (dev->tuner_type == TUNER_NXP_TDA18271)
603                         status = cx231xx_set_decoder_video_input(dev,
604                                                         CX231XX_VMUX_TELEVISION,
605                                                         INPUT(input)->vmux);
606                 else
607                         status = cx231xx_set_decoder_video_input(dev,
608                                                         CX231XX_VMUX_COMPOSITE1,
609                                                         INPUT(input)->vmux);
610
611                 break;
612         default:
613                 dev_err(dev->dev, "%s: Unknown Input %d !\n",
614                         __func__, INPUT(input)->type);
615                 break;
616         }
617
618         /* save the selection */
619         dev->video_input = input;
620
621         return status;
622 }
623
624 int cx231xx_set_decoder_video_input(struct cx231xx *dev,
625                                 u8 pin_type, u8 input)
626 {
627         int status = 0;
628         u32 value = 0;
629
630         if (pin_type != dev->video_input) {
631                 status = cx231xx_afe_adjust_ref_count(dev, pin_type);
632                 if (status < 0) {
633                         dev_err(dev->dev,
634                                 "%s: adjust_ref_count :Failed to set AFE input mux - errCode [%d]!\n",
635                                 __func__, status);
636                         return status;
637                 }
638         }
639
640         /* call afe block to set video inputs */
641         status = cx231xx_afe_set_input_mux(dev, input);
642         if (status < 0) {
643                 dev_err(dev->dev,
644                         "%s: set_input_mux :Failed to set AFE input mux - errCode [%d]!\n",
645                         __func__, status);
646                 return status;
647         }
648
649         switch (pin_type) {
650         case CX231XX_VMUX_COMPOSITE1:
651                 status = vid_blk_read_word(dev, AFE_CTRL, &value);
652                 value |= (0 << 13) | (1 << 4);
653                 value &= ~(1 << 5);
654
655                 /* set [24:23] [22:15] to 0  */
656                 value &= (~(0x1ff8000));
657                 /* set FUNC_MODE[24:23] = 2 IF_MOD[22:15] = 0  */
658                 value |= 0x1000000;
659                 status = vid_blk_write_word(dev, AFE_CTRL, value);
660
661                 status = vid_blk_read_word(dev, OUT_CTRL1, &value);
662                 value |= (1 << 7);
663                 status = vid_blk_write_word(dev, OUT_CTRL1, value);
664
665                 /* Set output mode */
666                 status = cx231xx_read_modify_write_i2c_dword(dev,
667                                                         VID_BLK_I2C_ADDRESS,
668                                                         OUT_CTRL1,
669                                                         FLD_OUT_MODE,
670                                                         dev->board.output_mode);
671
672                 /* Tell DIF object to go to baseband mode  */
673                 status = cx231xx_dif_set_standard(dev, DIF_USE_BASEBAND);
674                 if (status < 0) {
675                         dev_err(dev->dev,
676                                 "%s: cx231xx_dif set to By pass mode- errCode [%d]!\n",
677                                 __func__, status);
678                         return status;
679                 }
680
681                 /* Read the DFE_CTRL1 register */
682                 status = vid_blk_read_word(dev, DFE_CTRL1, &value);
683
684                 /* enable the VBI_GATE_EN */
685                 value |= FLD_VBI_GATE_EN;
686
687                 /* Enable the auto-VGA enable */
688                 value |= FLD_VGA_AUTO_EN;
689
690                 /* Write it back */
691                 status = vid_blk_write_word(dev, DFE_CTRL1, value);
692
693                 /* Disable auto config of registers */
694                 status = cx231xx_read_modify_write_i2c_dword(dev,
695                                         VID_BLK_I2C_ADDRESS,
696                                         MODE_CTRL, FLD_ACFG_DIS,
697                                         cx231xx_set_field(FLD_ACFG_DIS, 1));
698
699                 /* Set CVBS input mode */
700                 status = cx231xx_read_modify_write_i2c_dword(dev,
701                         VID_BLK_I2C_ADDRESS,
702                         MODE_CTRL, FLD_INPUT_MODE,
703                         cx231xx_set_field(FLD_INPUT_MODE, INPUT_MODE_CVBS_0));
704                 break;
705         case CX231XX_VMUX_SVIDEO:
706                 /* Disable the use of  DIF */
707
708                 status = vid_blk_read_word(dev, AFE_CTRL, &value);
709
710                 /* set [24:23] [22:15] to 0 */
711                 value &= (~(0x1ff8000));
712                 /* set FUNC_MODE[24:23] = 2
713                 IF_MOD[22:15] = 0 DCR_BYP_CH2[4:4] = 1; */
714                 value |= 0x1000010;
715                 status = vid_blk_write_word(dev, AFE_CTRL, value);
716
717                 /* Tell DIF object to go to baseband mode */
718                 status = cx231xx_dif_set_standard(dev, DIF_USE_BASEBAND);
719                 if (status < 0) {
720                         dev_err(dev->dev,
721                                 "%s: cx231xx_dif set to By pass mode- errCode [%d]!\n",
722                                 __func__, status);
723                         return status;
724                 }
725
726                 /* Read the DFE_CTRL1 register */
727                 status = vid_blk_read_word(dev, DFE_CTRL1, &value);
728
729                 /* enable the VBI_GATE_EN */
730                 value |= FLD_VBI_GATE_EN;
731
732                 /* Enable the auto-VGA enable */
733                 value |= FLD_VGA_AUTO_EN;
734
735                 /* Write it back */
736                 status = vid_blk_write_word(dev, DFE_CTRL1, value);
737
738                 /* Disable auto config of registers  */
739                 status =  cx231xx_read_modify_write_i2c_dword(dev,
740                                         VID_BLK_I2C_ADDRESS,
741                                         MODE_CTRL, FLD_ACFG_DIS,
742                                         cx231xx_set_field(FLD_ACFG_DIS, 1));
743
744                 /* Set YC input mode */
745                 status = cx231xx_read_modify_write_i2c_dword(dev,
746                         VID_BLK_I2C_ADDRESS,
747                         MODE_CTRL,
748                         FLD_INPUT_MODE,
749                         cx231xx_set_field(FLD_INPUT_MODE, INPUT_MODE_YC_1));
750
751                 /* Chroma to ADC2 */
752                 status = vid_blk_read_word(dev, AFE_CTRL, &value);
753                 value |= FLD_CHROMA_IN_SEL;     /* set the chroma in select */
754
755                 /* Clear VGA_SEL_CH2 and VGA_SEL_CH3 (bits 7 and 8)
756                    This sets them to use video
757                    rather than audio.  Only one of the two will be in use. */
758                 value &= ~(FLD_VGA_SEL_CH2 | FLD_VGA_SEL_CH3);
759
760                 status = vid_blk_write_word(dev, AFE_CTRL, value);
761
762                 status = cx231xx_afe_set_mode(dev, AFE_MODE_BASEBAND);
763                 break;
764         case CX231XX_VMUX_TELEVISION:
765         case CX231XX_VMUX_CABLE:
766         default:
767                 /* TODO: Test if this is also needed for xc2028/xc3028 */
768                 if (dev->board.tuner_type == TUNER_XC5000) {
769                         /* Disable the use of  DIF   */
770
771                         status = vid_blk_read_word(dev, AFE_CTRL, &value);
772                         value |= (0 << 13) | (1 << 4);
773                         value &= ~(1 << 5);
774
775                         /* set [24:23] [22:15] to 0 */
776                         value &= (~(0x1FF8000));
777                         /* set FUNC_MODE[24:23] = 2 IF_MOD[22:15] = 0 */
778                         value |= 0x1000000;
779                         status = vid_blk_write_word(dev, AFE_CTRL, value);
780
781                         status = vid_blk_read_word(dev, OUT_CTRL1, &value);
782                         value |= (1 << 7);
783                         status = vid_blk_write_word(dev, OUT_CTRL1, value);
784
785                         /* Set output mode */
786                         status = cx231xx_read_modify_write_i2c_dword(dev,
787                                                         VID_BLK_I2C_ADDRESS,
788                                                         OUT_CTRL1, FLD_OUT_MODE,
789                                                         dev->board.output_mode);
790
791                         /* Tell DIF object to go to baseband mode */
792                         status = cx231xx_dif_set_standard(dev,
793                                                           DIF_USE_BASEBAND);
794                         if (status < 0) {
795                                 dev_err(dev->dev,
796                                         "%s: cx231xx_dif set to By pass mode- errCode [%d]!\n",
797                                        __func__, status);
798                                 return status;
799                         }
800
801                         /* Read the DFE_CTRL1 register */
802                         status = vid_blk_read_word(dev, DFE_CTRL1, &value);
803
804                         /* enable the VBI_GATE_EN */
805                         value |= FLD_VBI_GATE_EN;
806
807                         /* Enable the auto-VGA enable */
808                         value |= FLD_VGA_AUTO_EN;
809
810                         /* Write it back */
811                         status = vid_blk_write_word(dev, DFE_CTRL1, value);
812
813                         /* Disable auto config of registers */
814                         status = cx231xx_read_modify_write_i2c_dword(dev,
815                                         VID_BLK_I2C_ADDRESS,
816                                         MODE_CTRL, FLD_ACFG_DIS,
817                                         cx231xx_set_field(FLD_ACFG_DIS, 1));
818
819                         /* Set CVBS input mode */
820                         status = cx231xx_read_modify_write_i2c_dword(dev,
821                                 VID_BLK_I2C_ADDRESS,
822                                 MODE_CTRL, FLD_INPUT_MODE,
823                                 cx231xx_set_field(FLD_INPUT_MODE,
824                                                 INPUT_MODE_CVBS_0));
825                 } else {
826                         /* Enable the DIF for the tuner */
827
828                         /* Reinitialize the DIF */
829                         status = cx231xx_dif_set_standard(dev, dev->norm);
830                         if (status < 0) {
831                                 dev_err(dev->dev,
832                                         "%s: cx231xx_dif set to By pass mode- errCode [%d]!\n",
833                                         __func__, status);
834                                 return status;
835                         }
836
837                         /* Make sure bypass is cleared */
838                         status = vid_blk_read_word(dev, DIF_MISC_CTRL, &value);
839
840                         /* Clear the bypass bit */
841                         value &= ~FLD_DIF_DIF_BYPASS;
842
843                         /* Enable the use of the DIF block */
844                         status = vid_blk_write_word(dev, DIF_MISC_CTRL, value);
845
846                         /* Read the DFE_CTRL1 register */
847                         status = vid_blk_read_word(dev, DFE_CTRL1, &value);
848
849                         /* Disable the VBI_GATE_EN */
850                         value &= ~FLD_VBI_GATE_EN;
851
852                         /* Enable the auto-VGA enable, AGC, and
853                            set the skip count to 2 */
854                         value |= FLD_VGA_AUTO_EN | FLD_AGC_AUTO_EN | 0x00200000;
855
856                         /* Write it back */
857                         status = vid_blk_write_word(dev, DFE_CTRL1, value);
858
859                         /* Wait until AGC locks up */
860                         msleep(1);
861
862                         /* Disable the auto-VGA enable AGC */
863                         value &= ~(FLD_VGA_AUTO_EN);
864
865                         /* Write it back */
866                         status = vid_blk_write_word(dev, DFE_CTRL1, value);
867
868                         /* Enable Polaris B0 AGC output */
869                         status = vid_blk_read_word(dev, PIN_CTRL, &value);
870                         value |= (FLD_OEF_AGC_RF) |
871                                  (FLD_OEF_AGC_IFVGA) |
872                                  (FLD_OEF_AGC_IF);
873                         status = vid_blk_write_word(dev, PIN_CTRL, value);
874
875                         /* Set output mode */
876                         status = cx231xx_read_modify_write_i2c_dword(dev,
877                                                 VID_BLK_I2C_ADDRESS,
878                                                 OUT_CTRL1, FLD_OUT_MODE,
879                                                 dev->board.output_mode);
880
881                         /* Disable auto config of registers */
882                         status = cx231xx_read_modify_write_i2c_dword(dev,
883                                         VID_BLK_I2C_ADDRESS,
884                                         MODE_CTRL, FLD_ACFG_DIS,
885                                         cx231xx_set_field(FLD_ACFG_DIS, 1));
886
887                         /* Set CVBS input mode */
888                         status = cx231xx_read_modify_write_i2c_dword(dev,
889                                 VID_BLK_I2C_ADDRESS,
890                                 MODE_CTRL, FLD_INPUT_MODE,
891                                 cx231xx_set_field(FLD_INPUT_MODE,
892                                                 INPUT_MODE_CVBS_0));
893
894                         /* Set some bits in AFE_CTRL so that channel 2 or 3
895                          * is ready to receive audio */
896                         /* Clear clamp for channels 2 and 3      (bit 16-17) */
897                         /* Clear droop comp                      (bit 19-20) */
898                         /* Set VGA_SEL (for audio control)       (bit 7-8) */
899                         status = vid_blk_read_word(dev, AFE_CTRL, &value);
900
901                         /*Set Func mode:01-DIF 10-baseband 11-YUV*/
902                         value &= (~(FLD_FUNC_MODE));
903                         value |= 0x800000;
904
905                         value |= FLD_VGA_SEL_CH3 | FLD_VGA_SEL_CH2;
906
907                         status = vid_blk_write_word(dev, AFE_CTRL, value);
908
909                         if (dev->tuner_type == TUNER_NXP_TDA18271) {
910                                 status = vid_blk_read_word(dev, PIN_CTRL,
911                                  &value);
912                                 status = vid_blk_write_word(dev, PIN_CTRL,
913                                  (value & 0xFFFFFFEF));
914                         }
915
916                         break;
917
918                 }
919                 break;
920         }
921
922         /* Set raw VBI mode */
923         status = cx231xx_read_modify_write_i2c_dword(dev,
924                                 VID_BLK_I2C_ADDRESS,
925                                 OUT_CTRL1, FLD_VBIHACTRAW_EN,
926                                 cx231xx_set_field(FLD_VBIHACTRAW_EN, 1));
927
928         status = vid_blk_read_word(dev, OUT_CTRL1, &value);
929         if (value & 0x02) {
930                 value |= (1 << 19);
931                 status = vid_blk_write_word(dev, OUT_CTRL1, value);
932         }
933
934         return status;
935 }
936
937 void cx231xx_enable656(struct cx231xx *dev)
938 {
939         u8 temp = 0;
940         /*enable TS1 data[0:7] as output to export 656*/
941
942         vid_blk_write_byte(dev, TS1_PIN_CTL0, 0xFF);
943
944         /*enable TS1 clock as output to export 656*/
945
946         vid_blk_read_byte(dev, TS1_PIN_CTL1, &temp);
947         temp = temp|0x04;
948
949         vid_blk_write_byte(dev, TS1_PIN_CTL1, temp);
950 }
951 EXPORT_SYMBOL_GPL(cx231xx_enable656);
952
953 void cx231xx_disable656(struct cx231xx *dev)
954 {
955         u8 temp = 0;
956
957         vid_blk_write_byte(dev, TS1_PIN_CTL0, 0x00);
958
959         vid_blk_read_byte(dev, TS1_PIN_CTL1, &temp);
960         temp = temp&0xFB;
961
962         vid_blk_write_byte(dev, TS1_PIN_CTL1, temp);
963 }
964 EXPORT_SYMBOL_GPL(cx231xx_disable656);
965
966 /*
967  * Handle any video-mode specific overrides that are different
968  * on a per video standards basis after touching the MODE_CTRL
969  * register which resets many values for autodetect
970  */
971 int cx231xx_do_mode_ctrl_overrides(struct cx231xx *dev)
972 {
973         int status = 0;
974
975         dev_dbg(dev->dev, "%s: 0x%x\n",
976                 __func__, (unsigned int)dev->norm);
977
978         /* Change the DFE_CTRL3 bp_percent to fix flagging */
979         status = vid_blk_write_word(dev, DFE_CTRL3, 0xCD3F0280);
980
981         if (dev->norm & (V4L2_STD_NTSC | V4L2_STD_PAL_M)) {
982                 dev_dbg(dev->dev, "%s: NTSC\n", __func__);
983
984                 /* Move the close caption lines out of active video,
985                    adjust the active video start point */
986                 status = cx231xx_read_modify_write_i2c_dword(dev,
987                                                         VID_BLK_I2C_ADDRESS,
988                                                         VERT_TIM_CTRL,
989                                                         FLD_VBLANK_CNT, 0x18);
990                 status = cx231xx_read_modify_write_i2c_dword(dev,
991                                                         VID_BLK_I2C_ADDRESS,
992                                                         VERT_TIM_CTRL,
993                                                         FLD_VACTIVE_CNT,
994                                                         0x1E7000);
995                 status = cx231xx_read_modify_write_i2c_dword(dev,
996                                                         VID_BLK_I2C_ADDRESS,
997                                                         VERT_TIM_CTRL,
998                                                         FLD_V656BLANK_CNT,
999                                                         0x1C000000);
1000
1001                 status = cx231xx_read_modify_write_i2c_dword(dev,
1002                                                         VID_BLK_I2C_ADDRESS,
1003                                                         HORIZ_TIM_CTRL,
1004                                                         FLD_HBLANK_CNT,
1005                                                         cx231xx_set_field
1006                                                         (FLD_HBLANK_CNT, 0x79));
1007
1008         } else if (dev->norm & V4L2_STD_SECAM) {
1009                 dev_dbg(dev->dev, "%s: SECAM\n", __func__);
1010                 status =  cx231xx_read_modify_write_i2c_dword(dev,
1011                                                         VID_BLK_I2C_ADDRESS,
1012                                                         VERT_TIM_CTRL,
1013                                                         FLD_VBLANK_CNT, 0x20);
1014                 status = cx231xx_read_modify_write_i2c_dword(dev,
1015                                                         VID_BLK_I2C_ADDRESS,
1016                                                         VERT_TIM_CTRL,
1017                                                         FLD_VACTIVE_CNT,
1018                                                         cx231xx_set_field
1019                                                         (FLD_VACTIVE_CNT,
1020                                                          0x244));
1021                 status = cx231xx_read_modify_write_i2c_dword(dev,
1022                                                         VID_BLK_I2C_ADDRESS,
1023                                                         VERT_TIM_CTRL,
1024                                                         FLD_V656BLANK_CNT,
1025                                                         cx231xx_set_field
1026                                                         (FLD_V656BLANK_CNT,
1027                                                         0x24));
1028                 /* Adjust the active video horizontal start point */
1029                 status = cx231xx_read_modify_write_i2c_dword(dev,
1030                                                         VID_BLK_I2C_ADDRESS,
1031                                                         HORIZ_TIM_CTRL,
1032                                                         FLD_HBLANK_CNT,
1033                                                         cx231xx_set_field
1034                                                         (FLD_HBLANK_CNT, 0x85));
1035         } else {
1036                 dev_dbg(dev->dev, "%s: PAL\n", __func__);
1037                 status = cx231xx_read_modify_write_i2c_dword(dev,
1038                                                         VID_BLK_I2C_ADDRESS,
1039                                                         VERT_TIM_CTRL,
1040                                                         FLD_VBLANK_CNT, 0x20);
1041                 status = cx231xx_read_modify_write_i2c_dword(dev,
1042                                                         VID_BLK_I2C_ADDRESS,
1043                                                         VERT_TIM_CTRL,
1044                                                         FLD_VACTIVE_CNT,
1045                                                         cx231xx_set_field
1046                                                         (FLD_VACTIVE_CNT,
1047                                                          0x244));
1048                 status = cx231xx_read_modify_write_i2c_dword(dev,
1049                                                         VID_BLK_I2C_ADDRESS,
1050                                                         VERT_TIM_CTRL,
1051                                                         FLD_V656BLANK_CNT,
1052                                                         cx231xx_set_field
1053                                                         (FLD_V656BLANK_CNT,
1054                                                         0x24));
1055                 /* Adjust the active video horizontal start point */
1056                 status = cx231xx_read_modify_write_i2c_dword(dev,
1057                                                         VID_BLK_I2C_ADDRESS,
1058                                                         HORIZ_TIM_CTRL,
1059                                                         FLD_HBLANK_CNT,
1060                                                         cx231xx_set_field
1061                                                         (FLD_HBLANK_CNT, 0x85));
1062
1063         }
1064
1065         return status;
1066 }
1067
1068 int cx231xx_unmute_audio(struct cx231xx *dev)
1069 {
1070         return vid_blk_write_byte(dev, PATH1_VOL_CTL, 0x24);
1071 }
1072 EXPORT_SYMBOL_GPL(cx231xx_unmute_audio);
1073
1074 static int stopAudioFirmware(struct cx231xx *dev)
1075 {
1076         return vid_blk_write_byte(dev, DL_CTL_CONTROL, 0x03);
1077 }
1078
1079 static int restartAudioFirmware(struct cx231xx *dev)
1080 {
1081         return vid_blk_write_byte(dev, DL_CTL_CONTROL, 0x13);
1082 }
1083
1084 int cx231xx_set_audio_input(struct cx231xx *dev, u8 input)
1085 {
1086         int status = 0;
1087         enum AUDIO_INPUT ainput = AUDIO_INPUT_LINE;
1088
1089         switch (INPUT(input)->amux) {
1090         case CX231XX_AMUX_VIDEO:
1091                 ainput = AUDIO_INPUT_TUNER_TV;
1092                 break;
1093         case CX231XX_AMUX_LINE_IN:
1094                 status = cx231xx_i2s_blk_set_audio_input(dev, input);
1095                 ainput = AUDIO_INPUT_LINE;
1096                 break;
1097         default:
1098                 break;
1099         }
1100
1101         status = cx231xx_set_audio_decoder_input(dev, ainput);
1102
1103         return status;
1104 }
1105
1106 int cx231xx_set_audio_decoder_input(struct cx231xx *dev,
1107                                     enum AUDIO_INPUT audio_input)
1108 {
1109         u32 dwval;
1110         int status;
1111         u8 gen_ctrl;
1112         u32 value = 0;
1113
1114         /* Put it in soft reset   */
1115         status = vid_blk_read_byte(dev, GENERAL_CTL, &gen_ctrl);
1116         gen_ctrl |= 1;
1117         status = vid_blk_write_byte(dev, GENERAL_CTL, gen_ctrl);
1118
1119         switch (audio_input) {
1120         case AUDIO_INPUT_LINE:
1121                 /* setup AUD_IO control from Merlin paralle output */
1122                 value = cx231xx_set_field(FLD_AUD_CHAN1_SRC,
1123                                           AUD_CHAN_SRC_PARALLEL);
1124                 status = vid_blk_write_word(dev, AUD_IO_CTRL, value);
1125
1126                 /* setup input to Merlin, SRC2 connect to AC97
1127                    bypass upsample-by-2, slave mode, sony mode, left justify
1128                    adr 091c, dat 01000000 */
1129                 status = vid_blk_read_word(dev, AC97_CTL, &dwval);
1130
1131                 status = vid_blk_write_word(dev, AC97_CTL,
1132                                            (dwval | FLD_AC97_UP2X_BYPASS));
1133
1134                 /* select the parallel1 and SRC3 */
1135                 status = vid_blk_write_word(dev, BAND_OUT_SEL,
1136                                 cx231xx_set_field(FLD_SRC3_IN_SEL, 0x0) |
1137                                 cx231xx_set_field(FLD_SRC3_CLK_SEL, 0x0) |
1138                                 cx231xx_set_field(FLD_PARALLEL1_SRC_SEL, 0x0));
1139
1140                 /* unmute all, AC97 in, independence mode
1141                    adr 08d0, data 0x00063073 */
1142                 status = vid_blk_write_word(dev, DL_CTL, 0x3000001);
1143                 status = vid_blk_write_word(dev, PATH1_CTL1, 0x00063073);
1144
1145                 /* set AVC maximum threshold, adr 08d4, dat ffff0024 */
1146                 status = vid_blk_read_word(dev, PATH1_VOL_CTL, &dwval);
1147                 status = vid_blk_write_word(dev, PATH1_VOL_CTL,
1148                                            (dwval | FLD_PATH1_AVC_THRESHOLD));
1149
1150                 /* set SC maximum threshold, adr 08ec, dat ffffb3a3 */
1151                 status = vid_blk_read_word(dev, PATH1_SC_CTL, &dwval);
1152                 status = vid_blk_write_word(dev, PATH1_SC_CTL,
1153                                            (dwval | FLD_PATH1_SC_THRESHOLD));
1154                 break;
1155
1156         case AUDIO_INPUT_TUNER_TV:
1157         default:
1158                 status = stopAudioFirmware(dev);
1159                 /* Setup SRC sources and clocks */
1160                 status = vid_blk_write_word(dev, BAND_OUT_SEL,
1161                         cx231xx_set_field(FLD_SRC6_IN_SEL, 0x00)         |
1162                         cx231xx_set_field(FLD_SRC6_CLK_SEL, 0x01)        |
1163                         cx231xx_set_field(FLD_SRC5_IN_SEL, 0x00)         |
1164                         cx231xx_set_field(FLD_SRC5_CLK_SEL, 0x02)        |
1165                         cx231xx_set_field(FLD_SRC4_IN_SEL, 0x02)         |
1166                         cx231xx_set_field(FLD_SRC4_CLK_SEL, 0x03)        |
1167                         cx231xx_set_field(FLD_SRC3_IN_SEL, 0x00)         |
1168                         cx231xx_set_field(FLD_SRC3_CLK_SEL, 0x00)        |
1169                         cx231xx_set_field(FLD_BASEBAND_BYPASS_CTL, 0x00) |
1170                         cx231xx_set_field(FLD_AC97_SRC_SEL, 0x03)        |
1171                         cx231xx_set_field(FLD_I2S_SRC_SEL, 0x00)         |
1172                         cx231xx_set_field(FLD_PARALLEL2_SRC_SEL, 0x02)   |
1173                         cx231xx_set_field(FLD_PARALLEL1_SRC_SEL, 0x01));
1174
1175                 /* Setup the AUD_IO control */
1176                 status = vid_blk_write_word(dev, AUD_IO_CTRL,
1177                         cx231xx_set_field(FLD_I2S_PORT_DIR, 0x00)  |
1178                         cx231xx_set_field(FLD_I2S_OUT_SRC, 0x00)   |
1179                         cx231xx_set_field(FLD_AUD_CHAN3_SRC, 0x00) |
1180                         cx231xx_set_field(FLD_AUD_CHAN2_SRC, 0x00) |
1181                         cx231xx_set_field(FLD_AUD_CHAN1_SRC, 0x03));
1182
1183                 status = vid_blk_write_word(dev, PATH1_CTL1, 0x1F063870);
1184
1185                 /* setAudioStandard(_audio_standard); */
1186                 status = vid_blk_write_word(dev, PATH1_CTL1, 0x00063870);
1187
1188                 status = restartAudioFirmware(dev);
1189
1190                 switch (dev->board.tuner_type) {
1191                 case TUNER_XC5000:
1192                         /* SIF passthrough at 28.6363 MHz sample rate */
1193                         status = cx231xx_read_modify_write_i2c_dword(dev,
1194                                         VID_BLK_I2C_ADDRESS,
1195                                         CHIP_CTRL,
1196                                         FLD_SIF_EN,
1197                                         cx231xx_set_field(FLD_SIF_EN, 1));
1198                         break;
1199                 case TUNER_NXP_TDA18271:
1200                         /* Normal mode: SIF passthrough at 14.32 MHz */
1201                         status = cx231xx_read_modify_write_i2c_dword(dev,
1202                                         VID_BLK_I2C_ADDRESS,
1203                                         CHIP_CTRL,
1204                                         FLD_SIF_EN,
1205                                         cx231xx_set_field(FLD_SIF_EN, 0));
1206                         break;
1207                 default:
1208                         /* This is just a casual suggestion to people adding
1209                            new boards in case they use a tuner type we don't
1210                            currently know about */
1211                         dev_info(dev->dev,
1212                                  "Unknown tuner type configuring SIF");
1213                         break;
1214                 }
1215                 break;
1216
1217         case AUDIO_INPUT_TUNER_FM:
1218                 /*  use SIF for FM radio
1219                    setupFM();
1220                    setAudioStandard(_audio_standard);
1221                  */
1222                 break;
1223
1224         case AUDIO_INPUT_MUTE:
1225                 status = vid_blk_write_word(dev, PATH1_CTL1, 0x1F011012);
1226                 break;
1227         }
1228
1229         /* Take it out of soft reset */
1230         status = vid_blk_read_byte(dev, GENERAL_CTL, &gen_ctrl);
1231         gen_ctrl &= ~1;
1232         status = vid_blk_write_byte(dev, GENERAL_CTL, gen_ctrl);
1233
1234         return status;
1235 }
1236
1237 /******************************************************************************
1238  *                    C H I P Specific  C O N T R O L   functions             *
1239  ******************************************************************************/
1240 int cx231xx_init_ctrl_pin_status(struct cx231xx *dev)
1241 {
1242         u32 value;
1243         int status = 0;
1244
1245         status = vid_blk_read_word(dev, PIN_CTRL, &value);
1246         value |= (~dev->board.ctl_pin_status_mask);
1247         status = vid_blk_write_word(dev, PIN_CTRL, value);
1248
1249         return status;
1250 }
1251
1252 int cx231xx_set_agc_analog_digital_mux_select(struct cx231xx *dev,
1253                                               u8 analog_or_digital)
1254 {
1255         int status = 0;
1256
1257         /* first set the direction to output */
1258         status = cx231xx_set_gpio_direction(dev,
1259                                             dev->board.
1260                                             agc_analog_digital_select_gpio, 1);
1261
1262         /* 0 - demod ; 1 - Analog mode */
1263         status = cx231xx_set_gpio_value(dev,
1264                                    dev->board.agc_analog_digital_select_gpio,
1265                                    analog_or_digital);
1266
1267         return status;
1268 }
1269
1270 int cx231xx_enable_i2c_port_3(struct cx231xx *dev, bool is_port_3)
1271 {
1272         u8 value[4] = { 0, 0, 0, 0 };
1273         int status = 0;
1274         bool current_is_port_3;
1275
1276         /*
1277          * Should this code check dev->port_3_switch_enabled first
1278          * to skip unnecessary reading of the register?
1279          * If yes, the flag dev->port_3_switch_enabled must be initialized
1280          * correctly.
1281          */
1282
1283         status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER,
1284                                        PWR_CTL_EN, value, 4);
1285         if (status < 0)
1286                 return status;
1287
1288         current_is_port_3 = value[0] & I2C_DEMOD_EN ? true : false;
1289
1290         /* Just return, if already using the right port */
1291         if (current_is_port_3 == is_port_3)
1292                 return 0;
1293
1294         if (is_port_3)
1295                 value[0] |= I2C_DEMOD_EN;
1296         else
1297                 value[0] &= ~I2C_DEMOD_EN;
1298
1299         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1300                                         PWR_CTL_EN, value, 4);
1301
1302         /* remember status of the switch for usage in is_tuner */
1303         if (status >= 0)
1304                 dev->port_3_switch_enabled = is_port_3;
1305
1306         return status;
1307
1308 }
1309 EXPORT_SYMBOL_GPL(cx231xx_enable_i2c_port_3);
1310
1311 void update_HH_register_after_set_DIF(struct cx231xx *dev)
1312 {
1313 /*
1314         u8 status = 0;
1315         u32 value = 0;
1316
1317         vid_blk_write_word(dev, PIN_CTRL, 0xA0FFF82F);
1318         vid_blk_write_word(dev, DIF_MISC_CTRL, 0x0A203F11);
1319         vid_blk_write_word(dev, DIF_SRC_PHASE_INC, 0x1BEFBF06);
1320
1321         status = vid_blk_read_word(dev, AFE_CTRL_C2HH_SRC_CTRL, &value);
1322         vid_blk_write_word(dev, AFE_CTRL_C2HH_SRC_CTRL, 0x4485D390);
1323         status = vid_blk_read_word(dev, AFE_CTRL_C2HH_SRC_CTRL,  &value);
1324 */
1325 }
1326
1327 void cx231xx_dump_HH_reg(struct cx231xx *dev)
1328 {
1329         u32 value = 0;
1330         u16  i = 0;
1331
1332         value = 0x45005390;
1333         vid_blk_write_word(dev, 0x104, value);
1334
1335         for (i = 0x100; i < 0x140; i++) {
1336                 vid_blk_read_word(dev, i, &value);
1337                 dev_dbg(dev->dev, "reg0x%x=0x%x\n", i, value);
1338                 i = i+3;
1339         }
1340
1341         for (i = 0x300; i < 0x400; i++) {
1342                 vid_blk_read_word(dev, i, &value);
1343                 dev_dbg(dev->dev, "reg0x%x=0x%x\n", i, value);
1344                 i = i+3;
1345         }
1346
1347         for (i = 0x400; i < 0x440; i++) {
1348                 vid_blk_read_word(dev, i,  &value);
1349                 dev_dbg(dev->dev, "reg0x%x=0x%x\n", i, value);
1350                 i = i+3;
1351         }
1352
1353         vid_blk_read_word(dev, AFE_CTRL_C2HH_SRC_CTRL, &value);
1354         dev_dbg(dev->dev, "AFE_CTRL_C2HH_SRC_CTRL=0x%x\n", value);
1355         vid_blk_write_word(dev, AFE_CTRL_C2HH_SRC_CTRL, 0x4485D390);
1356         vid_blk_read_word(dev, AFE_CTRL_C2HH_SRC_CTRL, &value);
1357         dev_dbg(dev->dev, "AFE_CTRL_C2HH_SRC_CTRL=0x%x\n", value);
1358 }
1359
1360 #if 0
1361 static void cx231xx_dump_SC_reg(struct cx231xx *dev)
1362 {
1363         u8 value[4] = { 0, 0, 0, 0 };
1364         dev_dbg(dev->dev, "%s!\n", __func__);
1365
1366         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, BOARD_CFG_STAT,
1367                                  value, 4);
1368         dev_dbg(dev->dev,
1369                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", BOARD_CFG_STAT, value[0],
1370                 value[1], value[2], value[3]);
1371         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, TS_MODE_REG,
1372                                  value, 4);
1373         dev_dbg(dev->dev,
1374                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", TS_MODE_REG, value[0],
1375                  value[1], value[2], value[3]);
1376         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, TS1_CFG_REG,
1377                                  value, 4);
1378         dev_dbg(dev->dev,
1379                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", TS1_CFG_REG, value[0],
1380                  value[1], value[2], value[3]);
1381         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, TS1_LENGTH_REG,
1382                                  value, 4);
1383         dev_dbg(dev->dev,
1384                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", TS1_LENGTH_REG, value[0],
1385                 value[1], value[2], value[3]);
1386
1387         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, TS2_CFG_REG,
1388                                  value, 4);
1389         dev_dbg(dev->dev,
1390                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", TS2_CFG_REG, value[0],
1391                 value[1], value[2], value[3]);
1392         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, TS2_LENGTH_REG,
1393                                  value, 4);
1394         dev_dbg(dev->dev,
1395                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", TS2_LENGTH_REG, value[0],
1396                 value[1], value[2], value[3]);
1397         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, EP_MODE_SET,
1398                                  value, 4);
1399         dev_dbg(dev->dev,
1400                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", EP_MODE_SET, value[0],
1401                  value[1], value[2], value[3]);
1402         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_PWR_PTN1,
1403                                  value, 4);
1404         dev_dbg(dev->dev,
1405                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_PWR_PTN1, value[0],
1406                 value[1], value[2], value[3]);
1407
1408         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_PWR_PTN2,
1409                                  value, 4);
1410         dev_dbg(dev->dev,
1411                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_PWR_PTN2, value[0],
1412                 value[1], value[2], value[3]);
1413         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_PWR_PTN3,
1414                                  value, 4);
1415         dev_dbg(dev->dev,
1416                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_PWR_PTN3, value[0],
1417                 value[1], value[2], value[3]);
1418         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_PWR_MASK0,
1419                                  value, 4);
1420         dev_dbg(dev->dev,
1421                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_PWR_MASK0, value[0],
1422                 value[1], value[2], value[3]);
1423         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_PWR_MASK1,
1424                                  value, 4);
1425         dev_dbg(dev->dev,
1426                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_PWR_MASK1, value[0],
1427                 value[1], value[2], value[3]);
1428
1429         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_PWR_MASK2,
1430                                  value, 4);
1431         dev_dbg(dev->dev,
1432                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_PWR_MASK2, value[0],
1433                 value[1], value[2], value[3]);
1434         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_GAIN,
1435                                  value, 4);
1436         dev_dbg(dev->dev,
1437                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_GAIN, value[0],
1438                 value[1], value[2], value[3]);
1439         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_CAR_REG,
1440                                  value, 4);
1441         dev_dbg(dev->dev,
1442                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_CAR_REG, value[0],
1443                 value[1], value[2], value[3]);
1444         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_OT_CFG1,
1445                                  value, 4);
1446         dev_dbg(dev->dev,
1447                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_OT_CFG1, value[0],
1448                 value[1], value[2], value[3]);
1449
1450         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_OT_CFG2,
1451                                  value, 4);
1452         dev_dbg(dev->dev,
1453                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_OT_CFG2, value[0],
1454                 value[1], value[2], value[3]);
1455         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN,
1456                                  value, 4);
1457         dev_dbg(dev->dev,
1458                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", PWR_CTL_EN, value[0],
1459                 value[1], value[2], value[3]);
1460 }
1461 #endif
1462
1463 void cx231xx_Setup_AFE_for_LowIF(struct cx231xx *dev)
1464
1465 {
1466         u8 value = 0;
1467
1468         afe_read_byte(dev, ADC_STATUS2_CH3, &value);
1469         value = (value & 0xFE)|0x01;
1470         afe_write_byte(dev, ADC_STATUS2_CH3, value);
1471
1472         afe_read_byte(dev, ADC_STATUS2_CH3, &value);
1473         value = (value & 0xFE)|0x00;
1474         afe_write_byte(dev, ADC_STATUS2_CH3, value);
1475
1476
1477 /*
1478         config colibri to lo-if mode
1479
1480         FIXME: ntf_mode = 2'b00 by default. But set 0x1 would reduce
1481                 the diff IF input by half,
1482
1483                 for low-if agc defect
1484 */
1485
1486         afe_read_byte(dev, ADC_NTF_PRECLMP_EN_CH3, &value);
1487         value = (value & 0xFC)|0x00;
1488         afe_write_byte(dev, ADC_NTF_PRECLMP_EN_CH3, value);
1489
1490         afe_read_byte(dev, ADC_INPUT_CH3, &value);
1491         value = (value & 0xF9)|0x02;
1492         afe_write_byte(dev, ADC_INPUT_CH3, value);
1493
1494         afe_read_byte(dev, ADC_FB_FRCRST_CH3, &value);
1495         value = (value & 0xFB)|0x04;
1496         afe_write_byte(dev, ADC_FB_FRCRST_CH3, value);
1497
1498         afe_read_byte(dev, ADC_DCSERVO_DEM_CH3, &value);
1499         value = (value & 0xFC)|0x03;
1500         afe_write_byte(dev, ADC_DCSERVO_DEM_CH3, value);
1501
1502         afe_read_byte(dev, ADC_CTRL_DAC1_CH3, &value);
1503         value = (value & 0xFB)|0x04;
1504         afe_write_byte(dev, ADC_CTRL_DAC1_CH3, value);
1505
1506         afe_read_byte(dev, ADC_CTRL_DAC23_CH3, &value);
1507         value = (value & 0xF8)|0x06;
1508         afe_write_byte(dev, ADC_CTRL_DAC23_CH3, value);
1509
1510         afe_read_byte(dev, ADC_CTRL_DAC23_CH3, &value);
1511         value = (value & 0x8F)|0x40;
1512         afe_write_byte(dev, ADC_CTRL_DAC23_CH3, value);
1513
1514         afe_read_byte(dev, ADC_PWRDN_CLAMP_CH3, &value);
1515         value = (value & 0xDF)|0x20;
1516         afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3, value);
1517 }
1518
1519 void cx231xx_set_Colibri_For_LowIF(struct cx231xx *dev, u32 if_freq,
1520                  u8 spectral_invert, u32 mode)
1521 {
1522         u32 colibri_carrier_offset = 0;
1523         u32 func_mode = 0x01; /* Device has a DIF if this function is called */
1524         u32 standard = 0;
1525         u8 value[4] = { 0, 0, 0, 0 };
1526
1527         dev_dbg(dev->dev, "Enter cx231xx_set_Colibri_For_LowIF()\n");
1528         value[0] = (u8) 0x6F;
1529         value[1] = (u8) 0x6F;
1530         value[2] = (u8) 0x6F;
1531         value[3] = (u8) 0x6F;
1532         cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1533                                         PWR_CTL_EN, value, 4);
1534
1535         /*Set colibri for low IF*/
1536         cx231xx_afe_set_mode(dev, AFE_MODE_LOW_IF);
1537
1538         /* Set C2HH for low IF operation.*/
1539         standard = dev->norm;
1540         cx231xx_dif_configure_C2HH_for_low_IF(dev, dev->active_mode,
1541                                                        func_mode, standard);
1542
1543         /* Get colibri offsets.*/
1544         colibri_carrier_offset = cx231xx_Get_Colibri_CarrierOffset(mode,
1545                                                                    standard);
1546
1547         dev_dbg(dev->dev, "colibri_carrier_offset=%d, standard=0x%x\n",
1548                      colibri_carrier_offset, standard);
1549
1550         /* Set the band Pass filter for DIF*/
1551         cx231xx_set_DIF_bandpass(dev, (if_freq+colibri_carrier_offset),
1552                                  spectral_invert, mode);
1553 }
1554
1555 u32 cx231xx_Get_Colibri_CarrierOffset(u32 mode, u32 standerd)
1556 {
1557         u32 colibri_carrier_offset = 0;
1558
1559         if (mode == TUNER_MODE_FM_RADIO) {
1560                 colibri_carrier_offset = 1100000;
1561         } else if (standerd & (V4L2_STD_MN | V4L2_STD_NTSC_M_JP)) {
1562                 colibri_carrier_offset = 4832000;  /*4.83MHz    */
1563         } else if (standerd & (V4L2_STD_PAL_B | V4L2_STD_PAL_G)) {
1564                 colibri_carrier_offset = 2700000;  /*2.70MHz       */
1565         } else if (standerd & (V4L2_STD_PAL_D | V4L2_STD_PAL_I
1566                         | V4L2_STD_SECAM)) {
1567                 colibri_carrier_offset = 2100000;  /*2.10MHz    */
1568         }
1569
1570         return colibri_carrier_offset;
1571 }
1572
1573 void cx231xx_set_DIF_bandpass(struct cx231xx *dev, u32 if_freq,
1574                  u8 spectral_invert, u32 mode)
1575 {
1576         unsigned long pll_freq_word;
1577         u32 dif_misc_ctrl_value = 0;
1578         u64 pll_freq_u64 = 0;
1579         u32 i = 0;
1580
1581         dev_dbg(dev->dev, "if_freq=%d;spectral_invert=0x%x;mode=0x%x\n",
1582                 if_freq, spectral_invert, mode);
1583
1584
1585         if (mode == TUNER_MODE_FM_RADIO) {
1586                 pll_freq_word = 0x905A1CAC;
1587                 vid_blk_write_word(dev, DIF_PLL_FREQ_WORD,  pll_freq_word);
1588
1589         } else /*KSPROPERTY_TUNER_MODE_TV*/{
1590                 /* Calculate the PLL frequency word based on the adjusted if_freq*/
1591                 pll_freq_word = if_freq;
1592                 pll_freq_u64 = (u64)pll_freq_word << 28L;
1593                 do_div(pll_freq_u64, 50000000);
1594                 pll_freq_word = (u32)pll_freq_u64;
1595                 /*pll_freq_word = 0x3463497;*/
1596                 vid_blk_write_word(dev, DIF_PLL_FREQ_WORD,  pll_freq_word);
1597
1598         if (spectral_invert) {
1599                 if_freq -= 400000;
1600                 /* Enable Spectral Invert*/
1601                 vid_blk_read_word(dev, DIF_MISC_CTRL,
1602                                         &dif_misc_ctrl_value);
1603                 dif_misc_ctrl_value = dif_misc_ctrl_value | 0x00200000;
1604                 vid_blk_write_word(dev, DIF_MISC_CTRL,
1605                                         dif_misc_ctrl_value);
1606         } else {
1607                 if_freq += 400000;
1608                 /* Disable Spectral Invert*/
1609                 vid_blk_read_word(dev, DIF_MISC_CTRL,
1610                                         &dif_misc_ctrl_value);
1611                 dif_misc_ctrl_value = dif_misc_ctrl_value & 0xFFDFFFFF;
1612                 vid_blk_write_word(dev, DIF_MISC_CTRL,
1613                                         dif_misc_ctrl_value);
1614         }
1615
1616         if_freq = (if_freq/100000)*100000;
1617
1618         if (if_freq < 3000000)
1619                 if_freq = 3000000;
1620
1621         if (if_freq > 16000000)
1622                 if_freq = 16000000;
1623         }
1624
1625         dev_dbg(dev->dev, "Enter IF=%zu\n", ARRAY_SIZE(Dif_set_array));
1626         for (i = 0; i < ARRAY_SIZE(Dif_set_array); i++) {
1627                 if (Dif_set_array[i].if_freq == if_freq) {
1628                         vid_blk_write_word(dev,
1629                         Dif_set_array[i].register_address, Dif_set_array[i].value);
1630                 }
1631         }
1632 }
1633
1634 /******************************************************************************
1635  *                 D I F - B L O C K    C O N T R O L   functions             *
1636  ******************************************************************************/
1637 int cx231xx_dif_configure_C2HH_for_low_IF(struct cx231xx *dev, u32 mode,
1638                                           u32 function_mode, u32 standard)
1639 {
1640         int status = 0;
1641
1642
1643         if (mode == V4L2_TUNER_RADIO) {
1644                 /* C2HH */
1645                 /* lo if big signal */
1646                 status = cx231xx_reg_mask_write(dev,
1647                                 VID_BLK_I2C_ADDRESS, 32,
1648                                 AFE_CTRL_C2HH_SRC_CTRL, 30, 31, 0x1);
1649                 /* FUNC_MODE = DIF */
1650                 status = cx231xx_reg_mask_write(dev,
1651                                 VID_BLK_I2C_ADDRESS, 32,
1652                                 AFE_CTRL_C2HH_SRC_CTRL, 23, 24, function_mode);
1653                 /* IF_MODE */
1654                 status = cx231xx_reg_mask_write(dev,
1655                                 VID_BLK_I2C_ADDRESS, 32,
1656                                 AFE_CTRL_C2HH_SRC_CTRL, 15, 22, 0xFF);
1657                 /* no inv */
1658                 status = cx231xx_reg_mask_write(dev,
1659                                 VID_BLK_I2C_ADDRESS, 32,
1660                                 AFE_CTRL_C2HH_SRC_CTRL, 9, 9, 0x1);
1661         } else if (standard != DIF_USE_BASEBAND) {
1662                 if (standard & V4L2_STD_MN) {
1663                         /* lo if big signal */
1664                         status = cx231xx_reg_mask_write(dev,
1665                                         VID_BLK_I2C_ADDRESS, 32,
1666                                         AFE_CTRL_C2HH_SRC_CTRL, 30, 31, 0x1);
1667                         /* FUNC_MODE = DIF */
1668                         status = cx231xx_reg_mask_write(dev,
1669                                         VID_BLK_I2C_ADDRESS, 32,
1670                                         AFE_CTRL_C2HH_SRC_CTRL, 23, 24,
1671                                         function_mode);
1672                         /* IF_MODE */
1673                         status = cx231xx_reg_mask_write(dev,
1674                                         VID_BLK_I2C_ADDRESS, 32,
1675                                         AFE_CTRL_C2HH_SRC_CTRL, 15, 22, 0xb);
1676                         /* no inv */
1677                         status = cx231xx_reg_mask_write(dev,
1678                                         VID_BLK_I2C_ADDRESS, 32,
1679                                         AFE_CTRL_C2HH_SRC_CTRL, 9, 9, 0x1);
1680                         /* 0x124, AUD_CHAN1_SRC = 0x3 */
1681                         status = cx231xx_reg_mask_write(dev,
1682                                         VID_BLK_I2C_ADDRESS, 32,
1683                                         AUD_IO_CTRL, 0, 31, 0x00000003);
1684                 } else if ((standard == V4L2_STD_PAL_I) |
1685                         (standard & V4L2_STD_PAL_D) |
1686                         (standard & V4L2_STD_SECAM)) {
1687                         /* C2HH setup */
1688                         /* lo if big signal */
1689                         status = cx231xx_reg_mask_write(dev,
1690                                         VID_BLK_I2C_ADDRESS, 32,
1691                                         AFE_CTRL_C2HH_SRC_CTRL, 30, 31, 0x1);
1692                         /* FUNC_MODE = DIF */
1693                         status = cx231xx_reg_mask_write(dev,
1694                                         VID_BLK_I2C_ADDRESS, 32,
1695                                         AFE_CTRL_C2HH_SRC_CTRL, 23, 24,
1696                                         function_mode);
1697                         /* IF_MODE */
1698                         status = cx231xx_reg_mask_write(dev,
1699                                         VID_BLK_I2C_ADDRESS, 32,
1700                                         AFE_CTRL_C2HH_SRC_CTRL, 15, 22, 0xF);
1701                         /* no inv */
1702                         status = cx231xx_reg_mask_write(dev,
1703                                         VID_BLK_I2C_ADDRESS, 32,
1704                                         AFE_CTRL_C2HH_SRC_CTRL, 9, 9, 0x1);
1705                 } else {
1706                         /* default PAL BG */
1707                         /* C2HH setup */
1708                         /* lo if big signal */
1709                         status = cx231xx_reg_mask_write(dev,
1710                                         VID_BLK_I2C_ADDRESS, 32,
1711                                         AFE_CTRL_C2HH_SRC_CTRL, 30, 31, 0x1);
1712                         /* FUNC_MODE = DIF */
1713                         status = cx231xx_reg_mask_write(dev,
1714                                         VID_BLK_I2C_ADDRESS, 32,
1715                                         AFE_CTRL_C2HH_SRC_CTRL, 23, 24,
1716                                         function_mode);
1717                         /* IF_MODE */
1718                         status = cx231xx_reg_mask_write(dev,
1719                                         VID_BLK_I2C_ADDRESS, 32,
1720                                         AFE_CTRL_C2HH_SRC_CTRL, 15, 22, 0xE);
1721                         /* no inv */
1722                         status = cx231xx_reg_mask_write(dev,
1723                                         VID_BLK_I2C_ADDRESS, 32,
1724                                         AFE_CTRL_C2HH_SRC_CTRL, 9, 9, 0x1);
1725                 }
1726         }
1727
1728         return status;
1729 }
1730
1731 int cx231xx_dif_set_standard(struct cx231xx *dev, u32 standard)
1732 {
1733         int status = 0;
1734         u32 dif_misc_ctrl_value = 0;
1735         u32 func_mode = 0;
1736
1737         dev_dbg(dev->dev, "%s: setStandard to %x\n", __func__, standard);
1738
1739         status = vid_blk_read_word(dev, DIF_MISC_CTRL, &dif_misc_ctrl_value);
1740         if (standard != DIF_USE_BASEBAND)
1741                 dev->norm = standard;
1742
1743         switch (dev->model) {
1744         case CX231XX_BOARD_CNXT_CARRAERA:
1745         case CX231XX_BOARD_CNXT_RDE_250:
1746         case CX231XX_BOARD_CNXT_SHELBY:
1747         case CX231XX_BOARD_CNXT_RDU_250:
1748         case CX231XX_BOARD_CNXT_VIDEO_GRABBER:
1749         case CX231XX_BOARD_HAUPPAUGE_EXETER:
1750         case CX231XX_BOARD_OTG102:
1751                 func_mode = 0x03;
1752                 break;
1753         case CX231XX_BOARD_CNXT_RDE_253S:
1754         case CX231XX_BOARD_CNXT_RDU_253S:
1755         case CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL:
1756         case CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC:
1757                 func_mode = 0x01;
1758                 break;
1759         default:
1760                 func_mode = 0x01;
1761         }
1762
1763         status = cx231xx_dif_configure_C2HH_for_low_IF(dev, dev->active_mode,
1764                                                   func_mode, standard);
1765
1766         if (standard == DIF_USE_BASEBAND) {     /* base band */
1767                 /* There is a different SRC_PHASE_INC value
1768                    for baseband vs. DIF */
1769                 status = vid_blk_write_word(dev, DIF_SRC_PHASE_INC, 0xDF7DF83);
1770                 status = vid_blk_read_word(dev, DIF_MISC_CTRL,
1771                                                 &dif_misc_ctrl_value);
1772                 dif_misc_ctrl_value |= FLD_DIF_DIF_BYPASS;
1773                 status = vid_blk_write_word(dev, DIF_MISC_CTRL,
1774                                                 dif_misc_ctrl_value);
1775         } else if (standard & V4L2_STD_PAL_D) {
1776                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1777                                            DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
1778                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1779                                            DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
1780                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1781                                            DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
1782                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1783                                            DIF_PLL_CTRL3, 0, 31, 0x00008800);
1784                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1785                                            DIF_AGC_IF_REF, 0, 31, 0x444C1380);
1786                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1787                                            DIF_AGC_CTRL_IF, 0, 31, 0xDA302600);
1788                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1789                                            DIF_AGC_CTRL_INT, 0, 31, 0xDA261700);
1790                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1791                                            DIF_AGC_CTRL_RF, 0, 31, 0xDA262600);
1792                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1793                                            DIF_AGC_IF_INT_CURRENT, 0, 31,
1794                                            0x26001700);
1795                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1796                                            DIF_AGC_RF_CURRENT, 0, 31,
1797                                            0x00002660);
1798                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1799                                            DIF_VIDEO_AGC_CTRL, 0, 31,
1800                                            0x72500800);
1801                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1802                                            DIF_VID_AUD_OVERRIDE, 0, 31,
1803                                            0x27000100);
1804                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1805                                            DIF_AV_SEP_CTRL, 0, 31, 0x3F3934EA);
1806                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1807                                            DIF_COMP_FLT_CTRL, 0, 31,
1808                                            0x00000000);
1809                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1810                                            DIF_SRC_PHASE_INC, 0, 31,
1811                                            0x1befbf06);
1812                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1813                                            DIF_SRC_GAIN_CONTROL, 0, 31,
1814                                            0x000035e8);
1815                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1816                                            DIF_RPT_VARIANCE, 0, 31, 0x00000000);
1817                 /* Save the Spec Inversion value */
1818                 dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
1819                 dif_misc_ctrl_value |= 0x3a023F11;
1820         } else if (standard & V4L2_STD_PAL_I) {
1821                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1822                                            DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
1823                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1824                                            DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
1825                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1826                                            DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
1827                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1828                                            DIF_PLL_CTRL3, 0, 31, 0x00008800);
1829                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1830                                            DIF_AGC_IF_REF, 0, 31, 0x444C1380);
1831                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1832                                            DIF_AGC_CTRL_IF, 0, 31, 0xDA302600);
1833                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1834                                            DIF_AGC_CTRL_INT, 0, 31, 0xDA261700);
1835                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1836                                            DIF_AGC_CTRL_RF, 0, 31, 0xDA262600);
1837                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1838                                            DIF_AGC_IF_INT_CURRENT, 0, 31,
1839                                            0x26001700);
1840                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1841                                            DIF_AGC_RF_CURRENT, 0, 31,
1842                                            0x00002660);
1843                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1844                                            DIF_VIDEO_AGC_CTRL, 0, 31,
1845                                            0x72500800);
1846                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1847                                            DIF_VID_AUD_OVERRIDE, 0, 31,
1848                                            0x27000100);
1849                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1850                                            DIF_AV_SEP_CTRL, 0, 31, 0x5F39A934);
1851                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1852                                            DIF_COMP_FLT_CTRL, 0, 31,
1853                                            0x00000000);
1854                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1855                                            DIF_SRC_PHASE_INC, 0, 31,
1856                                            0x1befbf06);
1857                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1858                                            DIF_SRC_GAIN_CONTROL, 0, 31,
1859                                            0x000035e8);
1860                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1861                                            DIF_RPT_VARIANCE, 0, 31, 0x00000000);
1862                 /* Save the Spec Inversion value */
1863                 dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
1864                 dif_misc_ctrl_value |= 0x3a033F11;
1865         } else if (standard & V4L2_STD_PAL_M) {
1866                 /* improved Low Frequency Phase Noise */
1867                 status = vid_blk_write_word(dev, DIF_PLL_CTRL, 0xFF01FF0C);
1868                 status = vid_blk_write_word(dev, DIF_PLL_CTRL1, 0xbd038c85);
1869                 status = vid_blk_write_word(dev, DIF_PLL_CTRL2, 0x1db4640a);
1870                 status = vid_blk_write_word(dev, DIF_PLL_CTRL3, 0x00008800);
1871                 status = vid_blk_write_word(dev, DIF_AGC_IF_REF, 0x444C1380);
1872                 status = vid_blk_write_word(dev, DIF_AGC_IF_INT_CURRENT,
1873                                                 0x26001700);
1874                 status = vid_blk_write_word(dev, DIF_AGC_RF_CURRENT,
1875                                                 0x00002660);
1876                 status = vid_blk_write_word(dev, DIF_VIDEO_AGC_CTRL,
1877                                                 0x72500800);
1878                 status = vid_blk_write_word(dev, DIF_VID_AUD_OVERRIDE,
1879                                                 0x27000100);
1880                 status = vid_blk_write_word(dev, DIF_AV_SEP_CTRL, 0x012c405d);
1881                 status = vid_blk_write_word(dev, DIF_COMP_FLT_CTRL,
1882                                                 0x009f50c1);
1883                 status = vid_blk_write_word(dev, DIF_SRC_PHASE_INC,
1884                                                 0x1befbf06);
1885                 status = vid_blk_write_word(dev, DIF_SRC_GAIN_CONTROL,
1886                                                 0x000035e8);
1887                 status = vid_blk_write_word(dev, DIF_SOFT_RST_CTRL_REVB,
1888                                                 0x00000000);
1889                 /* Save the Spec Inversion value */
1890                 dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
1891                 dif_misc_ctrl_value |= 0x3A0A3F10;
1892         } else if (standard & (V4L2_STD_PAL_N | V4L2_STD_PAL_Nc)) {
1893                 /* improved Low Frequency Phase Noise */
1894                 status = vid_blk_write_word(dev, DIF_PLL_CTRL, 0xFF01FF0C);
1895                 status = vid_blk_write_word(dev, DIF_PLL_CTRL1, 0xbd038c85);
1896                 status = vid_blk_write_word(dev, DIF_PLL_CTRL2, 0x1db4640a);
1897                 status = vid_blk_write_word(dev, DIF_PLL_CTRL3, 0x00008800);
1898                 status = vid_blk_write_word(dev, DIF_AGC_IF_REF, 0x444C1380);
1899                 status = vid_blk_write_word(dev, DIF_AGC_IF_INT_CURRENT,
1900                                                 0x26001700);
1901                 status = vid_blk_write_word(dev, DIF_AGC_RF_CURRENT,
1902                                                 0x00002660);
1903                 status = vid_blk_write_word(dev, DIF_VIDEO_AGC_CTRL,
1904                                                 0x72500800);
1905                 status = vid_blk_write_word(dev, DIF_VID_AUD_OVERRIDE,
1906                                                 0x27000100);
1907                 status = vid_blk_write_word(dev, DIF_AV_SEP_CTRL,
1908                                                 0x012c405d);
1909                 status = vid_blk_write_word(dev, DIF_COMP_FLT_CTRL,
1910                                                 0x009f50c1);
1911                 status = vid_blk_write_word(dev, DIF_SRC_PHASE_INC,
1912                                                 0x1befbf06);
1913                 status = vid_blk_write_word(dev, DIF_SRC_GAIN_CONTROL,
1914                                                 0x000035e8);
1915                 status = vid_blk_write_word(dev, DIF_SOFT_RST_CTRL_REVB,
1916                                                 0x00000000);
1917                 /* Save the Spec Inversion value */
1918                 dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
1919                 dif_misc_ctrl_value = 0x3A093F10;
1920         } else if (standard &
1921                   (V4L2_STD_SECAM_B | V4L2_STD_SECAM_D | V4L2_STD_SECAM_G |
1922                    V4L2_STD_SECAM_K | V4L2_STD_SECAM_K1)) {
1923
1924                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1925                                            DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
1926                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1927                                            DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
1928                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1929                                            DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
1930                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1931                                            DIF_PLL_CTRL3, 0, 31, 0x00008800);
1932                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1933                                            DIF_AGC_IF_REF, 0, 31, 0x888C0380);
1934                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1935                                            DIF_AGC_CTRL_IF, 0, 31, 0xe0262600);
1936                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1937                                            DIF_AGC_CTRL_INT, 0, 31, 0xc2171700);
1938                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1939                                            DIF_AGC_CTRL_RF, 0, 31, 0xc2262600);
1940                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1941                                            DIF_AGC_IF_INT_CURRENT, 0, 31,
1942                                            0x26001700);
1943                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1944                                            DIF_AGC_RF_CURRENT, 0, 31,
1945                                            0x00002660);
1946                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1947                                            DIF_VID_AUD_OVERRIDE, 0, 31,
1948                                            0x27000100);
1949                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1950                                            DIF_AV_SEP_CTRL, 0, 31, 0x3F3530ec);
1951                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1952                                            DIF_COMP_FLT_CTRL, 0, 31,
1953                                            0x00000000);
1954                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1955                                            DIF_SRC_PHASE_INC, 0, 31,
1956                                            0x1befbf06);
1957                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1958                                            DIF_SRC_GAIN_CONTROL, 0, 31,
1959                                            0x000035e8);
1960                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1961                                            DIF_RPT_VARIANCE, 0, 31, 0x00000000);
1962                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1963                                            DIF_VIDEO_AGC_CTRL, 0, 31,
1964                                            0xf4000000);
1965
1966                 /* Save the Spec Inversion value */
1967                 dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
1968                 dif_misc_ctrl_value |= 0x3a023F11;
1969         } else if (standard & (V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC)) {
1970                 /* Is it SECAM_L1? */
1971                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1972                                            DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
1973                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1974                                            DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
1975                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1976                                            DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
1977                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1978                                            DIF_PLL_CTRL3, 0, 31, 0x00008800);
1979                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1980                                            DIF_AGC_IF_REF, 0, 31, 0x888C0380);
1981                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1982                                            DIF_AGC_CTRL_IF, 0, 31, 0xe0262600);
1983                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1984                                            DIF_AGC_CTRL_INT, 0, 31, 0xc2171700);
1985                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1986                                            DIF_AGC_CTRL_RF, 0, 31, 0xc2262600);
1987                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1988                                            DIF_AGC_IF_INT_CURRENT, 0, 31,
1989                                            0x26001700);
1990                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1991                                            DIF_AGC_RF_CURRENT, 0, 31,
1992                                            0x00002660);
1993                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1994                                            DIF_VID_AUD_OVERRIDE, 0, 31,
1995                                            0x27000100);
1996                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1997                                            DIF_AV_SEP_CTRL, 0, 31, 0x3F3530ec);
1998                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1999                                            DIF_COMP_FLT_CTRL, 0, 31,
2000                                            0x00000000);
2001                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2002                                            DIF_SRC_PHASE_INC, 0, 31,
2003                                            0x1befbf06);
2004                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2005                                            DIF_SRC_GAIN_CONTROL, 0, 31,
2006                                            0x000035e8);
2007                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2008                                            DIF_RPT_VARIANCE, 0, 31, 0x00000000);
2009                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2010                                            DIF_VIDEO_AGC_CTRL, 0, 31,
2011                                            0xf2560000);
2012
2013                 /* Save the Spec Inversion value */
2014                 dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
2015                 dif_misc_ctrl_value |= 0x3a023F11;
2016
2017         } else if (standard & V4L2_STD_NTSC_M) {
2018                 /* V4L2_STD_NTSC_M (75 IRE Setup) Or
2019                    V4L2_STD_NTSC_M_JP (Japan,  0 IRE Setup) */
2020
2021                 /* For NTSC the centre frequency of video coming out of
2022                    sidewinder is around 7.1MHz or 3.6MHz depending on the
2023                    spectral inversion. so for a non spectrally inverted channel
2024                    the pll freq word is 0x03420c49
2025                  */
2026
2027                 status = vid_blk_write_word(dev, DIF_PLL_CTRL, 0x6503BC0C);
2028                 status = vid_blk_write_word(dev, DIF_PLL_CTRL1, 0xBD038C85);
2029                 status = vid_blk_write_word(dev, DIF_PLL_CTRL2, 0x1DB4640A);
2030                 status = vid_blk_write_word(dev, DIF_PLL_CTRL3, 0x00008800);
2031                 status = vid_blk_write_word(dev, DIF_AGC_IF_REF, 0x444C0380);
2032                 status = vid_blk_write_word(dev, DIF_AGC_IF_INT_CURRENT,
2033                                                 0x26001700);
2034                 status = vid_blk_write_word(dev, DIF_AGC_RF_CURRENT,
2035                                                 0x00002660);
2036                 status = vid_blk_write_word(dev, DIF_VIDEO_AGC_CTRL,
2037                                                 0x04000800);
2038                 status = vid_blk_write_word(dev, DIF_VID_AUD_OVERRIDE,
2039                                                 0x27000100);
2040                 status = vid_blk_write_word(dev, DIF_AV_SEP_CTRL, 0x01296e1f);
2041
2042                 status = vid_blk_write_word(dev, DIF_COMP_FLT_CTRL,
2043                                                 0x009f50c1);
2044                 status = vid_blk_write_word(dev, DIF_SRC_PHASE_INC,
2045                                                 0x1befbf06);
2046                 status = vid_blk_write_word(dev, DIF_SRC_GAIN_CONTROL,
2047                                                 0x000035e8);
2048
2049                 status = vid_blk_write_word(dev, DIF_AGC_CTRL_IF, 0xC2262600);
2050                 status = vid_blk_write_word(dev, DIF_AGC_CTRL_INT,
2051                                                 0xC2262600);
2052                 status = vid_blk_write_word(dev, DIF_AGC_CTRL_RF, 0xC2262600);
2053
2054                 /* Save the Spec Inversion value */
2055                 dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
2056                 dif_misc_ctrl_value |= 0x3a003F10;
2057         } else {
2058                 /* default PAL BG */
2059                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2060                                            DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
2061                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2062                                            DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
2063                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2064                                            DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
2065                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2066                                            DIF_PLL_CTRL3, 0, 31, 0x00008800);
2067                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2068                                            DIF_AGC_IF_REF, 0, 31, 0x444C1380);
2069                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2070                                            DIF_AGC_CTRL_IF, 0, 31, 0xDA302600);
2071                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2072                                            DIF_AGC_CTRL_INT, 0, 31, 0xDA261700);
2073                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2074                                            DIF_AGC_CTRL_RF, 0, 31, 0xDA262600);
2075                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2076                                            DIF_AGC_IF_INT_CURRENT, 0, 31,
2077                                            0x26001700);
2078                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2079                                            DIF_AGC_RF_CURRENT, 0, 31,
2080                                            0x00002660);
2081                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2082                                            DIF_VIDEO_AGC_CTRL, 0, 31,
2083                                            0x72500800);
2084                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2085                                            DIF_VID_AUD_OVERRIDE, 0, 31,
2086                                            0x27000100);
2087                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2088                                            DIF_AV_SEP_CTRL, 0, 31, 0x3F3530EC);
2089                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2090                                            DIF_COMP_FLT_CTRL, 0, 31,
2091                                            0x00A653A8);
2092                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2093                                            DIF_SRC_PHASE_INC, 0, 31,
2094                                            0x1befbf06);
2095                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2096                                            DIF_SRC_GAIN_CONTROL, 0, 31,
2097                                            0x000035e8);
2098                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2099                                            DIF_RPT_VARIANCE, 0, 31, 0x00000000);
2100                 /* Save the Spec Inversion value */
2101                 dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
2102                 dif_misc_ctrl_value |= 0x3a013F11;
2103         }
2104
2105         /* The AGC values should be the same for all standards,
2106            AUD_SRC_SEL[19] should always be disabled    */
2107         dif_misc_ctrl_value &= ~FLD_DIF_AUD_SRC_SEL;
2108
2109         /* It is still possible to get Set Standard calls even when we
2110            are in FM mode.
2111            This is done to override the value for FM. */
2112         if (dev->active_mode == V4L2_TUNER_RADIO)
2113                 dif_misc_ctrl_value = 0x7a080000;
2114
2115         /* Write the calculated value for misc ontrol register      */
2116         status = vid_blk_write_word(dev, DIF_MISC_CTRL, dif_misc_ctrl_value);
2117
2118         return status;
2119 }
2120
2121 int cx231xx_tuner_pre_channel_change(struct cx231xx *dev)
2122 {
2123         int status = 0;
2124         u32 dwval;
2125
2126         /* Set the RF and IF k_agc values to 3 */
2127         status = vid_blk_read_word(dev, DIF_AGC_IF_REF, &dwval);
2128         dwval &= ~(FLD_DIF_K_AGC_RF | FLD_DIF_K_AGC_IF);
2129         dwval |= 0x33000000;
2130
2131         status = vid_blk_write_word(dev, DIF_AGC_IF_REF, dwval);
2132
2133         return status;
2134 }
2135
2136 int cx231xx_tuner_post_channel_change(struct cx231xx *dev)
2137 {
2138         int status = 0;
2139         u32 dwval;
2140         dev_dbg(dev->dev, "%s: dev->tuner_type =0%d\n",
2141                 __func__, dev->tuner_type);
2142         /* Set the RF and IF k_agc values to 4 for PAL/NTSC and 8 for
2143          * SECAM L/B/D standards */
2144         status = vid_blk_read_word(dev, DIF_AGC_IF_REF, &dwval);
2145         dwval &= ~(FLD_DIF_K_AGC_RF | FLD_DIF_K_AGC_IF);
2146
2147         if (dev->norm & (V4L2_STD_SECAM_L | V4L2_STD_SECAM_B |
2148                          V4L2_STD_SECAM_D)) {
2149                         if (dev->tuner_type == TUNER_NXP_TDA18271) {
2150                                 dwval &= ~FLD_DIF_IF_REF;
2151                                 dwval |= 0x88000300;
2152                         } else
2153                                 dwval |= 0x88000000;
2154                 } else {
2155                         if (dev->tuner_type == TUNER_NXP_TDA18271) {
2156                                 dwval &= ~FLD_DIF_IF_REF;
2157                                 dwval |= 0xCC000300;
2158                         } else
2159                                 dwval |= 0x44000000;
2160                 }
2161
2162         status = vid_blk_write_word(dev, DIF_AGC_IF_REF, dwval);
2163
2164         return status == sizeof(dwval) ? 0 : -EIO;
2165 }
2166
2167 /******************************************************************************
2168  *                  I 2 S - B L O C K    C O N T R O L   functions            *
2169  ******************************************************************************/
2170 int cx231xx_i2s_blk_initialize(struct cx231xx *dev)
2171 {
2172         int status = 0;
2173         u32 value;
2174
2175         status = cx231xx_read_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
2176                                        CH_PWR_CTRL1, 1, &value, 1);
2177         /* enables clock to delta-sigma and decimation filter */
2178         value |= 0x80;
2179         status = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
2180                                         CH_PWR_CTRL1, 1, value, 1);
2181         /* power up all channel */
2182         status = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
2183                                         CH_PWR_CTRL2, 1, 0x00, 1);
2184
2185         return status;
2186 }
2187
2188 int cx231xx_i2s_blk_update_power_control(struct cx231xx *dev,
2189                                         enum AV_MODE avmode)
2190 {
2191         int status = 0;
2192         u32 value = 0;
2193
2194         if (avmode != POLARIS_AVMODE_ENXTERNAL_AV) {
2195                 status = cx231xx_read_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
2196                                           CH_PWR_CTRL2, 1, &value, 1);
2197                 value |= 0xfe;
2198                 status = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
2199                                                 CH_PWR_CTRL2, 1, value, 1);
2200         } else {
2201                 status = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
2202                                                 CH_PWR_CTRL2, 1, 0x00, 1);
2203         }
2204
2205         return status;
2206 }
2207
2208 /* set i2s_blk for audio input types */
2209 int cx231xx_i2s_blk_set_audio_input(struct cx231xx *dev, u8 audio_input)
2210 {
2211         int status = 0;
2212
2213         switch (audio_input) {
2214         case CX231XX_AMUX_LINE_IN:
2215                 status = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
2216                                                 CH_PWR_CTRL2, 1, 0x00, 1);
2217                 status = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
2218                                                 CH_PWR_CTRL1, 1, 0x80, 1);
2219                 break;
2220         case CX231XX_AMUX_VIDEO:
2221         default:
2222                 break;
2223         }
2224
2225         dev->ctl_ainput = audio_input;
2226
2227         return status;
2228 }
2229
2230 /******************************************************************************
2231  *                  P O W E R      C O N T R O L   functions                  *
2232  ******************************************************************************/
2233 int cx231xx_set_power_mode(struct cx231xx *dev, enum AV_MODE mode)
2234 {
2235         u8 value[4] = { 0, 0, 0, 0 };
2236         u32 tmp = 0;
2237         int status = 0;
2238
2239         if (dev->power_mode != mode)
2240                 dev->power_mode = mode;
2241         else {
2242                 dev_dbg(dev->dev, "%s: mode = %d, No Change req.\n",
2243                          __func__, mode);
2244                 return 0;
2245         }
2246
2247         status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN, value,
2248                                        4);
2249         if (status < 0)
2250                 return status;
2251
2252         tmp = le32_to_cpu(*((__le32 *) value));
2253
2254         switch (mode) {
2255         case POLARIS_AVMODE_ENXTERNAL_AV:
2256
2257                 tmp &= (~PWR_MODE_MASK);
2258
2259                 tmp |= PWR_AV_EN;
2260                 value[0] = (u8) tmp;
2261                 value[1] = (u8) (tmp >> 8);
2262                 value[2] = (u8) (tmp >> 16);
2263                 value[3] = (u8) (tmp >> 24);
2264                 status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2265                                                 PWR_CTL_EN, value, 4);
2266                 msleep(PWR_SLEEP_INTERVAL);
2267
2268                 tmp |= PWR_ISO_EN;
2269                 value[0] = (u8) tmp;
2270                 value[1] = (u8) (tmp >> 8);
2271                 value[2] = (u8) (tmp >> 16);
2272                 value[3] = (u8) (tmp >> 24);
2273                 status =
2274                     cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER, PWR_CTL_EN,
2275                                            value, 4);
2276                 msleep(PWR_SLEEP_INTERVAL);
2277
2278                 tmp |= POLARIS_AVMODE_ENXTERNAL_AV;
2279                 value[0] = (u8) tmp;
2280                 value[1] = (u8) (tmp >> 8);
2281                 value[2] = (u8) (tmp >> 16);
2282                 value[3] = (u8) (tmp >> 24);
2283                 status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2284                                                 PWR_CTL_EN, value, 4);
2285
2286                 /* reset state of xceive tuner */
2287                 dev->xc_fw_load_done = 0;
2288                 break;
2289
2290         case POLARIS_AVMODE_ANALOGT_TV:
2291
2292                 tmp |= PWR_DEMOD_EN;
2293                 value[0] = (u8) tmp;
2294                 value[1] = (u8) (tmp >> 8);
2295                 value[2] = (u8) (tmp >> 16);
2296                 value[3] = (u8) (tmp >> 24);
2297                 status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2298                                                 PWR_CTL_EN, value, 4);
2299                 msleep(PWR_SLEEP_INTERVAL);
2300
2301                 if (!(tmp & PWR_TUNER_EN)) {
2302                         tmp |= (PWR_TUNER_EN);
2303                         value[0] = (u8) tmp;
2304                         value[1] = (u8) (tmp >> 8);
2305                         value[2] = (u8) (tmp >> 16);
2306                         value[3] = (u8) (tmp >> 24);
2307                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2308                                                         PWR_CTL_EN, value, 4);
2309                         msleep(PWR_SLEEP_INTERVAL);
2310                 }
2311
2312                 if (!(tmp & PWR_AV_EN)) {
2313                         tmp |= PWR_AV_EN;
2314                         value[0] = (u8) tmp;
2315                         value[1] = (u8) (tmp >> 8);
2316                         value[2] = (u8) (tmp >> 16);
2317                         value[3] = (u8) (tmp >> 24);
2318                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2319                                                         PWR_CTL_EN, value, 4);
2320                         msleep(PWR_SLEEP_INTERVAL);
2321                 }
2322                 if (!(tmp & PWR_ISO_EN)) {
2323                         tmp |= PWR_ISO_EN;
2324                         value[0] = (u8) tmp;
2325                         value[1] = (u8) (tmp >> 8);
2326                         value[2] = (u8) (tmp >> 16);
2327                         value[3] = (u8) (tmp >> 24);
2328                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2329                                                         PWR_CTL_EN, value, 4);
2330                         msleep(PWR_SLEEP_INTERVAL);
2331                 }
2332
2333                 if (!(tmp & POLARIS_AVMODE_ANALOGT_TV)) {
2334                         tmp |= POLARIS_AVMODE_ANALOGT_TV;
2335                         value[0] = (u8) tmp;
2336                         value[1] = (u8) (tmp >> 8);
2337                         value[2] = (u8) (tmp >> 16);
2338                         value[3] = (u8) (tmp >> 24);
2339                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2340                                                         PWR_CTL_EN, value, 4);
2341                         msleep(PWR_SLEEP_INTERVAL);
2342                 }
2343
2344                 if (dev->board.tuner_type != TUNER_ABSENT) {
2345                         /* reset the Tuner */
2346                         if (dev->board.tuner_gpio)
2347                                 cx231xx_gpio_set(dev, dev->board.tuner_gpio);
2348
2349                         if (dev->cx231xx_reset_analog_tuner)
2350                                 dev->cx231xx_reset_analog_tuner(dev);
2351                 }
2352
2353                 break;
2354
2355         case POLARIS_AVMODE_DIGITAL:
2356                 if (!(tmp & PWR_TUNER_EN)) {
2357                         tmp |= (PWR_TUNER_EN);
2358                         value[0] = (u8) tmp;
2359                         value[1] = (u8) (tmp >> 8);
2360                         value[2] = (u8) (tmp >> 16);
2361                         value[3] = (u8) (tmp >> 24);
2362                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2363                                                         PWR_CTL_EN, value, 4);
2364                         msleep(PWR_SLEEP_INTERVAL);
2365                 }
2366                 if (!(tmp & PWR_AV_EN)) {
2367                         tmp |= PWR_AV_EN;
2368                         value[0] = (u8) tmp;
2369                         value[1] = (u8) (tmp >> 8);
2370                         value[2] = (u8) (tmp >> 16);
2371                         value[3] = (u8) (tmp >> 24);
2372                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2373                                                         PWR_CTL_EN, value, 4);
2374                         msleep(PWR_SLEEP_INTERVAL);
2375                 }
2376                 if (!(tmp & PWR_ISO_EN)) {
2377                         tmp |= PWR_ISO_EN;
2378                         value[0] = (u8) tmp;
2379                         value[1] = (u8) (tmp >> 8);
2380                         value[2] = (u8) (tmp >> 16);
2381                         value[3] = (u8) (tmp >> 24);
2382                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2383                                                         PWR_CTL_EN, value, 4);
2384                         msleep(PWR_SLEEP_INTERVAL);
2385                 }
2386
2387                 tmp &= (~PWR_AV_MODE);
2388                 tmp |= POLARIS_AVMODE_DIGITAL;
2389                 value[0] = (u8) tmp;
2390                 value[1] = (u8) (tmp >> 8);
2391                 value[2] = (u8) (tmp >> 16);
2392                 value[3] = (u8) (tmp >> 24);
2393                 status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2394                                                 PWR_CTL_EN, value, 4);
2395                 msleep(PWR_SLEEP_INTERVAL);
2396
2397                 if (!(tmp & PWR_DEMOD_EN)) {
2398                         tmp |= PWR_DEMOD_EN;
2399                         value[0] = (u8) tmp;
2400                         value[1] = (u8) (tmp >> 8);
2401                         value[2] = (u8) (tmp >> 16);
2402                         value[3] = (u8) (tmp >> 24);
2403                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2404                                                         PWR_CTL_EN, value, 4);
2405                         msleep(PWR_SLEEP_INTERVAL);
2406                 }
2407
2408                 if (dev->board.tuner_type != TUNER_ABSENT) {
2409                         /* reset the Tuner */
2410                         if (dev->board.tuner_gpio)
2411                                 cx231xx_gpio_set(dev, dev->board.tuner_gpio);
2412
2413                         if (dev->cx231xx_reset_analog_tuner)
2414                                 dev->cx231xx_reset_analog_tuner(dev);
2415                 }
2416                 break;
2417
2418         default:
2419                 break;
2420         }
2421
2422         msleep(PWR_SLEEP_INTERVAL);
2423
2424         /* For power saving, only enable Pwr_resetout_n
2425            when digital TV is selected. */
2426         if (mode == POLARIS_AVMODE_DIGITAL) {
2427                 tmp |= PWR_RESETOUT_EN;
2428                 value[0] = (u8) tmp;
2429                 value[1] = (u8) (tmp >> 8);
2430                 value[2] = (u8) (tmp >> 16);
2431                 value[3] = (u8) (tmp >> 24);
2432                 status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2433                                                 PWR_CTL_EN, value, 4);
2434                 msleep(PWR_SLEEP_INTERVAL);
2435         }
2436
2437         /* update power control for afe */
2438         status = cx231xx_afe_update_power_control(dev, mode);
2439
2440         /* update power control for i2s_blk */
2441         status = cx231xx_i2s_blk_update_power_control(dev, mode);
2442
2443         status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN, value,
2444                                        4);
2445
2446         return status;
2447 }
2448
2449 int cx231xx_power_suspend(struct cx231xx *dev)
2450 {
2451         u8 value[4] = { 0, 0, 0, 0 };
2452         u32 tmp = 0;
2453         int status = 0;
2454
2455         status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN,
2456                                        value, 4);
2457         if (status > 0)
2458                 return status;
2459
2460         tmp = le32_to_cpu(*((__le32 *) value));
2461         tmp &= (~PWR_MODE_MASK);
2462
2463         value[0] = (u8) tmp;
2464         value[1] = (u8) (tmp >> 8);
2465         value[2] = (u8) (tmp >> 16);
2466         value[3] = (u8) (tmp >> 24);
2467         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER, PWR_CTL_EN,
2468                                         value, 4);
2469
2470         return status;
2471 }
2472
2473 /******************************************************************************
2474  *                  S T R E A M    C O N T R O L   functions                  *
2475  ******************************************************************************/
2476 int cx231xx_start_stream(struct cx231xx *dev, u32 ep_mask)
2477 {
2478         u8 value[4] = { 0x0, 0x0, 0x0, 0x0 };
2479         u32 tmp = 0;
2480         int status = 0;
2481
2482         dev_dbg(dev->dev, "%s: ep_mask = %x\n", __func__, ep_mask);
2483         status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, EP_MODE_SET,
2484                                        value, 4);
2485         if (status < 0)
2486                 return status;
2487
2488         tmp = le32_to_cpu(*((__le32 *) value));
2489         tmp |= ep_mask;
2490         value[0] = (u8) tmp;
2491         value[1] = (u8) (tmp >> 8);
2492         value[2] = (u8) (tmp >> 16);
2493         value[3] = (u8) (tmp >> 24);
2494
2495         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER, EP_MODE_SET,
2496                                         value, 4);
2497
2498         return status;
2499 }
2500
2501 int cx231xx_stop_stream(struct cx231xx *dev, u32 ep_mask)
2502 {
2503         u8 value[4] = { 0x0, 0x0, 0x0, 0x0 };
2504         u32 tmp = 0;
2505         int status = 0;
2506
2507         dev_dbg(dev->dev, "%s: ep_mask = %x\n", __func__, ep_mask);
2508         status =
2509             cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, EP_MODE_SET, value, 4);
2510         if (status < 0)
2511                 return status;
2512
2513         tmp = le32_to_cpu(*((__le32 *) value));
2514         tmp &= (~ep_mask);
2515         value[0] = (u8) tmp;
2516         value[1] = (u8) (tmp >> 8);
2517         value[2] = (u8) (tmp >> 16);
2518         value[3] = (u8) (tmp >> 24);
2519
2520         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER, EP_MODE_SET,
2521                                         value, 4);
2522
2523         return status;
2524 }
2525
2526 int cx231xx_initialize_stream_xfer(struct cx231xx *dev, u32 media_type)
2527 {
2528         int status = 0;
2529         u32 value = 0;
2530         u8 val[4] = { 0, 0, 0, 0 };
2531
2532         if (dev->udev->speed == USB_SPEED_HIGH) {
2533                 switch (media_type) {
2534                 case Audio:
2535                         dev_dbg(dev->dev,
2536                                 "%s: Audio enter HANC\n", __func__);
2537                         status =
2538                             cx231xx_mode_register(dev, TS_MODE_REG, 0x9300);
2539                         break;
2540
2541                 case Vbi:
2542                         dev_dbg(dev->dev,
2543                                 "%s: set vanc registers\n", __func__);
2544                         status = cx231xx_mode_register(dev, TS_MODE_REG, 0x300);
2545                         break;
2546
2547                 case Sliced_cc:
2548                         dev_dbg(dev->dev,
2549                                 "%s: set hanc registers\n", __func__);
2550                         status =
2551                             cx231xx_mode_register(dev, TS_MODE_REG, 0x1300);
2552                         break;
2553
2554                 case Raw_Video:
2555                         dev_dbg(dev->dev,
2556                                 "%s: set video registers\n", __func__);
2557                         status = cx231xx_mode_register(dev, TS_MODE_REG, 0x100);
2558                         break;
2559
2560                 case TS1_serial_mode:
2561                         dev_dbg(dev->dev,
2562                                 "%s: set ts1 registers", __func__);
2563
2564                         if (dev->board.has_417) {
2565                                 dev_dbg(dev->dev,
2566                                         "%s: MPEG\n", __func__);
2567                                 value &= 0xFFFFFFFC;
2568                                 value |= 0x3;
2569
2570                                 status = cx231xx_mode_register(dev,
2571                                                          TS_MODE_REG, value);
2572
2573                                 val[0] = 0x04;
2574                                 val[1] = 0xA3;
2575                                 val[2] = 0x3B;
2576                                 val[3] = 0x00;
2577                                 status = cx231xx_write_ctrl_reg(dev,
2578                                                         VRT_SET_REGISTER,
2579                                                         TS1_CFG_REG, val, 4);
2580
2581                                 val[0] = 0x00;
2582                                 val[1] = 0x08;
2583                                 val[2] = 0x00;
2584                                 val[3] = 0x08;
2585                                 status = cx231xx_write_ctrl_reg(dev,
2586                                                         VRT_SET_REGISTER,
2587                                                         TS1_LENGTH_REG, val, 4);
2588                         } else {
2589                                 dev_dbg(dev->dev, "%s: BDA\n", __func__);
2590                                 status = cx231xx_mode_register(dev,
2591                                                          TS_MODE_REG, 0x101);
2592                                 status = cx231xx_mode_register(dev,
2593                                                         TS1_CFG_REG, 0x010);
2594                         }
2595                         break;
2596
2597                 case TS1_parallel_mode:
2598                         dev_dbg(dev->dev,
2599                                 "%s: set ts1 parallel mode registers\n",
2600                                 __func__);
2601                         status = cx231xx_mode_register(dev, TS_MODE_REG, 0x100);
2602                         status = cx231xx_mode_register(dev, TS1_CFG_REG, 0x400);
2603                         break;
2604                 }
2605         } else {
2606                 status = cx231xx_mode_register(dev, TS_MODE_REG, 0x101);
2607         }
2608
2609         return status;
2610 }
2611
2612 int cx231xx_capture_start(struct cx231xx *dev, int start, u8 media_type)
2613 {
2614         int rc = -1;
2615         u32 ep_mask = -1;
2616         struct pcb_config *pcb_config;
2617
2618         /* get EP for media type */
2619         pcb_config = (struct pcb_config *)&dev->current_pcb_config;
2620
2621         if (pcb_config->config_num) {
2622                 switch (media_type) {
2623                 case Raw_Video:
2624                         ep_mask = ENABLE_EP4;   /* ep4  [00:1000] */
2625                         break;
2626                 case Audio:
2627                         ep_mask = ENABLE_EP3;   /* ep3  [00:0100] */
2628                         break;
2629                 case Vbi:
2630                         ep_mask = ENABLE_EP5;   /* ep5 [01:0000] */
2631                         break;
2632                 case Sliced_cc:
2633                         ep_mask = ENABLE_EP6;   /* ep6 [10:0000] */
2634                         break;
2635                 case TS1_serial_mode:
2636                 case TS1_parallel_mode:
2637                         ep_mask = ENABLE_EP1;   /* ep1 [00:0001] */
2638                         break;
2639                 case TS2:
2640                         ep_mask = ENABLE_EP2;   /* ep2 [00:0010] */
2641                         break;
2642                 }
2643         }
2644
2645         if (start) {
2646                 rc = cx231xx_initialize_stream_xfer(dev, media_type);
2647
2648                 if (rc < 0)
2649                         return rc;
2650
2651                 /* enable video capture */
2652                 if (ep_mask > 0)
2653                         rc = cx231xx_start_stream(dev, ep_mask);
2654         } else {
2655                 /* disable video capture */
2656                 if (ep_mask > 0)
2657                         rc = cx231xx_stop_stream(dev, ep_mask);
2658         }
2659
2660         return rc;
2661 }
2662 EXPORT_SYMBOL_GPL(cx231xx_capture_start);
2663
2664 /*****************************************************************************
2665 *                   G P I O   B I T control functions                        *
2666 ******************************************************************************/
2667 static int cx231xx_set_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u32 gpio_val)
2668 {
2669         int status = 0;
2670
2671         gpio_val = (__force u32)cpu_to_le32(gpio_val);
2672         status = cx231xx_send_gpio_cmd(dev, gpio_bit, (u8 *)&gpio_val, 4, 0, 0);
2673
2674         return status;
2675 }
2676
2677 static int cx231xx_get_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u32 *gpio_val)
2678 {
2679         __le32 tmp;
2680         int status = 0;
2681
2682         status = cx231xx_send_gpio_cmd(dev, gpio_bit, (u8 *)&tmp, 4, 0, 1);
2683         *gpio_val = le32_to_cpu(tmp);
2684
2685         return status;
2686 }
2687
2688 /*
2689 * cx231xx_set_gpio_direction
2690 *      Sets the direction of the GPIO pin to input or output
2691 *
2692 * Parameters :
2693 *      pin_number : The GPIO Pin number to program the direction for
2694 *                   from 0 to 31
2695 *      pin_value : The Direction of the GPIO Pin under reference.
2696 *                      0 = Input direction
2697 *                      1 = Output direction
2698 */
2699 int cx231xx_set_gpio_direction(struct cx231xx *dev,
2700                                int pin_number, int pin_value)
2701 {
2702         int status = 0;
2703         u32 value = 0;
2704
2705         /* Check for valid pin_number - if 32 , bail out */
2706         if (pin_number >= 32)
2707                 return -EINVAL;
2708
2709         /* input */
2710         if (pin_value == 0)
2711                 value = dev->gpio_dir & (~(1 << pin_number));   /* clear */
2712         else
2713                 value = dev->gpio_dir | (1 << pin_number);
2714
2715         status = cx231xx_set_gpio_bit(dev, value, dev->gpio_val);
2716
2717         /* cache the value for future */
2718         dev->gpio_dir = value;
2719
2720         return status;
2721 }
2722
2723 /*
2724 * cx231xx_set_gpio_value
2725 *      Sets the value of the GPIO pin to Logic high or low. The Pin under
2726 *      reference should ALREADY BE SET IN OUTPUT MODE !!!!!!!!!
2727 *
2728 * Parameters :
2729 *      pin_number : The GPIO Pin number to program the direction for
2730 *      pin_value : The value of the GPIO Pin under reference.
2731 *                      0 = set it to 0
2732 *                      1 = set it to 1
2733 */
2734 int cx231xx_set_gpio_value(struct cx231xx *dev, int pin_number, int pin_value)
2735 {
2736         int status = 0;
2737         u32 value = 0;
2738
2739         /* Check for valid pin_number - if 0xFF , bail out */
2740         if (pin_number >= 32)
2741                 return -EINVAL;
2742
2743         /* first do a sanity check - if the Pin is not output, make it output */
2744         if ((dev->gpio_dir & (1 << pin_number)) == 0x00) {
2745                 /* It was in input mode */
2746                 value = dev->gpio_dir | (1 << pin_number);
2747                 dev->gpio_dir = value;
2748                 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2749                                               dev->gpio_val);
2750                 value = 0;
2751         }
2752
2753         if (pin_value == 0)
2754                 value = dev->gpio_val & (~(1 << pin_number));
2755         else
2756                 value = dev->gpio_val | (1 << pin_number);
2757
2758         /* store the value */
2759         dev->gpio_val = value;
2760
2761         /* toggle bit0 of GP_IO */
2762         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2763
2764         return status;
2765 }
2766
2767 /*****************************************************************************
2768 *                      G P I O I2C related functions                         *
2769 ******************************************************************************/
2770 int cx231xx_gpio_i2c_start(struct cx231xx *dev)
2771 {
2772         int status = 0;
2773
2774         /* set SCL to output 1 ; set SDA to output 1 */
2775         dev->gpio_dir |= 1 << dev->board.tuner_scl_gpio;
2776         dev->gpio_dir |= 1 << dev->board.tuner_sda_gpio;
2777         dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
2778         dev->gpio_val |= 1 << dev->board.tuner_sda_gpio;
2779
2780         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2781         if (status < 0)
2782                 return -EINVAL;
2783
2784         /* set SCL to output 1; set SDA to output 0 */
2785         dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
2786         dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
2787
2788         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2789         if (status < 0)
2790                 return -EINVAL;
2791
2792         /* set SCL to output 0; set SDA to output 0      */
2793         dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2794         dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
2795
2796         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2797         if (status < 0)
2798                 return -EINVAL;
2799
2800         return status;
2801 }
2802
2803 int cx231xx_gpio_i2c_end(struct cx231xx *dev)
2804 {
2805         int status = 0;
2806
2807         /* set SCL to output 0; set SDA to output 0      */
2808         dev->gpio_dir |= 1 << dev->board.tuner_scl_gpio;
2809         dev->gpio_dir |= 1 << dev->board.tuner_sda_gpio;
2810
2811         dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2812         dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
2813
2814         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2815         if (status < 0)
2816                 return -EINVAL;
2817
2818         /* set SCL to output 1; set SDA to output 0      */
2819         dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
2820         dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
2821
2822         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2823         if (status < 0)
2824                 return -EINVAL;
2825
2826         /* set SCL to input ,release SCL cable control
2827            set SDA to input ,release SDA cable control */
2828         dev->gpio_dir &= ~(1 << dev->board.tuner_scl_gpio);
2829         dev->gpio_dir &= ~(1 << dev->board.tuner_sda_gpio);
2830
2831         status =
2832             cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2833         if (status < 0)
2834                 return -EINVAL;
2835
2836         return status;
2837 }
2838
2839 int cx231xx_gpio_i2c_write_byte(struct cx231xx *dev, u8 data)
2840 {
2841         int status = 0;
2842         u8 i;
2843
2844         /* set SCL to output ; set SDA to output */
2845         dev->gpio_dir |= 1 << dev->board.tuner_scl_gpio;
2846         dev->gpio_dir |= 1 << dev->board.tuner_sda_gpio;
2847
2848         for (i = 0; i < 8; i++) {
2849                 if (((data << i) & 0x80) == 0) {
2850                         /* set SCL to output 0; set SDA to output 0     */
2851                         dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2852                         dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
2853                         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2854                                                       dev->gpio_val);
2855
2856                         /* set SCL to output 1; set SDA to output 0     */
2857                         dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
2858                         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2859                                                       dev->gpio_val);
2860
2861                         /* set SCL to output 0; set SDA to output 0     */
2862                         dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2863                         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2864                                                       dev->gpio_val);
2865                 } else {
2866                         /* set SCL to output 0; set SDA to output 1     */
2867                         dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2868                         dev->gpio_val |= 1 << dev->board.tuner_sda_gpio;
2869                         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2870                                                       dev->gpio_val);
2871
2872                         /* set SCL to output 1; set SDA to output 1     */
2873                         dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
2874                         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2875                                                       dev->gpio_val);
2876
2877                         /* set SCL to output 0; set SDA to output 1     */
2878                         dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2879                         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2880                                                       dev->gpio_val);
2881                 }
2882         }
2883         return status;
2884 }
2885
2886 int cx231xx_gpio_i2c_read_byte(struct cx231xx *dev, u8 *buf)
2887 {
2888         u8 value = 0;
2889         int status = 0;
2890         u32 gpio_logic_value = 0;
2891         u8 i;
2892
2893         /* read byte */
2894         for (i = 0; i < 8; i++) {       /* send write I2c addr */
2895
2896                 /* set SCL to output 0; set SDA to input */
2897                 dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2898                 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2899                                               dev->gpio_val);
2900
2901                 /* set SCL to output 1; set SDA to input */
2902                 dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
2903                 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2904                                               dev->gpio_val);
2905
2906                 /* get SDA data bit */
2907                 gpio_logic_value = dev->gpio_val;
2908                 status = cx231xx_get_gpio_bit(dev, dev->gpio_dir,
2909                                               &dev->gpio_val);
2910                 if ((dev->gpio_val & (1 << dev->board.tuner_sda_gpio)) != 0)
2911                         value |= (1 << (8 - i - 1));
2912
2913                 dev->gpio_val = gpio_logic_value;
2914         }
2915
2916         /* set SCL to output 0,finish the read latest SCL signal.
2917            !!!set SDA to input, never to modify SDA direction at
2918            the same times */
2919         dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2920         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2921
2922         /* store the value */
2923         *buf = value & 0xff;
2924
2925         return status;
2926 }
2927
2928 int cx231xx_gpio_i2c_read_ack(struct cx231xx *dev)
2929 {
2930         int status = 0;
2931         u32 gpio_logic_value = 0;
2932         int nCnt = 10;
2933         int nInit = nCnt;
2934
2935         /* clock stretch; set SCL to input; set SDA to input;
2936            get SCL value till SCL = 1 */
2937         dev->gpio_dir &= ~(1 << dev->board.tuner_sda_gpio);
2938         dev->gpio_dir &= ~(1 << dev->board.tuner_scl_gpio);
2939
2940         gpio_logic_value = dev->gpio_val;
2941         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2942
2943         do {
2944                 msleep(2);
2945                 status = cx231xx_get_gpio_bit(dev, dev->gpio_dir,
2946                                               &dev->gpio_val);
2947                 nCnt--;
2948         } while (((dev->gpio_val &
2949                           (1 << dev->board.tuner_scl_gpio)) == 0) &&
2950                          (nCnt > 0));
2951
2952         if (nCnt == 0)
2953                 dev_dbg(dev->dev,
2954                         "No ACK after %d msec -GPIO I2C failed!",
2955                         nInit * 10);
2956
2957         /*
2958          * readAck
2959          * through clock stretch, slave has given a SCL signal,
2960          * so the SDA data can be directly read.
2961          */
2962         status = cx231xx_get_gpio_bit(dev, dev->gpio_dir, &dev->gpio_val);
2963
2964         if ((dev->gpio_val & 1 << dev->board.tuner_sda_gpio) == 0) {
2965                 dev->gpio_val = gpio_logic_value;
2966                 dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
2967                 status = 0;
2968         } else {
2969                 dev->gpio_val = gpio_logic_value;
2970                 dev->gpio_val |= (1 << dev->board.tuner_sda_gpio);
2971         }
2972
2973         /* read SDA end, set the SCL to output 0, after this operation,
2974            SDA direction can be changed. */
2975         dev->gpio_val = gpio_logic_value;
2976         dev->gpio_dir |= (1 << dev->board.tuner_scl_gpio);
2977         dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2978         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2979
2980         return status;
2981 }
2982
2983 int cx231xx_gpio_i2c_write_ack(struct cx231xx *dev)
2984 {
2985         int status = 0;
2986
2987         /* set SDA to ouput */
2988         dev->gpio_dir |= 1 << dev->board.tuner_sda_gpio;
2989         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2990
2991         /* set SCL = 0 (output); set SDA = 0 (output) */
2992         dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
2993         dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2994         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2995
2996         /* set SCL = 1 (output); set SDA = 0 (output) */
2997         dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
2998         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2999
3000         /* set SCL = 0 (output); set SDA = 0 (output) */
3001         dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
3002         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
3003
3004         /* set SDA to input,and then the slave will read data from SDA. */
3005         dev->gpio_dir &= ~(1 << dev->board.tuner_sda_gpio);
3006         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
3007
3008         return status;
3009 }
3010
3011 int cx231xx_gpio_i2c_write_nak(struct cx231xx *dev)
3012 {
3013         int status = 0;
3014
3015         /* set scl to output ; set sda to input */
3016         dev->gpio_dir |= 1 << dev->board.tuner_scl_gpio;
3017         dev->gpio_dir &= ~(1 << dev->board.tuner_sda_gpio);
3018         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
3019
3020         /* set scl to output 0; set sda to input */
3021         dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
3022         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
3023
3024         /* set scl to output 1; set sda to input */
3025         dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
3026         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
3027
3028         return status;
3029 }
3030
3031 /*****************************************************************************
3032 *                      G P I O I2C related functions                         *
3033 ******************************************************************************/
3034 /* cx231xx_gpio_i2c_read
3035  * Function to read data from gpio based I2C interface
3036  */
3037 int cx231xx_gpio_i2c_read(struct cx231xx *dev, u8 dev_addr, u8 *buf, u8 len)
3038 {
3039         int status = 0;
3040         int i = 0;
3041
3042         /* get the lock */
3043         mutex_lock(&dev->gpio_i2c_lock);
3044
3045         /* start */
3046         status = cx231xx_gpio_i2c_start(dev);
3047
3048         /* write dev_addr */
3049         status = cx231xx_gpio_i2c_write_byte(dev, (dev_addr << 1) + 1);
3050
3051         /* readAck */
3052         status = cx231xx_gpio_i2c_read_ack(dev);
3053
3054         /* read data */
3055         for (i = 0; i < len; i++) {
3056                 /* read data */
3057                 buf[i] = 0;
3058                 status = cx231xx_gpio_i2c_read_byte(dev, &buf[i]);
3059
3060                 if ((i + 1) != len) {
3061                         /* only do write ack if we more length */
3062                         status = cx231xx_gpio_i2c_write_ack(dev);
3063                 }
3064         }
3065
3066         /* write NAK - inform reads are complete */
3067         status = cx231xx_gpio_i2c_write_nak(dev);
3068
3069         /* write end */
3070         status = cx231xx_gpio_i2c_end(dev);
3071
3072         /* release the lock */
3073         mutex_unlock(&dev->gpio_i2c_lock);
3074
3075         return status;
3076 }
3077
3078 /* cx231xx_gpio_i2c_write
3079  * Function to write data to gpio based I2C interface
3080  */
3081 int cx231xx_gpio_i2c_write(struct cx231xx *dev, u8 dev_addr, u8 *buf, u8 len)
3082 {
3083         int i = 0;
3084
3085         /* get the lock */
3086         mutex_lock(&dev->gpio_i2c_lock);
3087
3088         /* start */
3089         cx231xx_gpio_i2c_start(dev);
3090
3091         /* write dev_addr */
3092         cx231xx_gpio_i2c_write_byte(dev, dev_addr << 1);
3093
3094         /* read Ack */
3095         cx231xx_gpio_i2c_read_ack(dev);
3096
3097         for (i = 0; i < len; i++) {
3098                 /* Write data */
3099                 cx231xx_gpio_i2c_write_byte(dev, buf[i]);
3100
3101                 /* read Ack */
3102                 cx231xx_gpio_i2c_read_ack(dev);
3103         }
3104
3105         /* write End */
3106         cx231xx_gpio_i2c_end(dev);
3107
3108         /* release the lock */
3109         mutex_unlock(&dev->gpio_i2c_lock);
3110
3111         return 0;
3112 }