cx231xx-avcore.c 89.9 KB
Newer Older
1
/*
2 3
   cx231xx_avcore.c - driver for Conexant Cx23100/101/102
		      USB video capture devices
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

   Copyright (C) 2008 <srinivasa.deevi at conexant dot com>

   This program contains the specific code to control the avdecoder chip and
   other related usb control functions for cx231xx based chipset.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include <linux/init.h>
#include <linux/list.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/bitmap.h>
#include <linux/usb.h>
#include <linux/i2c.h>
#include <linux/mm.h>
#include <linux/mutex.h>
34
#include <media/tuner.h>
35 36 37 38 39

#include <media/v4l2-common.h>
#include <media/v4l2-ioctl.h>

#include "cx231xx.h"
40
#include "cx231xx-dif.h"
41

42
#define TUNER_MODE_FM_RADIO 0
43
/******************************************************************************
44 45 46 47 48 49 50 51 52 53 54
			-: BLOCK ARRANGEMENT :-
	I2S block ----------------------|
	[I2S audio]			|
					|
	Analog Front End --> Direct IF -|-> Cx25840 --> Audio
	[video & audio]			|   [Audio]
					|
					|-> Cx25840 --> Video
					    [Video]

*******************************************************************************/
55 56
/******************************************************************************
 *                    VERVE REGISTER                                          *
57
 *									      *
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
 ******************************************************************************/
static int verve_write_byte(struct cx231xx *dev, u8 saddr, u8 data)
{
	return cx231xx_write_i2c_data(dev, VERVE_I2C_ADDRESS,
					saddr, 1, data, 1);
}

static int verve_read_byte(struct cx231xx *dev, u8 saddr, u8 *data)
{
	int status;
	u32 temp = 0;

	status = cx231xx_read_i2c_data(dev, VERVE_I2C_ADDRESS,
					saddr, 1, &temp, 1);
	*data = (u8) temp;
	return status;
}
void initGPIO(struct cx231xx *dev)
{
	u32 _gpio_direction = 0;
	u32 value = 0;
	u8 val = 0;

	_gpio_direction = _gpio_direction & 0xFC0003FF;
	_gpio_direction = _gpio_direction | 0x03FDFC00;
	cx231xx_send_gpio_cmd(dev, _gpio_direction, (u8 *)&value, 4, 0, 0);

	verve_read_byte(dev, 0x07, &val);
	cx231xx_info(" verve_read_byte address0x07=0x%x\n", val);
	verve_write_byte(dev, 0x07, 0xF4);
	verve_read_byte(dev, 0x07, &val);
	cx231xx_info(" verve_read_byte address0x07=0x%x\n", val);

91
	cx231xx_capture_start(dev, 1, Vbi);
92 93 94 95 96 97 98 99 100

	cx231xx_mode_register(dev, EP_MODE_SET, 0x0500FE00);
	cx231xx_mode_register(dev, GBULK_BIT_EN, 0xFFFDFFFF);

}
void uninitGPIO(struct cx231xx *dev)
{
	u8 value[4] = { 0, 0, 0, 0 };

101
	cx231xx_capture_start(dev, 0, Vbi);
102 103 104 105
	verve_write_byte(dev, 0x07, 0x14);
	cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
			0x68, value, 4);
}
106 107 108 109

/******************************************************************************
 *                    A F E - B L O C K    C O N T R O L   functions          *
 * 				[ANALOG FRONT END]			      *
110
 ******************************************************************************/
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
static int afe_write_byte(struct cx231xx *dev, u16 saddr, u8 data)
{
	return cx231xx_write_i2c_data(dev, AFE_DEVICE_ADDRESS,
					saddr, 2, data, 1);
}

static int afe_read_byte(struct cx231xx *dev, u16 saddr, u8 *data)
{
	int status;
	u32 temp = 0;

	status = cx231xx_read_i2c_data(dev, AFE_DEVICE_ADDRESS,
					saddr, 2, &temp, 1);
	*data = (u8) temp;
	return status;
}

int cx231xx_afe_init_super_block(struct cx231xx *dev, u32 ref_count)
129
{
130 131
	int status = 0;
	u8 temp = 0;
132
	u8 afe_power_status = 0;
133 134 135 136
	int i = 0;

	/* super block initialize */
	temp = (u8) (ref_count & 0xff);
137
	status = afe_write_byte(dev, SUP_BLK_TUNE2, temp);
138 139
	if (status < 0)
		return status;
140

141
	status = afe_read_byte(dev, SUP_BLK_TUNE2, &afe_power_status);
142 143
	if (status < 0)
		return status;
144 145 146

	temp = (u8) ((ref_count & 0x300) >> 8);
	temp |= 0x40;
147
	status = afe_write_byte(dev, SUP_BLK_TUNE1, temp);
148 149 150
	if (status < 0)
		return status;

151
	status = afe_write_byte(dev, SUP_BLK_PLL2, 0x0f);
152 153
	if (status < 0)
		return status;
154 155

	/* enable pll     */
156 157
	while (afe_power_status != 0x18) {
		status = afe_write_byte(dev, SUP_BLK_PWRDN, 0x18);
158 159 160 161 162 163
		if (status < 0) {
			cx231xx_info(
			": Init Super Block failed in send cmd\n");
			break;
		}

164 165
		status = afe_read_byte(dev, SUP_BLK_PWRDN, &afe_power_status);
		afe_power_status &= 0xff;
166
		if (status < 0) {
167
			cx231xx_info(
168
			": Init Super Block failed in receive cmd\n");
169 170 171 172
			break;
		}
		i++;
		if (i == 10) {
173 174
			cx231xx_info(
			": Init Super Block force break in loop !!!!\n");
175 176 177 178 179 180 181 182 183
			status = -1;
			break;
		}
	}

	if (status < 0)
		return status;

	/* start tuning filter */
184
	status = afe_write_byte(dev, SUP_BLK_TUNE3, 0x40);
185 186 187
	if (status < 0)
		return status;

188 189 190
	msleep(5);

	/* exit tuning */
191
	status = afe_write_byte(dev, SUP_BLK_TUNE3, 0x00);
192 193

	return status;
194 195
}

196
int cx231xx_afe_init_channels(struct cx231xx *dev)
197
{
198 199 200
	int status = 0;

	/* power up all 3 channels, clear pd_buffer */
201 202 203
	status = afe_write_byte(dev, ADC_PWRDN_CLAMP_CH1, 0x00);
	status = afe_write_byte(dev, ADC_PWRDN_CLAMP_CH2, 0x00);
	status = afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3, 0x00);
204 205

	/* Enable quantizer calibration */
206
	status = afe_write_byte(dev, ADC_COM_QUANT, 0x02);
207 208

	/* channel initialize, force modulator (fb) reset */
209 210 211
	status = afe_write_byte(dev, ADC_FB_FRCRST_CH1, 0x17);
	status = afe_write_byte(dev, ADC_FB_FRCRST_CH2, 0x17);
	status = afe_write_byte(dev, ADC_FB_FRCRST_CH3, 0x17);
212 213

	/* start quantilizer calibration  */
214 215 216
	status = afe_write_byte(dev, ADC_CAL_ATEST_CH1, 0x10);
	status = afe_write_byte(dev, ADC_CAL_ATEST_CH2, 0x10);
	status = afe_write_byte(dev, ADC_CAL_ATEST_CH3, 0x10);
217 218 219
	msleep(5);

	/* exit modulator (fb) reset */
220 221 222
	status = afe_write_byte(dev, ADC_FB_FRCRST_CH1, 0x07);
	status = afe_write_byte(dev, ADC_FB_FRCRST_CH2, 0x07);
	status = afe_write_byte(dev, ADC_FB_FRCRST_CH3, 0x07);
223 224

	/* enable the pre_clamp in each channel for single-ended input */
225 226 227
	status = afe_write_byte(dev, ADC_NTF_PRECLMP_EN_CH1, 0xf0);
	status = afe_write_byte(dev, ADC_NTF_PRECLMP_EN_CH2, 0xf0);
	status = afe_write_byte(dev, ADC_NTF_PRECLMP_EN_CH3, 0xf0);
228 229

	/* use diode instead of resistor, so set term_en to 0, res_en to 0  */
230
	status = cx231xx_reg_mask_write(dev, AFE_DEVICE_ADDRESS, 8,
231
				   ADC_QGAIN_RES_TRM_CH1, 3, 7, 0x00);
232
	status = cx231xx_reg_mask_write(dev, AFE_DEVICE_ADDRESS, 8,
233
				   ADC_QGAIN_RES_TRM_CH2, 3, 7, 0x00);
234
	status = cx231xx_reg_mask_write(dev, AFE_DEVICE_ADDRESS, 8,
235 236 237
				   ADC_QGAIN_RES_TRM_CH3, 3, 7, 0x00);

	/* dynamic element matching off */
238 239 240
	status = afe_write_byte(dev, ADC_DCSERVO_DEM_CH1, 0x03);
	status = afe_write_byte(dev, ADC_DCSERVO_DEM_CH2, 0x03);
	status = afe_write_byte(dev, ADC_DCSERVO_DEM_CH3, 0x03);
241 242

	return status;
243 244
}

245
int cx231xx_afe_setup_AFE_for_baseband(struct cx231xx *dev)
246
{
247
	u8 c_value = 0;
248
	int status = 0;
249

250
	status = afe_read_byte(dev, ADC_PWRDN_CLAMP_CH2, &c_value);
251
	c_value &= (~(0x50));
252
	status = afe_write_byte(dev, ADC_PWRDN_CLAMP_CH2, c_value);
253

254
	return status;
255 256 257
}

/*
258 259 260 261
	The Analog Front End in Cx231xx has 3 channels. These
	channels are used to share between different inputs
	like tuner, s-video and composite inputs.

262 263 264 265
	channel 1 ----- pin 1  to pin4(in reg is 1-4)
	channel 2 ----- pin 5  to pin8(in reg is 5-8)
	channel 3 ----- pin 9 to pin 12(in reg is 9-11)
*/
266
int cx231xx_afe_set_input_mux(struct cx231xx *dev, u32 input_mux)
267
{
268 269 270 271
	u8 ch1_setting = (u8) input_mux;
	u8 ch2_setting = (u8) (input_mux >> 8);
	u8 ch3_setting = (u8) (input_mux >> 16);
	int status = 0;
272
	u8 value = 0;
273 274

	if (ch1_setting != 0) {
275
		status = afe_read_byte(dev, ADC_INPUT_CH1, &value);
276
		value &= ~INPUT_SEL_MASK;
277 278
		value |= (ch1_setting - 1) << 4;
		value &= 0xff;
279
		status = afe_write_byte(dev, ADC_INPUT_CH1, value);
280 281 282
	}

	if (ch2_setting != 0) {
283
		status = afe_read_byte(dev, ADC_INPUT_CH2, &value);
284
		value &= ~INPUT_SEL_MASK;
285 286
		value |= (ch2_setting - 1) << 4;
		value &= 0xff;
287
		status = afe_write_byte(dev, ADC_INPUT_CH2, value);
288 289
	}

290 291
	/* For ch3_setting, the value to put in the register is
	   7 less than the input number */
292
	if (ch3_setting != 0) {
293
		status = afe_read_byte(dev, ADC_INPUT_CH3, &value);
294
		value &= ~INPUT_SEL_MASK;
295 296
		value |= (ch3_setting - 1) << 4;
		value &= 0xff;
297
		status = afe_write_byte(dev, ADC_INPUT_CH3, value);
298 299 300
	}

	return status;
301 302
}

303
int cx231xx_afe_set_mode(struct cx231xx *dev, enum AFE_MODE mode)
304
{
305 306
	int status = 0;

307 308 309 310 311
	/*
	* FIXME: We need to implement the AFE code for LOW IF and for HI IF.
	* Currently, only baseband works.
	*/

312 313
	switch (mode) {
	case AFE_MODE_LOW_IF:
314
		cx231xx_Setup_AFE_for_LowIF(dev);
315 316
		break;
	case AFE_MODE_BASEBAND:
317
		status = cx231xx_afe_setup_AFE_for_baseband(dev);
318 319 320 321 322 323 324 325 326 327 328 329
		break;
	case AFE_MODE_EU_HI_IF:
		/* SetupAFEforEuHiIF(); */
		break;
	case AFE_MODE_US_HI_IF:
		/* SetupAFEforUsHiIF(); */
		break;
	case AFE_MODE_JAPAN_HI_IF:
		/* SetupAFEforJapanHiIF(); */
		break;
	}

330
	if ((mode != dev->afe_mode) &&
331
		(dev->video_input == CX231XX_VMUX_TELEVISION))
332
		status = cx231xx_afe_adjust_ref_count(dev,
333 334
						     CX231XX_VMUX_TELEVISION);

335
	dev->afe_mode = mode;
336 337

	return status;
338 339
}

340
int cx231xx_afe_update_power_control(struct cx231xx *dev,
341
					enum AV_MODE avmode)
342
{
343
	u8 afe_power_status = 0;
344 345 346
	int status = 0;

	switch (dev->model) {
347
	case CX231XX_BOARD_CNXT_CARRAERA:
348
	case CX231XX_BOARD_CNXT_RDE_250:
349
	case CX231XX_BOARD_CNXT_SHELBY:
350
	case CX231XX_BOARD_CNXT_RDU_250:
351 352 353
	case CX231XX_BOARD_CNXT_RDE_253S:
	case CX231XX_BOARD_CNXT_RDU_253S:
	case CX231XX_BOARD_CNXT_VIDEO_GRABBER:
354
	case CX231XX_BOARD_HAUPPAUGE_EXETER:
355
	case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
356
	case CX231XX_BOARD_HAUPPAUGE_USBLIVE2:
357
	case CX231XX_BOARD_PV_PLAYTV_USB_HYBRID:
358 359
	case CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL:
	case CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC:
360
	case CX231XX_BOARD_OTG102:
361
		if (avmode == POLARIS_AVMODE_ANALOGT_TV) {
362
			while (afe_power_status != (FLD_PWRDN_TUNING_BIAS |
363
						FLD_PWRDN_ENABLE_PLL)) {
364
				status = afe_write_byte(dev, SUP_BLK_PWRDN,
365
							FLD_PWRDN_TUNING_BIAS |
366 367 368
							FLD_PWRDN_ENABLE_PLL);
				status |= afe_read_byte(dev, SUP_BLK_PWRDN,
							&afe_power_status);
369 370 371 372
				if (status < 0)
					break;
			}

373 374 375 376 377 378
			status = afe_write_byte(dev, ADC_PWRDN_CLAMP_CH1,
							0x00);
			status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH2,
							0x00);
			status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3,
							0x00);
379
		} else if (avmode == POLARIS_AVMODE_DIGITAL) {
380 381 382 383 384 385 386 387 388 389
			status = afe_write_byte(dev, ADC_PWRDN_CLAMP_CH1,
							0x70);
			status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH2,
							0x70);
			status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3,
							0x70);

			status |= afe_read_byte(dev, SUP_BLK_PWRDN,
						  &afe_power_status);
			afe_power_status |= FLD_PWRDN_PD_BANDGAP |
390 391
						FLD_PWRDN_PD_BIAS |
						FLD_PWRDN_PD_TUNECK;
392 393
			status |= afe_write_byte(dev, SUP_BLK_PWRDN,
						   afe_power_status);
394
		} else if (avmode == POLARIS_AVMODE_ENXTERNAL_AV) {
395
			while (afe_power_status != (FLD_PWRDN_TUNING_BIAS |
396
						FLD_PWRDN_ENABLE_PLL)) {
397
				status = afe_write_byte(dev, SUP_BLK_PWRDN,
398
							FLD_PWRDN_TUNING_BIAS |
399 400 401
							FLD_PWRDN_ENABLE_PLL);
				status |= afe_read_byte(dev, SUP_BLK_PWRDN,
							&afe_power_status);
402 403 404 405
				if (status < 0)
					break;
			}

406 407 408 409 410 411
			status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH1,
						0x00);
			status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH2,
						0x00);
			status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3,
						0x00);
