xc4000.c 44.2 KB
Newer Older
1 2 3 4 5 6 7
/*
 *  Driver for Xceive XC4000 "QAM/8VSB single chip tuner"
 *
 *  Copyright (c) 2007 Xceive Corporation
 *  Copyright (c) 2007 Steven Toth <stoth@linuxtv.org>
 *  Copyright (c) 2009 Devin Heitmueller <dheitmueller@kernellabs.com>
 *  Copyright (c) 2009 Davide Ferri <d.ferri@zero11.it>
8
 *  Copyright (c) 2010 Istvan Varga <istvan_v@mailbox.hu>
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 *
 *  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/module.h>
#include <linux/moduleparam.h>
#include <linux/videodev2.h>
#include <linux/delay.h>
#include <linux/dvb/frontend.h>
#include <linux/i2c.h>
I
Istvan Varga 已提交
31
#include <linux/mutex.h>
32
#include <asm/unaligned.h>
33 34 35 36 37

#include "dvb_frontend.h"

#include "xc4000.h"
#include "tuner-i2c.h"
38
#include "tuner-xc2028-types.h"
39

40
static int debug;
41
module_param(debug, int, 0644);
42
MODULE_PARM_DESC(debug, "Debugging level (0 to 2, default: 0 (off)).");
43 44 45

static int no_poweroff;
module_param(no_poweroff, int, 0644);
46 47
MODULE_PARM_DESC(no_poweroff, "Power management (1: disabled, 2: enabled, "
	"0 (default): use device-specific default mode).");
48 49 50

static int audio_std;
module_param(audio_std, int, 0644);
51 52 53 54 55 56 57 58 59
MODULE_PARM_DESC(audio_std, "Audio standard. XC4000 audio decoder explicitly "
	"needs to know what audio standard is needed for some video standards "
	"with audio A2 or NICAM. The valid settings are a sum of:\n"
	" 1: use NICAM/B or A2/B instead of NICAM/A or A2/A\n"
	" 2: use A2 instead of NICAM or BTSC\n"
	" 4: use SECAM/K3 instead of K1\n"
	" 8: use PAL-D/K audio for SECAM-D/K\n"
	"16: use FM radio input 1 instead of input 2\n"
	"32: use mono audio (the lower three bits are ignored)");
60 61 62

static char firmware_name[30];
module_param_string(firmware_name, firmware_name, sizeof(firmware_name), 0);
63 64
MODULE_PARM_DESC(firmware_name, "Firmware file name. Allows overriding the "
	"default firmware name.");
65

66 67 68 69 70 71
static DEFINE_MUTEX(xc4000_list_mutex);
static LIST_HEAD(hybrid_tuner_instance_list);

#define dprintk(level, fmt, arg...) if (debug >= level) \
	printk(KERN_INFO "%s: " fmt, "xc4000", ## arg)

72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
/* struct for storing firmware table */
struct firmware_description {
	unsigned int  type;
	v4l2_std_id   id;
	__u16         int_freq;
	unsigned char *ptr;
	unsigned int  size;
};

struct firmware_properties {
	unsigned int	type;
	v4l2_std_id	id;
	v4l2_std_id	std_req;
	__u16		int_freq;
	unsigned int	scode_table;
87
	int		scode_nr;
88
};
89 90 91 92

struct xc4000_priv {
	struct tuner_i2c_props i2c_props;
	struct list_head hybrid_tuner_instance_list;
93
	struct firmware_description *firm;
I
Istvan Varga 已提交
94 95 96 97 98 99
	int	firm_size;
	u32	if_khz;
	u32	freq_hz;
	u32	bandwidth;
	u8	video_standard;
	u8	rf_mode;
100 101 102
	u8	default_pm;
	u8	dvb_amplitude;
	u8	set_smoothedcvbs;
I
Istvan Varga 已提交
103
	u8	ignore_i2c_write_errors;
104
	__u16	firm_version;
105
	struct firmware_properties cur_fw;
I
Istvan Varga 已提交
106 107
	__u16	hwmodel;
	__u16	hwvers;
I
Istvan Varga 已提交
108
	struct mutex	lock;
109 110
};

111 112 113 114 115 116 117 118 119
#define XC4000_AUDIO_STD_B		 1
#define XC4000_AUDIO_STD_A2		 2
#define XC4000_AUDIO_STD_K3		 4
#define XC4000_AUDIO_STD_L		 8
#define XC4000_AUDIO_STD_INPUT1		16
#define XC4000_AUDIO_STD_MONO		32

#define XC4000_DEFAULT_FIRMWARE "dvb-fe-xc4000-1.4.fw"

120
/* Misc Defines */
121
#define MAX_TV_STANDARD			24
122
#define XC_MAX_I2C_WRITE_LENGTH		64
123
#define XC_POWERED_DOWN			0x80000000U
124 125 126 127 128 129 130

/* Signal Types */
#define XC_RF_MODE_AIR			0
#define XC_RF_MODE_CABLE		1

/* Product id */
#define XC_PRODUCT_ID_FW_NOT_LOADED	0x2000
131 132
#define XC_PRODUCT_ID_XC4000		0x0FA0
#define XC_PRODUCT_ID_XC4100		0x1004
133

134
/* Registers (Write-only) */
135 136 137 138 139
#define XREG_INIT         0x00
#define XREG_VIDEO_MODE   0x01
#define XREG_AUDIO_MODE   0x02
#define XREG_RF_FREQ      0x03
#define XREG_D_CODE       0x04
140 141 142 143
#define XREG_DIRECTSITTING_MODE 0x05
#define XREG_SEEK_MODE    0x06
#define XREG_POWER_DOWN   0x08
#define XREG_SIGNALSOURCE 0x0A
I
Istvan Varga 已提交
144
#define XREG_SMOOTHEDCVBS 0x0E
145
#define XREG_AMPLITUDE    0x10
146

147
/* Registers (Read-only) */
148 149 150 151 152 153 154 155 156
#define XREG_ADC_ENV      0x00
#define XREG_QUALITY      0x01
#define XREG_FRAME_LINES  0x02
#define XREG_HSYNC_FREQ   0x03
#define XREG_LOCK         0x04
#define XREG_FREQ_ERROR   0x05
#define XREG_SNR          0x06
#define XREG_VERSION      0x07
#define XREG_PRODUCT_ID   0x08
157 158
#define XREG_SIGNAL_LEVEL 0x0A
#define XREG_NOISE_LEVEL  0x0B
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191

/*
   Basic firmware description. This will remain with
   the driver for documentation purposes.

   This represents an I2C firmware file encoded as a
   string of unsigned char. Format is as follows:

   char[0  ]=len0_MSB  -> len = len_MSB * 256 + len_LSB
   char[1  ]=len0_LSB  -> length of first write transaction
   char[2  ]=data0 -> first byte to be sent
   char[3  ]=data1
   char[4  ]=data2
   char[   ]=...
   char[M  ]=dataN  -> last byte to be sent
   char[M+1]=len1_MSB  -> len = len_MSB * 256 + len_LSB
   char[M+2]=len1_LSB  -> length of second write transaction
   char[M+3]=data0
   char[M+4]=data1
   ...
   etc.

   The [len] value should be interpreted as follows:

   len= len_MSB _ len_LSB
   len=1111_1111_1111_1111   : End of I2C_SEQUENCE
   len=0000_0000_0000_0000   : Reset command: Do hardware reset
   len=0NNN_NNNN_NNNN_NNNN   : Normal transaction: number of bytes = {1:32767)
   len=1WWW_WWWW_WWWW_WWWW   : Wait command: wait for {1:32767} ms

   For the RESET and WAIT commands, the two following bytes will contain
   immediately the length of the following transaction.
*/
I
Istvan Varga 已提交
192

193
struct XC_TV_STANDARD {
I
Istvan Varga 已提交
194
	const char  *Name;
195 196
	u16	    audio_mode;
	u16	    video_mode;
197
	u16	    int_freq;
198 199 200
};

/* Tuner standards */
201 202 203 204 205 206 207 208 209 210 211 212 213
#define XC4000_MN_NTSC_PAL_BTSC		0
#define XC4000_MN_NTSC_PAL_A2		1
#define XC4000_MN_NTSC_PAL_EIAJ		2
#define XC4000_MN_NTSC_PAL_Mono		3
#define XC4000_BG_PAL_A2		4
#define XC4000_BG_PAL_NICAM		5
#define XC4000_BG_PAL_MONO		6
#define XC4000_I_PAL_NICAM		7
#define XC4000_I_PAL_NICAM_MONO		8
#define XC4000_DK_PAL_A2		9
#define XC4000_DK_PAL_NICAM		10
#define XC4000_DK_PAL_MONO		11
#define XC4000_DK_SECAM_A2DK1		12
214 215
#define XC4000_DK_SECAM_A2LDK3		13
#define XC4000_DK_SECAM_A2MONO		14
216 217 218 219 220 221 222 223 224
#define XC4000_DK_SECAM_NICAM		15
#define XC4000_L_SECAM_NICAM		16
#define XC4000_LC_SECAM_NICAM		17
#define XC4000_DTV6			18
#define XC4000_DTV8			19
#define XC4000_DTV7_8			20
#define XC4000_DTV7			21
#define XC4000_FM_Radio_INPUT2		22
#define XC4000_FM_Radio_INPUT1		23
225

