brintos

brintos / linux-shallow public Read only

0
0
Text · 44.0 KiB · 3cf54d7 Raw
1752 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 *  Driver for Xceive XC4000 "QAM/8VSB single chip tuner"4 *5 *  Copyright (c) 2007 Xceive Corporation6 *  Copyright (c) 2007 Steven Toth <stoth@linuxtv.org>7 *  Copyright (c) 2009 Devin Heitmueller <dheitmueller@kernellabs.com>8 *  Copyright (c) 2009 Davide Ferri <d.ferri@zero11.it>9 *  Copyright (c) 2010 Istvan Varga <istvan_v@mailbox.hu>10 */11 12#include <linux/module.h>13#include <linux/moduleparam.h>14#include <linux/videodev2.h>15#include <linux/delay.h>16#include <linux/dvb/frontend.h>17#include <linux/i2c.h>18#include <linux/mutex.h>19#include <linux/unaligned.h>20 21#include <media/dvb_frontend.h>22 23#include "xc4000.h"24#include "tuner-i2c.h"25#include "xc2028-types.h"26 27static int debug;28module_param(debug, int, 0644);29MODULE_PARM_DESC(debug, "Debugging level (0 to 2, default: 0 (off)).");30 31static int no_poweroff;32module_param(no_poweroff, int, 0644);33MODULE_PARM_DESC(no_poweroff, "Power management (1: disabled, 2: enabled, 0 (default): use device-specific default mode).");34 35static int audio_std;36module_param(audio_std, int, 0644);37MODULE_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"38	" 1: use NICAM/B or A2/B instead of NICAM/A or A2/A\n"39	" 2: use A2 instead of NICAM or BTSC\n"40	" 4: use SECAM/K3 instead of K1\n"41	" 8: use PAL-D/K audio for SECAM-D/K\n"42	"16: use FM radio input 1 instead of input 2\n"43	"32: use mono audio (the lower three bits are ignored)");44 45static char firmware_name[30];46module_param_string(firmware_name, firmware_name, sizeof(firmware_name), 0);47MODULE_PARM_DESC(firmware_name, "Firmware file name. Allows overriding the default firmware name.");48 49static DEFINE_MUTEX(xc4000_list_mutex);50static LIST_HEAD(hybrid_tuner_instance_list);51 52#define dprintk(level, fmt, arg...) if (debug >= level) \53	printk(KERN_INFO "%s: " fmt, "xc4000", ## arg)54 55/* struct for storing firmware table */56struct firmware_description {57	unsigned int  type;58	v4l2_std_id   id;59	__u16         int_freq;60	unsigned char *ptr;61	unsigned int  size;62};63 64struct firmware_properties {65	unsigned int	type;66	v4l2_std_id	id;67	v4l2_std_id	std_req;68	__u16		int_freq;69	unsigned int	scode_table;70	int		scode_nr;71};72 73struct xc4000_priv {74	struct tuner_i2c_props i2c_props;75	struct list_head hybrid_tuner_instance_list;76	struct firmware_description *firm;77	int	firm_size;78	u32	if_khz;79	u32	freq_hz, freq_offset;80	u32	bandwidth;81	u8	video_standard;82	u8	rf_mode;83	u8	default_pm;84	u8	dvb_amplitude;85	u8	set_smoothedcvbs;86	u8	ignore_i2c_write_errors;87	__u16	firm_version;88	struct firmware_properties cur_fw;89	__u16	hwmodel;90	__u16	hwvers;91	struct mutex	lock;92};93 94#define XC4000_AUDIO_STD_B		 195#define XC4000_AUDIO_STD_A2		 296#define XC4000_AUDIO_STD_K3		 497#define XC4000_AUDIO_STD_L		 898#define XC4000_AUDIO_STD_INPUT1		1699#define XC4000_AUDIO_STD_MONO		32100 101#define XC4000_DEFAULT_FIRMWARE "dvb-fe-xc4000-1.4.fw"102#define XC4000_DEFAULT_FIRMWARE_NEW "dvb-fe-xc4000-1.4.1.fw"103 104/* Misc Defines */105#define MAX_TV_STANDARD			24106#define XC_MAX_I2C_WRITE_LENGTH		64107#define XC_POWERED_DOWN			0x80000000U108 109/* Signal Types */110#define XC_RF_MODE_AIR			0111#define XC_RF_MODE_CABLE		1112 113/* Product id */114#define XC_PRODUCT_ID_FW_NOT_LOADED	0x2000115#define XC_PRODUCT_ID_XC4000		0x0FA0116#define XC_PRODUCT_ID_XC4100		0x1004117 118/* Registers (Write-only) */119#define XREG_INIT         0x00120#define XREG_VIDEO_MODE   0x01121#define XREG_AUDIO_MODE   0x02122#define XREG_RF_FREQ      0x03123#define XREG_D_CODE       0x04124#define XREG_DIRECTSITTING_MODE 0x05125#define XREG_SEEK_MODE    0x06126#define XREG_POWER_DOWN   0x08127#define XREG_SIGNALSOURCE 0x0A128#define XREG_SMOOTHEDCVBS 0x0E129#define XREG_AMPLITUDE    0x10130 131/* Registers (Read-only) */132#define XREG_ADC_ENV      0x00133#define XREG_QUALITY      0x01134#define XREG_FRAME_LINES  0x02135#define XREG_HSYNC_FREQ   0x03136#define XREG_LOCK         0x04137#define XREG_FREQ_ERROR   0x05138#define XREG_SNR          0x06139#define XREG_VERSION      0x07140#define XREG_PRODUCT_ID   0x08141#define XREG_SIGNAL_LEVEL 0x0A142#define XREG_NOISE_LEVEL  0x0B143 144/*145   Basic firmware description. This will remain with146   the driver for documentation purposes.147 148   This represents an I2C firmware file encoded as a149   string of unsigned char. Format is as follows:150 151   char[0  ]=len0_MSB  -> len = len_MSB * 256 + len_LSB152   char[1  ]=len0_LSB  -> length of first write transaction153   char[2  ]=data0 -> first byte to be sent154   char[3  ]=data1155   char[4  ]=data2156   char[   ]=...157   char[M  ]=dataN  -> last byte to be sent158   char[M+1]=len1_MSB  -> len = len_MSB * 256 + len_LSB159   char[M+2]=len1_LSB  -> length of second write transaction160   char[M+3]=data0161   char[M+4]=data1162   ...163   etc.164 165   The [len] value should be interpreted as follows:166 167   len= len_MSB _ len_LSB168   len=1111_1111_1111_1111   : End of I2C_SEQUENCE169   len=0000_0000_0000_0000   : Reset command: Do hardware reset170   len=0NNN_NNNN_NNNN_NNNN   : Normal transaction: number of bytes = {1:32767)171   len=1WWW_WWWW_WWWW_WWWW   : Wait command: wait for {1:32767} ms172 173   For the RESET and WAIT commands, the two following bytes will contain174   immediately the length of the following transaction.175*/176 177struct XC_TV_STANDARD {178	const char  *Name;179	u16	    audio_mode;180	u16	    video_mode;181	u16	    int_freq;182};183 184/* Tuner standards */185#define XC4000_MN_NTSC_PAL_BTSC		0186#define XC4000_MN_NTSC_PAL_A2		1187#define XC4000_MN_NTSC_PAL_EIAJ		2188#define XC4000_MN_NTSC_PAL_Mono		3189#define XC4000_BG_PAL_A2		4190#define XC4000_BG_PAL_NICAM		5191#define XC4000_BG_PAL_MONO		6192#define XC4000_I_PAL_NICAM		7193#define XC4000_I_PAL_NICAM_MONO		8194#define XC4000_DK_PAL_A2		9195#define XC4000_DK_PAL_NICAM		10196#define XC4000_DK_PAL_MONO		11197#define XC4000_DK_SECAM_A2DK1		12198#define XC4000_DK_SECAM_A2LDK3		13199#define XC4000_DK_SECAM_A2MONO		14200#define XC4000_DK_SECAM_NICAM		15201#define XC4000_L_SECAM_NICAM		16202#define XC4000_LC_SECAM_NICAM		17203#define XC4000_DTV6			18204#define XC4000_DTV8			19205#define XC4000_DTV7_8			20206#define XC4000_DTV7			21207#define XC4000_FM_Radio_INPUT2		22208#define XC4000_FM_Radio_INPUT1		23209 210static struct XC_TV_STANDARD xc4000_standard[MAX_TV_STANDARD] = {211	{"M/N-NTSC/PAL-BTSC",	0x0000, 0x80A0, 4500},212	{"M/N-NTSC/PAL-A2",	0x0000, 0x80A0, 4600},213	{"M/N-NTSC/PAL-EIAJ",	0x0040, 0x80A0, 4500},214	{"M/N-NTSC/PAL-Mono",	0x0078, 0x80A0, 4500},215	{"B/G-PAL-A2",		0x0000, 0x8159, 5640},216	{"B/G-PAL-NICAM",	0x0004, 0x8159, 5740},217	{"B/G-PAL-MONO",	0x0078, 0x8159, 5500},218	{"I-PAL-NICAM",		0x0080, 0x8049, 6240},219	{"I-PAL-NICAM-MONO",	0x0078, 0x8049, 6000},220	{"D/K-PAL-A2",		0x0000, 0x8049, 6380},221	{"D/K-PAL-NICAM",	0x0080, 0x8049, 6200},222	{"D/K-PAL-MONO",	0x0078, 0x8049, 6500},223	{"D/K-SECAM-A2 DK1",	0x0000, 0x8049, 6340},224	{"D/K-SECAM-A2 L/DK3",	0x0000, 0x8049, 6000},225	{"D/K-SECAM-A2 MONO",	0x0078, 0x8049, 6500},226	{"D/K-SECAM-NICAM",	0x0080, 0x8049, 6200},227	{"L-SECAM-NICAM",	0x8080, 0x0009, 6200},228	{"L'-SECAM-NICAM",	0x8080, 0x4009, 6200},229	{"DTV6",		0x00C0, 0x8002,    0},230	{"DTV8",		0x00C0, 0x800B,    0},231	{"DTV7/8",		0x00C0, 0x801B,    0},232	{"DTV7",		0x00C0, 0x8007,    0},233	{"FM Radio-INPUT2",	0x0008, 0x9800, 10700},234	{"FM Radio-INPUT1",	0x0008, 0x9000, 10700}235};236 237static int xc4000_readreg(struct xc4000_priv *priv, u16 reg, u16 *val);238static int xc4000_tuner_reset(struct dvb_frontend *fe);239static void xc_debug_dump(struct xc4000_priv *priv);240 241static int xc_send_i2c_data(struct xc4000_priv *priv, u8 *buf, int len)242{243	struct i2c_msg msg = { .addr = priv->i2c_props.addr,244			       .flags = 0, .buf = buf, .len = len };245	if (i2c_transfer(priv->i2c_props.adap, &msg, 1) != 1) {246		if (priv->ignore_i2c_write_errors == 0) {247			printk(KERN_ERR "xc4000: I2C write failed (len=%i)\n",248			       len);249			if (len == 4) {250				printk(KERN_ERR "bytes %*ph\n", 4, buf);251			}252			return -EREMOTEIO;253		}254	}255	return 0;256}257 258static int xc4000_tuner_reset(struct dvb_frontend *fe)259{260	struct xc4000_priv *priv = fe->tuner_priv;261	int ret;262 263	dprintk(1, "%s()\n", __func__);264 265	if (fe->callback) {266		ret = fe->callback(((fe->dvb) && (fe->dvb->priv)) ?267					   fe->dvb->priv :268					   priv->i2c_props.adap->algo_data,269					   DVB_FRONTEND_COMPONENT_TUNER,270					   XC4000_TUNER_RESET, 0);271		if (ret) {272			printk(KERN_ERR "xc4000: reset failed\n");273			return -EREMOTEIO;274		}275	} else {276		printk(KERN_ERR "xc4000: no tuner reset callback function, fatal\n");277		return -EINVAL;278	}279	return 0;280}281 282static int xc_write_reg(struct xc4000_priv *priv, u16 regAddr, u16 i2cData)283{284	u8 buf[4];285 286	buf[0] = (regAddr >> 8) & 0xFF;287	buf[1] = regAddr & 0xFF;288	buf[2] = (i2cData >> 8) & 0xFF;289	buf[3] = i2cData & 0xFF;290 291	return xc_send_i2c_data(priv, buf, 4);292}293 294static int xc_load_i2c_sequence(struct dvb_frontend *fe, const u8 *i2c_sequence)295{296	struct xc4000_priv *priv = fe->tuner_priv;297 298	int i, nbytes_to_send, result;299	unsigned int len, pos, index;300	u8 buf[XC_MAX_I2C_WRITE_LENGTH];301 302	index = 0;303	while ((i2c_sequence[index] != 0xFF) ||304		(i2c_sequence[index + 1] != 0xFF)) {305		len = i2c_sequence[index] * 256 + i2c_sequence[index+1];306		if (len == 0x0000) {307			/* RESET command */308			/* NOTE: this is ignored, as the reset callback was */309			/* already called by check_firmware() */310			index += 2;311		} else if (len & 0x8000) {312			/* WAIT command */313			msleep(len & 0x7FFF);314			index += 2;315		} else {316			/* Send i2c data whilst ensuring individual transactions317			 * do not exceed XC_MAX_I2C_WRITE_LENGTH bytes.318			 */319			index += 2;320			buf[0] = i2c_sequence[index];321			buf[1] = i2c_sequence[index + 1];322			pos = 2;323			while (pos < len) {324				if ((len - pos) > XC_MAX_I2C_WRITE_LENGTH - 2)325					nbytes_to_send =326						XC_MAX_I2C_WRITE_LENGTH;327				else328					nbytes_to_send = (len - pos + 2);329				for (i = 2; i < nbytes_to_send; i++) {330					buf[i] = i2c_sequence[index + pos +331						i - 2];332				}333				result = xc_send_i2c_data(priv, buf,334					nbytes_to_send);335 336				if (result != 0)337					return result;338 339				pos += nbytes_to_send - 2;340			}341			index += len;342		}343	}344	return 0;345}346 347static int xc_set_tv_standard(struct xc4000_priv *priv,348	u16 video_mode, u16 audio_mode)349{350	int ret;351	dprintk(1, "%s(0x%04x,0x%04x)\n", __func__, video_mode, audio_mode);352	dprintk(1, "%s() Standard = %s\n",353		__func__,354		xc4000_standard[priv->video_standard].Name);355 356	/* Don't complain when the request fails because of i2c stretching */357	priv->ignore_i2c_write_errors = 1;358 359	ret = xc_write_reg(priv, XREG_VIDEO_MODE, video_mode);360	if (ret == 0)361		ret = xc_write_reg(priv, XREG_AUDIO_MODE, audio_mode);362 363	priv->ignore_i2c_write_errors = 0;364 365	return ret;366}367 368static int xc_set_signal_source(struct xc4000_priv *priv, u16 rf_mode)369{370	dprintk(1, "%s(%d) Source = %s\n", __func__, rf_mode,371		rf_mode == XC_RF_MODE_AIR ? "ANTENNA" : "CABLE");372 373	if ((rf_mode != XC_RF_MODE_AIR) && (rf_mode != XC_RF_MODE_CABLE)) {374		rf_mode = XC_RF_MODE_CABLE;375		printk(KERN_ERR376			"%s(), Invalid mode, defaulting to CABLE",377			__func__);378	}379	return xc_write_reg(priv, XREG_SIGNALSOURCE, rf_mode);380}381 382static const struct dvb_tuner_ops xc4000_tuner_ops;383 384static int xc_set_rf_frequency(struct xc4000_priv *priv, u32 freq_hz)385{386	u16 freq_code;387 388	dprintk(1, "%s(%u)\n", __func__, freq_hz);389 390	if ((freq_hz > xc4000_tuner_ops.info.frequency_max_hz) ||391	    (freq_hz < xc4000_tuner_ops.info.frequency_min_hz))392		return -EINVAL;393 394	freq_code = (u16)(freq_hz / 15625);395 396	/* WAS: Starting in firmware version 1.1.44, Xceive recommends using the397	   FINERFREQ for all normal tuning (the doc indicates reg 0x03 should398	   only be used for fast scanning for channel lock) */399	/* WAS: XREG_FINERFREQ */400	return xc_write_reg(priv, XREG_RF_FREQ, freq_code);401}402 403static int xc_get_adc_envelope(struct xc4000_priv *priv, u16 *adc_envelope)404{405	return xc4000_readreg(priv, XREG_ADC_ENV, adc_envelope);406}407 408static int xc_get_frequency_error(struct xc4000_priv *priv, u32 *freq_error_hz)409{410	int result;411	u16 regData;412	u32 tmp;413 414	result = xc4000_readreg(priv, XREG_FREQ_ERROR, &regData);415	if (result != 0)416		return result;417 418	tmp = (u32)regData & 0xFFFFU;419	tmp = (tmp < 0x8000U ? tmp : 0x10000U - tmp);420	(*freq_error_hz) = tmp * 15625;421	return result;422}423 424static int xc_get_lock_status(struct xc4000_priv *priv, u16 *lock_status)425{426	return xc4000_readreg(priv, XREG_LOCK, lock_status);427}428 429static int xc_get_version(struct xc4000_priv *priv,430	u8 *hw_majorversion, u8 *hw_minorversion,431	u8 *fw_majorversion, u8 *fw_minorversion)432{433	u16 data;434	int result;435 436	result = xc4000_readreg(priv, XREG_VERSION, &data);437	if (result != 0)438		return result;439 440	(*hw_majorversion) = (data >> 12) & 0x0F;441	(*hw_minorversion) = (data >>  8) & 0x0F;442	(*fw_majorversion) = (data >>  4) & 0x0F;443	(*fw_minorversion) = data & 0x0F;444 445	return 0;446}447 448static int xc_get_hsync_freq(struct xc4000_priv *priv, u32 *hsync_freq_hz)449{450	u16 regData;451	int result;452 453	result = xc4000_readreg(priv, XREG_HSYNC_FREQ, &regData);454	if (result != 0)455		return result;456 457	(*hsync_freq_hz) = ((regData & 0x0fff) * 763)/100;458	return result;459}460 461static int xc_get_frame_lines(struct xc4000_priv *priv, u16 *frame_lines)462{463	return xc4000_readreg(priv, XREG_FRAME_LINES, frame_lines);464}465 466static int xc_get_quality(struct xc4000_priv *priv, u16 *quality)467{468	return xc4000_readreg(priv, XREG_QUALITY, quality);469}470 471static int xc_get_signal_level(struct xc4000_priv *priv, u16 *signal)472{473	return xc4000_readreg(priv, XREG_SIGNAL_LEVEL, signal);474}475 476static int xc_get_noise_level(struct xc4000_priv *priv, u16 *noise)477{478	return xc4000_readreg(priv, XREG_NOISE_LEVEL, noise);479}480 481static u16 xc_wait_for_lock(struct xc4000_priv *priv)482{483	u16	lock_state = 0;484	int	watchdog_count = 40;485 486	while ((lock_state == 0) && (watchdog_count > 0)) {487		xc_get_lock_status(priv, &lock_state);488		if (lock_state != 1) {489			msleep(5);490			watchdog_count--;491		}492	}493	return lock_state;494}495 496static int xc_tune_channel(struct xc4000_priv *priv, u32 freq_hz)497{498	int	found = 1;499	int	result;500 501	dprintk(1, "%s(%u)\n", __func__, freq_hz);502 503	/* Don't complain when the request fails because of i2c stretching */504	priv->ignore_i2c_write_errors = 1;505	result = xc_set_rf_frequency(priv, freq_hz);506	priv->ignore_i2c_write_errors = 0;507 508	if (result != 0)509		return 0;510 511	/* wait for lock only in analog TV mode */512	if ((priv->cur_fw.type & (FM | DTV6 | DTV7 | DTV78 | DTV8)) == 0) {513		if (xc_wait_for_lock(priv) != 1)514			found = 0;515	}516 517	/* Wait for stats to stabilize.518	 * Frame Lines needs two frame times after initial lock519	 * before it is valid.520	 */521	msleep(debug ? 100 : 10);522 523	if (debug)524		xc_debug_dump(priv);525 526	return found;527}528 529static int xc4000_readreg(struct xc4000_priv *priv, u16 reg, u16 *val)530{531	u8 buf[2] = { reg >> 8, reg & 0xff };532	u8 bval[2] = { 0, 0 };533	struct i2c_msg msg[2] = {534		{ .addr = priv->i2c_props.addr,535			.flags = 0, .buf = &buf[0], .len = 2 },536		{ .addr = priv->i2c_props.addr,537			.flags = I2C_M_RD, .buf = &bval[0], .len = 2 },538	};539 540	if (i2c_transfer(priv->i2c_props.adap, msg, 2) != 2) {541		printk(KERN_ERR "xc4000: I2C read failed\n");542		return -EREMOTEIO;543	}544 545	*val = (bval[0] << 8) | bval[1];546	return 0;547}548 549#define dump_firm_type(t)	dump_firm_type_and_int_freq(t, 0)550static void dump_firm_type_and_int_freq(unsigned int type, u16 int_freq)551{552	if (type & BASE)553		printk(KERN_CONT "BASE ");554	if (type & INIT1)555		printk(KERN_CONT "INIT1 ");556	if (type & F8MHZ)557		printk(KERN_CONT "F8MHZ ");558	if (type & MTS)559		printk(KERN_CONT "MTS ");560	if (type & D2620)561		printk(KERN_CONT "D2620 ");562	if (type & D2633)563		printk(KERN_CONT "D2633 ");564	if (type & DTV6)565		printk(KERN_CONT "DTV6 ");566	if (type & QAM)567		printk(KERN_CONT "QAM ");568	if (type & DTV7)569		printk(KERN_CONT "DTV7 ");570	if (type & DTV78)571		printk(KERN_CONT "DTV78 ");572	if (type & DTV8)573		printk(KERN_CONT "DTV8 ");574	if (type & FM)575		printk(KERN_CONT "FM ");576	if (type & INPUT1)577		printk(KERN_CONT "INPUT1 ");578	if (type & LCD)579		printk(KERN_CONT "LCD ");580	if (type & NOGD)581		printk(KERN_CONT "NOGD ");582	if (type & MONO)583		printk(KERN_CONT "MONO ");584	if (type & ATSC)585		printk(KERN_CONT "ATSC ");586	if (type & IF)587		printk(KERN_CONT "IF ");588	if (type & LG60)589		printk(KERN_CONT "LG60 ");590	if (type & ATI638)591		printk(KERN_CONT "ATI638 ");592	if (type & OREN538)593		printk(KERN_CONT "OREN538 ");594	if (type & OREN36)595		printk(KERN_CONT "OREN36 ");596	if (type & TOYOTA388)597		printk(KERN_CONT "TOYOTA388 ");598	if (type & TOYOTA794)599		printk(KERN_CONT "TOYOTA794 ");600	if (type & DIBCOM52)601		printk(KERN_CONT "DIBCOM52 ");602	if (type & ZARLINK456)603		printk(KERN_CONT "ZARLINK456 ");604	if (type & CHINA)605		printk(KERN_CONT "CHINA ");606	if (type & F6MHZ)607		printk(KERN_CONT "F6MHZ ");608	if (type & INPUT2)609		printk(KERN_CONT "INPUT2 ");610	if (type & SCODE)611		printk(KERN_CONT "SCODE ");612	if (type & HAS_IF)613		printk(KERN_CONT "HAS_IF_%d ", int_freq);614}615 616static int seek_firmware(struct dvb_frontend *fe, unsigned int type,617			 v4l2_std_id *id)618{619	struct xc4000_priv *priv = fe->tuner_priv;620	int		i, best_i = -1;621	unsigned int	best_nr_diffs = 255U;622 623	if (!priv->firm) {624		printk(KERN_ERR "Error! firmware not loaded\n");625		return -EINVAL;626	}627 628	if (((type & ~SCODE) == 0) && (*id == 0))629		*id = V4L2_STD_PAL;630 631	/* Seek for generic video standard match */632	for (i = 0; i < priv->firm_size; i++) {633		v4l2_std_id	id_diff_mask =634			(priv->firm[i].id ^ (*id)) & (*id);635		unsigned int	type_diff_mask =636			(priv->firm[i].type ^ type)637			& (BASE_TYPES | DTV_TYPES | LCD | NOGD | MONO | SCODE);638		unsigned int	nr_diffs;639 640		if (type_diff_mask641		    & (BASE | INIT1 | FM | DTV6 | DTV7 | DTV78 | DTV8 | SCODE))642			continue;643 644		nr_diffs = hweight64(id_diff_mask) + hweight32(type_diff_mask);645		if (!nr_diffs)	/* Supports all the requested standards */646			goto found;647 648		if (nr_diffs < best_nr_diffs) {649			best_nr_diffs = nr_diffs;650			best_i = i;651		}652	}653 654	/* FIXME: Would make sense to seek for type "hint" match ? */655	if (best_i < 0) {656		i = -ENOENT;657		goto ret;658	}659 660	if (best_nr_diffs > 0U) {661		printk(KERN_WARNING662		       "Selecting best matching firmware (%u bits differ) for type=(%x), id %016llx:\n",663		       best_nr_diffs, type, (unsigned long long)*id);664		i = best_i;665	}666 667found:668	*id = priv->firm[i].id;669 670ret:671	if (debug) {672		printk(KERN_DEBUG "%s firmware for type=",673		       (i < 0) ? "Can't find" : "Found");674		dump_firm_type(type);675		printk(KERN_DEBUG "(%x), id %016llx.\n", type, (unsigned long long)*id);676	}677	return i;678}679 680static int load_firmware(struct dvb_frontend *fe, unsigned int type,681			 v4l2_std_id *id)682{683	struct xc4000_priv *priv = fe->tuner_priv;684	int                pos, rc;685	unsigned char      *p;686 687	pos = seek_firmware(fe, type, id);688	if (pos < 0)689		return pos;690 691	p = priv->firm[pos].ptr;692 693	/* Don't complain when the request fails because of i2c stretching */694	priv->ignore_i2c_write_errors = 1;695 696	rc = xc_load_i2c_sequence(fe, p);697 698	priv->ignore_i2c_write_errors = 0;699 700	return rc;701}702 703static int xc4000_fwupload(struct dvb_frontend *fe)704{705	struct xc4000_priv *priv = fe->tuner_priv;706	const struct firmware *fw   = NULL;707	const unsigned char   *p, *endp;708	int                   rc = 0;709	int		      n, n_array;710	char		      name[33];711	const char	      *fname;712 713	if (firmware_name[0] != '\0') {714		fname = firmware_name;715 716		dprintk(1, "Reading custom firmware %s\n", fname);717		rc = request_firmware(&fw, fname,718				      priv->i2c_props.adap->dev.parent);719	} else {720		fname = XC4000_DEFAULT_FIRMWARE_NEW;721		dprintk(1, "Trying to read firmware %s\n", fname);722		rc = request_firmware(&fw, fname,723				      priv->i2c_props.adap->dev.parent);724		if (rc == -ENOENT) {725			fname = XC4000_DEFAULT_FIRMWARE;726			dprintk(1, "Trying to read firmware %s\n", fname);727			rc = request_firmware(&fw, fname,728					      priv->i2c_props.adap->dev.parent);729		}730	}731 732	if (rc < 0) {733		if (rc == -ENOENT)734			printk(KERN_ERR "Error: firmware %s not found.\n", fname);735		else736			printk(KERN_ERR "Error %d while requesting firmware %s\n",737			       rc, fname);738 739		return rc;740	}741	dprintk(1, "Loading Firmware: %s\n", fname);742 743	p = fw->data;744	endp = p + fw->size;745 746	if (fw->size < sizeof(name) - 1 + 2 + 2) {747		printk(KERN_ERR "Error: firmware file %s has invalid size!\n",748		       fname);749		goto corrupt;750	}751 752	memcpy(name, p, sizeof(name) - 1);753	name[sizeof(name) - 1] = '\0';754	p += sizeof(name) - 1;755 756	priv->firm_version = get_unaligned_le16(p);757	p += 2;758 759	n_array = get_unaligned_le16(p);760	p += 2;761 762	dprintk(1, "Loading %d firmware images from %s, type: %s, ver %d.%d\n",763		n_array, fname, name,764		priv->firm_version >> 8, priv->firm_version & 0xff);765 766	priv->firm = kcalloc(n_array, sizeof(*priv->firm), GFP_KERNEL);767	if (priv->firm == NULL) {768		printk(KERN_ERR "Not enough memory to load firmware file.\n");769		rc = -ENOMEM;770		goto done;771	}772	priv->firm_size = n_array;773 774	n = -1;775	while (p < endp) {776		__u32 type, size;777		v4l2_std_id id;778		__u16 int_freq = 0;779 780		n++;781		if (n >= n_array) {782			printk(KERN_ERR "More firmware images in file than were expected!\n");783			goto corrupt;784		}785 786		/* Checks if there's enough bytes to read */787		if (endp - p < sizeof(type) + sizeof(id) + sizeof(size))788			goto header;789 790		type = get_unaligned_le32(p);791		p += sizeof(type);792 793		id = get_unaligned_le64(p);794		p += sizeof(id);795 796		if (type & HAS_IF) {797			int_freq = get_unaligned_le16(p);798			p += sizeof(int_freq);799			if (endp - p < sizeof(size))800				goto header;801		}802 803		size = get_unaligned_le32(p);804		p += sizeof(size);805 806		if (!size || size > endp - p) {807			printk(KERN_ERR "Firmware type (%x), id %llx is corrupted (size=%zd, expected %d)\n",808			       type, (unsigned long long)id,809			       endp - p, size);810			goto corrupt;811		}812 813		priv->firm[n].ptr = kmemdup(p, size, GFP_KERNEL);814		if (priv->firm[n].ptr == NULL) {815			printk(KERN_ERR "Not enough memory to load firmware file.\n");816			rc = -ENOMEM;817			goto done;818		}819 820		if (debug) {821			printk(KERN_DEBUG "Reading firmware type ");822			dump_firm_type_and_int_freq(type, int_freq);823			printk(KERN_DEBUG "(%x), id %llx, size=%d.\n",824			       type, (unsigned long long)id, size);825		}826 827		priv->firm[n].type = type;828		priv->firm[n].id   = id;829		priv->firm[n].size = size;830		priv->firm[n].int_freq = int_freq;831 832		p += size;833	}834 835	if (n + 1 != priv->firm_size) {836		printk(KERN_ERR "Firmware file is incomplete!\n");837		goto corrupt;838	}839 840	goto done;841 842header:843	printk(KERN_ERR "Firmware header is incomplete!\n");844corrupt:845	rc = -EINVAL;846	printk(KERN_ERR "Error: firmware file is corrupted!\n");847 848done:849	release_firmware(fw);850	if (rc == 0)851		dprintk(1, "Firmware files loaded.\n");852 853	return rc;854}855 856static int load_scode(struct dvb_frontend *fe, unsigned int type,857			 v4l2_std_id *id, __u16 int_freq, int scode)858{859	struct xc4000_priv *priv = fe->tuner_priv;860	int		pos, rc;861	unsigned char	*p;862	u8		scode_buf[13];863	u8		indirect_mode[5];864 865	dprintk(1, "%s called int_freq=%d\n", __func__, int_freq);866 867	if (!int_freq) {868		pos = seek_firmware(fe, type, id);869		if (pos < 0)870			return pos;871	} else {872		for (pos = 0; pos < priv->firm_size; pos++) {873			if ((priv->firm[pos].int_freq == int_freq) &&874			    (priv->firm[pos].type & HAS_IF))875				break;876		}877		if (pos == priv->firm_size)878			return -ENOENT;879	}880 881	p = priv->firm[pos].ptr;882 883	if (priv->firm[pos].size != 12 * 16 || scode >= 16)884		return -EINVAL;885	p += 12 * scode;886 887	if (debug) {888		tuner_info("Loading SCODE for type=");889		dump_firm_type_and_int_freq(priv->firm[pos].type,890					    priv->firm[pos].int_freq);891		printk(KERN_CONT "(%x), id %016llx.\n", priv->firm[pos].type,892		       (unsigned long long)*id);893	}894 895	scode_buf[0] = 0x00;896	memcpy(&scode_buf[1], p, 12);897 898	/* Enter direct-mode */899	rc = xc_write_reg(priv, XREG_DIRECTSITTING_MODE, 0);900	if (rc < 0) {901		printk(KERN_ERR "failed to put device into direct mode!\n");902		return -EIO;903	}904 905	rc = xc_send_i2c_data(priv, scode_buf, 13);906	if (rc != 0) {907		/* Even if the send failed, make sure we set back to indirect908		   mode */909		printk(KERN_ERR "Failed to set scode %d\n", rc);910	}911 912	/* Switch back to indirect-mode */913	memset(indirect_mode, 0, sizeof(indirect_mode));914	indirect_mode[4] = 0x88;915	xc_send_i2c_data(priv, indirect_mode, sizeof(indirect_mode));916	msleep(10);917 918	return 0;919}920 921static int check_firmware(struct dvb_frontend *fe, unsigned int type,922			  v4l2_std_id std, __u16 int_freq)923{924	struct xc4000_priv         *priv = fe->tuner_priv;925	struct firmware_properties new_fw;926	int			   rc = 0, is_retry = 0;927	u16			   hwmodel;928	v4l2_std_id		   std0;929	u8			   hw_major = 0, hw_minor = 0, fw_major = 0, fw_minor = 0;930 931	dprintk(1, "%s called\n", __func__);932 933	if (!priv->firm) {934		rc = xc4000_fwupload(fe);935		if (rc < 0)936			return rc;937	}938 939retry:940	new_fw.type = type;941	new_fw.id = std;942	new_fw.std_req = std;943	new_fw.scode_table = SCODE;944	new_fw.scode_nr = 0;945	new_fw.int_freq = int_freq;946 947	dprintk(1, "checking firmware, user requested type=");948	if (debug) {949		dump_firm_type(new_fw.type);950		printk(KERN_CONT "(%x), id %016llx, ", new_fw.type,951		       (unsigned long long)new_fw.std_req);952		if (!int_freq)953			printk(KERN_CONT "scode_tbl ");954		else955			printk(KERN_CONT "int_freq %d, ", new_fw.int_freq);956		printk(KERN_CONT "scode_nr %d\n", new_fw.scode_nr);957	}958 959	/* No need to reload base firmware if it matches */960	if (priv->cur_fw.type & BASE) {961		dprintk(1, "BASE firmware not changed.\n");962		goto skip_base;963	}964 965	/* Updating BASE - forget about all currently loaded firmware */966	memset(&priv->cur_fw, 0, sizeof(priv->cur_fw));967 968	/* Reset is needed before loading firmware */969	rc = xc4000_tuner_reset(fe);970	if (rc < 0)971		goto fail;972 973	/* BASE firmwares are all std0 */974	std0 = 0;975	rc = load_firmware(fe, BASE, &std0);976	if (rc < 0) {977		printk(KERN_ERR "Error %d while loading base firmware\n", rc);978		goto fail;979	}980 981	/* Load INIT1, if needed */982	dprintk(1, "Load init1 firmware, if exists\n");983 984	rc = load_firmware(fe, BASE | INIT1, &std0);985	if (rc == -ENOENT)986		rc = load_firmware(fe, BASE | INIT1, &std0);987	if (rc < 0 && rc != -ENOENT) {988		tuner_err("Error %d while loading init1 firmware\n",989			  rc);990		goto fail;991	}992 993skip_base:994	/*995	 * No need to reload standard specific firmware if base firmware996	 * was not reloaded and requested video standards have not changed.997	 */998	if (priv->cur_fw.type == (BASE | new_fw.type) &&999	    priv->cur_fw.std_req == std) {1000		dprintk(1, "Std-specific firmware already loaded.\n");1001		goto skip_std_specific;1002	}1003 1004	/* Reloading std-specific firmware forces a SCODE update */1005	priv->cur_fw.scode_table = 0;1006 1007	/* Load the standard firmware */1008	rc = load_firmware(fe, new_fw.type, &new_fw.id);1009 1010	if (rc < 0)1011		goto fail;1012 1013skip_std_specific:1014	if (priv->cur_fw.scode_table == new_fw.scode_table &&1015	    priv->cur_fw.scode_nr == new_fw.scode_nr) {1016		dprintk(1, "SCODE firmware already loaded.\n");1017		goto check_device;1018	}1019 1020	/* Load SCODE firmware, if exists */1021	rc = load_scode(fe, new_fw.type | new_fw.scode_table, &new_fw.id,1022			new_fw.int_freq, new_fw.scode_nr);1023	if (rc != 0)1024		dprintk(1, "load scode failed %d\n", rc);1025 1026check_device:1027	if (xc4000_readreg(priv, XREG_PRODUCT_ID, &hwmodel) < 0) {1028		printk(KERN_ERR "Unable to read tuner registers.\n");1029		goto fail;1030	}1031 1032	if (xc_get_version(priv, &hw_major, &hw_minor, &fw_major,1033			   &fw_minor) != 0) {1034		printk(KERN_ERR "Unable to read tuner registers.\n");1035		goto fail;1036	}1037 1038	dprintk(1, "Device is Xceive %d version %d.%d, firmware version %d.%d\n",1039		hwmodel, hw_major, hw_minor, fw_major, fw_minor);1040 1041	/* Check firmware version against what we downloaded. */1042	if (priv->firm_version != ((fw_major << 8) | fw_minor)) {1043		printk(KERN_WARNING1044		       "Incorrect readback of firmware version %d.%d.\n",1045		       fw_major, fw_minor);1046		goto fail;1047	}1048 1049	/* Check that the tuner hardware model remains consistent over time. */1050	if (priv->hwmodel == 0 &&1051	    (hwmodel == XC_PRODUCT_ID_XC4000 ||1052	     hwmodel == XC_PRODUCT_ID_XC4100)) {1053		priv->hwmodel = hwmodel;1054		priv->hwvers = (hw_major << 8) | hw_minor;1055	} else if (priv->hwmodel == 0 || priv->hwmodel != hwmodel ||1056		   priv->hwvers != ((hw_major << 8) | hw_minor)) {1057		printk(KERN_WARNING1058		       "Read invalid device hardware information - tuner hung?\n");1059		goto fail;1060	}1061 1062	priv->cur_fw = new_fw;1063 1064	/*1065	 * By setting BASE in cur_fw.type only after successfully loading all1066	 * firmwares, we can:1067	 * 1. Identify that BASE firmware with type=0 has been loaded;1068	 * 2. Tell whether BASE firmware was just changed the next time through.1069	 */1070	priv->cur_fw.type |= BASE;1071 1072	return 0;1073 1074fail:1075	memset(&priv->cur_fw, 0, sizeof(priv->cur_fw));1076	if (!is_retry) {1077		msleep(50);1078		is_retry = 1;1079		dprintk(1, "Retrying firmware load\n");1080		goto retry;1081	}1082 1083	if (rc == -ENOENT)1084		rc = -EINVAL;1085	return rc;1086}1087 1088static void xc_debug_dump(struct xc4000_priv *priv)1089{1090	u16	adc_envelope;1091	u32	freq_error_hz = 0;1092	u16	lock_status;1093	u32	hsync_freq_hz = 0;1094	u16	frame_lines;1095	u16	quality;1096	u16	signal = 0;1097	u16	noise = 0;1098	u8	hw_majorversion = 0, hw_minorversion = 0;1099	u8	fw_majorversion = 0, fw_minorversion = 0;1100 1101	xc_get_adc_envelope(priv, &adc_envelope);1102	dprintk(1, "*** ADC envelope (0-1023) = %d\n", adc_envelope);1103 1104	xc_get_frequency_error(priv, &freq_error_hz);1105	dprintk(1, "*** Frequency error = %d Hz\n", freq_error_hz);1106 1107	xc_get_lock_status(priv, &lock_status);1108	dprintk(1, "*** Lock status (0-Wait, 1-Locked, 2-No-signal) = %d\n",1109		lock_status);1110 1111	xc_get_version(priv, &hw_majorversion, &hw_minorversion,1112		       &fw_majorversion, &fw_minorversion);1113	dprintk(1, "*** HW: V%02x.%02x, FW: V%02x.%02x\n",1114		hw_majorversion, hw_minorversion,1115		fw_majorversion, fw_minorversion);1116 1117	if (priv->video_standard < XC4000_DTV6) {1118		xc_get_hsync_freq(priv, &hsync_freq_hz);1119		dprintk(1, "*** Horizontal sync frequency = %d Hz\n",1120			hsync_freq_hz);1121 1122		xc_get_frame_lines(priv, &frame_lines);1123		dprintk(1, "*** Frame lines = %d\n", frame_lines);1124	}1125 1126	xc_get_quality(priv, &quality);1127	dprintk(1, "*** Quality (0:<8dB, 7:>56dB) = %d\n", quality);1128 1129	xc_get_signal_level(priv, &signal);1130	dprintk(1, "*** Signal level = -%ddB (%d)\n", signal >> 8, signal);1131 1132	xc_get_noise_level(priv, &noise);1133	dprintk(1, "*** Noise level = %ddB (%d)\n", noise >> 8, noise);1134}1135 1136static int xc4000_set_params(struct dvb_frontend *fe)1137{1138	struct dtv_frontend_properties *c = &fe->dtv_property_cache;1139	u32 delsys = c->delivery_system;1140	u32 bw = c->bandwidth_hz;1141	struct xc4000_priv *priv = fe->tuner_priv;1142	unsigned int type;1143	int	ret = -EREMOTEIO;1144 1145	dprintk(1, "%s() frequency=%d (Hz)\n", __func__, c->frequency);1146 1147	mutex_lock(&priv->lock);1148 1149	switch (delsys) {1150	case SYS_ATSC:1151		dprintk(1, "%s() VSB modulation\n", __func__);1152		priv->rf_mode = XC_RF_MODE_AIR;1153		priv->freq_offset = 1750000;1154		priv->video_standard = XC4000_DTV6;1155		type = DTV6;1156		break;1157	case SYS_DVBC_ANNEX_B:1158		dprintk(1, "%s() QAM modulation\n", __func__);1159		priv->rf_mode = XC_RF_MODE_CABLE;1160		priv->freq_offset = 1750000;1161		priv->video_standard = XC4000_DTV6;1162		type = DTV6;1163		break;1164	case SYS_DVBT:1165	case SYS_DVBT2:1166		dprintk(1, "%s() OFDM\n", __func__);1167		if (bw == 0) {1168			if (c->frequency < 400000000) {1169				priv->freq_offset = 2250000;1170			} else {1171				priv->freq_offset = 2750000;1172			}1173			priv->video_standard = XC4000_DTV7_8;1174			type = DTV78;1175		} else if (bw <= 6000000) {1176			priv->video_standard = XC4000_DTV6;1177			priv->freq_offset = 1750000;1178			type = DTV6;1179		} else if (bw <= 7000000) {1180			priv->video_standard = XC4000_DTV7;1181			priv->freq_offset = 2250000;1182			type = DTV7;1183		} else {1184			priv->video_standard = XC4000_DTV8;1185			priv->freq_offset = 2750000;1186			type = DTV8;1187		}1188		priv->rf_mode = XC_RF_MODE_AIR;1189		break;1190	default:1191		printk(KERN_ERR "xc4000 delivery system not supported!\n");1192		ret = -EINVAL;1193		goto fail;1194	}1195 1196	priv->freq_hz = c->frequency - priv->freq_offset;1197 1198	dprintk(1, "%s() frequency=%d (compensated)\n",1199		__func__, priv->freq_hz);1200 1201	/* Make sure the correct firmware type is loaded */1202	if (check_firmware(fe, type, 0, priv->if_khz) != 0)1203		goto fail;1204 1205	priv->bandwidth = c->bandwidth_hz;1206 1207	ret = xc_set_signal_source(priv, priv->rf_mode);1208	if (ret != 0) {1209		printk(KERN_ERR "xc4000: xc_set_signal_source(%d) failed\n",1210		       priv->rf_mode);1211		goto fail;1212	} else {1213		u16	video_mode, audio_mode;1214		video_mode = xc4000_standard[priv->video_standard].video_mode;1215		audio_mode = xc4000_standard[priv->video_standard].audio_mode;1216		if (type == DTV6 && priv->firm_version != 0x0102)1217			video_mode |= 0x0001;1218		ret = xc_set_tv_standard(priv, video_mode, audio_mode);1219		if (ret != 0) {1220			printk(KERN_ERR "xc4000: xc_set_tv_standard failed\n");1221			/* DJH - do not return when it fails... */1222			/* goto fail; */1223		}1224	}1225 1226	if (xc_write_reg(priv, XREG_D_CODE, 0) == 0)1227		ret = 0;1228	if (priv->dvb_amplitude != 0) {1229		if (xc_write_reg(priv, XREG_AMPLITUDE,1230				 (priv->firm_version != 0x0102 ||1231				  priv->dvb_amplitude != 134 ?1232				  priv->dvb_amplitude : 132)) != 0)1233			ret = -EREMOTEIO;1234	}1235	if (priv->set_smoothedcvbs != 0) {1236		if (xc_write_reg(priv, XREG_SMOOTHEDCVBS, 1) != 0)1237			ret = -EREMOTEIO;1238	}1239	if (ret != 0) {1240		printk(KERN_ERR "xc4000: setting registers failed\n");1241		/* goto fail; */1242	}1243 1244	xc_tune_channel(priv, priv->freq_hz);1245 1246	ret = 0;1247 1248fail:1249	mutex_unlock(&priv->lock);1250 1251	return ret;1252}1253 1254static int xc4000_set_analog_params(struct dvb_frontend *fe,1255	struct analog_parameters *params)1256{1257	struct xc4000_priv *priv = fe->tuner_priv;1258	unsigned int type = 0;1259	int	ret = -EREMOTEIO;1260 1261	if (params->mode == V4L2_TUNER_RADIO) {1262		dprintk(1, "%s() frequency=%d (in units of 62.5Hz)\n",1263			__func__, params->frequency);1264 1265		mutex_lock(&priv->lock);1266 1267		params->std = 0;1268		priv->freq_hz = params->frequency * 125L / 2;1269 1270		if (audio_std & XC4000_AUDIO_STD_INPUT1) {1271			priv->video_standard = XC4000_FM_Radio_INPUT1;1272			type = FM | INPUT1;1273		} else {1274			priv->video_standard = XC4000_FM_Radio_INPUT2;1275			type = FM | INPUT2;1276		}1277 1278		goto tune_channel;1279	}1280 1281	dprintk(1, "%s() frequency=%d (in units of 62.5khz)\n",1282		__func__, params->frequency);1283 1284	mutex_lock(&priv->lock);1285 1286	/* params->frequency is in units of 62.5khz */1287	priv->freq_hz = params->frequency * 62500;1288 1289	params->std &= V4L2_STD_ALL;1290	/* if std is not defined, choose one */1291	if (!params->std)1292		params->std = V4L2_STD_PAL_BG;1293 1294	if (audio_std & XC4000_AUDIO_STD_MONO)1295		type = MONO;1296 1297	if (params->std & V4L2_STD_MN) {1298		params->std = V4L2_STD_MN;1299		if (audio_std & XC4000_AUDIO_STD_MONO) {1300			priv->video_standard = XC4000_MN_NTSC_PAL_Mono;1301		} else if (audio_std & XC4000_AUDIO_STD_A2) {1302			params->std |= V4L2_STD_A2;1303			priv->video_standard = XC4000_MN_NTSC_PAL_A2;1304		} else {1305			params->std |= V4L2_STD_BTSC;1306			priv->video_standard = XC4000_MN_NTSC_PAL_BTSC;1307		}1308		goto tune_channel;1309	}1310 1311	if (params->std & V4L2_STD_PAL_BG) {1312		params->std = V4L2_STD_PAL_BG;1313		if (audio_std & XC4000_AUDIO_STD_MONO) {1314			priv->video_standard = XC4000_BG_PAL_MONO;1315		} else if (!(audio_std & XC4000_AUDIO_STD_A2)) {1316			if (!(audio_std & XC4000_AUDIO_STD_B)) {1317				params->std |= V4L2_STD_NICAM_A;1318				priv->video_standard = XC4000_BG_PAL_NICAM;1319			} else {1320				params->std |= V4L2_STD_NICAM_B;1321				priv->video_standard = XC4000_BG_PAL_NICAM;1322			}1323		} else {1324			if (!(audio_std & XC4000_AUDIO_STD_B)) {1325				params->std |= V4L2_STD_A2_A;1326				priv->video_standard = XC4000_BG_PAL_A2;1327			} else {1328				params->std |= V4L2_STD_A2_B;1329				priv->video_standard = XC4000_BG_PAL_A2;1330			}1331		}1332		goto tune_channel;1333	}1334 1335	if (params->std & V4L2_STD_PAL_I) {1336		/* default to NICAM audio standard */1337		params->std = V4L2_STD_PAL_I | V4L2_STD_NICAM;1338		if (audio_std & XC4000_AUDIO_STD_MONO)1339			priv->video_standard = XC4000_I_PAL_NICAM_MONO;1340		else1341			priv->video_standard = XC4000_I_PAL_NICAM;1342		goto tune_channel;1343	}1344 1345	if (params->std & V4L2_STD_PAL_DK) {1346		params->std = V4L2_STD_PAL_DK;1347		if (audio_std & XC4000_AUDIO_STD_MONO) {1348			priv->video_standard = XC4000_DK_PAL_MONO;1349		} else if (audio_std & XC4000_AUDIO_STD_A2) {1350			params->std |= V4L2_STD_A2;1351			priv->video_standard = XC4000_DK_PAL_A2;1352		} else {1353			params->std |= V4L2_STD_NICAM;1354			priv->video_standard = XC4000_DK_PAL_NICAM;1355		}1356		goto tune_channel;1357	}1358 1359	if (params->std & V4L2_STD_SECAM_DK) {1360		/* default to A2 audio standard */1361		params->std = V4L2_STD_SECAM_DK | V4L2_STD_A2;1362		if (audio_std & XC4000_AUDIO_STD_L) {1363			type = 0;1364			priv->video_standard = XC4000_DK_SECAM_NICAM;1365		} else if (audio_std & XC4000_AUDIO_STD_MONO) {1366			priv->video_standard = XC4000_DK_SECAM_A2MONO;1367		} else if (audio_std & XC4000_AUDIO_STD_K3) {1368			params->std |= V4L2_STD_SECAM_K3;1369			priv->video_standard = XC4000_DK_SECAM_A2LDK3;1370		} else {1371			priv->video_standard = XC4000_DK_SECAM_A2DK1;1372		}1373		goto tune_channel;1374	}1375 1376	if (params->std & V4L2_STD_SECAM_L) {1377		/* default to NICAM audio standard */1378		type = 0;1379		params->std = V4L2_STD_SECAM_L | V4L2_STD_NICAM;1380		priv->video_standard = XC4000_L_SECAM_NICAM;1381		goto tune_channel;1382	}1383 1384	if (params->std & V4L2_STD_SECAM_LC) {1385		/* default to NICAM audio standard */1386		type = 0;1387		params->std = V4L2_STD_SECAM_LC | V4L2_STD_NICAM;1388		priv->video_standard = XC4000_LC_SECAM_NICAM;1389		goto tune_channel;1390	}1391 1392tune_channel:1393	/* FIXME: it could be air. */1394	priv->rf_mode = XC_RF_MODE_CABLE;1395 1396	if (check_firmware(fe, type, params->std,1397			   xc4000_standard[priv->video_standard].int_freq) != 0)1398		goto fail;1399 1400	ret = xc_set_signal_source(priv, priv->rf_mode);1401	if (ret != 0) {1402		printk(KERN_ERR1403		       "xc4000: xc_set_signal_source(%d) failed\n",1404		       priv->rf_mode);1405		goto fail;1406	} else {1407		u16	video_mode, audio_mode;1408		video_mode = xc4000_standard[priv->video_standard].video_mode;1409		audio_mode = xc4000_standard[priv->video_standard].audio_mode;1410		if (priv->video_standard < XC4000_BG_PAL_A2) {1411			if (type & NOGD)1412				video_mode &= 0xFF7F;1413		} else if (priv->video_standard < XC4000_I_PAL_NICAM) {1414			if (priv->firm_version == 0x0102)1415				video_mode &= 0xFEFF;1416			if (audio_std & XC4000_AUDIO_STD_B)1417				video_mode |= 0x0080;1418		}1419		ret = xc_set_tv_standard(priv, video_mode, audio_mode);1420		if (ret != 0) {1421			printk(KERN_ERR "xc4000: xc_set_tv_standard failed\n");1422			goto fail;1423		}1424	}1425 1426	if (xc_write_reg(priv, XREG_D_CODE, 0) == 0)1427		ret = 0;1428	if (xc_write_reg(priv, XREG_AMPLITUDE, 1) != 0)1429		ret = -EREMOTEIO;1430	if (priv->set_smoothedcvbs != 0) {1431		if (xc_write_reg(priv, XREG_SMOOTHEDCVBS, 1) != 0)1432			ret = -EREMOTEIO;1433	}1434	if (ret != 0) {1435		printk(KERN_ERR "xc4000: setting registers failed\n");1436		goto fail;1437	}1438 1439	xc_tune_channel(priv, priv->freq_hz);1440 1441	ret = 0;1442 1443fail:1444	mutex_unlock(&priv->lock);1445 1446	return ret;1447}1448 1449static int xc4000_get_signal(struct dvb_frontend *fe, u16 *strength)1450{1451	struct xc4000_priv *priv = fe->tuner_priv;1452	u16 value = 0;1453	int rc;1454 1455	mutex_lock(&priv->lock);1456	rc = xc4000_readreg(priv, XREG_SIGNAL_LEVEL, &value);1457	mutex_unlock(&priv->lock);1458 1459	if (rc < 0)1460		goto ret;1461 1462	/* Information from real testing of DVB-T and radio part,1463	   coefficient for one dB is 0xff.1464	 */1465	tuner_dbg("Signal strength: -%ddB (%05d)\n", value >> 8, value);1466 1467	/* all known digital modes */1468	if ((priv->video_standard == XC4000_DTV6) ||1469	    (priv->video_standard == XC4000_DTV7) ||1470	    (priv->video_standard == XC4000_DTV7_8) ||1471	    (priv->video_standard == XC4000_DTV8))1472		goto digital;1473 1474	/* Analog mode has NOISE LEVEL important, signal1475	   depends only on gain of antenna and amplifiers,1476	   but it doesn't tell anything about real quality1477	   of reception.1478	 */1479	mutex_lock(&priv->lock);1480	rc = xc4000_readreg(priv, XREG_NOISE_LEVEL, &value);1481	mutex_unlock(&priv->lock);1482 1483	tuner_dbg("Noise level: %ddB (%05d)\n", value >> 8, value);1484 1485	/* highest noise level: 32dB */1486	if (value >= 0x2000) {1487		value = 0;1488	} else {1489		value = (~value << 3) & 0xffff;1490	}1491 1492	goto ret;1493 1494	/* Digital mode has SIGNAL LEVEL important and real1495	   noise level is stored in demodulator registers.1496	 */1497digital:1498	/* best signal: -50dB */1499	if (value <= 0x3200) {1500		value = 0xffff;1501	/* minimum: -114dB - should be 0x7200 but real zero is 0x713A */1502	} else if (value >= 0x713A) {1503		value = 0;1504	} else {1505		value = ~(value - 0x3200) << 2;1506	}1507 1508ret:1509	*strength = value;1510 1511	return rc;1512}1513 1514static int xc4000_get_frequency(struct dvb_frontend *fe, u32 *freq)1515{1516	struct xc4000_priv *priv = fe->tuner_priv;1517 1518	mutex_lock(&priv->lock);1519	*freq = priv->freq_hz + priv->freq_offset;1520 1521	if (debug) {1522		if ((priv->cur_fw.type1523		     & (BASE | FM | DTV6 | DTV7 | DTV78 | DTV8)) == BASE) {1524			u16	snr = 0;1525			if (xc4000_readreg(priv, XREG_SNR, &snr) == 0) {1526				mutex_unlock(&priv->lock);1527				dprintk(1, "%s() freq = %u, SNR = %d\n",1528					__func__, *freq, snr);1529				return 0;1530			}1531		}1532	}1533	mutex_unlock(&priv->lock);1534 1535	dprintk(1, "%s()\n", __func__);1536 1537	return 0;1538}1539 1540static int xc4000_get_bandwidth(struct dvb_frontend *fe, u32 *bw)1541{1542	struct xc4000_priv *priv = fe->tuner_priv;1543	dprintk(1, "%s()\n", __func__);1544 1545	*bw = priv->bandwidth;1546	return 0;1547}1548 1549static int xc4000_get_status(struct dvb_frontend *fe, u32 *status)1550{1551	struct xc4000_priv *priv = fe->tuner_priv;1552	u16	lock_status = 0;1553 1554	mutex_lock(&priv->lock);1555 1556	if (priv->cur_fw.type & BASE)1557		xc_get_lock_status(priv, &lock_status);1558 1559	*status = (lock_status == 1 ?1560		   TUNER_STATUS_LOCKED | TUNER_STATUS_STEREO : 0);1561	if (priv->cur_fw.type & (DTV6 | DTV7 | DTV78 | DTV8))1562		*status &= (~TUNER_STATUS_STEREO);1563 1564	mutex_unlock(&priv->lock);1565 1566	dprintk(2, "%s() lock_status = %d\n", __func__, lock_status);1567 1568	return 0;1569}1570 1571static int xc4000_sleep(struct dvb_frontend *fe)1572{1573	struct xc4000_priv *priv = fe->tuner_priv;1574	int	ret = 0;1575 1576	dprintk(1, "%s()\n", __func__);1577 1578	mutex_lock(&priv->lock);1579 1580	/* Avoid firmware reload on slow devices */1581	if ((no_poweroff == 2 ||1582	     (no_poweroff == 0 && priv->default_pm != 0)) &&1583	    (priv->cur_fw.type & BASE) != 0) {1584		/* force reset and firmware reload */1585		priv->cur_fw.type = XC_POWERED_DOWN;1586 1587		if (xc_write_reg(priv, XREG_POWER_DOWN, 0) != 0) {1588			printk(KERN_ERR1589			       "xc4000: %s() unable to shutdown tuner\n",1590			       __func__);1591			ret = -EREMOTEIO;1592		}1593		msleep(20);1594	}1595 1596	mutex_unlock(&priv->lock);1597 1598	return ret;1599}1600 1601static int xc4000_init(struct dvb_frontend *fe)1602{1603	dprintk(1, "%s()\n", __func__);1604 1605	return 0;1606}1607 1608static void xc4000_release(struct dvb_frontend *fe)1609{1610	struct xc4000_priv *priv = fe->tuner_priv;1611 1612	dprintk(1, "%s()\n", __func__);1613 1614	mutex_lock(&xc4000_list_mutex);1615 1616	if (priv)1617		hybrid_tuner_release_state(priv);1618 1619	mutex_unlock(&xc4000_list_mutex);1620 1621	fe->tuner_priv = NULL;1622}1623 1624static const struct dvb_tuner_ops xc4000_tuner_ops = {1625	.info = {1626		.name              = "Xceive XC4000",1627		.frequency_min_hz  =    1 * MHz,1628		.frequency_max_hz  = 1023 * MHz,1629		.frequency_step_hz =   50 * kHz,1630	},1631 1632	.release	   = xc4000_release,1633	.init		   = xc4000_init,1634	.sleep		   = xc4000_sleep,1635 1636	.set_params	   = xc4000_set_params,1637	.set_analog_params = xc4000_set_analog_params,1638	.get_frequency	   = xc4000_get_frequency,1639	.get_rf_strength   = xc4000_get_signal,1640	.get_bandwidth	   = xc4000_get_bandwidth,1641	.get_status	   = xc4000_get_status1642};1643 1644struct dvb_frontend *xc4000_attach(struct dvb_frontend *fe,1645				   struct i2c_adapter *i2c,1646				   struct xc4000_config *cfg)1647{1648	struct xc4000_priv *priv = NULL;1649	int	instance;1650	u16	id = 0;1651 1652	dprintk(1, "%s(%d-%04x)\n", __func__,1653		i2c ? i2c_adapter_id(i2c) : -1,1654		cfg ? cfg->i2c_address : -1);1655 1656	mutex_lock(&xc4000_list_mutex);1657 1658	instance = hybrid_tuner_request_state(struct xc4000_priv, priv,1659					      hybrid_tuner_instance_list,1660					      i2c, cfg->i2c_address, "xc4000");1661	switch (instance) {1662	case 0:1663		goto fail;1664	case 1:1665		/* new tuner instance */1666		priv->bandwidth = 6000000;1667		/* set default configuration */1668		priv->if_khz = 4560;1669		priv->default_pm = 0;1670		priv->dvb_amplitude = 134;1671		priv->set_smoothedcvbs = 1;1672		mutex_init(&priv->lock);1673		fe->tuner_priv = priv;1674		break;1675	default:1676		/* existing tuner instance */1677		fe->tuner_priv = priv;1678		break;1679	}1680 1681	if (cfg->if_khz != 0) {1682		/* copy configuration if provided by the caller */1683		priv->if_khz = cfg->if_khz;1684		priv->default_pm = cfg->default_pm;1685		priv->dvb_amplitude = cfg->dvb_amplitude;1686		priv->set_smoothedcvbs = cfg->set_smoothedcvbs;1687	}1688 1689	/* Check if firmware has been loaded. It is possible that another1690	   instance of the driver has loaded the firmware.1691	 */1692 1693	if (instance == 1) {1694		if (xc4000_readreg(priv, XREG_PRODUCT_ID, &id) != 0)1695			goto fail;1696	} else {1697		id = ((priv->cur_fw.type & BASE) != 0 ?1698		      priv->hwmodel : XC_PRODUCT_ID_FW_NOT_LOADED);1699	}1700 1701	switch (id) {1702	case XC_PRODUCT_ID_XC4000:1703	case XC_PRODUCT_ID_XC4100:1704		printk(KERN_INFO1705			"xc4000: Successfully identified at address 0x%02x\n",1706			cfg->i2c_address);1707		printk(KERN_INFO1708			"xc4000: Firmware has been loaded previously\n");1709		break;1710	case XC_PRODUCT_ID_FW_NOT_LOADED:1711		printk(KERN_INFO1712			"xc4000: Successfully identified at address 0x%02x\n",1713			cfg->i2c_address);1714		printk(KERN_INFO1715			"xc4000: Firmware has not been loaded previously\n");1716		break;1717	default:1718		printk(KERN_ERR1719			"xc4000: Device not found at addr 0x%02x (0x%x)\n",1720			cfg->i2c_address, id);1721		goto fail;1722	}1723 1724	mutex_unlock(&xc4000_list_mutex);1725 1726	memcpy(&fe->ops.tuner_ops, &xc4000_tuner_ops,1727		sizeof(struct dvb_tuner_ops));1728 1729	if (instance == 1) {1730		int	ret;1731		mutex_lock(&priv->lock);1732		ret = xc4000_fwupload(fe);1733		mutex_unlock(&priv->lock);1734		if (ret != 0)1735			goto fail2;1736	}1737 1738	return fe;1739fail:1740	mutex_unlock(&xc4000_list_mutex);1741fail2:1742	xc4000_release(fe);1743	return NULL;1744}1745EXPORT_SYMBOL_GPL(xc4000_attach);1746 1747MODULE_AUTHOR("Steven Toth, Davide Ferri");1748MODULE_DESCRIPTION("Xceive xc4000 silicon tuner driver");1749MODULE_LICENSE("GPL");1750MODULE_FIRMWARE(XC4000_DEFAULT_FIRMWARE_NEW);1751MODULE_FIRMWARE(XC4000_DEFAULT_FIRMWARE);1752