412 413 414 415 416 417 418
		} else {
			cx231xx_info("Invalid AV mode input\n");
			status = -1;
		}
		break;
	default:
		if (avmode == POLARIS_AVMODE_ANALOGT_TV) {
419
			while (afe_power_status != (FLD_PWRDN_TUNING_BIAS |
420
						FLD_PWRDN_ENABLE_PLL)) {
421
				status = afe_write_byte(dev, SUP_BLK_PWRDN,
422
							FLD_PWRDN_TUNING_BIAS |
423 424 425
							FLD_PWRDN_ENABLE_PLL);
				status |= afe_read_byte(dev, SUP_BLK_PWRDN,
							&afe_power_status);
426 427 428 429
				if (status < 0)
					break;
			}

430 431 432 433 434 435
			status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH1,
							0x40);
			status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH2,
							0x40);
			status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3,
							0x00);
436
		} else if (avmode == POLARIS_AVMODE_DIGITAL) {
437 438 439 440 441 442 443 444 445 446
			status = afe_write_byte(dev, ADC_PWRDN_CLAMP_CH1,
							0x70);
			status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH2,
							0x70);
			status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3,
							0x70);

			status |= afe_read_byte(dev, SUP_BLK_PWRDN,
						       &afe_power_status);
			afe_power_status |= FLD_PWRDN_PD_BANDGAP |
447 448
						FLD_PWRDN_PD_BIAS |
						FLD_PWRDN_PD_TUNECK;
449 450
			status |= afe_write_byte(dev, SUP_BLK_PWRDN,
							afe_power_status);
451
		} else if (avmode == POLARIS_AVMODE_ENXTERNAL_AV) {
452
			while (afe_power_status != (FLD_PWRDN_TUNING_BIAS |
453
						FLD_PWRDN_ENABLE_PLL)) {
454
				status = afe_write_byte(dev, SUP_BLK_PWRDN,
455
							FLD_PWRDN_TUNING_BIAS |
456 457 458
							FLD_PWRDN_ENABLE_PLL);
				status |= afe_read_byte(dev, SUP_BLK_PWRDN,
							&afe_power_status);
459 460 461 462
				if (status < 0)
					break;
			}

463 464 465 466 467 468
			status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH1,
							0x00);
			status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH2,
							0x00);
			status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3,
							0x40);
469 470 471 472 473 474 475
		} else {
			cx231xx_info("Invalid AV mode input\n");
			status = -1;
		}
	}			/* switch  */

	return status;
476 477
}

478
int cx231xx_afe_adjust_ref_count(struct cx231xx *dev, u32 video_input)
479
{
480 481
	u8 input_mode = 0;
	u8 ntf_mode = 0;
482 483 484 485 486
	int status = 0;

	dev->video_input = video_input;

	if (video_input == CX231XX_VMUX_TELEVISION) {
487 488 489
		status = afe_read_byte(dev, ADC_INPUT_CH3, &input_mode);
		status = afe_read_byte(dev, ADC_NTF_PRECLMP_EN_CH3,
					&ntf_mode);
490
	} else {
491 492 493
		status = afe_read_byte(dev, ADC_INPUT_CH1, &input_mode);
		status = afe_read_byte(dev, ADC_NTF_PRECLMP_EN_CH1,
					&ntf_mode);
494
	}
495

496 497 498 499
	input_mode = (ntf_mode & 0x3) | ((input_mode & 0x6) << 1);

	switch (input_mode) {
	case SINGLE_ENDED:
500
		dev->afe_ref_count = 0x23C;
501 502
		break;
	case LOW_IF:
503
		dev->afe_ref_count = 0x24C;
504 505
		break;
	case EU_IF:
506
		dev->afe_ref_count = 0x258;
507 508
		break;
	case US_IF:
509
		dev->afe_ref_count = 0x260;
510 511 512 513 514
		break;
	default:
		break;
	}

515
	status = cx231xx_afe_init_super_block(dev, dev->afe_ref_count);
516

517 518
	return status;
}
519

520 521
/******************************************************************************
 *     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    *
522
 ******************************************************************************/
523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550
static int vid_blk_write_byte(struct cx231xx *dev, u16 saddr, u8 data)
{
	return cx231xx_write_i2c_data(dev, VID_BLK_I2C_ADDRESS,
					saddr, 2, data, 1);
}

static int vid_blk_read_byte(struct cx231xx *dev, u16 saddr, u8 *data)
{
	int status;
	u32 temp = 0;

	status = cx231xx_read_i2c_data(dev, VID_BLK_I2C_ADDRESS,
					saddr, 2, &temp, 1);
	*data = (u8) temp;
	return status;
}

static int vid_blk_write_word(struct cx231xx *dev, u16 saddr, u32 data)
{
	return cx231xx_write_i2c_data(dev, VID_BLK_I2C_ADDRESS,
					saddr, 2, data, 4);
}

static int vid_blk_read_word(struct cx231xx *dev, u16 saddr, u32 *data)
{
	return cx231xx_read_i2c_data(dev, VID_BLK_I2C_ADDRESS,
					saddr, 2, data, 4);
}
551 552 553 554 555 556 557 558 559 560 561
int cx231xx_check_fw(struct cx231xx *dev)
{
	u8 temp = 0;
	int status = 0;
	status = vid_blk_read_byte(dev, DL_CTL_ADDRESS_LOW, &temp);
	if (status < 0)
		return status;
	else
		return temp;

}
562

563 564
int cx231xx_set_video_input_mux(struct cx231xx *dev, u8 input)
{
565 566 567 568 569 570 571
	int status = 0;

	switch (INPUT(input)->type) {
	case CX231XX_VMUX_COMPOSITE1:
	case CX231XX_VMUX_SVIDEO:
		if ((dev->current_pcb_config.type == USB_BUS_POWER) &&
		    (dev->power_mode != POLARIS_AVMODE_ENXTERNAL_AV)) {
572 573 574
			/* External AV */
			status = cx231xx_set_power_mode(dev,
					POLARIS_AVMODE_ENXTERNAL_AV);
575
			if (status < 0) {
576 577 578
				cx231xx_errdev("%s: set_power_mode : Failed to"
						" set Power - errCode [%d]!\n",
						__func__, status);
579 580 581
				return status;
			}
		}
582 583 584
		status = cx231xx_set_decoder_video_input(dev,
							 INPUT(input)->type,
							 INPUT(input)->vmux);
585 586 587 588 589
		break;
	case CX231XX_VMUX_TELEVISION:
	case CX231XX_VMUX_CABLE:
		if ((dev->current_pcb_config.type == USB_BUS_POWER) &&
		    (dev->power_mode != POLARIS_AVMODE_ANALOGT_TV)) {
590 591 592
			/* Tuner */
			status = cx231xx_set_power_mode(dev,
						POLARIS_AVMODE_ANALOGT_TV);
593
			if (status < 0) {
594 595 596
				cx231xx_errdev("%s: set_power_mode:Failed"
					" to set Power - errCode [%d]!\n",
					__func__, status);
597 598 599
				return status;
			}
		}
600 601 602 603 604 605
		if (dev->tuner_type == TUNER_NXP_TDA18271)
			status = cx231xx_set_decoder_video_input(dev,
							CX231XX_VMUX_TELEVISION,
							INPUT(input)->vmux);
		else
			status = cx231xx_set_decoder_video_input(dev,
606 607
							CX231XX_VMUX_COMPOSITE1,
							INPUT(input)->vmux);
608

609 610
		break;
	default:
611
		cx231xx_errdev("%s: set_power_mode : Unknown Input %d !\n",
612 613 614 615 616 617 618 619
		     __func__, INPUT(input)->type);
		break;
	}

	/* save the selection */
	dev->video_input = input;

	return status;
620 621
}

622 623
int cx231xx_set_decoder_video_input(struct cx231xx *dev,
				u8 pin_type, u8 input)
624
{
625 626 627 628
	int status = 0;
	u32 value = 0;

	if (pin_type != dev->video_input) {
629
		status = cx231xx_afe_adjust_ref_count(dev, pin_type);
630
		if (status < 0) {
631
			cx231xx_errdev("%s: adjust_ref_count :Failed to set"
632
				"AFE input mux - errCode [%d]!\n",
633
				__func__, status);
634 635 636
			return status;
		}
	}
637

638 639
	/* call afe block to set video inputs */
	status = cx231xx_afe_set_input_mux(dev, input);
640
	if (status < 0) {
641
		cx231xx_errdev("%s: set_input_mux :Failed to set"
642
				" AFE input mux - errCode [%d]!\n",
643
				__func__, status);
644 645 646 647 648
		return status;
	}

	switch (pin_type) {
	case CX231XX_VMUX_COMPOSITE1:
649
		status = vid_blk_read_word(dev, AFE_CTRL, &value);
650 651 652
		value |= (0 << 13) | (1 << 4);
		value &= ~(1 << 5);

653 654 655 656
		/* set [24:23] [22:15] to 0  */
		value &= (~(0x1ff8000));
		/* set FUNC_MODE[24:23] = 2 IF_MOD[22:15] = 0  */
		value |= 0x1000000;
657
		status = vid_blk_write_word(dev, AFE_CTRL, value);
658

659
		status = vid_blk_read_word(dev, OUT_CTRL1, &value);
660
		value |= (1 << 7);
661
		status = vid_blk_write_word(dev, OUT_CTRL1, value);
662

663
		/* Set output mode */
664
		status = cx231xx_read_modify_write_i2c_dword(dev,
665
							VID_BLK_I2C_ADDRESS,
666 667
							OUT_CTRL1,
							FLD_OUT_MODE,
668
							dev->board.output_mode);
669 670 671 672

		/* Tell DIF object to go to baseband mode  */
		status = cx231xx_dif_set_standard(dev, DIF_USE_BASEBAND);
		if (status < 0) {
673 674
			cx231xx_errdev("%s: cx231xx_dif set to By pass"
						   " mode- errCode [%d]!\n",
675 676 677 678 679
				__func__, status);
			return status;
		}

		/* Read the DFE_CTRL1 register */
680
		status = vid_blk_read_word(dev, DFE_CTRL1, &value);
681 682 683 684 685 686 687 688

		/* enable the VBI_GATE_EN */
		value |= FLD_VBI_GATE_EN;

		/* Enable the auto-VGA enable */
		value |= FLD_VGA_AUTO_EN;

		/* Write it back */
689
		status = vid_blk_write_word(dev, DFE_CTRL1, value);
690 691 692

		/* Disable auto config of registers */
		status = cx231xx_read_modify_write_i2c_dword(dev,
693
					VID_BLK_I2C_ADDRESS,
694 695 696 697 698
					MODE_CTRL, FLD_ACFG_DIS,
					cx231xx_set_field(FLD_ACFG_DIS, 1));

		/* Set CVBS input mode */
		status = cx231xx_read_modify_write_i2c_dword(dev,
699
			VID_BLK_I2C_ADDRESS,
700 701 702 703 704 705
			MODE_CTRL, FLD_INPUT_MODE,
			cx231xx_set_field(FLD_INPUT_MODE, INPUT_MODE_CVBS_0));
		break;
	case CX231XX_VMUX_SVIDEO:
		/* Disable the use of  DIF */

706
		status = vid_blk_read_word(dev, AFE_CTRL, &value);
707

708 709 710 711 712
		/* set [24:23] [22:15] to 0 */
		value &= (~(0x1ff8000));
		/* set FUNC_MODE[24:23] = 2
		IF_MOD[22:15] = 0 DCR_BYP_CH2[4:4] = 1; */
		value |= 0x1000010;
713
		status = vid_blk_write_word(dev, AFE_CTRL, value);
714 715 716 717

		/* Tell DIF object to go to baseband mode */
		status = cx231xx_dif_set_standard(dev, DIF_USE_BASEBAND);
		if (status < 0) {
718 719
			cx231xx_errdev("%s: cx231xx_dif set to By pass"
						   " mode- errCode [%d]!\n",
720 721 722 723 724
				__func__, status);
			return status;
		}

		/* Read the DFE_CTRL1 register */
725
		status = vid_blk_read_word(dev, DFE_CTRL1, &value);
726 727 728 729 730 731 732 733

		/* enable the VBI_GATE_EN */
		value |= FLD_VBI_GATE_EN;

		/* Enable the auto-VGA enable */
		value |= FLD_VGA_AUTO_EN;

		/* Write it back */
734
		status = vid_blk_write_word(dev, DFE_CTRL1, value);
735 736 737

		/* Disable auto config of registers  */
		status =  cx231xx_read_modify_write_i2c_dword(dev,
738
					VID_BLK_I2C_ADDRESS,
739 740 741 742 743
					MODE_CTRL, FLD_ACFG_DIS,
					cx231xx_set_field(FLD_ACFG_DIS, 1));

		/* Set YC input mode */
		status = cx231xx_read_modify_write_i2c_dword(dev,
744
			VID_BLK_I2C_ADDRESS,
745 746 747 748 749
			MODE_CTRL,
			FLD_INPUT_MODE,
			cx231xx_set_field(FLD_INPUT_MODE, INPUT_MODE_YC_1));

		/* Chroma to ADC2 */
750
		status = vid_blk_read_word(dev, AFE_CTRL, &value);
751 752 753 754 755 756 757
		value |= FLD_CHROMA_IN_SEL;	/* set the chroma in select */

		/* Clear VGA_SEL_CH2 and VGA_SEL_CH3 (bits 7 and 8)
		   This sets them to use video
		   rather than audio.  Only one of the two will be in use. */
		value &= ~(FLD_VGA_SEL_CH2 | FLD_VGA_SEL_CH3);

758
		status = vid_blk_write_word(dev, AFE_CTRL, value);
759

760
		status = cx231xx_afe_set_mode(dev, AFE_MODE_BASEBAND);
761 762 763 764
		break;
	case CX231XX_VMUX_TELEVISION:
	case CX231XX_VMUX_CABLE:
	default:
765 766
		/* TODO: Test if this is also needed for xc2028/xc3028 */
		if (dev->board.tuner_type == TUNER_XC5000) {
767 768
			/* Disable the use of  DIF   */

769
			status = vid_blk_read_word(dev, AFE_CTRL, &value);
770 771 772
			value |= (0 << 13) | (1 << 4);
			value &= ~(1 << 5);

773 774 775 776
			/* set [24:23] [22:15] to 0 */
			value &= (~(0x1FF8000));
			/* set FUNC_MODE[24:23] = 2 IF_MOD[22:15] = 0 */
			value |= 0x1000000;
777 778 779
			status = vid_blk_write_word(dev, AFE_CTRL, value);

			status = vid_blk_read_word(dev, OUT_CTRL1, &value);
780
			value |= (1 << 7);
781
			status = vid_blk_write_word(dev, OUT_CTRL1, value);
782

783
			/* Set output mode */
784
			status = cx231xx_read_modify_write_i2c_dword(dev,
785
							VID_BLK_I2C_ADDRESS,
786
							OUT_CTRL1, FLD_OUT_MODE,
787
							dev->board.output_mode);
788

789 790 791
			/* Tell DIF object to go to baseband mode */
			status = cx231xx_dif_set_standard(dev,
							  DIF_USE_BASEBAND);
792
			if (status < 0) {
793 794 795
				cx231xx_errdev("%s: cx231xx_dif set to By pass"
						" mode- errCode [%d]!\n",
						__func__, status);
796 797 798 799
				return status;
			}

			/* Read the DFE_CTRL1 register */
800
			status = vid_blk_read_word(dev, DFE_CTRL1, &value);
801 802 803 804 805 806 807 808

			/* enable the VBI_GATE_EN */
			value |= FLD_VBI_GATE_EN;

			/* Enable the auto-VGA enable */
			value |= FLD_VGA_AUTO_EN;

			/* Write it back */
809
			status = vid_blk_write_word(dev, DFE_CTRL1, value);
810 811

			/* Disable auto config of registers */
812
			status = cx231xx_read_modify_write_i2c_dword(dev,
813
					VID_BLK_I2C_ADDRESS,
814 815
					MODE_CTRL, FLD_ACFG_DIS,
					cx231xx_set_field(FLD_ACFG_DIS, 1));
816 817

			/* Set CVBS input mode */
818
			status = cx231xx_read_modify_write_i2c_dword(dev,
819
				VID_BLK_I2C_ADDRESS,
820
				MODE_CTRL, FLD_INPUT_MODE,
821 822
				cx231xx_set_field(FLD_INPUT_MODE,
						INPUT_MODE_CVBS_0));
823
		} else {
824
			/* Enable the DIF for the tuner */
825

826 827
			/* Reinitialize the DIF */
			status = cx231xx_dif_set_standard(dev, dev->norm);
828
			if (status < 0) {
829 830 831
				cx231xx_errdev("%s: cx231xx_dif set to By pass"
						" mode- errCode [%d]!\n",
						__func__, status);
832 833 834
				return status;
			}

835
			/* Make sure bypass is cleared */
836
			status = vid_blk_read_word(dev, DIF_MISC_CTRL, &value);
837 838 839 840 841

			/* Clear the bypass bit */
			value &= ~FLD_DIF_DIF_BYPASS;

			/* Enable the use of the DIF block */
842
			status = vid_blk_write_word(dev, DIF_MISC_CTRL, value);
843

844
			/* Read the DFE_CTRL1 register */
845
			status = vid_blk_read_word(dev, DFE_CTRL1, &value);
846

847 848
			/* Disable the VBI_GATE_EN */
			value &= ~FLD_VBI_GATE_EN;
849

850 851 852
			/* Enable the auto-VGA enable, AGC, and
			   set the skip count to 2 */
			value |= FLD_VGA_AUTO_EN | FLD_AGC_AUTO_EN | 0x00200000;
853 854

			/* Write it back */
855
			status = vid_blk_write_word(dev, DFE_CTRL1, value);
856

857
			/* Wait until AGC locks up */
858
			msleep(1);
859

860 861
			/* Disable the auto-VGA enable AGC */
			value &= ~(FLD_VGA_AUTO_EN);
862

863
			/* Write it back */
864
			status = vid_blk_write_word(dev, DFE_CTRL1, value);
865

866
			/* Enable Polaris B0 AGC output */
867
			status = vid_blk_read_word(dev, PIN_CTRL, &value);
868 869 870
			value |= (FLD_OEF_AGC_RF) |
				 (FLD_OEF_AGC_IFVGA) |
				 (FLD_OEF_AGC_IF);
871
			status = vid_blk_write_word(dev, PIN_CTRL, value);
872

873
			/* Set output mode */
874
			status = cx231xx_read_modify_write_i2c_dword(dev,
875
						VID_BLK_I2C_ADDRESS,
876
						OUT_CTRL1, FLD_OUT_MODE,
877
						dev->board.output_mode);
878 879 880

			/* Disable auto config of registers */
			status = cx231xx_read_modify_write_i2c_dword(dev,
881
					VID_BLK_I2C_ADDRESS,
882 883 884 885 886
					MODE_CTRL, FLD_ACFG_DIS,
					cx231xx_set_field(FLD_ACFG_DIS, 1));

			/* Set CVBS input mode */
			status = cx231xx_read_modify_write_i2c_dword(dev,
887
				VID_BLK_I2C_ADDRESS,
888
				MODE_CTRL, FLD_INPUT_MODE,
889 890
				cx231xx_set_field(FLD_INPUT_MODE,
						INPUT_MODE_CVBS_0));
891

892 893
			/* Set some bits in AFE_CTRL so that channel 2 or 3
			 * is ready to receive audio */
894 895 896
			/* Clear clamp for channels 2 and 3      (bit 16-17) */
			/* Clear droop comp                      (bit 19-20) */
			/* Set VGA_SEL (for audio control)       (bit 7-8) */
897
			status = vid_blk_read_word(dev, AFE_CTRL, &value);
898

899 900 901 902
			/*Set Func mode:01-DIF 10-baseband 11-YUV*/
			value &= (~(FLD_FUNC_MODE));
			value |= 0x800000;

903 904
			value |= FLD_VGA_SEL_CH3 | FLD_VGA_SEL_CH2;

905
			status = vid_blk_write_word(dev, AFE_CTRL, value);
906 907 908 909 910 911 912 913

			if (dev->tuner_type == TUNER_NXP_TDA18271) {
				status = vid_blk_read_word(dev, PIN_CTRL,
				 &value);
				status = vid_blk_write_word(dev, PIN_CTRL,
				 (value & 0xFFFFFFEF));
			}

914
			break;
915 916 917 918 919 920

		}
		break;
	}

	/* Set raw VBI mode */
921
	status = cx231xx_read_modify_write_i2c_dword(dev,
922
				VID_BLK_I2C_ADDRESS,
923 924
				OUT_CTRL1, FLD_VBIHACTRAW_EN,
				cx231xx_set_field(FLD_VBIHACTRAW_EN, 1));
925

926
	status = vid_blk_read_word(dev, OUT_CTRL1, &value);
927 928
	if (value & 0x02) {
		value |= (1 << 19);
929
		status = vid_blk_write_word(dev, OUT_CTRL1, value);
930 931 932
	}

	return status;
933 934
}