226
static struct XC_TV_STANDARD xc4000_standard[MAX_TV_STANDARD] = {
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248
	{"M/N-NTSC/PAL-BTSC",	0x0000, 0x80A0, 4500},
	{"M/N-NTSC/PAL-A2",	0x0000, 0x80A0, 4600},
	{"M/N-NTSC/PAL-EIAJ",	0x0040, 0x80A0, 4500},
	{"M/N-NTSC/PAL-Mono",	0x0078, 0x80A0, 4500},
	{"B/G-PAL-A2",		0x0000, 0x8159, 5640},
	{"B/G-PAL-NICAM",	0x0004, 0x8159, 5740},
	{"B/G-PAL-MONO",	0x0078, 0x8159, 5500},
	{"I-PAL-NICAM",		0x0080, 0x8049, 6240},
	{"I-PAL-NICAM-MONO",	0x0078, 0x8049, 6000},
	{"D/K-PAL-A2",		0x0000, 0x8049, 6380},
	{"D/K-PAL-NICAM",	0x0080, 0x8049, 6200},
	{"D/K-PAL-MONO",	0x0078, 0x8049, 6500},
	{"D/K-SECAM-A2 DK1",	0x0000, 0x8049, 6340},
	{"D/K-SECAM-A2 L/DK3",	0x0000, 0x8049, 6000},
	{"D/K-SECAM-A2 MONO",	0x0078, 0x8049, 6500},
	{"D/K-SECAM-NICAM",	0x0080, 0x8049, 6200},
	{"L-SECAM-NICAM",	0x8080, 0x0009, 6200},
	{"L'-SECAM-NICAM",	0x8080, 0x4009, 6200},
	{"DTV6",		0x00C0, 0x8002,    0},
	{"DTV8",		0x00C0, 0x800B,    0},
	{"DTV7/8",		0x00C0, 0x801B,    0},
	{"DTV7",		0x00C0, 0x8007,    0},
249 250
	{"FM Radio-INPUT2",	0x0008, 0x9800, 10700},
	{"FM Radio-INPUT1",	0x0008, 0x9000, 10700}
251 252 253
};

static int xc4000_readreg(struct xc4000_priv *priv, u16 reg, u16 *val);
254
static int xc4000_tuner_reset(struct dvb_frontend *fe);
255
static void xc_debug_dump(struct xc4000_priv *priv);
256 257 258 259 260 261

static int xc_send_i2c_data(struct xc4000_priv *priv, u8 *buf, int len)
{
	struct i2c_msg msg = { .addr = priv->i2c_props.addr,
			       .flags = 0, .buf = buf, .len = len };
	if (i2c_transfer(priv->i2c_props.adap, &msg, 1) != 1) {
262 263 264 265
		if (priv->ignore_i2c_write_errors == 0) {
			printk(KERN_ERR "xc4000: I2C write failed (len=%i)\n",
			       len);
			if (len == 4) {
266
				printk(KERN_ERR "bytes %*ph\n", 4, buf);
267
			}
268
			return -EREMOTEIO;
269
		}
270
	}
271
	return 0;
272 273
}

274
static int xc4000_tuner_reset(struct dvb_frontend *fe)
275 276 277 278 279 280 281 282 283 284 285 286 287 288
{
	struct xc4000_priv *priv = fe->tuner_priv;
	int ret;

	dprintk(1, "%s()\n", __func__);

	if (fe->callback) {
		ret = fe->callback(((fe->dvb) && (fe->dvb->priv)) ?
					   fe->dvb->priv :
					   priv->i2c_props.adap->algo_data,
					   DVB_FRONTEND_COMPONENT_TUNER,
					   XC4000_TUNER_RESET, 0);
		if (ret) {
			printk(KERN_ERR "xc4000: reset failed\n");
289
			return -EREMOTEIO;
290 291
		}
	} else {
292 293 294
		printk(KERN_ERR "xc4000: no tuner reset callback function, "
				"fatal\n");
		return -EINVAL;
295
	}
296
	return 0;
297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326
}

static int xc_write_reg(struct xc4000_priv *priv, u16 regAddr, u16 i2cData)
{
	u8 buf[4];
	int result;

	buf[0] = (regAddr >> 8) & 0xFF;
	buf[1] = regAddr & 0xFF;
	buf[2] = (i2cData >> 8) & 0xFF;
	buf[3] = i2cData & 0xFF;
	result = xc_send_i2c_data(priv, buf, 4);

	return result;
}

static int xc_load_i2c_sequence(struct dvb_frontend *fe, const u8 *i2c_sequence)
{
	struct xc4000_priv *priv = fe->tuner_priv;

	int i, nbytes_to_send, result;
	unsigned int len, pos, index;
	u8 buf[XC_MAX_I2C_WRITE_LENGTH];

	index = 0;
	while ((i2c_sequence[index] != 0xFF) ||
		(i2c_sequence[index + 1] != 0xFF)) {
		len = i2c_sequence[index] * 256 + i2c_sequence[index+1];
		if (len == 0x0000) {
			/* RESET command */
327 328
			/* NOTE: this is ignored, as the reset callback was */
			/* already called by check_firmware() */
329 330 331
			index += 2;
		} else if (len & 0x8000) {
			/* WAIT command */
332
			msleep(len & 0x7FFF);
333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354
			index += 2;
		} else {
			/* Send i2c data whilst ensuring individual transactions
			 * do not exceed XC_MAX_I2C_WRITE_LENGTH bytes.
			 */
			index += 2;
			buf[0] = i2c_sequence[index];
			buf[1] = i2c_sequence[index + 1];
			pos = 2;
			while (pos < len) {
				if ((len - pos) > XC_MAX_I2C_WRITE_LENGTH - 2)
					nbytes_to_send =
						XC_MAX_I2C_WRITE_LENGTH;
				else
					nbytes_to_send = (len - pos + 2);
				for (i = 2; i < nbytes_to_send; i++) {
					buf[i] = i2c_sequence[index + pos +
						i - 2];
				}
				result = xc_send_i2c_data(priv, buf,
					nbytes_to_send);

355
				if (result != 0)
356 357 358 359 360 361 362
					return result;

				pos += nbytes_to_send - 2;
			}
			index += len;
		}
	}
363
	return 0;
364 365
}

366 367
static int xc_set_tv_standard(struct xc4000_priv *priv,
	u16 video_mode, u16 audio_mode)
368 369
{
	int ret;
370
	dprintk(1, "%s(0x%04x,0x%04x)\n", __func__, video_mode, audio_mode);
371 372
	dprintk(1, "%s() Standard = %s\n",
		__func__,
373
		xc4000_standard[priv->video_standard].Name);
374

375 376 377
	/* Don't complain when the request fails because of i2c stretching */
	priv->ignore_i2c_write_errors = 1;

378 379 380
	ret = xc_write_reg(priv, XREG_VIDEO_MODE, video_mode);
	if (ret == 0)
		ret = xc_write_reg(priv, XREG_AUDIO_MODE, audio_mode);
381

382 383
	priv->ignore_i2c_write_errors = 0;

384 385 386
	return ret;
}

387
static int xc_set_signal_source(struct xc4000_priv *priv, u16 rf_mode)
388 389 390 391 392 393 394 395 396 397 398 399 400 401 402
{
	dprintk(1, "%s(%d) Source = %s\n", __func__, rf_mode,
		rf_mode == XC_RF_MODE_AIR ? "ANTENNA" : "CABLE");

	if ((rf_mode != XC_RF_MODE_AIR) && (rf_mode != XC_RF_MODE_CABLE)) {
		rf_mode = XC_RF_MODE_CABLE;
		printk(KERN_ERR
			"%s(), Invalid mode, defaulting to CABLE",
			__func__);
	}
	return xc_write_reg(priv, XREG_SIGNALSOURCE, rf_mode);
}

static const struct dvb_tuner_ops xc4000_tuner_ops;

