Upgrade to 4.4.50-rt62
[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         if (status < 0)
1268                 return status;
1269
1270         return 0;
1271 }
1272
1273 int cx231xx_enable_i2c_port_3(struct cx231xx *dev, bool is_port_3)
1274 {
1275         u8 value[4] = { 0, 0, 0, 0 };
1276         int status = 0;
1277         bool current_is_port_3;
1278
1279         /*
1280          * Should this code check dev->port_3_switch_enabled first
1281          * to skip unnecessary reading of the register?
1282          * If yes, the flag dev->port_3_switch_enabled must be initialized
1283          * correctly.
1284          */
1285
1286         status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER,
1287                                        PWR_CTL_EN, value, 4);
1288         if (status < 0)
1289                 return status;
1290
1291         current_is_port_3 = value[0] & I2C_DEMOD_EN ? true : false;
1292
1293         /* Just return, if already using the right port */
1294         if (current_is_port_3 == is_port_3)
1295                 return 0;
1296
1297         if (is_port_3)
1298                 value[0] |= I2C_DEMOD_EN;
1299         else
1300                 value[0] &= ~I2C_DEMOD_EN;
1301
1302         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1303                                         PWR_CTL_EN, value, 4);
1304
1305         /* remember status of the switch for usage in is_tuner */
1306         if (status >= 0)
1307                 dev->port_3_switch_enabled = is_port_3;
1308
1309         return status;
1310
1311 }
1312 EXPORT_SYMBOL_GPL(cx231xx_enable_i2c_port_3);
1313
1314 void update_HH_register_after_set_DIF(struct cx231xx *dev)
1315 {
1316 /*
1317         u8 status = 0;
1318         u32 value = 0;
1319
1320         vid_blk_write_word(dev, PIN_CTRL, 0xA0FFF82F);
1321         vid_blk_write_word(dev, DIF_MISC_CTRL, 0x0A203F11);
1322         vid_blk_write_word(dev, DIF_SRC_PHASE_INC, 0x1BEFBF06);
1323
1324         status = vid_blk_read_word(dev, AFE_CTRL_C2HH_SRC_CTRL, &value);
1325         vid_blk_write_word(dev, AFE_CTRL_C2HH_SRC_CTRL, 0x4485D390);
1326         status = vid_blk_read_word(dev, AFE_CTRL_C2HH_SRC_CTRL,  &value);
1327 */
1328 }
1329
1330 void cx231xx_dump_HH_reg(struct cx231xx *dev)
1331 {
1332         u32 value = 0;
1333         u16  i = 0;
1334
1335         value = 0x45005390;
1336         vid_blk_write_word(dev, 0x104, value);
1337
1338         for (i = 0x100; i < 0x140; i++) {
1339                 vid_blk_read_word(dev, i, &value);
1340                 dev_dbg(dev->dev, "reg0x%x=0x%x\n", i, value);
1341                 i = i+3;
1342         }
1343
1344         for (i = 0x300; i < 0x400; i++) {
1345                 vid_blk_read_word(dev, i, &value);
1346                 dev_dbg(dev->dev, "reg0x%x=0x%x\n", i, value);
1347                 i = i+3;
1348         }
1349
1350         for (i = 0x400; i < 0x440; i++) {
1351                 vid_blk_read_word(dev, i,  &value);
1352                 dev_dbg(dev->dev, "reg0x%x=0x%x\n", i, value);
1353                 i = i+3;
1354         }
1355
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         vid_blk_write_word(dev, AFE_CTRL_C2HH_SRC_CTRL, 0x4485D390);
1359         vid_blk_read_word(dev, AFE_CTRL_C2HH_SRC_CTRL, &value);
1360         dev_dbg(dev->dev, "AFE_CTRL_C2HH_SRC_CTRL=0x%x\n", value);
1361 }
1362
1363 #if 0
1364 static void cx231xx_dump_SC_reg(struct cx231xx *dev)
1365 {
1366         u8 value[4] = { 0, 0, 0, 0 };
1367         dev_dbg(dev->dev, "%s!\n", __func__);
1368
1369         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, BOARD_CFG_STAT,
1370                                  value, 4);
1371         dev_dbg(dev->dev,
1372                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", BOARD_CFG_STAT, value[0],
1373                 value[1], value[2], value[3]);
1374         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, TS_MODE_REG,
1375                                  value, 4);
1376         dev_dbg(dev->dev,
1377                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", TS_MODE_REG, value[0],
1378                  value[1], value[2], value[3]);
1379         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, TS1_CFG_REG,
1380                                  value, 4);
1381         dev_dbg(dev->dev,
1382                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", TS1_CFG_REG, value[0],
1383                  value[1], value[2], value[3]);
1384         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, TS1_LENGTH_REG,
1385                                  value, 4);
1386         dev_dbg(dev->dev,
1387                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", TS1_LENGTH_REG, value[0],
1388                 value[1], value[2], value[3]);
1389
1390         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, TS2_CFG_REG,
1391                                  value, 4);
1392         dev_dbg(dev->dev,
1393                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", TS2_CFG_REG, value[0],
1394                 value[1], value[2], value[3]);
1395         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, TS2_LENGTH_REG,
1396                                  value, 4);
1397         dev_dbg(dev->dev,
1398                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", TS2_LENGTH_REG, value[0],
1399                 value[1], value[2], value[3]);
1400         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, EP_MODE_SET,
1401                                  value, 4);
1402         dev_dbg(dev->dev,
1403                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", EP_MODE_SET, value[0],
1404                  value[1], value[2], value[3]);
1405         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_PWR_PTN1,
1406                                  value, 4);
1407         dev_dbg(dev->dev,
1408                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_PWR_PTN1, value[0],
1409                 value[1], value[2], value[3]);
1410
1411         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_PWR_PTN2,
1412                                  value, 4);
1413         dev_dbg(dev->dev,
1414                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_PWR_PTN2, value[0],
1415                 value[1], value[2], value[3]);
1416         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_PWR_PTN3,
1417                                  value, 4);
1418         dev_dbg(dev->dev,
1419                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_PWR_PTN3, value[0],
1420                 value[1], value[2], value[3]);
1421         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_PWR_MASK0,
1422                                  value, 4);
1423         dev_dbg(dev->dev,
1424                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_PWR_MASK0, value[0],
1425                 value[1], value[2], value[3]);
1426         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_PWR_MASK1,
1427                                  value, 4);
1428         dev_dbg(dev->dev,
1429                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_PWR_MASK1, value[0],
1430                 value[1], value[2], value[3]);
1431
1432         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_PWR_MASK2,
1433                                  value, 4);
1434         dev_dbg(dev->dev,
1435                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_PWR_MASK2, value[0],
1436                 value[1], value[2], value[3]);
1437         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_GAIN,
1438                                  value, 4);
1439         dev_dbg(dev->dev,
1440                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_GAIN, value[0],
1441                 value[1], value[2], value[3]);
1442         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_CAR_REG,
1443                                  value, 4);
1444         dev_dbg(dev->dev,
1445                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_CAR_REG, value[0],
1446                 value[1], value[2], value[3]);
1447         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_OT_CFG1,
1448                                  value, 4);
1449         dev_dbg(dev->dev,
1450                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_OT_CFG1, value[0],
1451                 value[1], value[2], value[3]);
1452
1453         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_OT_CFG2,
1454                                  value, 4);
1455         dev_dbg(dev->dev,
1456                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_OT_CFG2, value[0],
1457                 value[1], value[2], value[3]);
1458         cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN,
1459                                  value, 4);
1460         dev_dbg(dev->dev,
1461                 "reg0x%x=0x%x 0x%x 0x%x 0x%x\n", PWR_CTL_EN, value[0],
1462                 value[1], value[2], value[3]);
1463 }
1464 #endif
1465
1466 void cx231xx_Setup_AFE_for_LowIF(struct cx231xx *dev)
1467
1468 {
1469         u8 value = 0;
1470
1471         afe_read_byte(dev, ADC_STATUS2_CH3, &value);
1472         value = (value & 0xFE)|0x01;
1473         afe_write_byte(dev, ADC_STATUS2_CH3, value);
1474
1475         afe_read_byte(dev, ADC_STATUS2_CH3, &value);
1476         value = (value & 0xFE)|0x00;
1477         afe_write_byte(dev, ADC_STATUS2_CH3, value);
1478
1479
1480 /*
1481         config colibri to lo-if mode
1482
1483         FIXME: ntf_mode = 2'b00 by default. But set 0x1 would reduce
1484                 the diff IF input by half,
1485
1486                 for low-if agc defect
1487 */
1488
1489         afe_read_byte(dev, ADC_NTF_PRECLMP_EN_CH3, &value);
1490         value = (value & 0xFC)|0x00;
1491         afe_write_byte(dev, ADC_NTF_PRECLMP_EN_CH3, value);
1492
1493         afe_read_byte(dev, ADC_INPUT_CH3, &value);
1494         value = (value & 0xF9)|0x02;
1495         afe_write_byte(dev, ADC_INPUT_CH3, value);
1496
1497         afe_read_byte(dev, ADC_FB_FRCRST_CH3, &value);
1498         value = (value & 0xFB)|0x04;
1499         afe_write_byte(dev, ADC_FB_FRCRST_CH3, value);
1500
1501         afe_read_byte(dev, ADC_DCSERVO_DEM_CH3, &value);
1502         value = (value & 0xFC)|0x03;
1503         afe_write_byte(dev, ADC_DCSERVO_DEM_CH3, value);
1504
1505         afe_read_byte(dev, ADC_CTRL_DAC1_CH3, &value);
1506         value = (value & 0xFB)|0x04;
1507         afe_write_byte(dev, ADC_CTRL_DAC1_CH3, value);
1508
1509         afe_read_byte(dev, ADC_CTRL_DAC23_CH3, &value);
1510         value = (value & 0xF8)|0x06;
1511         afe_write_byte(dev, ADC_CTRL_DAC23_CH3, value);
1512
1513         afe_read_byte(dev, ADC_CTRL_DAC23_CH3, &value);
1514         value = (value & 0x8F)|0x40;
1515         afe_write_byte(dev, ADC_CTRL_DAC23_CH3, value);
1516
1517         afe_read_byte(dev, ADC_PWRDN_CLAMP_CH3, &value);
1518         value = (value & 0xDF)|0x20;
1519         afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3, value);
1520 }
1521
1522 void cx231xx_set_Colibri_For_LowIF(struct cx231xx *dev, u32 if_freq,
1523                  u8 spectral_invert, u32 mode)
1524 {
1525         u32 colibri_carrier_offset = 0;
1526         u32 func_mode = 0x01; /* Device has a DIF if this function is called */
1527         u32 standard = 0;
1528         u8 value[4] = { 0, 0, 0, 0 };
1529
1530         dev_dbg(dev->dev, "Enter cx231xx_set_Colibri_For_LowIF()\n");
1531         value[0] = (u8) 0x6F;
1532         value[1] = (u8) 0x6F;
1533         value[2] = (u8) 0x6F;
1534         value[3] = (u8) 0x6F;
1535         cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1536                                         PWR_CTL_EN, value, 4);
1537
1538         /*Set colibri for low IF*/
1539         cx231xx_afe_set_mode(dev, AFE_MODE_LOW_IF);
1540
1541         /* Set C2HH for low IF operation.*/
1542         standard = dev->norm;
1543         cx231xx_dif_configure_C2HH_for_low_IF(dev, dev->active_mode,
1544                                                        func_mode, standard);
1545
1546         /* Get colibri offsets.*/
1547         colibri_carrier_offset = cx231xx_Get_Colibri_CarrierOffset(mode,
1548                                                                    standard);
1549
1550         dev_dbg(dev->dev, "colibri_carrier_offset=%d, standard=0x%x\n",
1551                      colibri_carrier_offset, standard);
1552
1553         /* Set the band Pass filter for DIF*/
1554         cx231xx_set_DIF_bandpass(dev, (if_freq+colibri_carrier_offset),
1555                                  spectral_invert, mode);
1556 }
1557
1558 u32 cx231xx_Get_Colibri_CarrierOffset(u32 mode, u32 standerd)
1559 {
1560         u32 colibri_carrier_offset = 0;
1561
1562         if (mode == TUNER_MODE_FM_RADIO) {
1563                 colibri_carrier_offset = 1100000;
1564         } else if (standerd & (V4L2_STD_MN | V4L2_STD_NTSC_M_JP)) {
1565                 colibri_carrier_offset = 4832000;  /*4.83MHz    */
1566         } else if (standerd & (V4L2_STD_PAL_B | V4L2_STD_PAL_G)) {
1567                 colibri_carrier_offset = 2700000;  /*2.70MHz       */
1568         } else if (standerd & (V4L2_STD_PAL_D | V4L2_STD_PAL_I
1569                         | V4L2_STD_SECAM)) {
1570                 colibri_carrier_offset = 2100000;  /*2.10MHz    */
1571         }
1572
1573         return colibri_carrier_offset;
1574 }
1575
1576 void cx231xx_set_DIF_bandpass(struct cx231xx *dev, u32 if_freq,
1577                  u8 spectral_invert, u32 mode)
1578 {
1579         unsigned long pll_freq_word;
1580         u32 dif_misc_ctrl_value = 0;
1581         u64 pll_freq_u64 = 0;
1582         u32 i = 0;
1583
1584         dev_dbg(dev->dev, "if_freq=%d;spectral_invert=0x%x;mode=0x%x\n",
1585                 if_freq, spectral_invert, mode);
1586
1587
1588         if (mode == TUNER_MODE_FM_RADIO) {
1589                 pll_freq_word = 0x905A1CAC;
1590                 vid_blk_write_word(dev, DIF_PLL_FREQ_WORD,  pll_freq_word);
1591
1592         } else /*KSPROPERTY_TUNER_MODE_TV*/{
1593                 /* Calculate the PLL frequency word based on the adjusted if_freq*/
1594                 pll_freq_word = if_freq;
1595                 pll_freq_u64 = (u64)pll_freq_word << 28L;
1596                 do_div(pll_freq_u64, 50000000);
1597                 pll_freq_word = (u32)pll_freq_u64;
1598                 /*pll_freq_word = 0x3463497;*/
1599                 vid_blk_write_word(dev, DIF_PLL_FREQ_WORD,  pll_freq_word);
1600
1601                 if (spectral_invert) {
1602                         if_freq -= 400000;
1603                         /* Enable Spectral Invert*/
1604                         vid_blk_read_word(dev, DIF_MISC_CTRL,
1605                                           &dif_misc_ctrl_value);
1606                         dif_misc_ctrl_value = dif_misc_ctrl_value | 0x00200000;
1607                         vid_blk_write_word(dev, DIF_MISC_CTRL,
1608                                           dif_misc_ctrl_value);
1609                 } else {
1610                         if_freq += 400000;
1611                         /* Disable Spectral Invert*/
1612                         vid_blk_read_word(dev, DIF_MISC_CTRL,
1613                                           &dif_misc_ctrl_value);
1614                         dif_misc_ctrl_value = dif_misc_ctrl_value & 0xFFDFFFFF;
1615                         vid_blk_write_word(dev, DIF_MISC_CTRL,
1616                                           dif_misc_ctrl_value);
1617                 }
1618
1619                 if_freq = (if_freq / 100000) * 100000;
1620
1621                 if (if_freq < 3000000)
1622                         if_freq = 3000000;
1623
1624                 if (if_freq > 16000000)
1625                         if_freq = 16000000;
1626         }
1627
1628         dev_dbg(dev->dev, "Enter IF=%zu\n", ARRAY_SIZE(Dif_set_array));
1629         for (i = 0; i < ARRAY_SIZE(Dif_set_array); i++) {
1630                 if (Dif_set_array[i].if_freq == if_freq) {
1631                         vid_blk_write_word(dev,
1632                         Dif_set_array[i].register_address, Dif_set_array[i].value);
1633                 }
1634         }
1635 }
1636
1637 /******************************************************************************
1638  *                 D I F - B L O C K    C O N T R O L   functions             *
1639  ******************************************************************************/
1640 int cx231xx_dif_configure_C2HH_for_low_IF(struct cx231xx *dev, u32 mode,
1641                                           u32 function_mode, u32 standard)
1642 {
1643         int status = 0;
1644
1645
1646         if (mode == V4L2_TUNER_RADIO) {
1647                 /* C2HH */
1648                 /* lo if big signal */
1649                 status = cx231xx_reg_mask_write(dev,
1650                                 VID_BLK_I2C_ADDRESS, 32,
1651                                 AFE_CTRL_C2HH_SRC_CTRL, 30, 31, 0x1);
1652                 /* FUNC_MODE = DIF */
1653                 status = cx231xx_reg_mask_write(dev,
1654                                 VID_BLK_I2C_ADDRESS, 32,
1655                                 AFE_CTRL_C2HH_SRC_CTRL, 23, 24, function_mode);
1656                 /* IF_MODE */
1657                 status = cx231xx_reg_mask_write(dev,
1658                                 VID_BLK_I2C_ADDRESS, 32,
1659                                 AFE_CTRL_C2HH_SRC_CTRL, 15, 22, 0xFF);
1660                 /* no inv */
1661                 status = cx231xx_reg_mask_write(dev,
1662                                 VID_BLK_I2C_ADDRESS, 32,
1663                                 AFE_CTRL_C2HH_SRC_CTRL, 9, 9, 0x1);
1664         } else if (standard != DIF_USE_BASEBAND) {
1665                 if (standard & V4L2_STD_MN) {
1666                         /* lo if big signal */
1667                         status = cx231xx_reg_mask_write(dev,
1668                                         VID_BLK_I2C_ADDRESS, 32,
1669                                         AFE_CTRL_C2HH_SRC_CTRL, 30, 31, 0x1);
1670                         /* FUNC_MODE = DIF */
1671                         status = cx231xx_reg_mask_write(dev,
1672                                         VID_BLK_I2C_ADDRESS, 32,
1673                                         AFE_CTRL_C2HH_SRC_CTRL, 23, 24,
1674                                         function_mode);
1675                         /* IF_MODE */
1676                         status = cx231xx_reg_mask_write(dev,
1677                                         VID_BLK_I2C_ADDRESS, 32,
1678                                         AFE_CTRL_C2HH_SRC_CTRL, 15, 22, 0xb);
1679                         /* no inv */
1680                         status = cx231xx_reg_mask_write(dev,
1681                                         VID_BLK_I2C_ADDRESS, 32,
1682                                         AFE_CTRL_C2HH_SRC_CTRL, 9, 9, 0x1);
1683                         /* 0x124, AUD_CHAN1_SRC = 0x3 */
1684                         status = cx231xx_reg_mask_write(dev,
1685                                         VID_BLK_I2C_ADDRESS, 32,
1686                                         AUD_IO_CTRL, 0, 31, 0x00000003);
1687                 } else if ((standard == V4L2_STD_PAL_I) |
1688                         (standard & V4L2_STD_PAL_D) |
1689                         (standard & V4L2_STD_SECAM)) {
1690                         /* C2HH setup */
1691                         /* lo if big signal */
1692                         status = cx231xx_reg_mask_write(dev,
1693                                         VID_BLK_I2C_ADDRESS, 32,
1694                                         AFE_CTRL_C2HH_SRC_CTRL, 30, 31, 0x1);
1695                         /* FUNC_MODE = DIF */
1696                         status = cx231xx_reg_mask_write(dev,
1697                                         VID_BLK_I2C_ADDRESS, 32,
1698                                         AFE_CTRL_C2HH_SRC_CTRL, 23, 24,
1699                                         function_mode);
1700                         /* IF_MODE */
1701                         status = cx231xx_reg_mask_write(dev,
1702                                         VID_BLK_I2C_ADDRESS, 32,
1703                                         AFE_CTRL_C2HH_SRC_CTRL, 15, 22, 0xF);
1704                         /* no inv */
1705                         status = cx231xx_reg_mask_write(dev,
1706                                         VID_BLK_I2C_ADDRESS, 32,
1707                                         AFE_CTRL_C2HH_SRC_CTRL, 9, 9, 0x1);
1708                 } else {
1709                         /* default PAL BG */
1710                         /* C2HH setup */
1711                         /* lo if big signal */
1712                         status = cx231xx_reg_mask_write(dev,
1713                                         VID_BLK_I2C_ADDRESS, 32,
1714                                         AFE_CTRL_C2HH_SRC_CTRL, 30, 31, 0x1);
1715                         /* FUNC_MODE = DIF */
1716                         status = cx231xx_reg_mask_write(dev,
1717                                         VID_BLK_I2C_ADDRESS, 32,
1718                                         AFE_CTRL_C2HH_SRC_CTRL, 23, 24,
1719                                         function_mode);
1720                         /* IF_MODE */
1721                         status = cx231xx_reg_mask_write(dev,
1722                                         VID_BLK_I2C_ADDRESS, 32,
1723                                         AFE_CTRL_C2HH_SRC_CTRL, 15, 22, 0xE);
1724                         /* no inv */
1725                         status = cx231xx_reg_mask_write(dev,
1726                                         VID_BLK_I2C_ADDRESS, 32,
1727                                         AFE_CTRL_C2HH_SRC_CTRL, 9, 9, 0x1);
1728                 }
1729         }
1730
1731         return status;
1732 }
1733
1734 int cx231xx_dif_set_standard(struct cx231xx *dev, u32 standard)
1735 {
1736         int status = 0;
1737         u32 dif_misc_ctrl_value = 0;
1738         u32 func_mode = 0;
1739
1740         dev_dbg(dev->dev, "%s: setStandard to %x\n", __func__, standard);
1741
1742         status = vid_blk_read_word(dev, DIF_MISC_CTRL, &dif_misc_ctrl_value);
1743         if (standard != DIF_USE_BASEBAND)
1744                 dev->norm = standard;
1745
1746         switch (dev->model) {
1747         case CX231XX_BOARD_CNXT_CARRAERA:
1748         case CX231XX_BOARD_CNXT_RDE_250:
1749         case CX231XX_BOARD_CNXT_SHELBY:
1750         case CX231XX_BOARD_CNXT_RDU_250:
1751         case CX231XX_BOARD_CNXT_VIDEO_GRABBER:
1752         case CX231XX_BOARD_HAUPPAUGE_EXETER:
1753         case CX231XX_BOARD_OTG102:
1754                 func_mode = 0x03;
1755                 break;
1756         case CX231XX_BOARD_CNXT_RDE_253S:
1757         case CX231XX_BOARD_CNXT_RDU_253S:
1758         case CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL:
1759         case CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC:
1760                 func_mode = 0x01;
1761                 break;
1762         default:
1763                 func_mode = 0x01;
1764         }
1765
1766         status = cx231xx_dif_configure_C2HH_for_low_IF(dev, dev->active_mode,
1767                                                   func_mode, standard);
1768
1769         if (standard == DIF_USE_BASEBAND) {     /* base band */
1770                 /* There is a different SRC_PHASE_INC value
1771                    for baseband vs. DIF */
1772                 status = vid_blk_write_word(dev, DIF_SRC_PHASE_INC, 0xDF7DF83);
1773                 status = vid_blk_read_word(dev, DIF_MISC_CTRL,
1774                                                 &dif_misc_ctrl_value);
1775                 dif_misc_ctrl_value |= FLD_DIF_DIF_BYPASS;
1776                 status = vid_blk_write_word(dev, DIF_MISC_CTRL,
1777                                                 dif_misc_ctrl_value);
1778         } else if (standard & V4L2_STD_PAL_D) {
1779                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1780                                            DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
1781                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1782                                            DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
1783                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1784                                            DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
1785                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1786                                            DIF_PLL_CTRL3, 0, 31, 0x00008800);
1787                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1788                                            DIF_AGC_IF_REF, 0, 31, 0x444C1380);
1789                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1790                                            DIF_AGC_CTRL_IF, 0, 31, 0xDA302600);
1791                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1792                                            DIF_AGC_CTRL_INT, 0, 31, 0xDA261700);
1793                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1794                                            DIF_AGC_CTRL_RF, 0, 31, 0xDA262600);
1795                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1796                                            DIF_AGC_IF_INT_CURRENT, 0, 31,
1797                                            0x26001700);
1798                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1799                                            DIF_AGC_RF_CURRENT, 0, 31,
1800                                            0x00002660);
1801                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1802                                            DIF_VIDEO_AGC_CTRL, 0, 31,
1803                                            0x72500800);
1804                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1805                                            DIF_VID_AUD_OVERRIDE, 0, 31,
1806                                            0x27000100);
1807                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1808                                            DIF_AV_SEP_CTRL, 0, 31, 0x3F3934EA);
1809                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1810                                            DIF_COMP_FLT_CTRL, 0, 31,
1811                                            0x00000000);
1812                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1813                                            DIF_SRC_PHASE_INC, 0, 31,
1814                                            0x1befbf06);
1815                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1816                                            DIF_SRC_GAIN_CONTROL, 0, 31,
1817                                            0x000035e8);
1818                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1819                                            DIF_RPT_VARIANCE, 0, 31, 0x00000000);
1820                 /* Save the Spec Inversion value */
1821                 dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
1822                 dif_misc_ctrl_value |= 0x3a023F11;
1823         } else if (standard & V4L2_STD_PAL_I) {
1824                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1825                                            DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
1826                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1827                                            DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
1828                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1829                                            DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
1830                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1831                                            DIF_PLL_CTRL3, 0, 31, 0x00008800);
1832                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1833                                            DIF_AGC_IF_REF, 0, 31, 0x444C1380);
1834                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1835                                            DIF_AGC_CTRL_IF, 0, 31, 0xDA302600);
1836                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1837                                            DIF_AGC_CTRL_INT, 0, 31, 0xDA261700);
1838                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1839                                            DIF_AGC_CTRL_RF, 0, 31, 0xDA262600);
1840                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1841                                            DIF_AGC_IF_INT_CURRENT, 0, 31,
1842                                            0x26001700);
1843                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1844                                            DIF_AGC_RF_CURRENT, 0, 31,
1845                                            0x00002660);
1846                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1847                                            DIF_VIDEO_AGC_CTRL, 0, 31,
1848                                            0x72500800);
1849                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1850                                            DIF_VID_AUD_OVERRIDE, 0, 31,
1851                                            0x27000100);
1852                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1853                                            DIF_AV_SEP_CTRL, 0, 31, 0x5F39A934);
1854                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1855                                            DIF_COMP_FLT_CTRL, 0, 31,
1856                                            0x00000000);
1857                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1858                                            DIF_SRC_PHASE_INC, 0, 31,
1859                                            0x1befbf06);
1860                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1861                                            DIF_SRC_GAIN_CONTROL, 0, 31,
1862                                            0x000035e8);
1863                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1864                                            DIF_RPT_VARIANCE, 0, 31, 0x00000000);
1865                 /* Save the Spec Inversion value */
1866                 dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
1867                 dif_misc_ctrl_value |= 0x3a033F11;
1868         } else if (standard & V4L2_STD_PAL_M) {
1869                 /* improved Low Frequency Phase Noise */
1870                 status = vid_blk_write_word(dev, DIF_PLL_CTRL, 0xFF01FF0C);
1871                 status = vid_blk_write_word(dev, DIF_PLL_CTRL1, 0xbd038c85);
1872                 status = vid_blk_write_word(dev, DIF_PLL_CTRL2, 0x1db4640a);
1873                 status = vid_blk_write_word(dev, DIF_PLL_CTRL3, 0x00008800);
1874                 status = vid_blk_write_word(dev, DIF_AGC_IF_REF, 0x444C1380);
1875                 status = vid_blk_write_word(dev, DIF_AGC_IF_INT_CURRENT,
1876                                                 0x26001700);
1877                 status = vid_blk_write_word(dev, DIF_AGC_RF_CURRENT,
1878                                                 0x00002660);
1879                 status = vid_blk_write_word(dev, DIF_VIDEO_AGC_CTRL,
1880                                                 0x72500800);
1881                 status = vid_blk_write_word(dev, DIF_VID_AUD_OVERRIDE,
1882                                                 0x27000100);
1883                 status = vid_blk_write_word(dev, DIF_AV_SEP_CTRL, 0x012c405d);
1884                 status = vid_blk_write_word(dev, DIF_COMP_FLT_CTRL,
1885                                                 0x009f50c1);
1886                 status = vid_blk_write_word(dev, DIF_SRC_PHASE_INC,
1887                                                 0x1befbf06);
1888                 status = vid_blk_write_word(dev, DIF_SRC_GAIN_CONTROL,
1889                                                 0x000035e8);
1890                 status = vid_blk_write_word(dev, DIF_SOFT_RST_CTRL_REVB,
1891                                                 0x00000000);
1892                 /* Save the Spec Inversion value */
1893                 dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
1894                 dif_misc_ctrl_value |= 0x3A0A3F10;
1895         } else if (standard & (V4L2_STD_PAL_N | V4L2_STD_PAL_Nc)) {
1896                 /* improved Low Frequency Phase Noise */
1897                 status = vid_blk_write_word(dev, DIF_PLL_CTRL, 0xFF01FF0C);
1898                 status = vid_blk_write_word(dev, DIF_PLL_CTRL1, 0xbd038c85);
1899                 status = vid_blk_write_word(dev, DIF_PLL_CTRL2, 0x1db4640a);
1900                 status = vid_blk_write_word(dev, DIF_PLL_CTRL3, 0x00008800);
1901                 status = vid_blk_write_word(dev, DIF_AGC_IF_REF, 0x444C1380);
1902                 status = vid_blk_write_word(dev, DIF_AGC_IF_INT_CURRENT,
1903                                                 0x26001700);
1904                 status = vid_blk_write_word(dev, DIF_AGC_RF_CURRENT,
1905                                                 0x00002660);
1906                 status = vid_blk_write_word(dev, DIF_VIDEO_AGC_CTRL,
1907                                                 0x72500800);
1908                 status = vid_blk_write_word(dev, DIF_VID_AUD_OVERRIDE,
1909                                                 0x27000100);
1910                 status = vid_blk_write_word(dev, DIF_AV_SEP_CTRL,
1911                                                 0x012c405d);
1912                 status = vid_blk_write_word(dev, DIF_COMP_FLT_CTRL,
1913                                                 0x009f50c1);
1914                 status = vid_blk_write_word(dev, DIF_SRC_PHASE_INC,
1915                                                 0x1befbf06);
1916                 status = vid_blk_write_word(dev, DIF_SRC_GAIN_CONTROL,
1917                                                 0x000035e8);
1918                 status = vid_blk_write_word(dev, DIF_SOFT_RST_CTRL_REVB,
1919                                                 0x00000000);
1920                 /* Save the Spec Inversion value */
1921                 dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
1922                 dif_misc_ctrl_value = 0x3A093F10;
1923         } else if (standard &
1924                   (V4L2_STD_SECAM_B | V4L2_STD_SECAM_D | V4L2_STD_SECAM_G |
1925                    V4L2_STD_SECAM_K | V4L2_STD_SECAM_K1)) {
1926
1927                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1928                                            DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
1929                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1930                                            DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
1931                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1932                                            DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
1933                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1934                                            DIF_PLL_CTRL3, 0, 31, 0x00008800);
1935                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1936                                            DIF_AGC_IF_REF, 0, 31, 0x888C0380);
1937                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1938                                            DIF_AGC_CTRL_IF, 0, 31, 0xe0262600);
1939                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1940                                            DIF_AGC_CTRL_INT, 0, 31, 0xc2171700);
1941                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1942                                            DIF_AGC_CTRL_RF, 0, 31, 0xc2262600);
1943                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1944                                            DIF_AGC_IF_INT_CURRENT, 0, 31,
1945                                            0x26001700);
1946                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1947                                            DIF_AGC_RF_CURRENT, 0, 31,
1948                                            0x00002660);
1949                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1950                                            DIF_VID_AUD_OVERRIDE, 0, 31,
1951                                            0x27000100);
1952                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1953                                            DIF_AV_SEP_CTRL, 0, 31, 0x3F3530ec);
1954                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1955                                            DIF_COMP_FLT_CTRL, 0, 31,
1956                                            0x00000000);
1957                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1958                                            DIF_SRC_PHASE_INC, 0, 31,
1959                                            0x1befbf06);
1960                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1961                                            DIF_SRC_GAIN_CONTROL, 0, 31,
1962                                            0x000035e8);
1963                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1964                                            DIF_RPT_VARIANCE, 0, 31, 0x00000000);
1965                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1966                                            DIF_VIDEO_AGC_CTRL, 0, 31,
1967                                            0xf4000000);
1968
1969                 /* Save the Spec Inversion value */
1970                 dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
1971                 dif_misc_ctrl_value |= 0x3a023F11;
1972         } else if (standard & (V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC)) {
1973                 /* Is it SECAM_L1? */
1974                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1975                                            DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
1976                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1977                                            DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
1978                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1979                                            DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
1980                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1981                                            DIF_PLL_CTRL3, 0, 31, 0x00008800);
1982                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1983                                            DIF_AGC_IF_REF, 0, 31, 0x888C0380);
1984                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1985                                            DIF_AGC_CTRL_IF, 0, 31, 0xe0262600);
1986                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1987                                            DIF_AGC_CTRL_INT, 0, 31, 0xc2171700);
1988                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1989                                            DIF_AGC_CTRL_RF, 0, 31, 0xc2262600);
1990                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1991                                            DIF_AGC_IF_INT_CURRENT, 0, 31,
1992                                            0x26001700);
1993                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1994                                            DIF_AGC_RF_CURRENT, 0, 31,
1995                                            0x00002660);
1996                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1997                                            DIF_VID_AUD_OVERRIDE, 0, 31,
1998                                            0x27000100);
1999                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2000                                            DIF_AV_SEP_CTRL, 0, 31, 0x3F3530ec);
2001                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2002                                            DIF_COMP_FLT_CTRL, 0, 31,
2003                                            0x00000000);
2004                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2005                                            DIF_SRC_PHASE_INC, 0, 31,
2006                                            0x1befbf06);
2007                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2008                                            DIF_SRC_GAIN_CONTROL, 0, 31,
2009                                            0x000035e8);
2010                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2011                                            DIF_RPT_VARIANCE, 0, 31, 0x00000000);
2012                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2013                                            DIF_VIDEO_AGC_CTRL, 0, 31,
2014                                            0xf2560000);
2015
2016                 /* Save the Spec Inversion value */
2017                 dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
2018                 dif_misc_ctrl_value |= 0x3a023F11;
2019
2020         } else if (standard & V4L2_STD_NTSC_M) {
2021                 /* V4L2_STD_NTSC_M (75 IRE Setup) Or
2022                    V4L2_STD_NTSC_M_JP (Japan,  0 IRE Setup) */
2023
2024                 /* For NTSC the centre frequency of video coming out of
2025                    sidewinder is around 7.1MHz or 3.6MHz depending on the
2026                    spectral inversion. so for a non spectrally inverted channel
2027                    the pll freq word is 0x03420c49
2028                  */
2029
2030                 status = vid_blk_write_word(dev, DIF_PLL_CTRL, 0x6503BC0C);
2031                 status = vid_blk_write_word(dev, DIF_PLL_CTRL1, 0xBD038C85);
2032                 status = vid_blk_write_word(dev, DIF_PLL_CTRL2, 0x1DB4640A);
2033                 status = vid_blk_write_word(dev, DIF_PLL_CTRL3, 0x00008800);
2034                 status = vid_blk_write_word(dev, DIF_AGC_IF_REF, 0x444C0380);
2035                 status = vid_blk_write_word(dev, DIF_AGC_IF_INT_CURRENT,
2036                                                 0x26001700);
2037                 status = vid_blk_write_word(dev, DIF_AGC_RF_CURRENT,
2038                                                 0x00002660);
2039                 status = vid_blk_write_word(dev, DIF_VIDEO_AGC_CTRL,
2040                                                 0x04000800);
2041                 status = vid_blk_write_word(dev, DIF_VID_AUD_OVERRIDE,
2042                                                 0x27000100);
2043                 status = vid_blk_write_word(dev, DIF_AV_SEP_CTRL, 0x01296e1f);
2044
2045                 status = vid_blk_write_word(dev, DIF_COMP_FLT_CTRL,
2046                                                 0x009f50c1);
2047                 status = vid_blk_write_word(dev, DIF_SRC_PHASE_INC,
2048                                                 0x1befbf06);
2049                 status = vid_blk_write_word(dev, DIF_SRC_GAIN_CONTROL,
2050                                                 0x000035e8);
2051
2052                 status = vid_blk_write_word(dev, DIF_AGC_CTRL_IF, 0xC2262600);
2053                 status = vid_blk_write_word(dev, DIF_AGC_CTRL_INT,
2054                                                 0xC2262600);
2055                 status = vid_blk_write_word(dev, DIF_AGC_CTRL_RF, 0xC2262600);
2056
2057                 /* Save the Spec Inversion value */
2058                 dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
2059                 dif_misc_ctrl_value |= 0x3a003F10;
2060         } else {
2061                 /* default PAL BG */
2062                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2063                                            DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
2064                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2065                                            DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
2066                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2067                                            DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
2068                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2069                                            DIF_PLL_CTRL3, 0, 31, 0x00008800);
2070                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2071                                            DIF_AGC_IF_REF, 0, 31, 0x444C1380);
2072                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2073                                            DIF_AGC_CTRL_IF, 0, 31, 0xDA302600);
2074                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2075                                            DIF_AGC_CTRL_INT, 0, 31, 0xDA261700);
2076                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2077                                            DIF_AGC_CTRL_RF, 0, 31, 0xDA262600);
2078                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2079                                            DIF_AGC_IF_INT_CURRENT, 0, 31,
2080                                            0x26001700);
2081                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2082                                            DIF_AGC_RF_CURRENT, 0, 31,
2083                                            0x00002660);
2084                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2085                                            DIF_VIDEO_AGC_CTRL, 0, 31,
2086                                            0x72500800);
2087                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2088                                            DIF_VID_AUD_OVERRIDE, 0, 31,
2089                                            0x27000100);
2090                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2091                                            DIF_AV_SEP_CTRL, 0, 31, 0x3F3530EC);
2092                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2093                                            DIF_COMP_FLT_CTRL, 0, 31,
2094                                            0x00A653A8);
2095                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2096                                            DIF_SRC_PHASE_INC, 0, 31,
2097                                            0x1befbf06);
2098                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2099                                            DIF_SRC_GAIN_CONTROL, 0, 31,
2100                                            0x000035e8);
2101                 status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2102                                            DIF_RPT_VARIANCE, 0, 31, 0x00000000);
2103                 /* Save the Spec Inversion value */
2104                 dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
2105                 dif_misc_ctrl_value |= 0x3a013F11;
2106         }
2107
2108         /* The AGC values should be the same for all standards,
2109            AUD_SRC_SEL[19] should always be disabled    */
2110         dif_misc_ctrl_value &= ~FLD_DIF_AUD_SRC_SEL;
2111
2112         /* It is still possible to get Set Standard calls even when we
2113            are in FM mode.
2114            This is done to override the value for FM. */
2115         if (dev->active_mode == V4L2_TUNER_RADIO)
2116                 dif_misc_ctrl_value = 0x7a080000;
2117
2118         /* Write the calculated value for misc ontrol register      */
2119         status = vid_blk_write_word(dev, DIF_MISC_CTRL, dif_misc_ctrl_value);
2120
2121         return status;
2122 }
2123
2124 int cx231xx_tuner_pre_channel_change(struct cx231xx *dev)
2125 {
2126         int status = 0;
2127         u32 dwval;
2128
2129         /* Set the RF and IF k_agc values to 3 */
2130         status = vid_blk_read_word(dev, DIF_AGC_IF_REF, &dwval);
2131         dwval &= ~(FLD_DIF_K_AGC_RF | FLD_DIF_K_AGC_IF);
2132         dwval |= 0x33000000;
2133
2134         status = vid_blk_write_word(dev, DIF_AGC_IF_REF, dwval);
2135
2136         return status;
2137 }
2138
2139 int cx231xx_tuner_post_channel_change(struct cx231xx *dev)
2140 {
2141         int status = 0;
2142         u32 dwval;
2143         dev_dbg(dev->dev, "%s: dev->tuner_type =0%d\n",
2144                 __func__, dev->tuner_type);
2145         /* Set the RF and IF k_agc values to 4 for PAL/NTSC and 8 for
2146          * SECAM L/B/D standards */
2147         status = vid_blk_read_word(dev, DIF_AGC_IF_REF, &dwval);
2148         dwval &= ~(FLD_DIF_K_AGC_RF | FLD_DIF_K_AGC_IF);
2149
2150         if (dev->norm & (V4L2_STD_SECAM_L | V4L2_STD_SECAM_B |
2151                          V4L2_STD_SECAM_D)) {
2152                         if (dev->tuner_type == TUNER_NXP_TDA18271) {
2153                                 dwval &= ~FLD_DIF_IF_REF;
2154                                 dwval |= 0x88000300;
2155                         } else
2156                                 dwval |= 0x88000000;
2157                 } else {
2158                         if (dev->tuner_type == TUNER_NXP_TDA18271) {
2159                                 dwval &= ~FLD_DIF_IF_REF;
2160                                 dwval |= 0xCC000300;
2161                         } else
2162                                 dwval |= 0x44000000;
2163                 }
2164
2165         status = vid_blk_write_word(dev, DIF_AGC_IF_REF, dwval);
2166
2167         return status == sizeof(dwval) ? 0 : -EIO;
2168 }
2169
2170 /******************************************************************************
2171  *                  I 2 S - B L O C K    C O N T R O L   functions            *
2172  ******************************************************************************/
2173 int cx231xx_i2s_blk_initialize(struct cx231xx *dev)
2174 {
2175         int status = 0;
2176         u32 value;
2177
2178         status = cx231xx_read_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
2179                                        CH_PWR_CTRL1, 1, &value, 1);
2180         /* enables clock to delta-sigma and decimation filter */
2181         value |= 0x80;
2182         status = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
2183                                         CH_PWR_CTRL1, 1, value, 1);
2184         /* power up all channel */
2185         status = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
2186                                         CH_PWR_CTRL2, 1, 0x00, 1);
2187
2188         return status;
2189 }
2190
2191 int cx231xx_i2s_blk_update_power_control(struct cx231xx *dev,
2192                                         enum AV_MODE avmode)
2193 {
2194         int status = 0;
2195         u32 value = 0;
2196
2197         if (avmode != POLARIS_AVMODE_ENXTERNAL_AV) {
2198                 status = cx231xx_read_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
2199                                           CH_PWR_CTRL2, 1, &value, 1);
2200                 value |= 0xfe;
2201                 status = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
2202                                                 CH_PWR_CTRL2, 1, value, 1);
2203         } else {
2204                 status = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
2205                                                 CH_PWR_CTRL2, 1, 0x00, 1);
2206         }
2207
2208         return status;
2209 }
2210
2211 /* set i2s_blk for audio input types */
2212 int cx231xx_i2s_blk_set_audio_input(struct cx231xx *dev, u8 audio_input)
2213 {
2214         int status = 0;
2215
2216         switch (audio_input) {
2217         case CX231XX_AMUX_LINE_IN:
2218                 status = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
2219                                                 CH_PWR_CTRL2, 1, 0x00, 1);
2220                 status = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
2221                                                 CH_PWR_CTRL1, 1, 0x80, 1);
2222                 break;
2223         case CX231XX_AMUX_VIDEO:
2224         default:
2225                 break;
2226         }
2227
2228         dev->ctl_ainput = audio_input;
2229
2230         return status;
2231 }
2232
2233 /******************************************************************************
2234  *                  P O W E R      C O N T R O L   functions                  *
2235  ******************************************************************************/
2236 int cx231xx_set_power_mode(struct cx231xx *dev, enum AV_MODE mode)
2237 {
2238         u8 value[4] = { 0, 0, 0, 0 };
2239         u32 tmp = 0;
2240         int status = 0;
2241
2242         if (dev->power_mode != mode)
2243                 dev->power_mode = mode;
2244         else {
2245                 dev_dbg(dev->dev, "%s: mode = %d, No Change req.\n",
2246                          __func__, mode);
2247                 return 0;
2248         }
2249
2250         status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN, value,
2251                                        4);
2252         if (status < 0)
2253                 return status;
2254
2255         tmp = le32_to_cpu(*((__le32 *) value));
2256
2257         switch (mode) {
2258         case POLARIS_AVMODE_ENXTERNAL_AV:
2259
2260                 tmp &= (~PWR_MODE_MASK);
2261
2262                 tmp |= PWR_AV_EN;
2263                 value[0] = (u8) tmp;
2264                 value[1] = (u8) (tmp >> 8);
2265                 value[2] = (u8) (tmp >> 16);
2266                 value[3] = (u8) (tmp >> 24);
2267                 status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2268                                                 PWR_CTL_EN, value, 4);
2269                 msleep(PWR_SLEEP_INTERVAL);
2270
2271                 tmp |= PWR_ISO_EN;
2272                 value[0] = (u8) tmp;
2273                 value[1] = (u8) (tmp >> 8);
2274                 value[2] = (u8) (tmp >> 16);
2275                 value[3] = (u8) (tmp >> 24);
2276                 status =
2277                     cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER, PWR_CTL_EN,
2278                                            value, 4);
2279                 msleep(PWR_SLEEP_INTERVAL);
2280
2281                 tmp |= POLARIS_AVMODE_ENXTERNAL_AV;
2282                 value[0] = (u8) tmp;
2283                 value[1] = (u8) (tmp >> 8);
2284                 value[2] = (u8) (tmp >> 16);
2285                 value[3] = (u8) (tmp >> 24);
2286                 status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2287                                                 PWR_CTL_EN, value, 4);
2288
2289                 /* reset state of xceive tuner */
2290                 dev->xc_fw_load_done = 0;
2291                 break;
2292
2293         case POLARIS_AVMODE_ANALOGT_TV:
2294
2295                 tmp |= PWR_DEMOD_EN;
2296                 value[0] = (u8) tmp;
2297                 value[1] = (u8) (tmp >> 8);
2298                 value[2] = (u8) (tmp >> 16);
2299                 value[3] = (u8) (tmp >> 24);
2300                 status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2301                                                 PWR_CTL_EN, value, 4);
2302                 msleep(PWR_SLEEP_INTERVAL);
2303
2304                 if (!(tmp & PWR_TUNER_EN)) {
2305                         tmp |= (PWR_TUNER_EN);
2306                         value[0] = (u8) tmp;
2307                         value[1] = (u8) (tmp >> 8);
2308                         value[2] = (u8) (tmp >> 16);
2309                         value[3] = (u8) (tmp >> 24);
2310                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2311                                                         PWR_CTL_EN, value, 4);
2312                         msleep(PWR_SLEEP_INTERVAL);
2313                 }
2314
2315                 if (!(tmp & PWR_AV_EN)) {
2316                         tmp |= PWR_AV_EN;
2317                         value[0] = (u8) tmp;
2318                         value[1] = (u8) (tmp >> 8);
2319                         value[2] = (u8) (tmp >> 16);
2320                         value[3] = (u8) (tmp >> 24);
2321                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2322                                                         PWR_CTL_EN, value, 4);
2323                         msleep(PWR_SLEEP_INTERVAL);
2324                 }
2325                 if (!(tmp & PWR_ISO_EN)) {
2326                         tmp |= PWR_ISO_EN;
2327                         value[0] = (u8) tmp;
2328                         value[1] = (u8) (tmp >> 8);
2329                         value[2] = (u8) (tmp >> 16);
2330                         value[3] = (u8) (tmp >> 24);
2331                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2332                                                         PWR_CTL_EN, value, 4);
2333                         msleep(PWR_SLEEP_INTERVAL);
2334                 }
2335
2336                 if (!(tmp & POLARIS_AVMODE_ANALOGT_TV)) {
2337                         tmp |= POLARIS_AVMODE_ANALOGT_TV;
2338                         value[0] = (u8) tmp;
2339                         value[1] = (u8) (tmp >> 8);
2340                         value[2] = (u8) (tmp >> 16);
2341                         value[3] = (u8) (tmp >> 24);
2342                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2343                                                         PWR_CTL_EN, value, 4);
2344                         msleep(PWR_SLEEP_INTERVAL);
2345                 }
2346
2347                 if (dev->board.tuner_type != TUNER_ABSENT) {
2348                         /* reset the Tuner */
2349                         if (dev->board.tuner_gpio)
2350                                 cx231xx_gpio_set(dev, dev->board.tuner_gpio);
2351
2352                         if (dev->cx231xx_reset_analog_tuner)
2353                                 dev->cx231xx_reset_analog_tuner(dev);
2354                 }
2355
2356                 break;
2357
2358         case POLARIS_AVMODE_DIGITAL:
2359                 if (!(tmp & PWR_TUNER_EN)) {
2360                         tmp |= (PWR_TUNER_EN);
2361                         value[0] = (u8) tmp;
2362                         value[1] = (u8) (tmp >> 8);
2363                         value[2] = (u8) (tmp >> 16);
2364                         value[3] = (u8) (tmp >> 24);
2365                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2366                                                         PWR_CTL_EN, value, 4);
2367                         msleep(PWR_SLEEP_INTERVAL);
2368                 }
2369                 if (!(tmp & PWR_AV_EN)) {
2370                         tmp |= PWR_AV_EN;
2371                         value[0] = (u8) tmp;
2372                         value[1] = (u8) (tmp >> 8);
2373                         value[2] = (u8) (tmp >> 16);
2374                         value[3] = (u8) (tmp >> 24);
2375                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2376                                                         PWR_CTL_EN, value, 4);
2377                         msleep(PWR_SLEEP_INTERVAL);
2378                 }
2379                 if (!(tmp & PWR_ISO_EN)) {
2380                         tmp |= PWR_ISO_EN;
2381                         value[0] = (u8) tmp;
2382                         value[1] = (u8) (tmp >> 8);
2383                         value[2] = (u8) (tmp >> 16);
2384                         value[3] = (u8) (tmp >> 24);
2385                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2386                                                         PWR_CTL_EN, value, 4);
2387                         msleep(PWR_SLEEP_INTERVAL);
2388                 }
2389
2390                 tmp &= (~PWR_AV_MODE);
2391                 tmp |= POLARIS_AVMODE_DIGITAL;
2392                 value[0] = (u8) tmp;
2393                 value[1] = (u8) (tmp >> 8);
2394                 value[2] = (u8) (tmp >> 16);
2395                 value[3] = (u8) (tmp >> 24);
2396                 status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2397                                                 PWR_CTL_EN, value, 4);
2398                 msleep(PWR_SLEEP_INTERVAL);
2399
2400                 if (!(tmp & PWR_DEMOD_EN)) {
2401                         tmp |= PWR_DEMOD_EN;
2402                         value[0] = (u8) tmp;
2403                         value[1] = (u8) (tmp >> 8);
2404                         value[2] = (u8) (tmp >> 16);
2405                         value[3] = (u8) (tmp >> 24);
2406                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2407                                                         PWR_CTL_EN, value, 4);
2408                         msleep(PWR_SLEEP_INTERVAL);
2409                 }
2410
2411                 if (dev->board.tuner_type != TUNER_ABSENT) {
2412                         /* reset the Tuner */
2413                         if (dev->board.tuner_gpio)
2414                                 cx231xx_gpio_set(dev, dev->board.tuner_gpio);
2415
2416                         if (dev->cx231xx_reset_analog_tuner)
2417                                 dev->cx231xx_reset_analog_tuner(dev);
2418                 }
2419                 break;
2420
2421         default:
2422                 break;
2423         }
2424
2425         msleep(PWR_SLEEP_INTERVAL);
2426
2427         /* For power saving, only enable Pwr_resetout_n
2428            when digital TV is selected. */
2429         if (mode == POLARIS_AVMODE_DIGITAL) {
2430                 tmp |= PWR_RESETOUT_EN;
2431                 value[0] = (u8) tmp;
2432                 value[1] = (u8) (tmp >> 8);
2433                 value[2] = (u8) (tmp >> 16);
2434                 value[3] = (u8) (tmp >> 24);
2435                 status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
2436                                                 PWR_CTL_EN, value, 4);
2437                 msleep(PWR_SLEEP_INTERVAL);
2438         }
2439
2440         /* update power control for afe */
2441         status = cx231xx_afe_update_power_control(dev, mode);
2442
2443         /* update power control for i2s_blk */
2444         status = cx231xx_i2s_blk_update_power_control(dev, mode);
2445
2446         status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN, value,
2447                                        4);
2448
2449         return status;
2450 }
2451
2452 int cx231xx_power_suspend(struct cx231xx *dev)
2453 {
2454         u8 value[4] = { 0, 0, 0, 0 };
2455         u32 tmp = 0;
2456         int status = 0;
2457
2458         status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN,
2459                                        value, 4);
2460         if (status > 0)
2461                 return status;
2462
2463         tmp = le32_to_cpu(*((__le32 *) value));
2464         tmp &= (~PWR_MODE_MASK);
2465
2466         value[0] = (u8) tmp;
2467         value[1] = (u8) (tmp >> 8);
2468         value[2] = (u8) (tmp >> 16);
2469         value[3] = (u8) (tmp >> 24);
2470         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER, PWR_CTL_EN,
2471                                         value, 4);
2472
2473         return status;
2474 }
2475
2476 /******************************************************************************
2477  *                  S T R E A M    C O N T R O L   functions                  *
2478  ******************************************************************************/
2479 int cx231xx_start_stream(struct cx231xx *dev, u32 ep_mask)
2480 {
2481         u8 value[4] = { 0x0, 0x0, 0x0, 0x0 };
2482         u32 tmp = 0;
2483         int status = 0;
2484
2485         dev_dbg(dev->dev, "%s: ep_mask = %x\n", __func__, ep_mask);
2486         status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, EP_MODE_SET,
2487                                        value, 4);
2488         if (status < 0)
2489                 return status;
2490
2491         tmp = le32_to_cpu(*((__le32 *) value));
2492         tmp |= ep_mask;
2493         value[0] = (u8) tmp;
2494         value[1] = (u8) (tmp >> 8);
2495         value[2] = (u8) (tmp >> 16);
2496         value[3] = (u8) (tmp >> 24);
2497
2498         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER, EP_MODE_SET,
2499                                         value, 4);
2500
2501         return status;
2502 }
2503
2504 int cx231xx_stop_stream(struct cx231xx *dev, u32 ep_mask)
2505 {
2506         u8 value[4] = { 0x0, 0x0, 0x0, 0x0 };
2507         u32 tmp = 0;
2508         int status = 0;
2509
2510         dev_dbg(dev->dev, "%s: ep_mask = %x\n", __func__, ep_mask);
2511         status =
2512             cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, EP_MODE_SET, value, 4);
2513         if (status < 0)
2514                 return status;
2515
2516         tmp = le32_to_cpu(*((__le32 *) value));
2517         tmp &= (~ep_mask);
2518         value[0] = (u8) tmp;
2519         value[1] = (u8) (tmp >> 8);
2520         value[2] = (u8) (tmp >> 16);
2521         value[3] = (u8) (tmp >> 24);
2522
2523         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER, EP_MODE_SET,
2524                                         value, 4);
2525
2526         return status;
2527 }
2528
2529 int cx231xx_initialize_stream_xfer(struct cx231xx *dev, u32 media_type)
2530 {
2531         int status = 0;
2532         u32 value = 0;
2533         u8 val[4] = { 0, 0, 0, 0 };
2534
2535         if (dev->udev->speed == USB_SPEED_HIGH) {
2536                 switch (media_type) {
2537                 case Audio:
2538                         dev_dbg(dev->dev,
2539                                 "%s: Audio enter HANC\n", __func__);
2540                         status =
2541                             cx231xx_mode_register(dev, TS_MODE_REG, 0x9300);
2542                         break;
2543
2544                 case Vbi:
2545                         dev_dbg(dev->dev,
2546                                 "%s: set vanc registers\n", __func__);
2547                         status = cx231xx_mode_register(dev, TS_MODE_REG, 0x300);
2548                         break;
2549
2550                 case Sliced_cc:
2551                         dev_dbg(dev->dev,
2552                                 "%s: set hanc registers\n", __func__);
2553                         status =
2554                             cx231xx_mode_register(dev, TS_MODE_REG, 0x1300);
2555                         break;
2556
2557                 case Raw_Video:
2558                         dev_dbg(dev->dev,
2559                                 "%s: set video registers\n", __func__);
2560                         status = cx231xx_mode_register(dev, TS_MODE_REG, 0x100);
2561                         break;
2562
2563                 case TS1_serial_mode:
2564                         dev_dbg(dev->dev,
2565                                 "%s: set ts1 registers", __func__);
2566
2567                         if (dev->board.has_417) {
2568                                 dev_dbg(dev->dev,
2569                                         "%s: MPEG\n", __func__);
2570                                 value &= 0xFFFFFFFC;
2571                                 value |= 0x3;
2572
2573                                 status = cx231xx_mode_register(dev,
2574                                                          TS_MODE_REG, value);
2575
2576                                 val[0] = 0x04;
2577                                 val[1] = 0xA3;
2578                                 val[2] = 0x3B;
2579                                 val[3] = 0x00;
2580                                 status = cx231xx_write_ctrl_reg(dev,
2581                                                         VRT_SET_REGISTER,
2582                                                         TS1_CFG_REG, val, 4);
2583
2584                                 val[0] = 0x00;
2585                                 val[1] = 0x08;
2586                                 val[2] = 0x00;
2587                                 val[3] = 0x08;
2588                                 status = cx231xx_write_ctrl_reg(dev,
2589                                                         VRT_SET_REGISTER,
2590                                                         TS1_LENGTH_REG, val, 4);
2591                         } else {
2592                                 dev_dbg(dev->dev, "%s: BDA\n", __func__);
2593                                 status = cx231xx_mode_register(dev,
2594                                                          TS_MODE_REG, 0x101);
2595                                 status = cx231xx_mode_register(dev,
2596                                                         TS1_CFG_REG, 0x010);
2597                         }
2598                         break;
2599
2600                 case TS1_parallel_mode:
2601                         dev_dbg(dev->dev,
2602                                 "%s: set ts1 parallel mode registers\n",
2603                                 __func__);
2604                         status = cx231xx_mode_register(dev, TS_MODE_REG, 0x100);
2605                         status = cx231xx_mode_register(dev, TS1_CFG_REG, 0x400);
2606                         break;
2607                 }
2608         } else {
2609                 status = cx231xx_mode_register(dev, TS_MODE_REG, 0x101);
2610         }
2611
2612         return status;
2613 }
2614
2615 int cx231xx_capture_start(struct cx231xx *dev, int start, u8 media_type)
2616 {
2617         int rc = -1;
2618         u32 ep_mask = -1;
2619         struct pcb_config *pcb_config;
2620
2621         /* get EP for media type */
2622         pcb_config = (struct pcb_config *)&dev->current_pcb_config;
2623
2624         if (pcb_config->config_num) {
2625                 switch (media_type) {
2626                 case Raw_Video:
2627                         ep_mask = ENABLE_EP4;   /* ep4  [00:1000] */
2628                         break;
2629                 case Audio:
2630                         ep_mask = ENABLE_EP3;   /* ep3  [00:0100] */
2631                         break;
2632                 case Vbi:
2633                         ep_mask = ENABLE_EP5;   /* ep5 [01:0000] */
2634                         break;
2635                 case Sliced_cc:
2636                         ep_mask = ENABLE_EP6;   /* ep6 [10:0000] */
2637                         break;
2638                 case TS1_serial_mode:
2639                 case TS1_parallel_mode:
2640                         ep_mask = ENABLE_EP1;   /* ep1 [00:0001] */
2641                         break;
2642                 case TS2:
2643                         ep_mask = ENABLE_EP2;   /* ep2 [00:0010] */
2644                         break;
2645                 }
2646         }
2647
2648         if (start) {
2649                 rc = cx231xx_initialize_stream_xfer(dev, media_type);
2650
2651                 if (rc < 0)
2652                         return rc;
2653
2654                 /* enable video capture */
2655                 if (ep_mask > 0)
2656                         rc = cx231xx_start_stream(dev, ep_mask);
2657         } else {
2658                 /* disable video capture */
2659                 if (ep_mask > 0)
2660                         rc = cx231xx_stop_stream(dev, ep_mask);
2661         }
2662
2663         return rc;
2664 }
2665 EXPORT_SYMBOL_GPL(cx231xx_capture_start);
2666
2667 /*****************************************************************************
2668 *                   G P I O   B I T control functions                        *
2669 ******************************************************************************/
2670 static int cx231xx_set_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u32 gpio_val)
2671 {
2672         int status = 0;
2673
2674         gpio_val = (__force u32)cpu_to_le32(gpio_val);
2675         status = cx231xx_send_gpio_cmd(dev, gpio_bit, (u8 *)&gpio_val, 4, 0, 0);
2676
2677         return status;
2678 }
2679
2680 static int cx231xx_get_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u32 *gpio_val)
2681 {
2682         __le32 tmp;
2683         int status = 0;
2684
2685         status = cx231xx_send_gpio_cmd(dev, gpio_bit, (u8 *)&tmp, 4, 0, 1);
2686         *gpio_val = le32_to_cpu(tmp);
2687
2688         return status;
2689 }
2690
2691 /*
2692 * cx231xx_set_gpio_direction
2693 *      Sets the direction of the GPIO pin to input or output
2694 *
2695 * Parameters :
2696 *      pin_number : The GPIO Pin number to program the direction for
2697 *                   from 0 to 31
2698 *      pin_value : The Direction of the GPIO Pin under reference.
2699 *                      0 = Input direction
2700 *                      1 = Output direction
2701 */
2702 int cx231xx_set_gpio_direction(struct cx231xx *dev,
2703                                int pin_number, int pin_value)
2704 {
2705         int status = 0;
2706         u32 value = 0;
2707
2708         /* Check for valid pin_number - if 32 , bail out */
2709         if (pin_number >= 32)
2710                 return -EINVAL;
2711
2712         /* input */
2713         if (pin_value == 0)
2714                 value = dev->gpio_dir & (~(1 << pin_number));   /* clear */
2715         else
2716                 value = dev->gpio_dir | (1 << pin_number);
2717
2718         status = cx231xx_set_gpio_bit(dev, value, dev->gpio_val);
2719
2720         /* cache the value for future */
2721         dev->gpio_dir = value;
2722
2723         return status;
2724 }
2725
2726 /*
2727 * cx231xx_set_gpio_value
2728 *      Sets the value of the GPIO pin to Logic high or low. The Pin under
2729 *      reference should ALREADY BE SET IN OUTPUT MODE !!!!!!!!!
2730 *
2731 * Parameters :
2732 *      pin_number : The GPIO Pin number to program the direction for
2733 *      pin_value : The value of the GPIO Pin under reference.
2734 *                      0 = set it to 0
2735 *                      1 = set it to 1
2736 */
2737 int cx231xx_set_gpio_value(struct cx231xx *dev, int pin_number, int pin_value)
2738 {
2739         int status = 0;
2740         u32 value = 0;
2741
2742         /* Check for valid pin_number - if 0xFF , bail out */
2743         if (pin_number >= 32)
2744                 return -EINVAL;
2745
2746         /* first do a sanity check - if the Pin is not output, make it output */
2747         if ((dev->gpio_dir & (1 << pin_number)) == 0x00) {
2748                 /* It was in input mode */
2749                 value = dev->gpio_dir | (1 << pin_number);
2750                 dev->gpio_dir = value;
2751                 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2752                                               dev->gpio_val);
2753                 value = 0;
2754         }
2755
2756         if (pin_value == 0)
2757                 value = dev->gpio_val & (~(1 << pin_number));
2758         else
2759                 value = dev->gpio_val | (1 << pin_number);
2760
2761         /* store the value */
2762         dev->gpio_val = value;
2763
2764         /* toggle bit0 of GP_IO */
2765         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2766
2767         return status;
2768 }
2769
2770 /*****************************************************************************
2771 *                      G P I O I2C related functions                         *
2772 ******************************************************************************/
2773 int cx231xx_gpio_i2c_start(struct cx231xx *dev)
2774 {
2775         int status = 0;
2776
2777         /* set SCL to output 1 ; set SDA to output 1 */
2778         dev->gpio_dir |= 1 << dev->board.tuner_scl_gpio;
2779         dev->gpio_dir |= 1 << dev->board.tuner_sda_gpio;
2780         dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
2781         dev->gpio_val |= 1 << dev->board.tuner_sda_gpio;
2782
2783         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2784         if (status < 0)
2785                 return -EINVAL;
2786
2787         /* set SCL to output 1; set SDA to output 0 */
2788         dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
2789         dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
2790
2791         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2792         if (status < 0)
2793                 return -EINVAL;
2794
2795         /* set SCL to output 0; set SDA to output 0      */
2796         dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2797         dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
2798
2799         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2800         if (status < 0)
2801                 return -EINVAL;
2802
2803         return status;
2804 }
2805
2806 int cx231xx_gpio_i2c_end(struct cx231xx *dev)
2807 {
2808         int status = 0;
2809
2810         /* set SCL to output 0; set SDA to output 0      */
2811         dev->gpio_dir |= 1 << dev->board.tuner_scl_gpio;
2812         dev->gpio_dir |= 1 << dev->board.tuner_sda_gpio;
2813
2814         dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2815         dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
2816
2817         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2818         if (status < 0)
2819                 return -EINVAL;
2820
2821         /* set SCL to output 1; set SDA to output 0      */
2822         dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
2823         dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
2824
2825         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2826         if (status < 0)
2827                 return -EINVAL;
2828
2829         /* set SCL to input ,release SCL cable control
2830            set SDA to input ,release SDA cable control */
2831         dev->gpio_dir &= ~(1 << dev->board.tuner_scl_gpio);
2832         dev->gpio_dir &= ~(1 << dev->board.tuner_sda_gpio);
2833
2834         status =
2835             cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2836         if (status < 0)
2837                 return -EINVAL;
2838
2839         return status;
2840 }
2841
2842 int cx231xx_gpio_i2c_write_byte(struct cx231xx *dev, u8 data)
2843 {
2844         int status = 0;
2845         u8 i;
2846
2847         /* set SCL to output ; set SDA to output */
2848         dev->gpio_dir |= 1 << dev->board.tuner_scl_gpio;
2849         dev->gpio_dir |= 1 << dev->board.tuner_sda_gpio;
2850
2851         for (i = 0; i < 8; i++) {
2852                 if (((data << i) & 0x80) == 0) {
2853                         /* set SCL to output 0; set SDA to output 0     */
2854                         dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2855                         dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
2856                         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2857                                                       dev->gpio_val);
2858
2859                         /* set SCL to output 1; set SDA to output 0     */
2860                         dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
2861                         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2862                                                       dev->gpio_val);
2863
2864                         /* set SCL to output 0; set SDA to output 0     */
2865                         dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2866                         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2867                                                       dev->gpio_val);
2868                 } else {
2869                         /* set SCL to output 0; set SDA to output 1     */
2870                         dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2871                         dev->gpio_val |= 1 << dev->board.tuner_sda_gpio;
2872                         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2873                                                       dev->gpio_val);
2874
2875                         /* set SCL to output 1; set SDA to output 1     */
2876                         dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
2877                         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2878                                                       dev->gpio_val);
2879
2880                         /* set SCL to output 0; set SDA to output 1     */
2881                         dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2882                         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2883                                                       dev->gpio_val);
2884                 }
2885         }
2886         return status;
2887 }
2888
2889 int cx231xx_gpio_i2c_read_byte(struct cx231xx *dev, u8 *buf)
2890 {
2891         u8 value = 0;
2892         int status = 0;
2893         u32 gpio_logic_value = 0;
2894         u8 i;
2895
2896         /* read byte */
2897         for (i = 0; i < 8; i++) {       /* send write I2c addr */
2898
2899                 /* set SCL to output 0; set SDA to input */
2900                 dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2901                 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2902                                               dev->gpio_val);
2903
2904                 /* set SCL to output 1; set SDA to input */
2905                 dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
2906                 status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2907                                               dev->gpio_val);
2908
2909                 /* get SDA data bit */
2910                 gpio_logic_value = dev->gpio_val;
2911                 status = cx231xx_get_gpio_bit(dev, dev->gpio_dir,
2912                                               &dev->gpio_val);
2913                 if ((dev->gpio_val & (1 << dev->board.tuner_sda_gpio)) != 0)
2914                         value |= (1 << (8 - i - 1));
2915
2916                 dev->gpio_val = gpio_logic_value;
2917         }
2918
2919         /* set SCL to output 0,finish the read latest SCL signal.
2920            !!!set SDA to input, never to modify SDA direction at
2921            the same times */
2922         dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2923         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2924
2925         /* store the value */
2926         *buf = value & 0xff;
2927
2928         return status;
2929 }
2930
2931 int cx231xx_gpio_i2c_read_ack(struct cx231xx *dev)
2932 {
2933         int status = 0;
2934         u32 gpio_logic_value = 0;
2935         int nCnt = 10;
2936         int nInit = nCnt;
2937
2938         /* clock stretch; set SCL to input; set SDA to input;
2939            get SCL value till SCL = 1 */
2940         dev->gpio_dir &= ~(1 << dev->board.tuner_sda_gpio);
2941         dev->gpio_dir &= ~(1 << dev->board.tuner_scl_gpio);
2942
2943         gpio_logic_value = dev->gpio_val;
2944         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2945
2946         do {
2947                 msleep(2);
2948                 status = cx231xx_get_gpio_bit(dev, dev->gpio_dir,
2949                                               &dev->gpio_val);
2950                 nCnt--;
2951         } while (((dev->gpio_val &
2952                           (1 << dev->board.tuner_scl_gpio)) == 0) &&
2953                          (nCnt > 0));
2954
2955         if (nCnt == 0)
2956                 dev_dbg(dev->dev,
2957                         "No ACK after %d msec -GPIO I2C failed!",
2958                         nInit * 10);
2959
2960         /*
2961          * readAck
2962          * through clock stretch, slave has given a SCL signal,
2963          * so the SDA data can be directly read.
2964          */
2965         status = cx231xx_get_gpio_bit(dev, dev->gpio_dir, &dev->gpio_val);
2966
2967         if ((dev->gpio_val & 1 << dev->board.tuner_sda_gpio) == 0) {
2968                 dev->gpio_val = gpio_logic_value;
2969                 dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
2970                 status = 0;
2971         } else {
2972                 dev->gpio_val = gpio_logic_value;
2973                 dev->gpio_val |= (1 << dev->board.tuner_sda_gpio);
2974         }
2975
2976         /* read SDA end, set the SCL to output 0, after this operation,
2977            SDA direction can be changed. */
2978         dev->gpio_val = gpio_logic_value;
2979         dev->gpio_dir |= (1 << dev->board.tuner_scl_gpio);
2980         dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2981         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2982
2983         return status;
2984 }
2985
2986 int cx231xx_gpio_i2c_write_ack(struct cx231xx *dev)
2987 {
2988         int status = 0;
2989
2990         /* set SDA to ouput */
2991         dev->gpio_dir |= 1 << dev->board.tuner_sda_gpio;
2992         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2993
2994         /* set SCL = 0 (output); set SDA = 0 (output) */
2995         dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
2996         dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2997         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2998
2999         /* set SCL = 1 (output); set SDA = 0 (output) */
3000         dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
3001         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
3002
3003         /* set SCL = 0 (output); set SDA = 0 (output) */
3004         dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
3005         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
3006
3007         /* set SDA to input,and then the slave will read data from SDA. */
3008         dev->gpio_dir &= ~(1 << dev->board.tuner_sda_gpio);
3009         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
3010
3011         return status;
3012 }
3013
3014 int cx231xx_gpio_i2c_write_nak(struct cx231xx *dev)
3015 {
3016         int status = 0;
3017
3018         /* set scl to output ; set sda to input */
3019         dev->gpio_dir |= 1 << dev->board.tuner_scl_gpio;
3020         dev->gpio_dir &= ~(1 << dev->board.tuner_sda_gpio);
3021         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
3022
3023         /* set scl to output 0; set sda to input */
3024         dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
3025         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
3026
3027         /* set scl to output 1; set sda to input */
3028         dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
3029         status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
3030
3031         return status;
3032 }
3033
3034 /*****************************************************************************
3035 *                      G P I O I2C related functions                         *
3036 ******************************************************************************/
3037 /* cx231xx_gpio_i2c_read
3038  * Function to read data from gpio based I2C interface
3039  */
3040 int cx231xx_gpio_i2c_read(struct cx231xx *dev, u8 dev_addr, u8 *buf, u8 len)
3041 {
3042         int status = 0;
3043         int i = 0;
3044
3045         /* get the lock */
3046         mutex_lock(&dev->gpio_i2c_lock);
3047
3048         /* start */
3049         status = cx231xx_gpio_i2c_start(dev);
3050
3051         /* write dev_addr */
3052         status = cx231xx_gpio_i2c_write_byte(dev, (dev_addr << 1) + 1);
3053
3054         /* readAck */
3055         status = cx231xx_gpio_i2c_read_ack(dev);
3056
3057         /* read data */
3058         for (i = 0; i < len; i++) {
3059                 /* read data */
3060                 buf[i] = 0;
3061                 status = cx231xx_gpio_i2c_read_byte(dev, &buf[i]);
3062
3063                 if ((i + 1) != len) {
3064                         /* only do write ack if we more length */
3065                         status = cx231xx_gpio_i2c_write_ack(dev);
3066                 }
3067         }
3068
3069         /* write NAK - inform reads are complete */
3070         status = cx231xx_gpio_i2c_write_nak(dev);
3071
3072         /* write end */
3073         status = cx231xx_gpio_i2c_end(dev);
3074
3075         /* release the lock */
3076         mutex_unlock(&dev->gpio_i2c_lock);
3077
3078         return status;
3079 }
3080
3081 /* cx231xx_gpio_i2c_write
3082  * Function to write data to gpio based I2C interface
3083  */
3084 int cx231xx_gpio_i2c_write(struct cx231xx *dev, u8 dev_addr, u8 *buf, u8 len)
3085 {
3086         int i = 0;
3087
3088         /* get the lock */
3089         mutex_lock(&dev->gpio_i2c_lock);
3090
3091         /* start */
3092         cx231xx_gpio_i2c_start(dev);
3093
3094         /* write dev_addr */
3095         cx231xx_gpio_i2c_write_byte(dev, dev_addr << 1);
3096
3097         /* read Ack */
3098         cx231xx_gpio_i2c_read_ack(dev);
3099
3100         for (i = 0; i < len; i++) {
3101                 /* Write data */
3102                 cx231xx_gpio_i2c_write_byte(dev, buf[i]);
3103
3104                 /* read Ack */
3105                 cx231xx_gpio_i2c_read_ack(dev);
3106         }
3107
3108         /* write End */
3109         cx231xx_gpio_i2c_end(dev);
3110
3111         /* release the lock */
3112         mutex_unlock(&dev->gpio_i2c_lock);
3113
3114         return 0;
3115 }