935 936 937
void cx231xx_enable656(struct cx231xx *dev)
{
	u8 temp = 0;
938
	/*enable TS1 data[0:7] as output to export 656*/
939

940
	vid_blk_write_byte(dev, TS1_PIN_CTL0, 0xFF);
941

942
	/*enable TS1 clock as output to export 656*/
943

944
	vid_blk_read_byte(dev, TS1_PIN_CTL1, &temp);
945 946
	temp = temp|0x04;

947
	vid_blk_write_byte(dev, TS1_PIN_CTL1, temp);
948 949 950 951 952 953 954
}
EXPORT_SYMBOL_GPL(cx231xx_enable656);

void cx231xx_disable656(struct cx231xx *dev)
{
	u8 temp = 0;

955
	vid_blk_write_byte(dev, TS1_PIN_CTL0, 0x00);
956

957
	vid_blk_read_byte(dev, TS1_PIN_CTL1, &temp);
958 959
	temp = temp&0xFB;

960
	vid_blk_write_byte(dev, TS1_PIN_CTL1, temp);
961 962 963
}
EXPORT_SYMBOL_GPL(cx231xx_disable656);

964
/*
965 966 967
 * Handle any video-mode specific overrides that are different
 * on a per video standards basis after touching the MODE_CTRL
 * register which resets many values for autodetect
968 969 970
 */
int cx231xx_do_mode_ctrl_overrides(struct cx231xx *dev)
{
971 972 973 974 975 976
	int status = 0;

	cx231xx_info("do_mode_ctrl_overrides : 0x%x\n",
		     (unsigned int)dev->norm);

	/* Change the DFE_CTRL3 bp_percent to fix flagging */
977
	status = vid_blk_write_word(dev, DFE_CTRL3, 0xCD3F0280);
978

979
	if (dev->norm & (V4L2_STD_NTSC | V4L2_STD_PAL_M)) {
980 981
		cx231xx_info("do_mode_ctrl_overrides NTSC\n");

982 983 984
		/* Move the close caption lines out of active video,
		   adjust the active video start point */
		status = cx231xx_read_modify_write_i2c_dword(dev,
985
							VID_BLK_I2C_ADDRESS,
986 987
							VERT_TIM_CTRL,
							FLD_VBLANK_CNT, 0x18);
988
		status = cx231xx_read_modify_write_i2c_dword(dev,
989
							VID_BLK_I2C_ADDRESS,
990 991
							VERT_TIM_CTRL,
							FLD_VACTIVE_CNT,
992
							0x1E7000);
993
		status = cx231xx_read_modify_write_i2c_dword(dev,
994
							VID_BLK_I2C_ADDRESS,
995 996
							VERT_TIM_CTRL,
							FLD_V656BLANK_CNT,
997
							0x1C000000);
998

999
		status = cx231xx_read_modify_write_i2c_dword(dev,
1000
							VID_BLK_I2C_ADDRESS,
1001 1002 1003 1004
							HORIZ_TIM_CTRL,
							FLD_HBLANK_CNT,
							cx231xx_set_field
							(FLD_HBLANK_CNT, 0x79));
1005

1006 1007 1008
	} else if (dev->norm & V4L2_STD_SECAM) {
		cx231xx_info("do_mode_ctrl_overrides SECAM\n");
		status =  cx231xx_read_modify_write_i2c_dword(dev,
1009
							VID_BLK_I2C_ADDRESS,
1010
							VERT_TIM_CTRL,
1011
							FLD_VBLANK_CNT, 0x20);
1012 1013 1014 1015 1016 1017
		status = cx231xx_read_modify_write_i2c_dword(dev,
							VID_BLK_I2C_ADDRESS,
							VERT_TIM_CTRL,
							FLD_VACTIVE_CNT,
							cx231xx_set_field
							(FLD_VACTIVE_CNT,
1018
							 0x244));
1019 1020 1021 1022 1023 1024
		status = cx231xx_read_modify_write_i2c_dword(dev,
							VID_BLK_I2C_ADDRESS,
							VERT_TIM_CTRL,
							FLD_V656BLANK_CNT,
							cx231xx_set_field
							(FLD_V656BLANK_CNT,
1025
							0x24));
1026
		/* Adjust the active video horizontal start point */
1027
		status = cx231xx_read_modify_write_i2c_dword(dev,
1028
							VID_BLK_I2C_ADDRESS,
1029 1030 1031 1032
							HORIZ_TIM_CTRL,
							FLD_HBLANK_CNT,
							cx231xx_set_field
							(FLD_HBLANK_CNT, 0x85));
1033 1034 1035
	} else {
		cx231xx_info("do_mode_ctrl_overrides PAL\n");
		status = cx231xx_read_modify_write_i2c_dword(dev,
1036
							VID_BLK_I2C_ADDRESS,
1037
							VERT_TIM_CTRL,
1038
							FLD_VBLANK_CNT, 0x20);
1039 1040 1041 1042 1043 1044
		status = cx231xx_read_modify_write_i2c_dword(dev,
							VID_BLK_I2C_ADDRESS,
							VERT_TIM_CTRL,
							FLD_VACTIVE_CNT,
							cx231xx_set_field
							(FLD_VACTIVE_CNT,
1045
							 0x244));
1046 1047 1048 1049 1050 1051
		status = cx231xx_read_modify_write_i2c_dword(dev,
							VID_BLK_I2C_ADDRESS,
							VERT_TIM_CTRL,
							FLD_V656BLANK_CNT,
							cx231xx_set_field
							(FLD_V656BLANK_CNT,
1052
							0x24));
1053
		/* Adjust the active video horizontal start point */
1054
		status = cx231xx_read_modify_write_i2c_dword(dev,
1055
							VID_BLK_I2C_ADDRESS,
1056 1057 1058 1059
							HORIZ_TIM_CTRL,
							FLD_HBLANK_CNT,
							cx231xx_set_field
							(FLD_HBLANK_CNT, 0x85));
1060

1061 1062 1063
	}

	return status;
1064 1065
}

1066 1067 1068 1069 1070 1071
int cx231xx_unmute_audio(struct cx231xx *dev)
{
	return vid_blk_write_byte(dev, PATH1_VOL_CTL, 0x24);
}
EXPORT_SYMBOL_GPL(cx231xx_unmute_audio);

1072
static int stopAudioFirmware(struct cx231xx *dev)
1073 1074 1075 1076
{
	return vid_blk_write_byte(dev, DL_CTL_CONTROL, 0x03);
}

1077
static int restartAudioFirmware(struct cx231xx *dev)
1078 1079 1080 1081
{
	return vid_blk_write_byte(dev, DL_CTL_CONTROL, 0x13);
}

1082 1083
int cx231xx_set_audio_input(struct cx231xx *dev, u8 input)
{
1084 1085 1086 1087 1088 1089 1090 1091
	int status = 0;
	enum AUDIO_INPUT ainput = AUDIO_INPUT_LINE;

	switch (INPUT(input)->amux) {
	case CX231XX_AMUX_VIDEO:
		ainput = AUDIO_INPUT_TUNER_TV;
		break;
	case CX231XX_AMUX_LINE_IN:
1092
		status = cx231xx_i2s_blk_set_audio_input(dev, input);
1093 1094 1095 1096 1097 1098 1099 1100 1101
		ainput = AUDIO_INPUT_LINE;
		break;
	default:
		break;
	}

	status = cx231xx_set_audio_decoder_input(dev, ainput);

	return status;
1102 1103
}

1104 1105
int cx231xx_set_audio_decoder_input(struct cx231xx *dev,
				    enum AUDIO_INPUT audio_input)