403
static int xc_set_rf_frequency(struct xc4000_priv *priv, u32 freq_hz)
404 405 406 407 408 409
{
	u16 freq_code;

	dprintk(1, "%s(%u)\n", __func__, freq_hz);

	if ((freq_hz > xc4000_tuner_ops.info.frequency_max) ||
410 411
	    (freq_hz < xc4000_tuner_ops.info.frequency_min))
		return -EINVAL;
412 413 414 415 416 417

	freq_code = (u16)(freq_hz / 15625);

	/* WAS: Starting in firmware version 1.1.44, Xceive recommends using the
	   FINERFREQ for all normal tuning (the doc indicates reg 0x03 should
	   only be used for fast scanning for channel lock) */
418 419
	/* WAS: XREG_FINERFREQ */
	return xc_write_reg(priv, XREG_RF_FREQ, freq_code);
420 421
}

422
static int xc_get_adc_envelope(struct xc4000_priv *priv, u16 *adc_envelope)
423 424 425 426 427 428 429 430 431 432 433
{
	return xc4000_readreg(priv, XREG_ADC_ENV, adc_envelope);
}

static int xc_get_frequency_error(struct xc4000_priv *priv, u32 *freq_error_hz)
{
	int result;
	u16 regData;
	u32 tmp;

	result = xc4000_readreg(priv, XREG_FREQ_ERROR, &regData);
434
	if (result != 0)
435 436
		return result;

437 438 439
	tmp = (u32)regData & 0xFFFFU;
	tmp = (tmp < 0x8000U ? tmp : 0x10000U - tmp);
	(*freq_error_hz) = tmp * 15625;
440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455
	return result;
}

static int xc_get_lock_status(struct xc4000_priv *priv, u16 *lock_status)
{
	return xc4000_readreg(priv, XREG_LOCK, lock_status);
}

static int xc_get_version(struct xc4000_priv *priv,
	u8 *hw_majorversion, u8 *hw_minorversion,
	u8 *fw_majorversion, u8 *fw_minorversion)
{
	u16 data;
	int result;

	result = xc4000_readreg(priv, XREG_VERSION, &data);
456
	if (result != 0)
457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472
		return result;

	(*hw_majorversion) = (data >> 12) & 0x0F;
	(*hw_minorversion) = (data >>  8) & 0x0F;
	(*fw_majorversion) = (data >>  4) & 0x0F;
	(*fw_minorversion) = data & 0x0F;

	return 0;
}

static int xc_get_hsync_freq(struct xc4000_priv *priv, u32 *hsync_freq_hz)
{
	u16 regData;
	int result;

	result = xc4000_readreg(priv, XREG_HSYNC_FREQ, &regData);
473
	if (result != 0)
474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489
		return result;

	(*hsync_freq_hz) = ((regData & 0x0fff) * 763)/100;
	return result;
}

static int xc_get_frame_lines(struct xc4000_priv *priv, u16 *frame_lines)
{
	return xc4000_readreg(priv, XREG_FRAME_LINES, frame_lines);
}

static int xc_get_quality(struct xc4000_priv *priv, u16 *quality)
{
	return xc4000_readreg(priv, XREG_QUALITY, quality);
}

490 491 492 493 494 495 496 497 498 499
static int xc_get_signal_level(struct xc4000_priv *priv, u16 *signal)
{
	return xc4000_readreg(priv, XREG_SIGNAL_LEVEL, signal);
}

static int xc_get_noise_level(struct xc4000_priv *priv, u16 *noise)
{
	return xc4000_readreg(priv, XREG_NOISE_LEVEL, noise);
}

500
static u16 xc_wait_for_lock(struct xc4000_priv *priv)
501
{
502 503 504 505 506 507 508 509
	u16	lock_state = 0;
	int	watchdog_count = 40;

	while ((lock_state == 0) && (watchdog_count > 0)) {
		xc_get_lock_status(priv, &lock_state);
		if (lock_state != 1) {
			msleep(5);
			watchdog_count--;
510 511
		}
	}
512
	return lock_state;
513 514
}

515
static int xc_tune_channel(struct xc4000_priv *priv, u32 freq_hz)
516
{
517 518
	int	found = 1;
	int	result;
519 520 521

	dprintk(1, "%s(%u)\n", __func__, freq_hz);

522 523
	/* Don't complain when the request fails because of i2c stretching */
	priv->ignore_i2c_write_errors = 1;
524
	result = xc_set_rf_frequency(priv, freq_hz);
525 526
	priv->ignore_i2c_write_errors = 0;

527
	if (result != 0)
528 529
		return 0;

530 531
	/* wait for lock only in analog TV mode */
	if ((priv->cur_fw.type & (FM | DTV6 | DTV7 | DTV78 | DTV8)) == 0) {
532
		if (xc_wait_for_lock(priv) != 1)
533
			found = 0;
534 535
	}

536 537 538 539
	/* Wait for stats to stabilize.
	 * Frame Lines needs two frame times after initial lock
	 * before it is valid.
	 */
540
	msleep(debug ? 100 : 10);
541 542 543 544

	if (debug)
		xc_debug_dump(priv);

545 546 547 548 549 550 551 552 553 554 555 556 557 558 559
	return found;
}

static int xc4000_readreg(struct xc4000_priv *priv, u16 reg, u16 *val)
{
	u8 buf[2] = { reg >> 8, reg & 0xff };
	u8 bval[2] = { 0, 0 };
	struct i2c_msg msg[2] = {
		{ .addr = priv->i2c_props.addr,
			.flags = 0, .buf = &buf[0], .len = 2 },
		{ .addr = priv->i2c_props.addr,
			.flags = I2C_M_RD, .buf = &bval[0], .len = 2 },
	};

	if (i2c_transfer(priv->i2c_props.adap, msg, 2) != 2) {
560
		printk(KERN_ERR "xc4000: I2C read failed\n");
561 562 563 564
		return -EREMOTEIO;
	}

	*val = (bval[0] << 8) | bval[1];
565
	return 0;
566 567
}

568
#define dump_firm_type(t)	dump_firm_type_and_int_freq(t, 0)
569 570 571
static void dump_firm_type_and_int_freq(unsigned int type, u16 int_freq)
{
	 if (type & BASE)
572
		printk(KERN_CONT "BASE ");
573
	 if (type & INIT1)
574
		printk(KERN_CONT "INIT1 ");
575
	 if (type & F8MHZ)
576
		printk(KERN_CONT "F8MHZ ");
577
	 if (type & MTS)
578
		printk(KERN_CONT "MTS ");
579
	 if (type & D2620)
580
		printk(KERN_CONT "D2620 ");
581
	 if (type & D2633)
582
		printk(KERN_CONT "D2633 ");
583
	 if (type & DTV6)
584
		printk(KERN_CONT "DTV6 ");
585
	 if (type & QAM)
586
		printk(KERN_CONT "QAM ");
587
	 if (type & DTV7)
588
		printk(KERN_CONT "DTV7 ");
589
	 if (type & DTV78)
590
		printk(KERN_CONT "DTV78 ");
591
	 if (type & DTV8)
592
		printk(KERN_CONT "DTV8 ");
593
	 if (type & FM)
594
		printk(KERN_CONT "FM ");
595
	 if (type & INPUT1)
596
		printk(KERN_CONT "INPUT1 ");
597
	 if (type & LCD)
598
		printk(KERN_CONT "LCD ");
599
	 if (type & NOGD)
600
		printk(KERN_CONT "NOGD ");
601
	 if (type & MONO)
602
		printk(KERN_CONT "MONO ");
603
	 if (type & ATSC)
604
		printk(KERN_CONT "ATSC ");
605
	 if (type & IF)
606
		printk(KERN_CONT "IF ");
607
	 if (type & LG60)
608
		printk(KERN_CONT "LG60 ");
609
	 if (type & ATI638)
610
		printk(KERN_CONT "ATI638 ");
611
	 if (type & OREN538)
612
		printk(KERN_CONT "OREN538 ");
613
	 if (type & OREN36)
614
		printk(KERN_CONT "OREN36 ");
615
	 if (type & TOYOTA388)
616
		printk(KERN_CONT "TOYOTA388 ");
617
	 if (type & TOYOTA794)
618
		printk(KERN_CONT "TOYOTA794 ");
619
	 if (type & DIBCOM52)
620
		printk(KERN_CONT "DIBCOM52 ");
621
	 if (type & ZARLINK456)
622
		printk(KERN_CONT "ZARLINK456 ");
623
	 if (type & CHINA)
624
		printk(KERN_CONT "CHINA ");
625
	 if (type & F6MHZ)
626
		printk(KERN_CONT "F6MHZ ");
627
	 if (type & INPUT2)
628
		printk(KERN_CONT "INPUT2 ");
629
	 if (type & SCODE)
630
		printk(KERN_CONT "SCODE ");
631
	 if (type & HAS_IF)
632
		printk(KERN_CONT "HAS_IF_%d ", int_freq);
633 634
}

635 636 637 638
static int seek_firmware(struct dvb_frontend *fe, unsigned int type,
			 v4l2_std_id *id)
{
	struct xc4000_priv *priv = fe->tuner_priv;
639 640
	int		i, best_i = -1;
	unsigned int	best_nr_diffs = 255U;
641 642

	if (!priv->firm) {
643
		printk(KERN_ERR "Error! firmware not loaded\n");
644 645 646 647 648 649 650 651
		return -EINVAL;
	}

	if (((type & ~SCODE) == 0) && (*id == 0))
		*id = V4L2_STD_PAL;

	/* Seek for generic video standard match */
	for (i = 0; i < priv->firm_size; i++) {
652 653 654 655 656 657 658 659 660
		v4l2_std_id	id_diff_mask =
			(priv->firm[i].id ^ (*id)) & (*id);
		unsigned int	type_diff_mask =
			(priv->firm[i].type ^ type)
			& (BASE_TYPES | DTV_TYPES | LCD | NOGD | MONO | SCODE);
		unsigned int	nr_diffs;

		if (type_diff_mask
		    & (BASE | INIT1 | FM | DTV6 | DTV7 | DTV78 | DTV8 | SCODE))
661 662
			continue;

663 664 665
		nr_diffs = hweight64(id_diff_mask) + hweight32(type_diff_mask);
		if (!nr_diffs)	/* Supports all the requested standards */
			goto found;
666

667 668
		if (nr_diffs < best_nr_diffs) {
			best_nr_diffs = nr_diffs;
669 670 671 672
			best_i = i;
		}
	}

673 674 675 676 677 678 679
	/* FIXME: Would make sense to seek for type "hint" match ? */
	if (best_i < 0) {
		i = -ENOENT;
		goto ret;
	}

	if (best_nr_diffs > 0U) {
680 681
		printk(KERN_WARNING
		       "Selecting best matching firmware (%u bits differ) for "
682 683
		       "type=(%x), id %016llx:\n",
		       best_nr_diffs, type, (unsigned long long)*id);
684 685 686 687 688 689 690 691
		i = best_i;
	}

found:
	*id = priv->firm[i].id;

ret:
	if (debug) {
692
		printk(KERN_DEBUG "%s firmware for type=",
693
		       (i < 0) ? "Can't find" : "Found");
694
		dump_firm_type(type);
695
		printk(KERN_DEBUG "(%x), id %016llx.\n", type, (unsigned long long)*id);
696 697 698 699 700 701 702 703 704
	}
	return i;
}

static int load_firmware(struct dvb_frontend *fe, unsigned int type,
			 v4l2_std_id *id)
{
	struct xc4000_priv *priv = fe->tuner_priv;
	int                pos, rc;
705
	unsigned char      *p;
706 707 708 709 710 711 712

	pos = seek_firmware(fe, type, id);
	if (pos < 0)
		return pos;

	p = priv->firm[pos].ptr;

713 714 715
	/* Don't complain when the request fails because of i2c stretching */
	priv->ignore_i2c_write_errors = 1;

716
	rc = xc_load_i2c_sequence(fe, p);
717

718 719
	priv->ignore_i2c_write_errors = 0;

720
	return rc;
721 722
}

723 724 725
static int xc4000_fwupload(struct dvb_frontend *fe)
{
	struct xc4000_priv *priv = fe->tuner_priv;
726 727 728 729 730
	const struct firmware *fw   = NULL;
	const unsigned char   *p, *endp;
	int                   rc = 0;
	int		      n, n_array;
	char		      name[33];
I
Istvan Varga 已提交
731
	const char	      *fname;
732

733 734 735 736
	if (firmware_name[0] != '\0')
		fname = firmware_name;
	else
		fname = XC4000_DEFAULT_FIRMWARE;
737

738
	dprintk(1, "Reading firmware %s\n", fname);
739 740 741
	rc = request_firmware(&fw, fname, priv->i2c_props.adap->dev.parent);
	if (rc < 0) {
		if (rc == -ENOENT)
742
			printk(KERN_ERR "Error: firmware %s not found.\n", fname);
743
		else
744
			printk(KERN_ERR "Error %d while requesting firmware %s\n",
745
			       rc, fname);
746

747 748 749 750
		return rc;
	}
	p = fw->data;
	endp = p + fw->size;
751

752
	if (fw->size < sizeof(name) - 1 + 2 + 2) {
753 754
		printk(KERN_ERR "Error: firmware file %s has invalid size!\n",
		       fname);
755
		goto corrupt;
756 757
	}

758
	memcpy(name, p, sizeof(name) - 1);
759
	name[sizeof(name) - 1] = '\0';
760 761 762 763 764 765 766 767
	p += sizeof(name) - 1;

	priv->firm_version = get_unaligned_le16(p);
	p += 2;

	n_array = get_unaligned_le16(p);
	p += 2;

768 769 770
	dprintk(1, "Loading %d firmware images from %s, type: %s, ver %d.%d\n",
		n_array, fname, name,
		priv->firm_version >> 8, priv->firm_version & 0xff);
771

772
	priv->firm = kcalloc(n_array, sizeof(*priv->firm), GFP_KERNEL);
773
	if (priv->firm == NULL) {
774
		printk(KERN_ERR "Not enough memory to load firmware file.\n");
775
		rc = -ENOMEM;
776
		goto done;
777 778 779 780 781 782 783 784 785 786 787
	}
	priv->firm_size = n_array;

	n = -1;
	while (p < endp) {
		__u32 type, size;
		v4l2_std_id id;
		__u16 int_freq = 0;

		n++;
		if (n >= n_array) {
788
			printk(KERN_ERR "More firmware images in file than "
I
Istvan Varga 已提交
789
			       "were expected!\n");
790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813
			goto corrupt;
		}

		/* Checks if there's enough bytes to read */
		if (endp - p < sizeof(type) + sizeof(id) + sizeof(size))
			goto header;

		type = get_unaligned_le32(p);
		p += sizeof(type);

		id = get_unaligned_le64(p);
		p += sizeof(id);

		if (type & HAS_IF) {
			int_freq = get_unaligned_le16(p);
			p += sizeof(int_freq);
			if (endp - p < sizeof(size))
				goto header;
		}

		size = get_unaligned_le32(p);
		p += sizeof(size);

		if (!size || size > endp - p) {
814
			printk(KERN_ERR "Firmware type (%x), id %llx is corrupted (size=%d, expected %d)\n",
815 816 817 818 819 820 821
			       type, (unsigned long long)id,
			       (unsigned)(endp - p), size);
			goto corrupt;
		}

		priv->firm[n].ptr = kzalloc(size, GFP_KERNEL);
		if (priv->firm[n].ptr == NULL) {
822
			printk(KERN_ERR "Not enough memory to load firmware file.\n");
823
			rc = -ENOMEM;
824
			goto done;
825
		}
826

827
		if (debug) {
828
			printk(KERN_DEBUG "Reading firmware type ");
829
			dump_firm_type_and_int_freq(type, int_freq);
830
			printk(KERN_DEBUG "(%x), id %llx, size=%d.\n",
831 832 833 834 835 836 837 838 839 840
			       type, (unsigned long long)id, size);
		}

		memcpy(priv->firm[n].ptr, p, size);
		priv->firm[n].type = type;
		priv->firm[n].id   = id;
		priv->firm[n].size = size;
		priv->firm[n].int_freq = int_freq;

		p += size;
841 842
	}

843
	if (n + 1 != priv->firm_size) {
844
		printk(KERN_ERR "Firmware file is incomplete!\n");
845 846 847 848 849 850
		goto corrupt;
	}

	goto done;

header:
851
	printk(KERN_ERR "Firmware header is incomplete!\n");
852 853
corrupt:
	rc = -EINVAL;
854
	printk(KERN_ERR "Error: firmware file is corrupted!\n");
855 856

done:
857
	release_firmware(fw);
858
	if (rc == 0)
859
		dprintk(1, "Firmware files loaded.\n");
860 861

	return rc;
862 863
}