1106
{
1107 1108
	u32 dwval;
	int status;
1109
	u8 gen_ctrl;
1110 1111 1112
	u32 value = 0;

	/* Put it in soft reset   */
1113
	status = vid_blk_read_byte(dev, GENERAL_CTL, &gen_ctrl);
1114
	gen_ctrl |= 1;
1115
	status = vid_blk_write_byte(dev, GENERAL_CTL, gen_ctrl);
1116 1117 1118 1119

	switch (audio_input) {
	case AUDIO_INPUT_LINE:
		/* setup AUD_IO control from Merlin paralle output */
1120 1121
		value = cx231xx_set_field(FLD_AUD_CHAN1_SRC,
					  AUD_CHAN_SRC_PARALLEL);
1122
		status = vid_blk_write_word(dev, AUD_IO_CTRL, value);
1123 1124 1125 1126

		/* setup input to Merlin, SRC2 connect to AC97
		   bypass upsample-by-2, slave mode, sony mode, left justify
		   adr 091c, dat 01000000 */
1127
		status = vid_blk_read_word(dev, AC97_CTL, &dwval);
1128

1129 1130
		status = vid_blk_write_word(dev, AC97_CTL,
					   (dwval | FLD_AC97_UP2X_BYPASS));
1131 1132

		/* select the parallel1 and SRC3 */
1133
		status = vid_blk_write_word(dev, BAND_OUT_SEL,
1134 1135
				cx231xx_set_field(FLD_SRC3_IN_SEL, 0x0) |
				cx231xx_set_field(FLD_SRC3_CLK_SEL, 0x0) |
1136
				cx231xx_set_field(FLD_PARALLEL1_SRC_SEL, 0x0));
1137 1138 1139

		/* unmute all, AC97 in, independence mode
		   adr 08d0, data 0x00063073 */
1140
		status = vid_blk_write_word(dev, DL_CTL, 0x3000001);
1141
		status = vid_blk_write_word(dev, PATH1_CTL1, 0x00063073);
1142 1143

		/* set AVC maximum threshold, adr 08d4, dat ffff0024 */
1144 1145 1146
		status = vid_blk_read_word(dev, PATH1_VOL_CTL, &dwval);
		status = vid_blk_write_word(dev, PATH1_VOL_CTL,
					   (dwval | FLD_PATH1_AVC_THRESHOLD));
1147 1148

		/* set SC maximum threshold, adr 08ec, dat ffffb3a3 */
1149 1150 1151
		status = vid_blk_read_word(dev, PATH1_SC_CTL, &dwval);
		status = vid_blk_write_word(dev, PATH1_SC_CTL,
					   (dwval | FLD_PATH1_SC_THRESHOLD));
1152 1153 1154 1155
		break;

	case AUDIO_INPUT_TUNER_TV:
	default:
1156
		status = stopAudioFirmware(dev);
1157
		/* Setup SRC sources and clocks */
1158
		status = vid_blk_write_word(dev, BAND_OUT_SEL,
1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170
			cx231xx_set_field(FLD_SRC6_IN_SEL, 0x00)         |
			cx231xx_set_field(FLD_SRC6_CLK_SEL, 0x01)        |
			cx231xx_set_field(FLD_SRC5_IN_SEL, 0x00)         |
			cx231xx_set_field(FLD_SRC5_CLK_SEL, 0x02)        |
			cx231xx_set_field(FLD_SRC4_IN_SEL, 0x02)         |
			cx231xx_set_field(FLD_SRC4_CLK_SEL, 0x03)        |
			cx231xx_set_field(FLD_SRC3_IN_SEL, 0x00)         |
			cx231xx_set_field(FLD_SRC3_CLK_SEL, 0x00)        |
			cx231xx_set_field(FLD_BASEBAND_BYPASS_CTL, 0x00) |
			cx231xx_set_field(FLD_AC97_SRC_SEL, 0x03)        |
			cx231xx_set_field(FLD_I2S_SRC_SEL, 0x00)         |
			cx231xx_set_field(FLD_PARALLEL2_SRC_SEL, 0x02)   |
1171
			cx231xx_set_field(FLD_PARALLEL1_SRC_SEL, 0x01));
1172 1173

		/* Setup the AUD_IO control */
1174
		status = vid_blk_write_word(dev, AUD_IO_CTRL,
1175 1176 1177 1178
			cx231xx_set_field(FLD_I2S_PORT_DIR, 0x00)  |
			cx231xx_set_field(FLD_I2S_OUT_SRC, 0x00)   |
			cx231xx_set_field(FLD_AUD_CHAN3_SRC, 0x00) |
			cx231xx_set_field(FLD_AUD_CHAN2_SRC, 0x00) |
1179
			cx231xx_set_field(FLD_AUD_CHAN1_SRC, 0x03));
1180

1181
		status = vid_blk_write_word(dev, PATH1_CTL1, 0x1F063870);
1182 1183

		/* setAudioStandard(_audio_standard); */
1184
		status = vid_blk_write_word(dev, PATH1_CTL1, 0x00063870);
1185 1186 1187

		status = restartAudioFirmware(dev);

1188 1189 1190
		switch (dev->board.tuner_type) {
		case TUNER_XC5000:
			/* SIF passthrough at 28.6363 MHz sample rate */
1191
			status = cx231xx_read_modify_write_i2c_dword(dev,
1192
					VID_BLK_I2C_ADDRESS,
1193 1194 1195
					CHIP_CTRL,
					FLD_SIF_EN,
					cx231xx_set_field(FLD_SIF_EN, 1));
1196
			break;
1197 1198
		case TUNER_NXP_TDA18271:
			/* Normal mode: SIF passthrough at 14.32 MHz */
1199 1200 1201 1202 1203 1204
			status = cx231xx_read_modify_write_i2c_dword(dev,
					VID_BLK_I2C_ADDRESS,
					CHIP_CTRL,
					FLD_SIF_EN,
					cx231xx_set_field(FLD_SIF_EN, 0));
			break;
1205
		default:
1206 1207 1208 1209
			/* This is just a casual suggestion to people adding
			   new boards in case they use a tuner type we don't
			   currently know about */
			printk(KERN_INFO "Unknown tuner type configuring SIF");
1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221
			break;
		}
		break;

	case AUDIO_INPUT_TUNER_FM:
		/*  use SIF for FM radio
		   setupFM();
		   setAudioStandard(_audio_standard);
		 */
		break;

	case AUDIO_INPUT_MUTE:
1222
		status = vid_blk_write_word(dev, PATH1_CTL1, 0x1F011012);
1223 1224
		break;
	}
1225

1226
	/* Take it out of soft reset */
1227
	status = vid_blk_read_byte(dev, GENERAL_CTL, &gen_ctrl);
1228
	gen_ctrl &= ~1;
1229
	status = vid_blk_write_byte(dev, GENERAL_CTL, gen_ctrl);
1230

1231 1232
	return status;
}
1233

1234 1235 1236
/******************************************************************************
 *                    C H I P Specific  C O N T R O L   functions             *
 ******************************************************************************/
1237 1238
int cx231xx_init_ctrl_pin_status(struct cx231xx *dev)
{
1239 1240
	u32 value;
	int status = 0;
1241

1242
	status = vid_blk_read_word(dev, PIN_CTRL, &value);
1243
	value |= (~dev->board.ctl_pin_status_mask);
1244
	status = vid_blk_write_word(dev, PIN_CTRL, value);
1245

1246
	return status;
1247 1248
}

1249 1250
int cx231xx_set_agc_analog_digital_mux_select(struct cx231xx *dev,
					      u8 analog_or_digital)
1251
{
1252
	int status = 0;
1253

1254
	/* first set the direction to output */
1255 1256 1257
	status = cx231xx_set_gpio_direction(dev,
					    dev->board.
					    agc_analog_digital_select_gpio, 1);
1258

1259
	/* 0 - demod ; 1 - Analog mode */
1260
	status = cx231xx_set_gpio_value(dev,
1261 1262
				   dev->board.agc_analog_digital_select_gpio,
				   analog_or_digital);
1263

1264
	return status;
1265 1266
}

1267
int cx231xx_enable_i2c_port_3(struct cx231xx *dev, bool is_port_3)
1268
{
1269 1270
	u8 value[4] = { 0, 0, 0, 0 };
	int status = 0;
1271
	bool current_is_port_3;
1272

1273 1274
	if (dev->board.dont_use_port_3)
		is_port_3 = false;
1275 1276
	status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER,
				       PWR_CTL_EN, value, 4);
1277 1278
	if (status < 0)
		return status;
1279

1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295
	current_is_port_3 = value[0] & I2C_DEMOD_EN ? true : false;

	/* Just return, if already using the right port */
	if (current_is_port_3 == is_port_3)
		return 0;

	if (is_port_3)
		value[0] |= I2C_DEMOD_EN;
	else
		value[0] &= ~I2C_DEMOD_EN;

	cx231xx_info("Changing the i2c master port to %d\n",
		     is_port_3 ?  3 : 1);

	status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
					PWR_CTL_EN, value, 4);
1296

1297
	return status;
1298

1299
}
1300 1301
EXPORT_SYMBOL_GPL(cx231xx_enable_i2c_port_3);

1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323
void update_HH_register_after_set_DIF(struct cx231xx *dev)
{
/*
	u8 status = 0;
	u32 value = 0;

	vid_blk_write_word(dev, PIN_CTRL, 0xA0FFF82F);
	vid_blk_write_word(dev, DIF_MISC_CTRL, 0x0A203F11);
	vid_blk_write_word(dev, DIF_SRC_PHASE_INC, 0x1BEFBF06);

	status = vid_blk_read_word(dev, AFE_CTRL_C2HH_SRC_CTRL, &value);
	vid_blk_write_word(dev, AFE_CTRL_C2HH_SRC_CTRL, 0x4485D390);
	status = vid_blk_read_word(dev, AFE_CTRL_C2HH_SRC_CTRL,  &value);
*/
}

void cx231xx_dump_HH_reg(struct cx231xx *dev)
{
	u32 value = 0;
	u16  i = 0;

	value = 0x45005390;
1324
	vid_blk_write_word(dev, 0x104, value);
1325 1326

	for (i = 0x100; i < 0x140; i++) {
1327
		vid_blk_read_word(dev, i, &value);
1328 1329 1330 1331 1332
		cx231xx_info("reg0x%x=0x%x\n", i, value);
		i = i+3;
	}

	for (i = 0x300; i < 0x400; i++) {
1333
		vid_blk_read_word(dev, i, &value);
1334 1335 1336 1337 1338
		cx231xx_info("reg0x%x=0x%x\n", i, value);
		i = i+3;
	}

	for (i = 0x400; i < 0x440; i++) {
1339
		vid_blk_read_word(dev, i,  &value);
1340 1341 1342 1343
		cx231xx_info("reg0x%x=0x%x\n", i, value);
		i = i+3;
	}

1344
	vid_blk_read_word(dev, AFE_CTRL_C2HH_SRC_CTRL, &value);
1345 1346
	cx231xx_info("AFE_CTRL_C2HH_SRC_CTRL=0x%x\n", value);
	vid_blk_write_word(dev, AFE_CTRL_C2HH_SRC_CTRL, 0x4485D390);
1347
	vid_blk_read_word(dev, AFE_CTRL_C2HH_SRC_CTRL, &value);
1348
	cx231xx_info("AFE_CTRL_C2HH_SRC_CTRL=0x%x\n", value);
1349
}
1350

1351 1352 1353
void cx231xx_dump_SC_reg(struct cx231xx *dev)
{
	u8 value[4] = { 0, 0, 0, 0 };
1354
	cx231xx_info("cx231xx_dump_SC_reg!\n");
1355

1356
	cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, BOARD_CFG_STAT,
1357 1358 1359
				 value, 4);
	cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", BOARD_CFG_STAT, value[0],
				 value[1], value[2], value[3]);
1360
	cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, TS_MODE_REG,
1361 1362 1363
				 value, 4);
	cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", TS_MODE_REG, value[0],
				 value[1], value[2], value[3]);
1364
	cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, TS1_CFG_REG,
1365 1366 1367
				 value, 4);
	cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", TS1_CFG_REG, value[0],
				 value[1], value[2], value[3]);
1368
	cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, TS1_LENGTH_REG,
1369 1370 1371 1372
				 value, 4);
	cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", TS1_LENGTH_REG, value[0],
				 value[1], value[2], value[3]);

1373
	cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, TS2_CFG_REG,
1374 1375 1376
				 value, 4);
	cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", TS2_CFG_REG, value[0],
				 value[1], value[2], value[3]);
1377
	cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, TS2_LENGTH_REG,
1378 1379 1380
				 value, 4);
	cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", TS2_LENGTH_REG, value[0],
				 value[1], value[2], value[3]);
1381
	cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, EP_MODE_SET,
1382 1383 1384
				 value, 4);
	cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", EP_MODE_SET, value[0],
				 value[1], value[2], value[3]);
1385
	cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_PWR_PTN1,
1386 1387 1388 1389
				 value, 4);
	cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_PWR_PTN1, value[0],
				 value[1], value[2], value[3]);

1390
	cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_PWR_PTN2,
1391 1392 1393
				 value, 4);
	cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_PWR_PTN2, value[0],
				 value[1], value[2], value[3]);
1394
	cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_PWR_PTN3,
1395 1396 1397
				 value, 4);
	cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_PWR_PTN3, value[0],
				 value[1], value[2], value[3]);
1398
	cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_PWR_MASK0,
1399 1400 1401
				 value, 4);
	cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_PWR_MASK0, value[0],
				 value[1], value[2], value[3]);
1402
	cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_PWR_MASK1,
1403 1404 1405 1406
				 value, 4);
	cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_PWR_MASK1, value[0],
				 value[1], value[2], value[3]);

1407
	cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_PWR_MASK2,
1408 1409 1410
				 value, 4);
	cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_PWR_MASK2, value[0],
				 value[1], value[2], value[3]);
1411
	cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_GAIN,
1412 1413 1414
				 value, 4);
	cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_GAIN, value[0],
				 value[1], value[2], value[3]);
1415
	cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_CAR_REG,
1416 1417 1418
				 value, 4);
	cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_CAR_REG, value[0],
				 value[1], value[2], value[3]);
1419
	cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_OT_CFG1,
1420 1421 1422 1423
				 value, 4);
	cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_OT_CFG1, value[0],
				 value[1], value[2], value[3]);

1424
	cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, CIR_OT_CFG2,
1425 1426 1427
				 value, 4);
	cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", CIR_OT_CFG2, value[0],
				 value[1], value[2], value[3]);
1428
	cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN,
1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440
				 value, 4);
	cx231xx_info("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", PWR_CTL_EN, value[0],
				 value[1], value[2], value[3]);


}

void cx231xx_Setup_AFE_for_LowIF(struct cx231xx *dev)

{
	u8 value = 0;

1441
	afe_read_byte(dev, ADC_STATUS2_CH3, &value);
1442
	value = (value & 0xFE)|0x01;
1443
	afe_write_byte(dev, ADC_STATUS2_CH3, value);
1444

1445
	afe_read_byte(dev, ADC_STATUS2_CH3, &value);
1446
	value = (value & 0xFE)|0x00;
1447
	afe_write_byte(dev, ADC_STATUS2_CH3, value);
1448 1449 1450


/*
1451
	config colibri to lo-if mode
1452

1453 1454
	FIXME: ntf_mode = 2'b00 by default. But set 0x1 would reduce
		the diff IF input by half,
1455

1456
		for low-if agc defect
1457 1458
*/

1459
	afe_read_byte(dev, ADC_NTF_PRECLMP_EN_CH3, &value);
1460
	value = (value & 0xFC)|0x00;
1461
	afe_write_byte(dev, ADC_NTF_PRECLMP_EN_CH3, value);
1462

1463
	afe_read_byte(dev, ADC_INPUT_CH3, &value);
1464
	value = (value & 0xF9)|0x02;
1465
	afe_write_byte(dev, ADC_INPUT_CH3, value);
1466

1467
	afe_read_byte(dev, ADC_FB_FRCRST_CH3, &value);
1468
	value = (value & 0xFB)|0x04;
1469
	afe_write_byte(dev, ADC_FB_FRCRST_CH3, value);
1470

1471
	afe_read_byte(dev, ADC_DCSERVO_DEM_CH3, &value);
1472
	value = (value & 0xFC)|0x03;
1473
	afe_write_byte(dev, ADC_DCSERVO_DEM_CH3, value);
1474

1475
	afe_read_byte(dev, ADC_CTRL_DAC1_CH3, &value);
1476
	value = (value & 0xFB)|0x04;
1477
	afe_write_byte(dev, ADC_CTRL_DAC1_CH3, value);
1478

1479
	afe_read_byte(dev, ADC_CTRL_DAC23_CH3, &value);
1480
	value = (value & 0xF8)|0x06;
1481
	afe_write_byte(dev, ADC_CTRL_DAC23_CH3, value);
1482

1483
	afe_read_byte(dev, ADC_CTRL_DAC23_CH3, &value);
1484
	value = (value & 0x8F)|0x40;
1485
	afe_write_byte(dev, ADC_CTRL_DAC23_CH3, value);
1486

1487
	afe_read_byte(dev, ADC_PWRDN_CLAMP_CH3, &value);
1488
	value = (value & 0xDF)|0x20;
1489
	afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3, value);
1490 1491 1492 1493 1494
}

void cx231xx_set_Colibri_For_LowIF(struct cx231xx *dev, u32 if_freq,
		 u8 spectral_invert, u32 mode)
{
1495 1496 1497
	u32 colibri_carrier_offset = 0;
	u32 func_mode = 0x01; /* Device has a DIF if this function is called */
	u32 standard = 0;
1498 1499 1500
	u8 value[4] = { 0, 0, 0, 0 };

	cx231xx_info("Enter cx231xx_set_Colibri_For_LowIF()\n");
1501 1502 1503 1504
	value[0] = (u8) 0x6F;
	value[1] = (u8) 0x6F;
	value[2] = (u8) 0x6F;
	value[3] = (u8) 0x6F;
1505
	cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1506
					PWR_CTL_EN, value, 4);
1507 1508

	/*Set colibri for low IF*/
1509
	cx231xx_afe_set_mode(dev, AFE_MODE_LOW_IF);
1510 1511 1512

	/* Set C2HH for low IF operation.*/
	standard = dev->norm;
1513
	cx231xx_dif_configure_C2HH_for_low_IF(dev, dev->active_mode,
1514
						       func_mode, standard);
1515 1516 1517

	/* Get colibri offsets.*/
	colibri_carrier_offset = cx231xx_Get_Colibri_CarrierOffset(mode,
1518
								   standard);
1519 1520

	cx231xx_info("colibri_carrier_offset=%d, standard=0x%x\n",
1521
		     colibri_carrier_offset, standard);
1522 1523

	/* Set the band Pass filter for DIF*/
1524 1525
	cx231xx_set_DIF_bandpass(dev, (if_freq+colibri_carrier_offset),
				 spectral_invert, mode);
1526 1527 1528 1529
}

u32 cx231xx_Get_Colibri_CarrierOffset(u32 mode, u32 standerd)
{
1530
	u32 colibri_carrier_offset = 0;
1531

1532
	if (mode == TUNER_MODE_FM_RADIO) {
1533
		colibri_carrier_offset = 1100000;
1534
	} else if (standerd & (V4L2_STD_MN | V4L2_STD_NTSC_M_JP)) {
1535 1536 1537 1538 1539 1540 1541 1542
		colibri_carrier_offset = 4832000;  /*4.83MHz	*/
	} else if (standerd & (V4L2_STD_PAL_B | V4L2_STD_PAL_G)) {
		colibri_carrier_offset = 2700000;  /*2.70MHz       */
	} else if (standerd & (V4L2_STD_PAL_D | V4L2_STD_PAL_I
			| V4L2_STD_SECAM)) {
		colibri_carrier_offset = 2100000;  /*2.10MHz	*/
	}

1543
	return colibri_carrier_offset;
1544 1545 1546 1547 1548
}

void cx231xx_set_DIF_bandpass(struct cx231xx *dev, u32 if_freq,
		 u8 spectral_invert, u32 mode)
{
1549 1550 1551 1552
	unsigned long pll_freq_word;
	u32 dif_misc_ctrl_value = 0;
	u64 pll_freq_u64 = 0;
	u32 i = 0;
1553 1554 1555 1556 1557

	cx231xx_info("if_freq=%d;spectral_invert=0x%x;mode=0x%x\n",
			 if_freq, spectral_invert, mode);


1558 1559
	if (mode == TUNER_MODE_FM_RADIO) {
		pll_freq_word = 0x905A1CAC;
1560
		vid_blk_write_word(dev, DIF_PLL_FREQ_WORD,  pll_freq_word);
1561

1562 1563 1564 1565 1566 1567 1568
	} else /*KSPROPERTY_TUNER_MODE_TV*/{
		/* Calculate the PLL frequency word based on the adjusted if_freq*/
		pll_freq_word = if_freq;
		pll_freq_u64 = (u64)pll_freq_word << 28L;
		do_div(pll_freq_u64, 50000000);
		pll_freq_word = (u32)pll_freq_u64;
		/*pll_freq_word = 0x3463497;*/
1569
		vid_blk_write_word(dev, DIF_PLL_FREQ_WORD,  pll_freq_word);
1570

1571 1572 1573
	if (spectral_invert) {
		if_freq -= 400000;
		/* Enable Spectral Invert*/
1574
		vid_blk_read_word(dev, DIF_MISC_CTRL,
1575 1576
					&dif_misc_ctrl_value);
		dif_misc_ctrl_value = dif_misc_ctrl_value | 0x00200000;
1577
		vid_blk_write_word(dev, DIF_MISC_CTRL,
1578 1579 1580 1581
					dif_misc_ctrl_value);
	} else {
		if_freq += 400000;
		/* Disable Spectral Invert*/
1582
		vid_blk_read_word(dev, DIF_MISC_CTRL,
1583 1584
					&dif_misc_ctrl_value);
		dif_misc_ctrl_value = dif_misc_ctrl_value & 0xFFDFFFFF;
1585
		vid_blk_write_word(dev, DIF_MISC_CTRL,
1586 1587 1588 1589
					dif_misc_ctrl_value);
	}

	if_freq = (if_freq/100000)*100000;
1590

1591 1592
	if (if_freq < 3000000)
		if_freq = 3000000;
1593

1594 1595
	if (if_freq > 16000000)
		if_freq = 16000000;
1596 1597
	}

1598
	cx231xx_info("Enter IF=%zd\n",
1599 1600
			ARRAY_SIZE(Dif_set_array));
	for (i = 0; i < ARRAY_SIZE(Dif_set_array); i++) {
1601
		if (Dif_set_array[i].if_freq == if_freq) {
1602
			vid_blk_write_word(dev,
1603 1604 1605
			Dif_set_array[i].register_address, Dif_set_array[i].value);
		}
	}
1606 1607
}

1608 1609 1610
/******************************************************************************
 *                 D I F - B L O C K    C O N T R O L   functions             *
 ******************************************************************************/
1611
int cx231xx_dif_configure_C2HH_for_low_IF(struct cx231xx *dev, u32 mode,
1612
					  u32 function_mode, u32 standard)
1613
{
1614 1615
	int status = 0;

1616

1617 1618
	if (mode == V4L2_TUNER_RADIO) {
		/* C2HH */
1619 1620
		/* lo if big signal */
		status = cx231xx_reg_mask_write(dev,
1621
				VID_BLK_I2C_ADDRESS, 32,
1622 1623 1624
				AFE_CTRL_C2HH_SRC_CTRL, 30, 31, 0x1);
		/* FUNC_MODE = DIF */
		status = cx231xx_reg_mask_write(dev,
1625
				VID_BLK_I2C_ADDRESS, 32,
1626 1627 1628
				AFE_CTRL_C2HH_SRC_CTRL, 23, 24, function_mode);
		/* IF_MODE */
		status = cx231xx_reg_mask_write(dev,
1629
				VID_BLK_I2C_ADDRESS, 32,
1630 1631 1632
				AFE_CTRL_C2HH_SRC_CTRL, 15, 22, 0xFF);
		/* no inv */
		status = cx231xx_reg_mask_write(dev,
1633
				VID_BLK_I2C_ADDRESS, 32,
1634
				AFE_CTRL_C2HH_SRC_CTRL, 9, 9, 0x1);
1635 1636
	} else if (standard != DIF_USE_BASEBAND) {
		if (standard & V4L2_STD_MN) {
1637
			/* lo if big signal */
1638
			status = cx231xx_reg_mask_write(dev,
1639
					VID_BLK_I2C_ADDRESS, 32,
1640 1641
					AFE_CTRL_C2HH_SRC_CTRL, 30, 31, 0x1);
			/* FUNC_MODE = DIF */
1642
			status = cx231xx_reg_mask_write(dev,
1643
					VID_BLK_I2C_ADDRESS, 32,
1644
					AFE_CTRL_C2HH_SRC_CTRL, 23, 24,
1645 1646
					function_mode);
			/* IF_MODE */
1647
			status = cx231xx_reg_mask_write(dev,
1648
					VID_BLK_I2C_ADDRESS, 32,
1649 1650
					AFE_CTRL_C2HH_SRC_CTRL, 15, 22, 0xb);
			/* no inv */
1651
			status = cx231xx_reg_mask_write(dev,
1652
					VID_BLK_I2C_ADDRESS, 32,
1653 1654
					AFE_CTRL_C2HH_SRC_CTRL, 9, 9, 0x1);
			/* 0x124, AUD_CHAN1_SRC = 0x3 */
1655
			status = cx231xx_reg_mask_write(dev,
1656
					VID_BLK_I2C_ADDRESS, 32,
1657
					AUD_IO_CTRL, 0, 31, 0x00000003);
1658
		} else if ((standard == V4L2_STD_PAL_I) |
1659
			(standard & V4L2_STD_PAL_D) |
1660
			(standard & V4L2_STD_SECAM)) {
1661
			/* C2HH setup */
1662
			/* lo if big signal */
1663
			status = cx231xx_reg_mask_write(dev,
1664
					VID_BLK_I2C_ADDRESS, 32,
1665 1666
					AFE_CTRL_C2HH_SRC_CTRL, 30, 31, 0x1);
			/* FUNC_MODE = DIF */
1667
			status = cx231xx_reg_mask_write(dev,
1668
					VID_BLK_I2C_ADDRESS, 32,
1669
					AFE_CTRL_C2HH_SRC_CTRL, 23, 24,
1670 1671
					function_mode);
			/* IF_MODE */
1672
			status = cx231xx_reg_mask_write(dev,
1673
					VID_BLK_I2C_ADDRESS, 32,
1674
					AFE_CTRL_C2HH_SRC_CTRL, 15, 22, 0xF);
1675
			/* no inv */
1676
			status = cx231xx_reg_mask_write(dev,
1677
					VID_BLK_I2C_ADDRESS, 32,
1678
					AFE_CTRL_C2HH_SRC_CTRL, 9, 9, 0x1);
1679 1680
		} else {
			/* default PAL BG */
1681
			/* C2HH setup */
1682
			/* lo if big signal */
1683
			status = cx231xx_reg_mask_write(dev,
1684
					VID_BLK_I2C_ADDRESS, 32,
1685 1686
					AFE_CTRL_C2HH_SRC_CTRL, 30, 31, 0x1);
			/* FUNC_MODE = DIF */
1687
			status = cx231xx_reg_mask_write(dev,
1688
					VID_BLK_I2C_ADDRESS, 32,
1689
					AFE_CTRL_C2HH_SRC_CTRL, 23, 24,
1690 1691
					function_mode);
			/* IF_MODE */
1692
			status = cx231xx_reg_mask_write(dev,
1693
					VID_BLK_I2C_ADDRESS, 32,
1694
					AFE_CTRL_C2HH_SRC_CTRL, 15, 22, 0xE);
1695
			/* no inv */
1696
			status = cx231xx_reg_mask_write(dev,
1697
					VID_BLK_I2C_ADDRESS, 32,
1698
					AFE_CTRL_C2HH_SRC_CTRL, 9, 9, 0x1);
1699 1700 1701 1702
		}
	}

	return status;
1703 1704 1705 1706
}

int cx231xx_dif_set_standard(struct cx231xx *dev, u32 standard)
{
1707 1708 1709 1710 1711 1712
	int status = 0;
	u32 dif_misc_ctrl_value = 0;
	u32 func_mode = 0;

	cx231xx_info("%s: setStandard to %x\n", __func__, standard);

1713
	status = vid_blk_read_word(dev, DIF_MISC_CTRL, &dif_misc_ctrl_value);
1714 1715 1716 1717
	if (standard != DIF_USE_BASEBAND)
		dev->norm = standard;

	switch (dev->model) {
1718
	case CX231XX_BOARD_CNXT_CARRAERA:
1719
	case CX231XX_BOARD_CNXT_RDE_250:
1720
	case CX231XX_BOARD_CNXT_SHELBY:
1721
	case CX231XX_BOARD_CNXT_RDU_250:
1722
	case CX231XX_BOARD_CNXT_VIDEO_GRABBER:
1723
	case CX231XX_BOARD_HAUPPAUGE_EXETER:
1724
	case CX231XX_BOARD_OTG102:
1725 1726
		func_mode = 0x03;
		break;
1727 1728
	case CX231XX_BOARD_CNXT_RDE_253S:
	case CX231XX_BOARD_CNXT_RDU_253S:
1729 1730
	case CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL:
	case CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC:
1731 1732
		func_mode = 0x01;
		break;
1733 1734 1735 1736
	default:
		func_mode = 0x01;
	}

1737
	status = cx231xx_dif_configure_C2HH_for_low_IF(dev, dev->active_mode,
1738 1739 1740
						  func_mode, standard);

	if (standard == DIF_USE_BASEBAND) {	/* base band */
1741 1742
		/* There is a different SRC_PHASE_INC value
		   for baseband vs. DIF */
1743 1744 1745
		status = vid_blk_write_word(dev, DIF_SRC_PHASE_INC, 0xDF7DF83);
		status = vid_blk_read_word(dev, DIF_MISC_CTRL,
						&dif_misc_ctrl_value);
1746
		dif_misc_ctrl_value |= FLD_DIF_DIF_BYPASS;
1747 1748
		status = vid_blk_write_word(dev, DIF_MISC_CTRL,
						dif_misc_ctrl_value);
1749
	} else if (standard & V4L2_STD_PAL_D) {
1750
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1751
					   DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
1752
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1753
					   DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
1754
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1755
					   DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
1756
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1757
					   DIF_PLL_CTRL3, 0, 31, 0x00008800);
1758
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1759
					   DIF_AGC_IF_REF, 0, 31, 0x444C1380);
1760
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1761
					   DIF_AGC_CTRL_IF, 0, 31, 0xDA302600);
1762
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1763
					   DIF_AGC_CTRL_INT, 0, 31, 0xDA261700);
1764
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1765
					   DIF_AGC_CTRL_RF, 0, 31, 0xDA262600);
1766
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1767 1768
					   DIF_AGC_IF_INT_CURRENT, 0, 31,
					   0x26001700);
1769
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1770 1771
					   DIF_AGC_RF_CURRENT, 0, 31,
					   0x00002660);
1772
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1773 1774
					   DIF_VIDEO_AGC_CTRL, 0, 31,
					   0x72500800);
1775
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1776 1777
					   DIF_VID_AUD_OVERRIDE, 0, 31,
					   0x27000100);
1778
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1779
					   DIF_AV_SEP_CTRL, 0, 31, 0x3F3934EA);
1780
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1781 1782
					   DIF_COMP_FLT_CTRL, 0, 31,
					   0x00000000);
1783
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1784 1785
					   DIF_SRC_PHASE_INC, 0, 31,
					   0x1befbf06);
1786
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1787 1788
					   DIF_SRC_GAIN_CONTROL, 0, 31,
					   0x000035e8);
1789
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1790 1791 1792 1793 1794
					   DIF_RPT_VARIANCE, 0, 31, 0x00000000);
		/* Save the Spec Inversion value */
		dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
		dif_misc_ctrl_value |= 0x3a023F11;
	} else if (standard & V4L2_STD_PAL_I) {
1795
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1796
					   DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
1797
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1798
					   DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
1799
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1800
					   DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
1801
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1802
					   DIF_PLL_CTRL3, 0, 31, 0x00008800);
1803
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1804
					   DIF_AGC_IF_REF, 0, 31, 0x444C1380);
1805
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1806
					   DIF_AGC_CTRL_IF, 0, 31, 0xDA302600);
1807
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1808
					   DIF_AGC_CTRL_INT, 0, 31, 0xDA261700);
1809
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1810
					   DIF_AGC_CTRL_RF, 0, 31, 0xDA262600);
1811
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1812 1813
					   DIF_AGC_IF_INT_CURRENT, 0, 31,
					   0x26001700);
1814
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1815 1816
					   DIF_AGC_RF_CURRENT, 0, 31,
					   0x00002660);
1817
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1818 1819
					   DIF_VIDEO_AGC_CTRL, 0, 31,
					   0x72500800);
1820
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1821 1822
					   DIF_VID_AUD_OVERRIDE, 0, 31,
					   0x27000100);
1823
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1824
					   DIF_AV_SEP_CTRL, 0, 31, 0x5F39A934);
1825
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1826 1827
					   DIF_COMP_FLT_CTRL, 0, 31,
					   0x00000000);
1828
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1829 1830
					   DIF_SRC_PHASE_INC, 0, 31,
					   0x1befbf06);
1831
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1832 1833
					   DIF_SRC_GAIN_CONTROL, 0, 31,
					   0x000035e8);