864 865 866 867
static int load_scode(struct dvb_frontend *fe, unsigned int type,
			 v4l2_std_id *id, __u16 int_freq, int scode)
{
	struct xc4000_priv *priv = fe->tuner_priv;
868 869 870 871
	int		pos, rc;
	unsigned char	*p;
	u8		scode_buf[13];
	u8		indirect_mode[5];
872

873
	dprintk(1, "%s called int_freq=%d\n", __func__, int_freq);
874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890

	if (!int_freq) {
		pos = seek_firmware(fe, type, id);
		if (pos < 0)
			return pos;
	} else {
		for (pos = 0; pos < priv->firm_size; pos++) {
			if ((priv->firm[pos].int_freq == int_freq) &&
			    (priv->firm[pos].type & HAS_IF))
				break;
		}
		if (pos == priv->firm_size)
			return -ENOENT;
	}

	p = priv->firm[pos].ptr;

891 892 893
	if (priv->firm[pos].size != 12 * 16 || scode >= 16)
		return -EINVAL;
	p += 12 * scode;
894

895 896 897 898 899 900 901
	if (debug) {
		tuner_info("Loading SCODE for type=");
		dump_firm_type_and_int_freq(priv->firm[pos].type,
					    priv->firm[pos].int_freq);
		printk(KERN_CONT "(%x), id %016llx.\n", priv->firm[pos].type,
		       (unsigned long long)*id);
	}
902

903 904
	scode_buf[0] = 0x00;
	memcpy(&scode_buf[1], p, 12);
905 906

	/* Enter direct-mode */
907 908
	rc = xc_write_reg(priv, XREG_DIRECTSITTING_MODE, 0);
	if (rc < 0) {
909
		printk(KERN_ERR "failed to put device into direct mode!\n");
910
		return -EIO;
911
	}
912

913
	rc = xc_send_i2c_data(priv, scode_buf, 13);
914
	if (rc != 0) {
915 916
		/* Even if the send failed, make sure we set back to indirect
		   mode */
917
		printk(KERN_ERR "Failed to set scode %d\n", rc);
918
	}
919 920 921 922

	/* Switch back to indirect-mode */
	memset(indirect_mode, 0, sizeof(indirect_mode));
	indirect_mode[4] = 0x88;
923 924
	xc_send_i2c_data(priv, indirect_mode, sizeof(indirect_mode));
	msleep(10);
925 926 927 928 929 930 931 932 933 934

	return 0;
}

static int check_firmware(struct dvb_frontend *fe, unsigned int type,
			  v4l2_std_id std, __u16 int_freq)
{
	struct xc4000_priv         *priv = fe->tuner_priv;
	struct firmware_properties new_fw;
	int			   rc = 0, is_retry = 0;
935
	u16			   hwmodel;
936
	v4l2_std_id		   std0;
937
	u8			   hw_major = 0, hw_minor = 0, fw_major = 0, fw_minor = 0;
938 939 940 941 942 943 944 945 946 947 948 949 950

	dprintk(1, "%s called\n", __func__);

	if (!priv->firm) {
		rc = xc4000_fwupload(fe);
		if (rc < 0)
			return rc;
	}

retry:
	new_fw.type = type;
	new_fw.id = std;
	new_fw.std_req = std;
951
	new_fw.scode_table = SCODE;
952 953 954 955 956 957
	new_fw.scode_nr = 0;
	new_fw.int_freq = int_freq;

	dprintk(1, "checking firmware, user requested type=");
	if (debug) {
		dump_firm_type(new_fw.type);
958
		printk(KERN_CONT "(%x), id %016llx, ", new_fw.type,
959
		       (unsigned long long)new_fw.std_req);
960 961 962 963 964
		if (!int_freq)
			printk(KERN_CONT "scode_tbl ");
		else
			printk(KERN_CONT "int_freq %d, ", new_fw.int_freq);
		printk(KERN_CONT "scode_nr %d\n", new_fw.scode_nr);
965 966 967
	}

	/* No need to reload base firmware if it matches */
968
	if (priv->cur_fw.type & BASE) {
969 970 971 972 973 974 975 976
		dprintk(1, "BASE firmware not changed.\n");
		goto skip_base;
	}

	/* Updating BASE - forget about all currently loaded firmware */
	memset(&priv->cur_fw, 0, sizeof(priv->cur_fw));

	/* Reset is needed before loading firmware */
977
	rc = xc4000_tuner_reset(fe);
978 979 980 981 982
	if (rc < 0)
		goto fail;

	/* BASE firmwares are all std0 */
	std0 = 0;
983
	rc = load_firmware(fe, BASE, &std0);
984
	if (rc < 0) {
985
		printk(KERN_ERR "Error %d while loading base firmware\n", rc);
986 987 988 989 990 991
		goto fail;
	}

	/* Load INIT1, if needed */
	dprintk(1, "Load init1 firmware, if exists\n");

992
	rc = load_firmware(fe, BASE | INIT1, &std0);
993
	if (rc == -ENOENT)
994
		rc = load_firmware(fe, BASE | INIT1, &std0);
995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014
	if (rc < 0 && rc != -ENOENT) {
		tuner_err("Error %d while loading init1 firmware\n",
			  rc);
		goto fail;
	}

skip_base:
	/*
	 * No need to reload standard specific firmware if base firmware
	 * was not reloaded and requested video standards have not changed.
	 */
	if (priv->cur_fw.type == (BASE | new_fw.type) &&
	    priv->cur_fw.std_req == std) {
		dprintk(1, "Std-specific firmware already loaded.\n");
		goto skip_std_specific;
	}

	/* Reloading std-specific firmware forces a SCODE update */
	priv->cur_fw.scode_table = 0;

1015
	/* Load the standard firmware */
1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030
	rc = load_firmware(fe, new_fw.type, &new_fw.id);

	if (rc < 0)
		goto fail;

skip_std_specific:
	if (priv->cur_fw.scode_table == new_fw.scode_table &&
	    priv->cur_fw.scode_nr == new_fw.scode_nr) {
		dprintk(1, "SCODE firmware already loaded.\n");
		goto check_device;
	}

	/* Load SCODE firmware, if exists */
	rc = load_scode(fe, new_fw.type | new_fw.scode_table, &new_fw.id,
			new_fw.int_freq, new_fw.scode_nr);
1031
	if (rc != 0)
1032
		dprintk(1, "load scode failed %d\n", rc);
1033 1034 1035 1036

check_device:
	rc = xc4000_readreg(priv, XREG_PRODUCT_ID, &hwmodel);

1037
	if (xc_get_version(priv, &hw_major, &hw_minor, &fw_major,
1038
			   &fw_minor) != 0) {
1039
		printk(KERN_ERR "Unable to read tuner registers.\n");
1040 1041 1042 1043 1044 1045 1046 1047
		goto fail;
	}

	dprintk(1, "Device is Xceive %d version %d.%d, "
		"firmware version %d.%d\n",
		hwmodel, hw_major, hw_minor, fw_major, fw_minor);

	/* Check firmware version against what we downloaded. */
1048 1049 1050 1051
	if (priv->firm_version != ((fw_major << 8) | fw_minor)) {
		printk(KERN_WARNING
		       "Incorrect readback of firmware version %d.%d.\n",
		       fw_major, fw_minor);
1052 1053 1054 1055
		goto fail;
	}

	/* Check that the tuner hardware model remains consistent over time. */
1056 1057 1058
	if (priv->hwmodel == 0 &&
	    (hwmodel == XC_PRODUCT_ID_XC4000 ||
	     hwmodel == XC_PRODUCT_ID_XC4100)) {
1059
		priv->hwmodel = hwmodel;
1060
		priv->hwvers = (hw_major << 8) | hw_minor;
1061
	} else if (priv->hwmodel == 0 || priv->hwmodel != hwmodel ||
1062 1063 1064
		   priv->hwvers != ((hw_major << 8) | hw_minor)) {
		printk(KERN_WARNING
		       "Read invalid device hardware information - tuner "
I
Istvan Varga 已提交
1065
		       "hung?\n");
1066 1067 1068
		goto fail;
	}

1069
	priv->cur_fw = new_fw;
1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093

	/*
	 * By setting BASE in cur_fw.type only after successfully loading all
	 * firmwares, we can:
	 * 1. Identify that BASE firmware with type=0 has been loaded;
	 * 2. Tell whether BASE firmware was just changed the next time through.
	 */
	priv->cur_fw.type |= BASE;

	return 0;

fail:
	memset(&priv->cur_fw, 0, sizeof(priv->cur_fw));
	if (!is_retry) {
		msleep(50);
		is_retry = 1;
		dprintk(1, "Retrying firmware load\n");
		goto retry;
	}

	if (rc == -ENOENT)
		rc = -EINVAL;
	return rc;
}
1094