1834
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1835 1836 1837 1838 1839 1840
					   DIF_RPT_VARIANCE, 0, 31, 0x00000000);
		/* Save the Spec Inversion value */
		dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
		dif_misc_ctrl_value |= 0x3a033F11;
	} else if (standard & V4L2_STD_PAL_M) {
		/* improved Low Frequency Phase Noise */
1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862
		status = vid_blk_write_word(dev, DIF_PLL_CTRL, 0xFF01FF0C);
		status = vid_blk_write_word(dev, DIF_PLL_CTRL1, 0xbd038c85);
		status = vid_blk_write_word(dev, DIF_PLL_CTRL2, 0x1db4640a);
		status = vid_blk_write_word(dev, DIF_PLL_CTRL3, 0x00008800);
		status = vid_blk_write_word(dev, DIF_AGC_IF_REF, 0x444C1380);
		status = vid_blk_write_word(dev, DIF_AGC_IF_INT_CURRENT,
						0x26001700);
		status = vid_blk_write_word(dev, DIF_AGC_RF_CURRENT,
						0x00002660);
		status = vid_blk_write_word(dev, DIF_VIDEO_AGC_CTRL,
						0x72500800);
		status = vid_blk_write_word(dev, DIF_VID_AUD_OVERRIDE,
						0x27000100);
		status = vid_blk_write_word(dev, DIF_AV_SEP_CTRL, 0x012c405d);
		status = vid_blk_write_word(dev, DIF_COMP_FLT_CTRL,
						0x009f50c1);
		status = vid_blk_write_word(dev, DIF_SRC_PHASE_INC,
						0x1befbf06);
		status = vid_blk_write_word(dev, DIF_SRC_GAIN_CONTROL,
						0x000035e8);
		status = vid_blk_write_word(dev, DIF_SOFT_RST_CTRL_REVB,
						0x00000000);
1863 1864 1865 1866 1867
		/* Save the Spec Inversion value */
		dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
		dif_misc_ctrl_value |= 0x3A0A3F10;
	} else if (standard & (V4L2_STD_PAL_N | V4L2_STD_PAL_Nc)) {
		/* improved Low Frequency Phase Noise */
1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890
		status = vid_blk_write_word(dev, DIF_PLL_CTRL, 0xFF01FF0C);
		status = vid_blk_write_word(dev, DIF_PLL_CTRL1, 0xbd038c85);
		status = vid_blk_write_word(dev, DIF_PLL_CTRL2, 0x1db4640a);
		status = vid_blk_write_word(dev, DIF_PLL_CTRL3, 0x00008800);
		status = vid_blk_write_word(dev, DIF_AGC_IF_REF, 0x444C1380);
		status = vid_blk_write_word(dev, DIF_AGC_IF_INT_CURRENT,
						0x26001700);
		status = vid_blk_write_word(dev, DIF_AGC_RF_CURRENT,
						0x00002660);
		status = vid_blk_write_word(dev, DIF_VIDEO_AGC_CTRL,
						0x72500800);
		status = vid_blk_write_word(dev, DIF_VID_AUD_OVERRIDE,
						0x27000100);
		status = vid_blk_write_word(dev, DIF_AV_SEP_CTRL,
						0x012c405d);
		status = vid_blk_write_word(dev, DIF_COMP_FLT_CTRL,
						0x009f50c1);
		status = vid_blk_write_word(dev, DIF_SRC_PHASE_INC,
						0x1befbf06);
		status = vid_blk_write_word(dev, DIF_SRC_GAIN_CONTROL,
						0x000035e8);
		status = vid_blk_write_word(dev, DIF_SOFT_RST_CTRL_REVB,
						0x00000000);
1891 1892 1893 1894
		/* Save the Spec Inversion value */
		dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
		dif_misc_ctrl_value = 0x3A093F10;
	} else if (standard &
1895 1896
		  (V4L2_STD_SECAM_B | V4L2_STD_SECAM_D | V4L2_STD_SECAM_G |
		   V4L2_STD_SECAM_K | V4L2_STD_SECAM_K1)) {
1897

1898
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1899
					   DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
1900
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1901
					   DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
1902
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1903
					   DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
1904
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1905
					   DIF_PLL_CTRL3, 0, 31, 0x00008800);
1906
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1907
					   DIF_AGC_IF_REF, 0, 31, 0x888C0380);
1908
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1909
					   DIF_AGC_CTRL_IF, 0, 31, 0xe0262600);
1910
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1911
					   DIF_AGC_CTRL_INT, 0, 31, 0xc2171700);
1912
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1913
					   DIF_AGC_CTRL_RF, 0, 31, 0xc2262600);
1914
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1915 1916
					   DIF_AGC_IF_INT_CURRENT, 0, 31,
					   0x26001700);
1917
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1918 1919
					   DIF_AGC_RF_CURRENT, 0, 31,
					   0x00002660);
1920
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1921 1922
					   DIF_VID_AUD_OVERRIDE, 0, 31,
					   0x27000100);
1923
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1924
					   DIF_AV_SEP_CTRL, 0, 31, 0x3F3530ec);
1925
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1926 1927
					   DIF_COMP_FLT_CTRL, 0, 31,
					   0x00000000);
1928
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1929 1930
					   DIF_SRC_PHASE_INC, 0, 31,
					   0x1befbf06);
1931
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1932 1933
					   DIF_SRC_GAIN_CONTROL, 0, 31,
					   0x000035e8);
1934
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1935
					   DIF_RPT_VARIANCE, 0, 31, 0x00000000);
1936
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1937 1938 1939 1940 1941 1942 1943 1944
					   DIF_VIDEO_AGC_CTRL, 0, 31,
					   0xf4000000);

		/* Save the Spec Inversion value */
		dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
		dif_misc_ctrl_value |= 0x3a023F11;
	} else if (standard & (V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC)) {
		/* Is it SECAM_L1? */
1945
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1946
					   DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
1947
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1948
					   DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
1949
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1950
					   DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
1951
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1952
					   DIF_PLL_CTRL3, 0, 31, 0x00008800);
1953
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1954
					   DIF_AGC_IF_REF, 0, 31, 0x888C0380);
1955
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1956
					   DIF_AGC_CTRL_IF, 0, 31, 0xe0262600);
1957
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1958
					   DIF_AGC_CTRL_INT, 0, 31, 0xc2171700);
1959
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1960
					   DIF_AGC_CTRL_RF, 0, 31, 0xc2262600);
1961
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1962 1963
					   DIF_AGC_IF_INT_CURRENT, 0, 31,
					   0x26001700);
1964
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1965 1966
					   DIF_AGC_RF_CURRENT, 0, 31,
					   0x00002660);
1967
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1968 1969
					   DIF_VID_AUD_OVERRIDE, 0, 31,
					   0x27000100);
1970
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1971
					   DIF_AV_SEP_CTRL, 0, 31, 0x3F3530ec);
1972
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1973 1974
					   DIF_COMP_FLT_CTRL, 0, 31,
					   0x00000000);
1975
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1976 1977
					   DIF_SRC_PHASE_INC, 0, 31,
					   0x1befbf06);
1978
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1979 1980
					   DIF_SRC_GAIN_CONTROL, 0, 31,
					   0x000035e8);
1981
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1982
					   DIF_RPT_VARIANCE, 0, 31, 0x00000000);
1983
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
1984 1985 1986 1987 1988 1989 1990
					   DIF_VIDEO_AGC_CTRL, 0, 31,
					   0xf2560000);

		/* Save the Spec Inversion value */
		dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
		dif_misc_ctrl_value |= 0x3a023F11;

1991
	} else if (standard & V4L2_STD_NTSC_M) {
1992 1993
		/* V4L2_STD_NTSC_M (75 IRE Setup) Or
		   V4L2_STD_NTSC_M_JP (Japan,  0 IRE Setup) */
1994

1995 1996 1997 1998
		/* For NTSC the centre frequency of video coming out of
		   sidewinder is around 7.1MHz or 3.6MHz depending on the
		   spectral inversion. so for a non spectrally inverted channel
		   the pll freq word is 0x03420c49
1999 2000
		 */

2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026
		status = vid_blk_write_word(dev, DIF_PLL_CTRL, 0x6503BC0C);
		status = vid_blk_write_word(dev, DIF_PLL_CTRL1, 0xBD038C85);
		status = vid_blk_write_word(dev, DIF_PLL_CTRL2, 0x1DB4640A);
		status = vid_blk_write_word(dev, DIF_PLL_CTRL3, 0x00008800);
		status = vid_blk_write_word(dev, DIF_AGC_IF_REF, 0x444C0380);
		status = vid_blk_write_word(dev, DIF_AGC_IF_INT_CURRENT,
						0x26001700);
		status = vid_blk_write_word(dev, DIF_AGC_RF_CURRENT,
						0x00002660);
		status = vid_blk_write_word(dev, DIF_VIDEO_AGC_CTRL,
						0x04000800);
		status = vid_blk_write_word(dev, DIF_VID_AUD_OVERRIDE,
						0x27000100);
		status = vid_blk_write_word(dev, DIF_AV_SEP_CTRL, 0x01296e1f);

		status = vid_blk_write_word(dev, DIF_COMP_FLT_CTRL,
						0x009f50c1);
		status = vid_blk_write_word(dev, DIF_SRC_PHASE_INC,
						0x1befbf06);
		status = vid_blk_write_word(dev, DIF_SRC_GAIN_CONTROL,
						0x000035e8);

		status = vid_blk_write_word(dev, DIF_AGC_CTRL_IF, 0xC2262600);
		status = vid_blk_write_word(dev, DIF_AGC_CTRL_INT,
						0xC2262600);
		status = vid_blk_write_word(dev, DIF_AGC_CTRL_RF, 0xC2262600);
2027 2028 2029 2030

		/* Save the Spec Inversion value */
		dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
		dif_misc_ctrl_value |= 0x3a003F10;
2031 2032
	} else {
		/* default PAL BG */
2033
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2034
					   DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
2035
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2036
					   DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
2037
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2038
					   DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
2039
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2040
					   DIF_PLL_CTRL3, 0, 31, 0x00008800);
2041
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2042
					   DIF_AGC_IF_REF, 0, 31, 0x444C1380);
2043
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2044
					   DIF_AGC_CTRL_IF, 0, 31, 0xDA302600);
2045
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2046
					   DIF_AGC_CTRL_INT, 0, 31, 0xDA261700);
2047
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2048
					   DIF_AGC_CTRL_RF, 0, 31, 0xDA262600);
2049
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2050 2051
					   DIF_AGC_IF_INT_CURRENT, 0, 31,
					   0x26001700);
2052
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2053 2054
					   DIF_AGC_RF_CURRENT, 0, 31,
					   0x00002660);
2055
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2056 2057
					   DIF_VIDEO_AGC_CTRL, 0, 31,
					   0x72500800);
2058
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2059 2060
					   DIF_VID_AUD_OVERRIDE, 0, 31,
					   0x27000100);
2061
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2062
					   DIF_AV_SEP_CTRL, 0, 31, 0x3F3530EC);
2063
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2064 2065
					   DIF_COMP_FLT_CTRL, 0, 31,
					   0x00A653A8);
2066
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2067 2068
					   DIF_SRC_PHASE_INC, 0, 31,
					   0x1befbf06);
2069
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2070 2071
					   DIF_SRC_GAIN_CONTROL, 0, 31,
					   0x000035e8);
2072
		status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
2073 2074 2075 2076
					   DIF_RPT_VARIANCE, 0, 31, 0x00000000);
		/* Save the Spec Inversion value */
		dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
		dif_misc_ctrl_value |= 0x3a013F11;
2077 2078 2079 2080 2081 2082
	}

	/* The AGC values should be the same for all standards,
	   AUD_SRC_SEL[19] should always be disabled    */
	dif_misc_ctrl_value &= ~FLD_DIF_AUD_SRC_SEL;

2083 2084
	/* It is still possible to get Set Standard calls even when we
	   are in FM mode.
2085 2086 2087 2088 2089
	   This is done to override the value for FM. */
	if (dev->active_mode == V4L2_TUNER_RADIO)
		dif_misc_ctrl_value = 0x7a080000;

	/* Write the calculated value for misc ontrol register      */
2090
	status = vid_blk_write_word(dev, DIF_MISC_CTRL, dif_misc_ctrl_value);
2091 2092

	return status;
2093 2094 2095 2096 2097 2098 2099 2100
}

int cx231xx_tuner_pre_channel_change(struct cx231xx *dev)
{
	int status = 0;
	u32 dwval;

	/* Set the RF and IF k_agc values to 3 */
2101
	status = vid_blk_read_word(dev, DIF_AGC_IF_REF, &dwval);
2102 2103 2104
	dwval &= ~(FLD_DIF_K_AGC_RF | FLD_DIF_K_AGC_IF);
	dwval |= 0x33000000;

2105
	status = vid_blk_write_word(dev, DIF_AGC_IF_REF, dwval);
2106

2107
	return status;
2108 2109 2110 2111
}

int cx231xx_tuner_post_channel_change(struct cx231xx *dev)
{
2112
	int status = 0;
2113
	u32 dwval;
2114 2115
	cx231xx_info("cx231xx_tuner_post_channel_change  dev->tuner_type =0%d\n",
		     dev->tuner_type);
2116 2117
	/* Set the RF and IF k_agc values to 4 for PAL/NTSC and 8 for
	 * SECAM L/B/D standards */
2118
	status = vid_blk_read_word(dev, DIF_AGC_IF_REF, &dwval);
2119
	dwval &= ~(FLD_DIF_K_AGC_RF | FLD_DIF_K_AGC_IF);
2120

2121
	if (dev->norm & (V4L2_STD_SECAM_L | V4L2_STD_SECAM_B |
2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134
			 V4L2_STD_SECAM_D)) {
			if (dev->tuner_type == TUNER_NXP_TDA18271) {
				dwval &= ~FLD_DIF_IF_REF;
				dwval |= 0x88000300;
			} else
				dwval |= 0x88000000;
		} else {
			if (dev->tuner_type == TUNER_NXP_TDA18271) {
				dwval &= ~FLD_DIF_IF_REF;
				dwval |= 0xCC000300;
			} else
				dwval |= 0x44000000;
		}
2135

2136
	status = vid_blk_write_word(dev, DIF_AGC_IF_REF, dwval);
2137

2138
	return status == sizeof(dwval) ? 0 : -EIO;
2139 2140
}

2141
/******************************************************************************
2142
 *        	    I 2 S - B L O C K    C O N T R O L   functions            *
2143
 ******************************************************************************/
2144
int cx231xx_i2s_blk_initialize(struct cx231xx *dev)
2145
{
2146 2147 2148
	int status = 0;
	u32 value;

2149
	status = cx231xx_read_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
2150
				       CH_PWR_CTRL1, 1, &value, 1);
2151 2152
	/* enables clock to delta-sigma and decimation filter */
	value |= 0x80;
2153
	status = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
2154 2155
					CH_PWR_CTRL1, 1, value, 1);
	/* power up all channel */
2156
	status = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
2157 2158 2159
					CH_PWR_CTRL2, 1, 0x00, 1);

	return status;
2160 2161
}

2162
int cx231xx_i2s_blk_update_power_control(struct cx231xx *dev,
2163
					enum AV_MODE avmode)
2164
{
2165 2166 2167 2168
	int status = 0;
	u32 value = 0;

	if (avmode != POLARIS_AVMODE_ENXTERNAL_AV) {
2169
		status = cx231xx_read_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
2170 2171
					  CH_PWR_CTRL2, 1, &value, 1);
		value |= 0xfe;
2172
		status = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
2173 2174
						CH_PWR_CTRL2, 1, value, 1);
	} else {
2175
		status = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
2176 2177 2178 2179
						CH_PWR_CTRL2, 1, 0x00, 1);
	}

	return status;
2180 2181
}

2182 2183
/* set i2s_blk for audio input types */
int cx231xx_i2s_blk_set_audio_input(struct cx231xx *dev, u8 audio_input)
2184
{
2185
	int status = 0;
2186

2187 2188
	switch (audio_input) {
	case CX231XX_AMUX_LINE_IN:
2189
		status = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
2190
						CH_PWR_CTRL2, 1, 0x00, 1);
2191
		status = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
2192 2193 2194 2195 2196 2197
						CH_PWR_CTRL1, 1, 0x80, 1);
		break;
	case CX231XX_AMUX_VIDEO:
	default:
		break;
	}
2198

2199
	dev->ctl_ainput = audio_input;
2200

2201
	return status;
2202 2203
}

2204 2205 2206
/******************************************************************************
 *                  P O W E R      C O N T R O L   functions                  *
 ******************************************************************************/
2207
int cx231xx_set_power_mode(struct cx231xx *dev, enum AV_MODE mode)
2208
{
2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220
	u8 value[4] = { 0, 0, 0, 0 };
	u32 tmp = 0;
	int status = 0;

	if (dev->power_mode != mode)
		dev->power_mode = mode;
	else {
		cx231xx_info(" setPowerMode::mode = %d, No Change req.\n",
			     mode);
		return 0;
	}

2221 2222
	status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN, value,
				       4);
2223 2224 2225
	if (status < 0)
		return status;

2226
	tmp = le32_to_cpu(*((u32 *) value));
2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237

	switch (mode) {
	case POLARIS_AVMODE_ENXTERNAL_AV:

		tmp &= (~PWR_MODE_MASK);

		tmp |= PWR_AV_EN;
		value[0] = (u8) tmp;
		value[1] = (u8) (tmp >> 8);
		value[2] = (u8) (tmp >> 16);
		value[3] = (u8) (tmp >> 24);
2238 2239
		status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
						PWR_CTL_EN, value, 4);
2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256
		msleep(PWR_SLEEP_INTERVAL);

		tmp |= PWR_ISO_EN;
		value[0] = (u8) tmp;
		value[1] = (u8) (tmp >> 8);
		value[2] = (u8) (tmp >> 16);
		value[3] = (u8) (tmp >> 24);
		status =
		    cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER, PWR_CTL_EN,
					   value, 4);
		msleep(PWR_SLEEP_INTERVAL);

		tmp |= POLARIS_AVMODE_ENXTERNAL_AV;
		value[0] = (u8) tmp;
		value[1] = (u8) (tmp >> 8);
		value[2] = (u8) (tmp >> 16);
		value[3] = (u8) (tmp >> 24);
2257 2258
		status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
						PWR_CTL_EN, value, 4);
2259

2260 2261
		/* reset state of xceive tuner */
		dev->xc_fw_load_done = 0;
2262 2263 2264 2265
		break;

	case POLARIS_AVMODE_ANALOGT_TV:

2266
		tmp |= PWR_DEMOD_EN;
2267 2268 2269 2270 2271
		tmp |= (I2C_DEMOD_EN);
		value[0] = (u8) tmp;
		value[1] = (u8) (tmp >> 8);
		value[2] = (u8) (tmp >> 16);
		value[3] = (u8) (tmp >> 24);
2272 2273
		status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
						PWR_CTL_EN, value, 4);
2274 2275 2276 2277 2278 2279 2280 2281
		msleep(PWR_SLEEP_INTERVAL);

		if (!(tmp & PWR_TUNER_EN)) {
			tmp |= (PWR_TUNER_EN);
			value[0] = (u8) tmp;
			value[1] = (u8) (tmp >> 8);
			value[2] = (u8) (tmp >> 16);
			value[3] = (u8) (tmp >> 24);
2282 2283
			status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
							PWR_CTL_EN, value, 4);
2284 2285 2286 2287 2288 2289 2290 2291 2292
			msleep(PWR_SLEEP_INTERVAL);
		}

		if (!(tmp & PWR_AV_EN)) {
			tmp |= PWR_AV_EN;
			value[0] = (u8) tmp;
			value[1] = (u8) (tmp >> 8);
			value[2] = (u8) (tmp >> 16);
			value[3] = (u8) (tmp >> 24);
2293 2294
			status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
							PWR_CTL_EN, value, 4);
2295 2296 2297 2298 2299 2300 2301 2302
			msleep(PWR_SLEEP_INTERVAL);
		}
		if (!(tmp & PWR_ISO_EN)) {
			tmp |= PWR_ISO_EN;
			value[0] = (u8) tmp;
			value[1] = (u8) (tmp >> 8);
			value[2] = (u8) (tmp >> 16);
			value[3] = (u8) (tmp >> 24);
2303 2304
			status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
							PWR_CTL_EN, value, 4);
2305 2306 2307 2308 2309 2310 2311 2312 2313
			msleep(PWR_SLEEP_INTERVAL);
		}

		if (!(tmp & POLARIS_AVMODE_ANALOGT_TV)) {
			tmp |= POLARIS_AVMODE_ANALOGT_TV;
			value[0] = (u8) tmp;
			value[1] = (u8) (tmp >> 8);
			value[2] = (u8) (tmp >> 16);
			value[3] = (u8) (tmp >> 24);
2314 2315
			status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
							PWR_CTL_EN, value, 4);
2316 2317 2318
			msleep(PWR_SLEEP_INTERVAL);
		}

2319 2320 2321
		if (dev->board.tuner_type != TUNER_ABSENT) {
			/* Enable tuner */
			cx231xx_enable_i2c_port_3(dev, true);
2322

2323
			/* reset the Tuner */
2324 2325
			if (dev->board.tuner_gpio)
				cx231xx_gpio_set(dev, dev->board.tuner_gpio);
2326

2327 2328 2329
			if (dev->cx231xx_reset_analog_tuner)
				dev->cx231xx_reset_analog_tuner(dev);
		}
2330

2331 2332 2333 2334 2335 2336 2337 2338 2339
		break;

	case POLARIS_AVMODE_DIGITAL:
		if (!(tmp & PWR_TUNER_EN)) {
			tmp |= (PWR_TUNER_EN);
			value[0] = (u8) tmp;
			value[1] = (u8) (tmp >> 8);
			value[2] = (u8) (tmp >> 16);
			value[3] = (u8) (tmp >> 24);
2340 2341
			status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
							PWR_CTL_EN, value, 4);
2342 2343 2344 2345 2346 2347 2348 2349
			msleep(PWR_SLEEP_INTERVAL);
		}
		if (!(tmp & PWR_AV_EN)) {
			tmp |= PWR_AV_EN;
			value[0] = (u8) tmp;
			value[1] = (u8) (tmp >> 8);
			value[2] = (u8) (tmp >> 16);
			value[3] = (u8) (tmp >> 24);
2350 2351
			status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
							PWR_CTL_EN, value, 4);
2352 2353 2354 2355 2356 2357 2358 2359
			msleep(PWR_SLEEP_INTERVAL);
		}
		if (!(tmp & PWR_ISO_EN)) {
			tmp |= PWR_ISO_EN;
			value[0] = (u8) tmp;
			value[1] = (u8) (tmp >> 8);
			value[2] = (u8) (tmp >> 16);
			value[3] = (u8) (tmp >> 24);
2360 2361
			status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
							PWR_CTL_EN, value, 4);
2362 2363 2364
			msleep(PWR_SLEEP_INTERVAL);
		}

2365
		tmp &= (~PWR_AV_MODE);
2366 2367 2368 2369 2370
		tmp |= POLARIS_AVMODE_DIGITAL | I2C_DEMOD_EN;
		value[0] = (u8) tmp;
		value[1] = (u8) (tmp >> 8);
		value[2] = (u8) (tmp >> 16);
		value[3] = (u8) (tmp >> 24);
2371 2372
		status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
						PWR_CTL_EN, value, 4);
2373 2374 2375 2376 2377 2378 2379 2380
		msleep(PWR_SLEEP_INTERVAL);

		if (!(tmp & PWR_DEMOD_EN)) {
			tmp |= PWR_DEMOD_EN;
			value[0] = (u8) tmp;
			value[1] = (u8) (tmp >> 8);
			value[2] = (u8) (tmp >> 16);
			value[3] = (u8) (tmp >> 24);
2381 2382
			status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
							PWR_CTL_EN, value, 4);
2383 2384 2385
			msleep(PWR_SLEEP_INTERVAL);
		}

2386 2387 2388 2389 2390 2391 2392 2393 2394
		if (dev->board.tuner_type != TUNER_ABSENT) {
			/*
			 * Enable tuner
			 *	Hauppauge Exeter seems to need to do something different!
			 */
			if (dev->model == CX231XX_BOARD_HAUPPAUGE_EXETER)
				cx231xx_enable_i2c_port_3(dev, false);
			else
				cx231xx_enable_i2c_port_3(dev, true);
2395

2396
			/* reset the Tuner */
2397 2398
			if (dev->board.tuner_gpio)
				cx231xx_gpio_set(dev, dev->board.tuner_gpio);
2399

2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410
			if (dev->cx231xx_reset_analog_tuner)
				dev->cx231xx_reset_analog_tuner(dev);
		}
		break;

	default:
		break;
	}

	msleep(PWR_SLEEP_INTERVAL);

2411 2412
	/* For power saving, only enable Pwr_resetout_n
	   when digital TV is selected. */
2413 2414 2415 2416 2417 2418
	if (mode == POLARIS_AVMODE_DIGITAL) {
		tmp |= PWR_RESETOUT_EN;
		value[0] = (u8) tmp;
		value[1] = (u8) (tmp >> 8);
		value[2] = (u8) (tmp >> 16);
		value[3] = (u8) (tmp >> 24);
2419 2420
		status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
						PWR_CTL_EN, value, 4);
2421 2422 2423
		msleep(PWR_SLEEP_INTERVAL);
	}

2424 2425
	/* update power control for afe */
	status = cx231xx_afe_update_power_control(dev, mode);
2426

2427 2428
	/* update power control for i2s_blk */
	status = cx231xx_i2s_blk_update_power_control(dev, mode);
2429

2430 2431
	status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN, value,
				       4);
2432 2433

	return status;
2434 2435 2436 2437
}

int cx231xx_power_suspend(struct cx231xx *dev)
{
2438 2439 2440
	u8 value[4] = { 0, 0, 0, 0 };
	u32 tmp = 0;
	int status = 0;
2441

2442 2443
	status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN,
				       value, 4);
2444 2445
	if (status > 0)
		return status;
2446

2447
	tmp = le32_to_cpu(*((u32 *) value));
2448
	tmp &= (~PWR_MODE_MASK);
2449

2450 2451 2452 2453
	value[0] = (u8) tmp;
	value[1] = (u8) (tmp >> 8);
	value[2] = (u8) (tmp >> 16);
	value[3] = (u8) (tmp >> 24);
2454 2455
	status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER, PWR_CTL_EN,
					value, 4);
2456

2457
	return status;
2458 2459
}

2460 2461 2462
/******************************************************************************
 *                  S T R E A M    C O N T R O L   functions                  *
 ******************************************************************************/
2463 2464
int cx231xx_start_stream(struct cx231xx *dev, u32 ep_mask)
{
2465 2466 2467
	u8 value[4] = { 0x0, 0x0, 0x0, 0x0 };
	u32 tmp = 0;
	int status = 0;
2468

2469
	cx231xx_info("cx231xx_start_stream():: ep_mask = %x\n", ep_mask);
2470 2471
	status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, EP_MODE_SET,
				       value, 4);
2472 2473
	if (status < 0)
		return status;
2474

2475
	tmp = le32_to_cpu(*((u32 *) value));
2476 2477 2478 2479 2480
	tmp |= ep_mask;
	value[0] = (u8) tmp;
	value[1] = (u8) (tmp >> 8);
	value[2] = (u8) (tmp >> 16);
	value[3] = (u8) (tmp >> 24);
2481

2482 2483
	status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER, EP_MODE_SET,
					value, 4);
2484

2485
	return status;
2486 2487 2488 2489
}

int cx231xx_stop_stream(struct cx231xx *dev, u32 ep_mask)
{
2490 2491 2492
	u8 value[4] = { 0x0, 0x0, 0x0, 0x0 };
	u32 tmp = 0;
	int status = 0;
2493

2494 2495 2496 2497 2498
	cx231xx_info("cx231xx_stop_stream():: ep_mask = %x\n", ep_mask);
	status =
	    cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, EP_MODE_SET, value, 4);
	if (status < 0)
		return status;
2499

2500
	tmp = le32_to_cpu(*((u32 *) value));
2501 2502 2503 2504 2505
	tmp &= (~ep_mask);
	value[0] = (u8) tmp;
	value[1] = (u8) (tmp >> 8);
	value[2] = (u8) (tmp >> 16);
	value[3] = (u8) (tmp >> 24);
2506

2507 2508
	status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER, EP_MODE_SET,
					value, 4);
2509

2510
	return status;
2511 2512 2513 2514
}

int cx231xx_initialize_stream_xfer(struct cx231xx *dev, u32 media_type)
{
2515
	int status = 0;
2516 2517
	u32 value = 0;
	u8 val[4] = { 0, 0, 0, 0 };
2518

2519 2520
	if (dev->udev->speed == USB_SPEED_HIGH) {
		switch (media_type) {
2521
		case Audio:
2522 2523 2524 2525 2526
			cx231xx_info("%s: Audio enter HANC\n", __func__);
			status =
			    cx231xx_mode_register(dev, TS_MODE_REG, 0x9300);
			break;

2527
		case Vbi:
2528 2529 2530 2531
			cx231xx_info("%s: set vanc registers\n", __func__);
			status = cx231xx_mode_register(dev, TS_MODE_REG, 0x300);
			break;

2532
		case Sliced_cc:
2533 2534 2535 2536 2537
			cx231xx_info("%s: set hanc registers\n", __func__);
			status =
			    cx231xx_mode_register(dev, TS_MODE_REG, 0x1300);
			break;

2538
		case Raw_Video:
2539 2540 2541 2542
			cx231xx_info("%s: set video registers\n", __func__);
			status = cx231xx_mode_register(dev, TS_MODE_REG, 0x100);
			break;

2543
		case TS1_serial_mode:
2544 2545
			cx231xx_info("%s: set ts1 registers", __func__);

2546
		if (dev->board.has_417) {
2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568
			cx231xx_info(" MPEG\n");
			value &= 0xFFFFFFFC;
			value |= 0x3;

			status = cx231xx_mode_register(dev, TS_MODE_REG, value);

			val[0] = 0x04;
			val[1] = 0xA3;
			val[2] = 0x3B;
			val[3] = 0x00;
			status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
				 TS1_CFG_REG, val, 4);

			val[0] = 0x00;
			val[1] = 0x08;
			val[2] = 0x00;
			val[3] = 0x08;
			status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
				 TS1_LENGTH_REG, val, 4);

		} else {
			cx231xx_info(" BDA\n");
2569
			status = cx231xx_mode_register(dev, TS_MODE_REG, 0x101);
2570 2571
			status = cx231xx_mode_register(dev, TS1_CFG_REG, 0x010);
		}
2572
			break;
2573

2574
		case TS1_parallel_mode:
L
Lucas De Marchi 已提交
2575
			cx231xx_info("%s: set ts1 parallel mode registers\n",
2576 2577 2578 2579 2580 2581 2582 2583
				     __func__);
			status = cx231xx_mode_register(dev, TS_MODE_REG, 0x100);
			status = cx231xx_mode_register(dev, TS1_CFG_REG, 0x400);
			break;
		}
	} else {
		status = cx231xx_mode_register(dev, TS_MODE_REG, 0x101);
	}
2584

2585 2586
	return status;
}
2587 2588 2589