1095 1096
static void xc_debug_dump(struct xc4000_priv *priv)
{
I
Istvan Varga 已提交
1097 1098 1099 1100 1101 1102
	u16	adc_envelope;
	u32	freq_error_hz = 0;
	u16	lock_status;
	u32	hsync_freq_hz = 0;
	u16	frame_lines;
	u16	quality;
1103 1104
	u16	signal = 0;
	u16	noise = 0;
I
Istvan Varga 已提交
1105 1106
	u8	hw_majorversion = 0, hw_minorversion = 0;
	u8	fw_majorversion = 0, fw_minorversion = 0;
1107

1108
	xc_get_adc_envelope(priv, &adc_envelope);
1109 1110 1111 1112 1113
	dprintk(1, "*** ADC envelope (0-1023) = %d\n", adc_envelope);

	xc_get_frequency_error(priv, &freq_error_hz);
	dprintk(1, "*** Frequency error = %d Hz\n", freq_error_hz);

I
Istvan Varga 已提交
1114
	xc_get_lock_status(priv, &lock_status);
1115 1116 1117
	dprintk(1, "*** Lock status (0-Wait, 1-Locked, 2-No-signal) = %d\n",
		lock_status);

I
Istvan Varga 已提交
1118 1119
	xc_get_version(priv, &hw_majorversion, &hw_minorversion,
		       &fw_majorversion, &fw_minorversion);
1120 1121 1122 1123
	dprintk(1, "*** HW: V%02x.%02x, FW: V%02x.%02x\n",
		hw_majorversion, hw_minorversion,
		fw_majorversion, fw_minorversion);

1124 1125 1126 1127
	if (priv->video_standard < XC4000_DTV6) {
		xc_get_hsync_freq(priv, &hsync_freq_hz);
		dprintk(1, "*** Horizontal sync frequency = %d Hz\n",
			hsync_freq_hz);
1128

1129 1130 1131
		xc_get_frame_lines(priv, &frame_lines);
		dprintk(1, "*** Frame lines = %d\n", frame_lines);
	}
1132

I
Istvan Varga 已提交
1133
	xc_get_quality(priv, &quality);
1134
	dprintk(1, "*** Quality (0:<8dB, 7:>56dB) = %d\n", quality);
1135 1136 1137 1138 1139 1140

	xc_get_signal_level(priv, &signal);
	dprintk(1, "*** Signal level = -%ddB (%d)\n", signal >> 8, signal);

	xc_get_noise_level(priv, &noise);
	dprintk(1, "*** Noise level = %ddB (%d)\n", noise >> 8, noise);
1141 1142
}

1143
static int xc4000_set_params(struct dvb_frontend *fe)
1144
{
1145 1146 1147
	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
	u32 delsys = c->delivery_system;
	u32 bw = c->bandwidth_hz;
1148
	struct xc4000_priv *priv = fe->tuner_priv;
1149
	unsigned int type;
I
Istvan Varga 已提交
1150
	int	ret = -EREMOTEIO;
1151

1152
	dprintk(1, "%s() frequency=%d (Hz)\n", __func__, c->frequency);
1153

I
Istvan Varga 已提交
1154 1155
	mutex_lock(&priv->lock);

1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172
	switch (delsys) {
	case SYS_ATSC:
		dprintk(1, "%s() VSB modulation\n", __func__);
		priv->rf_mode = XC_RF_MODE_AIR;
		priv->freq_hz = c->frequency - 1750000;
		priv->video_standard = XC4000_DTV6;
		type = DTV6;
		break;
	case SYS_DVBC_ANNEX_B:
		dprintk(1, "%s() QAM modulation\n", __func__);
		priv->rf_mode = XC_RF_MODE_CABLE;
		priv->freq_hz = c->frequency - 1750000;
		priv->video_standard = XC4000_DTV6;
		type = DTV6;
		break;
	case SYS_DVBT:
	case SYS_DVBT2:
1173
		dprintk(1, "%s() OFDM\n", __func__);
1174 1175 1176 1177 1178 1179 1180 1181 1182
		if (bw == 0) {
			if (c->frequency < 400000000) {
				priv->freq_hz = c->frequency - 2250000;
			} else {
				priv->freq_hz = c->frequency - 2750000;
			}
			priv->video_standard = XC4000_DTV7_8;
			type = DTV78;
		} else if (bw <= 6000000) {
1183
			priv->video_standard = XC4000_DTV6;
1184
			priv->freq_hz = c->frequency - 1750000;
1185
			type = DTV6;
1186
		} else if (bw <= 7000000) {
1187
			priv->video_standard = XC4000_DTV7;
1188
			priv->freq_hz = c->frequency - 2250000;
1189
			type = DTV7;
1190
		} else {
1191
			priv->video_standard = XC4000_DTV8;
1192
			priv->freq_hz = c->frequency - 2750000;
1193
			type = DTV8;
1194 1195
		}
		priv->rf_mode = XC_RF_MODE_AIR;
1196 1197 1198
		break;
	default:
		printk(KERN_ERR "xc4000 delivery system not supported!\n");
I
Istvan Varga 已提交
1199 1200
		ret = -EINVAL;
		goto fail;
1201 1202 1203 1204 1205
	}

	dprintk(1, "%s() frequency=%d (compensated)\n",
		__func__, priv->freq_hz);

1206
	/* Make sure the correct firmware type is loaded */
1207
	if (check_firmware(fe, type, 0, priv->if_khz) != 0)
I
Istvan Varga 已提交
1208
		goto fail;
1209

1210 1211
	priv->bandwidth = c->bandwidth_hz;

1212 1213 1214
	ret = xc_set_signal_source(priv, priv->rf_mode);
	if (ret != 0) {
		printk(KERN_ERR "xc4000: xc_set_signal_source(%d) failed\n",
I
Istvan Varga 已提交
1215 1216
		       priv->rf_mode);
		goto fail;
I
Istvan Varga 已提交
1217 1218
	} else {
		u16	video_mode, audio_mode;
1219 1220
		video_mode = xc4000_standard[priv->video_standard].video_mode;
		audio_mode = xc4000_standard[priv->video_standard].audio_mode;
I
Istvan Varga 已提交
1221 1222
		if (type == DTV6 && priv->firm_version != 0x0102)
			video_mode |= 0x0001;
1223 1224 1225
		ret = xc_set_tv_standard(priv, video_mode, audio_mode);
		if (ret != 0) {
			printk(KERN_ERR "xc4000: xc_set_tv_standard failed\n");
I
Istvan Varga 已提交
1226 1227 1228
			/* DJH - do not return when it fails... */
			/* goto fail; */
		}
1229 1230
	}

1231 1232 1233
	if (xc_write_reg(priv, XREG_D_CODE, 0) == 0)
		ret = 0;
	if (priv->dvb_amplitude != 0) {
I
Istvan Varga 已提交
1234
		if (xc_write_reg(priv, XREG_AMPLITUDE,
1235 1236 1237
				 (priv->firm_version != 0x0102 ||
				  priv->dvb_amplitude != 134 ?
				  priv->dvb_amplitude : 132)) != 0)
I
Istvan Varga 已提交
1238
			ret = -EREMOTEIO;
1239 1240
	}
	if (priv->set_smoothedcvbs != 0) {
I
Istvan Varga 已提交
1241 1242
		if (xc_write_reg(priv, XREG_SMOOTHEDCVBS, 1) != 0)
			ret = -EREMOTEIO;
1243 1244 1245 1246
	}
	if (ret != 0) {
		printk(KERN_ERR "xc4000: setting registers failed\n");
		/* goto fail; */
1247
	}
I
Istvan Varga 已提交
1248

1249
	xc_tune_channel(priv, priv->freq_hz);
1250

I
Istvan Varga 已提交
1251 1252 1253 1254 1255 1256
	ret = 0;

fail:
	mutex_unlock(&priv->lock);

	return ret;
1257 1258 1259 1260 1261 1262
}

static int xc4000_set_analog_params(struct dvb_frontend *fe,
	struct analog_parameters *params)
{
	struct xc4000_priv *priv = fe->tuner_priv;
1263
	unsigned int type = 0;
I
Istvan Varga 已提交
1264
	int	ret = -EREMOTEIO;
1265

1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285
	if (params->mode == V4L2_TUNER_RADIO) {
		dprintk(1, "%s() frequency=%d (in units of 62.5Hz)\n",
			__func__, params->frequency);

		mutex_lock(&priv->lock);

		params->std = 0;
		priv->freq_hz = params->frequency * 125L / 2;

		if (audio_std & XC4000_AUDIO_STD_INPUT1) {
			priv->video_standard = XC4000_FM_Radio_INPUT1;
			type = FM | INPUT1;
		} else {
			priv->video_standard = XC4000_FM_Radio_INPUT2;
			type = FM | INPUT2;
		}

		goto tune_channel;
	}

1286 1287 1288
	dprintk(1, "%s() frequency=%d (in units of 62.5khz)\n",
		__func__, params->frequency);

I
Istvan Varga 已提交
1289 1290
	mutex_lock(&priv->lock);

1291 1292 1293
	/* params->frequency is in units of 62.5khz */
	priv->freq_hz = params->frequency * 62500;

1294 1295 1296 1297 1298 1299 1300 1301
	params->std &= V4L2_STD_ALL;
	/* if std is not defined, choose one */
	if (!params->std)
		params->std = V4L2_STD_PAL_BG;