int cx231xx_capture_start(struct cx231xx *dev, int start, u8 media_type)
{
2590
	int rc = -1;
2591
	u32 ep_mask = -1;
2592
	struct pcb_config *pcb_config;
2593 2594

	/* get EP for media type */
2595
	pcb_config = (struct pcb_config *)&dev->current_pcb_config;
2596

2597
	if (pcb_config->config_num) {
2598
		switch (media_type) {
2599
		case Raw_Video:
2600 2601
			ep_mask = ENABLE_EP4;	/* ep4  [00:1000] */
			break;
2602
		case Audio:
2603 2604
			ep_mask = ENABLE_EP3;	/* ep3  [00:0100] */
			break;
2605
		case Vbi:
2606 2607
			ep_mask = ENABLE_EP5;	/* ep5 [01:0000] */
			break;
2608
		case Sliced_cc:
2609 2610
			ep_mask = ENABLE_EP6;	/* ep6 [10:0000] */
			break;
2611 2612
		case TS1_serial_mode:
		case TS1_parallel_mode:
2613 2614
			ep_mask = ENABLE_EP1;	/* ep1 [00:0001] */
			break;
2615
		case TS2:
2616 2617 2618 2619 2620 2621 2622 2623
			ep_mask = ENABLE_EP2;	/* ep2 [00:0010] */
			break;
		}
	}

	if (start) {
		rc = cx231xx_initialize_stream_xfer(dev, media_type);

2624
		if (rc < 0)
2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635
			return rc;

		/* enable video capture */
		if (ep_mask > 0)
			rc = cx231xx_start_stream(dev, ep_mask);
	} else {
		/* disable video capture */
		if (ep_mask > 0)
			rc = cx231xx_stop_stream(dev, ep_mask);
	}

2636 2637
	return rc;
}
2638
EXPORT_SYMBOL_GPL(cx231xx_capture_start);
2639

2640 2641 2642
/*****************************************************************************
*                   G P I O   B I T control functions                        *
******************************************************************************/
2643
static int cx231xx_set_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u32 gpio_val)
2644
{
2645
	int status = 0;
2646

2647 2648
	gpio_val = cpu_to_le32(gpio_val);
	status = cx231xx_send_gpio_cmd(dev, gpio_bit, (u8 *)&gpio_val, 4, 0, 0);
2649

2650
	return status;
2651 2652
}

2653
static int cx231xx_get_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u32 *gpio_val)
2654
{
2655
	u32 tmp;
2656
	int status = 0;
2657

2658 2659
	status = cx231xx_send_gpio_cmd(dev, gpio_bit, (u8 *)&tmp, 4, 0, 1);
	*gpio_val = le32_to_cpu(tmp);
2660

2661
	return status;
2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675
}

/*
* cx231xx_set_gpio_direction
*      Sets the direction of the GPIO pin to input or output
*
* Parameters :
*      pin_number : The GPIO Pin number to program the direction for
*                   from 0 to 31
*      pin_value : The Direction of the GPIO Pin under reference.
*                      0 = Input direction
*                      1 = Output direction
*/
int cx231xx_set_gpio_direction(struct cx231xx *dev,
2676
			       int pin_number, int pin_value)
2677 2678
{
	int status = 0;
2679
	u32 value = 0;
2680

2681
	/* Check for valid pin_number - if 32 , bail out */
2682
	if (pin_number >= 32)
2683
		return -EINVAL;
2684

2685 2686
	/* input */
	if (pin_value == 0)
2687
		value = dev->gpio_dir & (~(1 << pin_number));	/* clear */
2688
	else
2689
		value = dev->gpio_dir | (1 << pin_number);
2690

2691
	status = cx231xx_set_gpio_bit(dev, value, dev->gpio_val);
2692

2693
	/* cache the value for future */
2694 2695
	dev->gpio_dir = value;

2696
	return status;
2697 2698 2699
}

/*
2700
* cx231xx_set_gpio_value
2701 2702 2703 2704 2705 2706 2707 2708 2709
*      Sets the value of the GPIO pin to Logic high or low. The Pin under
*      reference should ALREADY BE SET IN OUTPUT MODE !!!!!!!!!
*
* Parameters :
*      pin_number : The GPIO Pin number to program the direction for
*      pin_value : The value of the GPIO Pin under reference.
*                      0 = set it to 0
*                      1 = set it to 1
*/
2710
int cx231xx_set_gpio_value(struct cx231xx *dev, int pin_number, int pin_value)
2711
{
2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723
	int status = 0;
	u32 value = 0;

	/* Check for valid pin_number - if 0xFF , bail out */
	if (pin_number >= 32)
		return -EINVAL;

	/* first do a sanity check - if the Pin is not output, make it output */
	if ((dev->gpio_dir & (1 << pin_number)) == 0x00) {
		/* It was in input mode */
		value = dev->gpio_dir | (1 << pin_number);
		dev->gpio_dir = value;
2724
		status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2725
					      dev->gpio_val);
2726
		value = 0;
2727
	}
2728

2729
	if (pin_value == 0)
2730
		value = dev->gpio_val & (~(1 << pin_number));
2731
	else
2732
		value = dev->gpio_val | (1 << pin_number);
2733

2734 2735
	/* store the value */
	dev->gpio_val = value;
2736

2737
	/* toggle bit0 of GP_IO */
2738
	status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2739

2740
	return status;
2741 2742
}

2743 2744 2745
/*****************************************************************************
*                      G P I O I2C related functions                         *
******************************************************************************/
2746 2747 2748 2749 2750
int cx231xx_gpio_i2c_start(struct cx231xx *dev)
{
	int status = 0;

	/* set SCL to output 1 ; set SDA to output 1 */
2751 2752 2753 2754 2755
	dev->gpio_dir |= 1 << dev->board.tuner_scl_gpio;
	dev->gpio_dir |= 1 << dev->board.tuner_sda_gpio;
	dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
	dev->gpio_val |= 1 << dev->board.tuner_sda_gpio;

2756
	status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2757
	if (status < 0)
2758 2759 2760
		return -EINVAL;

	/* set SCL to output 1; set SDA to output 0 */
2761 2762
	dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
	dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
2763

2764
	status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2765
	if (status < 0)
2766 2767
		return -EINVAL;

2768 2769 2770
	/* set SCL to output 0; set SDA to output 0      */
	dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
	dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
2771

2772
	status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2773
	if (status < 0)
2774 2775 2776 2777 2778 2779 2780
		return -EINVAL;

	return status;
}

int cx231xx_gpio_i2c_end(struct cx231xx *dev)
{
2781
	int status = 0;
2782

2783 2784 2785
	/* set SCL to output 0; set SDA to output 0      */
	dev->gpio_dir |= 1 << dev->board.tuner_scl_gpio;
	dev->gpio_dir |= 1 << dev->board.tuner_sda_gpio;
2786

2787 2788
	dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
	dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
2789

2790
	status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2791
	if (status < 0)
2792 2793
		return -EINVAL;

2794 2795 2796
	/* set SCL to output 1; set SDA to output 0      */
	dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
	dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
2797

2798
	status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2799
	if (status < 0)
2800 2801 2802 2803
		return -EINVAL;

	/* set SCL to input ,release SCL cable control
	   set SDA to input ,release SDA cable control */
2804 2805
	dev->gpio_dir &= ~(1 << dev->board.tuner_scl_gpio);
	dev->gpio_dir &= ~(1 << dev->board.tuner_sda_gpio);
2806

2807
	status =
2808
	    cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2809
	if (status < 0)
2810
		return -EINVAL;
2811

2812 2813 2814 2815 2816
	return status;
}

int cx231xx_gpio_i2c_write_byte(struct cx231xx *dev, u8 data)
{
2817 2818
	int status = 0;
	u8 i;
2819 2820

	/* set SCL to output ; set SDA to output */
2821 2822 2823 2824 2825 2826 2827 2828
	dev->gpio_dir |= 1 << dev->board.tuner_scl_gpio;
	dev->gpio_dir |= 1 << dev->board.tuner_sda_gpio;

	for (i = 0; i < 8; i++) {
		if (((data << i) & 0x80) == 0) {
			/* set SCL to output 0; set SDA to output 0     */
			dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
			dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
2829
			status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2830
						      dev->gpio_val);
2831 2832 2833

			/* set SCL to output 1; set SDA to output 0     */
			dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
2834
			status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2835
						      dev->gpio_val);
2836 2837 2838

			/* set SCL to output 0; set SDA to output 0     */
			dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2839
			status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2840
						      dev->gpio_val);
2841
		} else {
2842 2843 2844
			/* set SCL to output 0; set SDA to output 1     */
			dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
			dev->gpio_val |= 1 << dev->board.tuner_sda_gpio;
2845
			status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2846
						      dev->gpio_val);
2847 2848 2849

			/* set SCL to output 1; set SDA to output 1     */
			dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
2850
			status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2851
						      dev->gpio_val);
2852 2853 2854

			/* set SCL to output 0; set SDA to output 1     */
			dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2855
			status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2856
						      dev->gpio_val);
2857
		}
2858 2859 2860 2861
	}
	return status;
}

2862
int cx231xx_gpio_i2c_read_byte(struct cx231xx *dev, u8 *buf)
2863 2864
{
	u8 value = 0;
2865 2866 2867
	int status = 0;
	u32 gpio_logic_value = 0;
	u8 i;
2868 2869

	/* read byte */
2870
	for (i = 0; i < 8; i++) {	/* send write I2c addr */
2871 2872

		/* set SCL to output 0; set SDA to input */
2873
		dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2874
		status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2875
					      dev->gpio_val);
2876 2877

		/* set SCL to output 1; set SDA to input */
2878
		dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
2879
		status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
2880
					      dev->gpio_val);
2881 2882 2883

		/* get SDA data bit */
		gpio_logic_value = dev->gpio_val;
2884
		status = cx231xx_get_gpio_bit(dev, dev->gpio_dir,
2885
					      &dev->gpio_val);
2886
		if ((dev->gpio_val & (1 << dev->board.tuner_sda_gpio)) != 0)
2887
			value |= (1 << (8 - i - 1));
2888 2889 2890 2891 2892

		dev->gpio_val = gpio_logic_value;
	}

	/* set SCL to output 0,finish the read latest SCL signal.
2893 2894
	   !!!set SDA to input, never to modify SDA direction at
	   the same times */
2895
	dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2896
	status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2897

2898 2899
	/* store the value */
	*buf = value & 0xff;
2900 2901 2902 2903 2904 2905

	return status;
}

int cx231xx_gpio_i2c_read_ack(struct cx231xx *dev)
{
2906
	int status = 0;
2907
	u32 gpio_logic_value = 0;
2908 2909
	int nCnt = 10;
	int nInit = nCnt;
2910

2911 2912
	/* clock stretch; set SCL to input; set SDA to input;
	   get SCL value till SCL = 1 */
2913 2914
	dev->gpio_dir &= ~(1 << dev->board.tuner_sda_gpio);
	dev->gpio_dir &= ~(1 << dev->board.tuner_scl_gpio);
2915 2916

	gpio_logic_value = dev->gpio_val;
2917
	status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2918

2919
	do {
2920
		msleep(2);
2921
		status = cx231xx_get_gpio_bit(dev, dev->gpio_dir,
2922
					      &dev->gpio_val);
2923
		nCnt--;
2924 2925 2926
	} while (((dev->gpio_val &
			  (1 << dev->board.tuner_scl_gpio)) == 0) &&
			 (nCnt > 0));
2927

2928
	if (nCnt == 0)
2929
		cx231xx_info("No ACK after %d msec -GPIO I2C failed!",
2930
			     nInit * 10);
2931

2932 2933 2934 2935 2936
	/*
	 * readAck
	 * through clock stretch, slave has given a SCL signal,
	 * so the SDA data can be directly read.
	 */
2937
	status = cx231xx_get_gpio_bit(dev, dev->gpio_dir, &dev->gpio_val);
2938

2939
	if ((dev->gpio_val & 1 << dev->board.tuner_sda_gpio) == 0) {
2940
		dev->gpio_val = gpio_logic_value;
2941
		dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
2942 2943 2944
		status = 0;
	} else {
		dev->gpio_val = gpio_logic_value;
2945
		dev->gpio_val |= (1 << dev->board.tuner_sda_gpio);
2946 2947
	}

2948 2949
	/* read SDA end, set the SCL to output 0, after this operation,
	   SDA direction can be changed. */
2950
	dev->gpio_val = gpio_logic_value;
2951 2952
	dev->gpio_dir |= (1 << dev->board.tuner_scl_gpio);
	dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2953
	status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2954 2955 2956 2957 2958 2959

	return status;
}

int cx231xx_gpio_i2c_write_ack(struct cx231xx *dev)
{
2960
	int status = 0;
2961 2962

	/* set SDA to ouput */
2963
	dev->gpio_dir |= 1 << dev->board.tuner_sda_gpio;
2964
	status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2965 2966

	/* set SCL = 0 (output); set SDA = 0 (output) */
2967 2968
	dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
	dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2969
	status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2970 2971

	/* set SCL = 1 (output); set SDA = 0 (output) */
2972
	dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
2973
	status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2974 2975

	/* set SCL = 0 (output); set SDA = 0 (output) */
2976
	dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
2977
	status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2978 2979

	/* set SDA to input,and then the slave will read data from SDA. */
2980
	dev->gpio_dir &= ~(1 << dev->board.tuner_sda_gpio);
2981
	status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2982 2983 2984 2985 2986 2987

	return status;
}

int cx231xx_gpio_i2c_write_nak(struct cx231xx *dev)
{
2988
	int status = 0;
2989 2990

	/* set scl to output ; set sda to input */
2991 2992
	dev->gpio_dir |= 1 << dev->board.tuner_scl_gpio;
	dev->gpio_dir &= ~(1 << dev->board.tuner_sda_gpio);
2993
	status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
2994 2995

	/* set scl to output 0; set sda to input */
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 to output 1; set sda to input */
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 3004 3005

	return status;
}

3006 3007 3008
/*****************************************************************************
*                      G P I O I2C related functions                         *
******************************************************************************/
3009 3010 3011
/* cx231xx_gpio_i2c_read
 * Function to read data from gpio based I2C interface
 */
3012
int cx231xx_gpio_i2c_read(struct cx231xx *dev, u8 dev_addr, u8 *buf, u8 len)
3013
{
3014 3015
	int status = 0;
	int i = 0;
3016

3017
	/* get the lock */
3018 3019 3020 3021 3022 3023
	mutex_lock(&dev->gpio_i2c_lock);

	/* start */
	status = cx231xx_gpio_i2c_start(dev);

	/* write dev_addr */
3024
	status = cx231xx_gpio_i2c_write_byte(dev, (dev_addr << 1) + 1);
3025 3026 3027 3028

	/* readAck */
	status = cx231xx_gpio_i2c_read_ack(dev);

3029 3030 3031 3032 3033
	/* read data */
	for (i = 0; i < len; i++) {
		/* read data */
		buf[i] = 0;
		status = cx231xx_gpio_i2c_read_byte(dev, &buf[i]);
3034

3035 3036 3037 3038 3039
		if ((i + 1) != len) {
			/* only do write ack if we more length */
			status = cx231xx_gpio_i2c_write_ack(dev);
		}
	}
3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055

	/* write NAK - inform reads are complete */
	status = cx231xx_gpio_i2c_write_nak(dev);

	/* write end */
	status = cx231xx_gpio_i2c_end(dev);

	/* release the lock */
	mutex_unlock(&dev->gpio_i2c_lock);

	return status;
}

/* cx231xx_gpio_i2c_write
 * Function to write data to gpio based I2C interface
 */
3056
int cx231xx_gpio_i2c_write(struct cx231xx *dev, u8 dev_addr, u8 *buf, u8 len)
3057
{
3058
	int i = 0;
3059 3060 3061 3062 3063

	/* get the lock */
	mutex_lock(&dev->gpio_i2c_lock);

	/* start */
3064
	cx231xx_gpio_i2c_start(dev);
3065 3066

	/* write dev_addr */
3067
	cx231xx_gpio_i2c_write_byte(dev, dev_addr << 1);
3068 3069

	/* read Ack */
3070
	cx231xx_gpio_i2c_read_ack(dev);
3071

3072
	for (i = 0; i < len; i++) {
3073
		/* Write data */
3074
		cx231xx_gpio_i2c_write_byte(dev, buf[i]);
3075

3076
		/* read Ack */
3077
		cx231xx_gpio_i2c_read_ack(dev);
3078
	}
3079

3080
	/* write End */
3081
	cx231xx_gpio_i2c_end(dev);
3082 3083 3084 3085 3086 3087

	/* release the lock */
	mutex_unlock(&dev->gpio_i2c_lock);

	return 0;
}