	if (audio_std & XC4000_AUDIO_STD_MONO)
		type = MONO;

1302
	if (params->std & V4L2_STD_MN) {
1303 1304 1305 1306 1307 1308 1309 1310 1311 1312
		params->std = V4L2_STD_MN;
		if (audio_std & XC4000_AUDIO_STD_MONO) {
			priv->video_standard = XC4000_MN_NTSC_PAL_Mono;
		} else if (audio_std & XC4000_AUDIO_STD_A2) {
			params->std |= V4L2_STD_A2;
			priv->video_standard = XC4000_MN_NTSC_PAL_A2;
		} else {
			params->std |= V4L2_STD_BTSC;
			priv->video_standard = XC4000_MN_NTSC_PAL_BTSC;
		}
1313 1314 1315 1316
		goto tune_channel;
	}

	if (params->std & V4L2_STD_PAL_BG) {
1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336
		params->std = V4L2_STD_PAL_BG;
		if (audio_std & XC4000_AUDIO_STD_MONO) {
			priv->video_standard = XC4000_BG_PAL_MONO;
		} else if (!(audio_std & XC4000_AUDIO_STD_A2)) {
			if (!(audio_std & XC4000_AUDIO_STD_B)) {
				params->std |= V4L2_STD_NICAM_A;
				priv->video_standard = XC4000_BG_PAL_NICAM;
			} else {
				params->std |= V4L2_STD_NICAM_B;
				priv->video_standard = XC4000_BG_PAL_NICAM;
			}
		} else {
			if (!(audio_std & XC4000_AUDIO_STD_B)) {
				params->std |= V4L2_STD_A2_A;
				priv->video_standard = XC4000_BG_PAL_A2;
			} else {
				params->std |= V4L2_STD_A2_B;
				priv->video_standard = XC4000_BG_PAL_A2;
			}
		}
1337 1338 1339 1340 1341
		goto tune_channel;
	}

	if (params->std & V4L2_STD_PAL_I) {
		/* default to NICAM audio standard */
1342
		params->std = V4L2_STD_PAL_I | V4L2_STD_NICAM;
1343
		if (audio_std & XC4000_AUDIO_STD_MONO)
1344
			priv->video_standard = XC4000_I_PAL_NICAM_MONO;
1345
		else
1346
			priv->video_standard = XC4000_I_PAL_NICAM;
1347 1348 1349 1350
		goto tune_channel;
	}

	if (params->std & V4L2_STD_PAL_DK) {
1351 1352 1353 1354 1355 1356 1357 1358 1359 1360
		params->std = V4L2_STD_PAL_DK;
		if (audio_std & XC4000_AUDIO_STD_MONO) {
			priv->video_standard = XC4000_DK_PAL_MONO;
		} else if (audio_std & XC4000_AUDIO_STD_A2) {
			params->std |= V4L2_STD_A2;
			priv->video_standard = XC4000_DK_PAL_A2;
		} else {
			params->std |= V4L2_STD_NICAM;
			priv->video_standard = XC4000_DK_PAL_NICAM;
		}
1361 1362 1363 1364
		goto tune_channel;
	}

	if (params->std & V4L2_STD_SECAM_DK) {
1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377
		/* default to A2 audio standard */
		params->std = V4L2_STD_SECAM_DK | V4L2_STD_A2;
		if (audio_std & XC4000_AUDIO_STD_L) {
			type = 0;
			priv->video_standard = XC4000_DK_SECAM_NICAM;
		} else if (audio_std & XC4000_AUDIO_STD_MONO) {
			priv->video_standard = XC4000_DK_SECAM_A2MONO;
		} else if (audio_std & XC4000_AUDIO_STD_K3) {
			params->std |= V4L2_STD_SECAM_K3;
			priv->video_standard = XC4000_DK_SECAM_A2LDK3;
		} else {
			priv->video_standard = XC4000_DK_SECAM_A2DK1;
		}
1378 1379 1380 1381
		goto tune_channel;
	}

	if (params->std & V4L2_STD_SECAM_L) {
1382 1383 1384
		/* default to NICAM audio standard */
		type = 0;
		params->std = V4L2_STD_SECAM_L | V4L2_STD_NICAM;
1385
		priv->video_standard = XC4000_L_SECAM_NICAM;
1386 1387 1388 1389
		goto tune_channel;
	}

	if (params->std & V4L2_STD_SECAM_LC) {
1390 1391 1392
		/* default to NICAM audio standard */
		type = 0;
		params->std = V4L2_STD_SECAM_LC | V4L2_STD_NICAM;
1393
		priv->video_standard = XC4000_LC_SECAM_NICAM;
1394 1395 1396 1397
		goto tune_channel;
	}

tune_channel:
1398
	/* FIXME: it could be air. */
1399
	priv->rf_mode = XC_RF_MODE_CABLE;
1400

1401
	if (check_firmware(fe, type, params->std,
1402
			   xc4000_standard[priv->video_standard].int_freq) != 0)
I
Istvan Varga 已提交
1403
		goto fail;
1404

1405 1406
	ret = xc_set_signal_source(priv, priv->rf_mode);
	if (ret != 0) {
1407
		printk(KERN_ERR
1408
		       "xc4000: xc_set_signal_source(%d) failed\n",
I
Istvan Varga 已提交
1409 1410
		       priv->rf_mode);
		goto fail;
I
Istvan Varga 已提交
1411 1412
	} else {
		u16	video_mode, audio_mode;
1413 1414
		video_mode = xc4000_standard[priv->video_standard].video_mode;
		audio_mode = xc4000_standard[priv->video_standard].audio_mode;
I
Istvan Varga 已提交
1415
		if (priv->video_standard < XC4000_BG_PAL_A2) {
1416
			if (type & NOGD)
I
Istvan Varga 已提交
1417 1418
				video_mode &= 0xFF7F;
		} else if (priv->video_standard < XC4000_I_PAL_NICAM) {
1419
			if (priv->firm_version == 0x0102)
I
Istvan Varga 已提交
1420
				video_mode &= 0xFEFF;
1421 1422
			if (audio_std & XC4000_AUDIO_STD_B)
				video_mode |= 0x0080;
I
Istvan Varga 已提交
1423
		}
1424 1425 1426
		ret = xc_set_tv_standard(priv, video_mode, audio_mode);
		if (ret != 0) {
			printk(KERN_ERR "xc4000: xc_set_tv_standard failed\n");
I
Istvan Varga 已提交
1427 1428
			goto fail;
		}
1429 1430
	}

1431 1432 1433 1434 1435
	if (xc_write_reg(priv, XREG_D_CODE, 0) == 0)
		ret = 0;
	if (xc_write_reg(priv, XREG_AMPLITUDE, 1) != 0)
		ret = -EREMOTEIO;
	if (priv->set_smoothedcvbs != 0) {
I
Istvan Varga 已提交
1436 1437
		if (xc_write_reg(priv, XREG_SMOOTHEDCVBS, 1) != 0)
			ret = -EREMOTEIO;
1438 1439 1440 1441
	}
	if (ret != 0) {
		printk(KERN_ERR "xc4000: setting registers failed\n");
		goto fail;
1442 1443
	}

1444
	xc_tune_channel(priv, priv->freq_hz);
1445

I
Istvan Varga 已提交
1446 1447 1448 1449 1450 1451
	ret = 0;

fail:
	mutex_unlock(&priv->lock);

	return ret;
1452 1453
}

1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518
static int xc4000_get_signal(struct dvb_frontend *fe, u16 *strength)
{
	struct xc4000_priv *priv = fe->tuner_priv;
	u16 value = 0;
	int rc;

	mutex_lock(&priv->lock);
	rc = xc4000_readreg(priv, XREG_SIGNAL_LEVEL, &value);
	mutex_unlock(&priv->lock);

	if (rc < 0)
		goto ret;

	/* Informations from real testing of DVB-T and radio part,
	   coeficient for one dB is 0xff.
	 */
	tuner_dbg("Signal strength: -%ddB (%05d)\n", value >> 8, value);

	/* all known digital modes */
	if ((priv->video_standard == XC4000_DTV6) ||
	    (priv->video_standard == XC4000_DTV7) ||
	    (priv->video_standard == XC4000_DTV7_8) ||
	    (priv->video_standard == XC4000_DTV8))
		goto digital;

	/* Analog mode has NOISE LEVEL important, signal
	   depends only on gain of antenna and amplifiers,
	   but it doesn't tell anything about real quality
	   of reception.
	 */
	mutex_lock(&priv->lock);
	rc = xc4000_readreg(priv, XREG_NOISE_LEVEL, &value);
	mutex_unlock(&priv->lock);

	tuner_dbg("Noise level: %ddB (%05d)\n", value >> 8, value);

	/* highest noise level: 32dB */
	if (value >= 0x2000) {
		value = 0;
	} else {
		value = ~value << 3;
	}

	goto ret;

	/* Digital mode has SIGNAL LEVEL important and real
	   noise level is stored in demodulator registers.
	 */
digital:
	/* best signal: -50dB */
	if (value <= 0x3200) {
		value = 0xffff;
	/* minimum: -114dB - should be 0x7200 but real zero is 0x713A */
	} else if (value >= 0x713A) {
		value = 0;
	} else {
		value = ~(value - 0x3200) << 2;
	}

ret:
	*strength = value;

	return rc;
}

1519 1520 1521
static int xc4000_get_frequency(struct dvb_frontend *fe, u32 *freq)
{
	struct xc4000_priv *priv = fe->tuner_priv;
1522

1523
	*freq = priv->freq_hz;
1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541

	if (debug) {
		mutex_lock(&priv->lock);
		if ((priv->cur_fw.type
		     & (BASE | FM | DTV6 | DTV7 | DTV78 | DTV8)) == BASE) {
			u16	snr = 0;
			if (xc4000_readreg(priv, XREG_SNR, &snr) == 0) {
				mutex_unlock(&priv->lock);
				dprintk(1, "%s() freq = %u, SNR = %d\n",
					__func__, *freq, snr);
				return 0;
			}
		}
		mutex_unlock(&priv->lock);
	}

	dprintk(1, "%s()\n", __func__);

1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556
	return 0;
}

static int xc4000_get_bandwidth(struct dvb_frontend *fe, u32 *bw)
{
	struct xc4000_priv *priv = fe->tuner_priv;
	dprintk(1, "%s()\n", __func__);

	*bw = priv->bandwidth;
	return 0;
}

static int xc4000_get_status(struct dvb_frontend *fe, u32 *status)
{
	struct xc4000_priv *priv = fe->tuner_priv;
I
Istvan Varga 已提交
1557
	u16	lock_status = 0;
1558

I
Istvan Varga 已提交
1559 1560
	mutex_lock(&priv->lock);

1561 1562
	if (priv->cur_fw.type & BASE)
		xc_get_lock_status(priv, &lock_status);
1563

1564 1565 1566 1567
	*status = (lock_status == 1 ?
		   TUNER_STATUS_LOCKED | TUNER_STATUS_STEREO : 0);
	if (priv->cur_fw.type & (DTV6 | DTV7 | DTV78 | DTV8))
		*status &= (~TUNER_STATUS_STEREO);
I
Istvan Varga 已提交
1568

1569
	mutex_unlock(&priv->lock);
1570

1571
	dprintk(2, "%s() lock_status = %d\n", __func__, lock_status);
1572 1573 1574 1575 1576 1577

	return 0;
}

static int xc4000_sleep(struct dvb_frontend *fe)
{
1578
	struct xc4000_priv *priv = fe->tuner_priv;
1579
	int	ret = 0;
1580 1581 1582 1583 1584 1585 1586

	dprintk(1, "%s()\n", __func__);

	mutex_lock(&priv->lock);

	/* Avoid firmware reload on slow devices */
	if ((no_poweroff == 2 ||
1587
	     (no_poweroff == 0 && priv->default_pm != 0)) &&
1588 1589 1590 1591
	    (priv->cur_fw.type & BASE) != 0) {
		/* force reset and firmware reload */
		priv->cur_fw.type = XC_POWERED_DOWN;

1592
		if (xc_write_reg(priv, XREG_POWER_DOWN, 0) != 0) {
1593 1594 1595 1596 1597
			printk(KERN_ERR
			       "xc4000: %s() unable to shutdown tuner\n",
			       __func__);
			ret = -EREMOTEIO;
		}
1598
		msleep(20);
1599 1600 1601 1602 1603
	}

	mutex_unlock(&priv->lock);

	return ret;
1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645
}

static int xc4000_init(struct dvb_frontend *fe)
{
	dprintk(1, "%s()\n", __func__);

	return 0;
}

static int xc4000_release(struct dvb_frontend *fe)
{
	struct xc4000_priv *priv = fe->tuner_priv;

	dprintk(1, "%s()\n", __func__);

	mutex_lock(&xc4000_list_mutex);

	if (priv)
		hybrid_tuner_release_state(priv);

	mutex_unlock(&xc4000_list_mutex);

	fe->tuner_priv = NULL;

	return 0;
}

static const struct dvb_tuner_ops xc4000_tuner_ops = {
	.info = {
		.name           = "Xceive XC4000",
		.frequency_min  =    1000000,
		.frequency_max  = 1023000000,
		.frequency_step =      50000,
	},

	.release	   = xc4000_release,
	.init		   = xc4000_init,
	.sleep		   = xc4000_sleep,

	.set_params	   = xc4000_set_params,
	.set_analog_params = xc4000_set_analog_params,
	.get_frequency	   = xc4000_get_frequency,
1646
	.get_rf_strength   = xc4000_get_signal,
1647 1648 1649 1650 1651 1652 1653 1654 1655
	.get_bandwidth	   = xc4000_get_bandwidth,
	.get_status	   = xc4000_get_status
};

struct dvb_frontend *xc4000_attach(struct dvb_frontend *fe,
				   struct i2c_adapter *i2c,
				   struct xc4000_config *cfg)
{
	struct xc4000_priv *priv = NULL;
I
Istvan Varga 已提交
1656 1657
	int	instance;
	u16	id = 0;
1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673

	dprintk(1, "%s(%d-%04x)\n", __func__,
		i2c ? i2c_adapter_id(i2c) : -1,
		cfg ? cfg->i2c_address : -1);

	mutex_lock(&xc4000_list_mutex);

	instance = hybrid_tuner_request_state(struct xc4000_priv, priv,
					      hybrid_tuner_instance_list,
					      i2c, cfg->i2c_address, "xc4000");
	switch (instance) {
	case 0:
		goto fail;
		break;
	case 1:
		/* new tuner instance */
1674
		priv->bandwidth = 6000000;
1675 1676 1677 1678 1679
		/* set default configuration */
		priv->if_khz = 4560;
		priv->default_pm = 0;
		priv->dvb_amplitude = 134;
		priv->set_smoothedcvbs = 1;
I
Istvan Varga 已提交
1680
		mutex_init(&priv->lock);
1681 1682 1683 1684 1685 1686 1687 1688
		fe->tuner_priv = priv;
		break;
	default:
		/* existing tuner instance */
		fe->tuner_priv = priv;
		break;
	}

I
Istvan Varga 已提交
1689
	if (cfg->if_khz != 0) {
1690
		/* copy configuration if provided by the caller */
1691
		priv->if_khz = cfg->if_khz;
1692 1693 1694
		priv->default_pm = cfg->default_pm;
		priv->dvb_amplitude = cfg->dvb_amplitude;
		priv->set_smoothedcvbs = cfg->set_smoothedcvbs;
1695 1696 1697 1698 1699 1700
	}

	/* Check if firmware has been loaded. It is possible that another
	   instance of the driver has loaded the firmware.
	 */

1701
	if (instance == 1) {
1702
		if (xc4000_readreg(priv, XREG_PRODUCT_ID, &id) != 0)
1703
			goto fail;
1704 1705 1706 1707
	} else {
		id = ((priv->cur_fw.type & BASE) != 0 ?
		      priv->hwmodel : XC_PRODUCT_ID_FW_NOT_LOADED);
	}
1708 1709

	switch (id) {
1710 1711
	case XC_PRODUCT_ID_XC4000:
	case XC_PRODUCT_ID_XC4100:
1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736
		printk(KERN_INFO
			"xc4000: Successfully identified at address 0x%02x\n",
			cfg->i2c_address);
		printk(KERN_INFO
			"xc4000: Firmware has been loaded previously\n");
		break;
	case XC_PRODUCT_ID_FW_NOT_LOADED:
		printk(KERN_INFO
			"xc4000: Successfully identified at address 0x%02x\n",
			cfg->i2c_address);
		printk(KERN_INFO
			"xc4000: Firmware has not been loaded previously\n");
		break;
	default:
		printk(KERN_ERR
			"xc4000: Device not found at addr 0x%02x (0x%x)\n",
			cfg->i2c_address, id);
		goto fail;
	}

	mutex_unlock(&xc4000_list_mutex);

	memcpy(&fe->ops.tuner_ops, &xc4000_tuner_ops,
		sizeof(struct dvb_tuner_ops));

1737 1738 1739 1740 1741
	if (instance == 1) {
		int	ret;
		mutex_lock(&priv->lock);
		ret = xc4000_fwupload(fe);
		mutex_unlock(&priv->lock);
1742
		if (ret != 0)
1743 1744
			goto fail2;
	}
1745

1746 1747 1748
	return fe;
fail:
	mutex_unlock(&xc4000_list_mutex);
1749
fail2:
1750 1751 1752 1753 1754 1755 1756 1757
	xc4000_release(fe);
	return NULL;
}
EXPORT_SYMBOL(xc4000_attach);

MODULE_AUTHOR("Steven Toth, Davide Ferri");
MODULE_DESCRIPTION("Xceive xc4000 silicon tuner driver");
MODULE_LICENSE("GPL");