159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky/*
259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky    tda18271-common.c - driver for the Philips / NXP TDA18271 silicon tuner
359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky    Copyright (C) 2007, 2008 Michael Krufky <mkrufky@linuxtv.org>
559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky    This program is free software; you can redistribute it and/or modify
759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky    it under the terms of the GNU General Public License as published by
859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky    the Free Software Foundation; either version 2 of the License, or
959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky    (at your option) any later version.
1059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
1159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky    This program is distributed in the hope that it will be useful,
1259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky    but WITHOUT ANY WARRANTY; without even the implied warranty of
1359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky    GNU General Public License for more details.
1559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
1659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky    You should have received a copy of the GNU General Public License
1759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky    along with this program; if not, write to the Free Software
1859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
1959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky*/
2059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
2159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky#include "tda18271-priv.h"
2259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
2359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufkystatic int tda18271_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
2459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky{
2559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	struct tda18271_priv *priv = fe->tuner_priv;
2659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	enum tda18271_i2c_gate gate;
2759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	int ret = 0;
2859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
2959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	switch (priv->gate) {
3059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	case TDA18271_GATE_DIGITAL:
3159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	case TDA18271_GATE_ANALOG:
3259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		gate = priv->gate;
3359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		break;
3459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	case TDA18271_GATE_AUTO:
3559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	default:
3659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		switch (priv->mode) {
3759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		case TDA18271_DIGITAL:
3859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky			gate = TDA18271_GATE_DIGITAL;
3959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky			break;
4059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		case TDA18271_ANALOG:
4159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		default:
4259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky			gate = TDA18271_GATE_ANALOG;
4359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky			break;
4459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		}
4559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	}
4659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
4759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	switch (gate) {
4859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	case TDA18271_GATE_ANALOG:
4959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		if (fe->ops.analog_ops.i2c_gate_ctrl)
5059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky			ret = fe->ops.analog_ops.i2c_gate_ctrl(fe, enable);
5159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		break;
5259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	case TDA18271_GATE_DIGITAL:
5359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		if (fe->ops.i2c_gate_ctrl)
5459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky			ret = fe->ops.i2c_gate_ctrl(fe, enable);
5559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		break;
5659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	default:
5759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		ret = -EINVAL;
5859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		break;
5959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	}
6059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
6159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	return ret;
6259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky};
6359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
6459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky/*---------------------------------------------------------------------*/
6559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
6659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufkystatic void tda18271_dump_regs(struct dvb_frontend *fe, int extended)
6759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky{
6859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	struct tda18271_priv *priv = fe->tuner_priv;
6959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	unsigned char *regs = priv->tda18271_regs;
7059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
7159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("=== TDA18271 REG DUMP ===\n");
7259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("ID_BYTE            = 0x%02x\n", 0xff & regs[R_ID]);
7359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("THERMO_BYTE        = 0x%02x\n", 0xff & regs[R_TM]);
7459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("POWER_LEVEL_BYTE   = 0x%02x\n", 0xff & regs[R_PL]);
7559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EASY_PROG_BYTE_1   = 0x%02x\n", 0xff & regs[R_EP1]);
7659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EASY_PROG_BYTE_2   = 0x%02x\n", 0xff & regs[R_EP2]);
7759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EASY_PROG_BYTE_3   = 0x%02x\n", 0xff & regs[R_EP3]);
7859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EASY_PROG_BYTE_4   = 0x%02x\n", 0xff & regs[R_EP4]);
7959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EASY_PROG_BYTE_5   = 0x%02x\n", 0xff & regs[R_EP5]);
8059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("CAL_POST_DIV_BYTE  = 0x%02x\n", 0xff & regs[R_CPD]);
8159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("CAL_DIV_BYTE_1     = 0x%02x\n", 0xff & regs[R_CD1]);
8259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("CAL_DIV_BYTE_2     = 0x%02x\n", 0xff & regs[R_CD2]);
8359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("CAL_DIV_BYTE_3     = 0x%02x\n", 0xff & regs[R_CD3]);
8459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("MAIN_POST_DIV_BYTE = 0x%02x\n", 0xff & regs[R_MPD]);
8559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("MAIN_DIV_BYTE_1    = 0x%02x\n", 0xff & regs[R_MD1]);
8659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("MAIN_DIV_BYTE_2    = 0x%02x\n", 0xff & regs[R_MD2]);
8759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("MAIN_DIV_BYTE_3    = 0x%02x\n", 0xff & regs[R_MD3]);
8859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
8959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* only dump extended regs if DBG_ADV is set */
9059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	if (!(tda18271_debug & DBG_ADV))
9159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		return;
9259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
9359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* W indicates write-only registers.
9459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	 * Register dump for write-only registers shows last value written. */
9559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
9659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EXTENDED_BYTE_1    = 0x%02x\n", 0xff & regs[R_EB1]);
9759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EXTENDED_BYTE_2    = 0x%02x\n", 0xff & regs[R_EB2]);
9859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EXTENDED_BYTE_3    = 0x%02x\n", 0xff & regs[R_EB3]);
9959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EXTENDED_BYTE_4    = 0x%02x\n", 0xff & regs[R_EB4]);
10059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EXTENDED_BYTE_5    = 0x%02x\n", 0xff & regs[R_EB5]);
10159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EXTENDED_BYTE_6    = 0x%02x\n", 0xff & regs[R_EB6]);
10259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EXTENDED_BYTE_7    = 0x%02x\n", 0xff & regs[R_EB7]);
10359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EXTENDED_BYTE_8    = 0x%02x\n", 0xff & regs[R_EB8]);
10459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EXTENDED_BYTE_9  W = 0x%02x\n", 0xff & regs[R_EB9]);
10559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EXTENDED_BYTE_10   = 0x%02x\n", 0xff & regs[R_EB10]);
10659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EXTENDED_BYTE_11   = 0x%02x\n", 0xff & regs[R_EB11]);
10759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EXTENDED_BYTE_12   = 0x%02x\n", 0xff & regs[R_EB12]);
10859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EXTENDED_BYTE_13   = 0x%02x\n", 0xff & regs[R_EB13]);
10959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EXTENDED_BYTE_14   = 0x%02x\n", 0xff & regs[R_EB14]);
11059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EXTENDED_BYTE_15   = 0x%02x\n", 0xff & regs[R_EB15]);
11159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EXTENDED_BYTE_16 W = 0x%02x\n", 0xff & regs[R_EB16]);
11259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EXTENDED_BYTE_17 W = 0x%02x\n", 0xff & regs[R_EB17]);
11359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EXTENDED_BYTE_18   = 0x%02x\n", 0xff & regs[R_EB18]);
11459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EXTENDED_BYTE_19 W = 0x%02x\n", 0xff & regs[R_EB19]);
11559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EXTENDED_BYTE_20 W = 0x%02x\n", 0xff & regs[R_EB20]);
11659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EXTENDED_BYTE_21   = 0x%02x\n", 0xff & regs[R_EB21]);
11759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EXTENDED_BYTE_22   = 0x%02x\n", 0xff & regs[R_EB22]);
11859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_reg("EXTENDED_BYTE_23   = 0x%02x\n", 0xff & regs[R_EB23]);
11959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky}
12059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
12159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufkyint tda18271_read_regs(struct dvb_frontend *fe)
12259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky{
12359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	struct tda18271_priv *priv = fe->tuner_priv;
12459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	unsigned char *regs = priv->tda18271_regs;
12559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	unsigned char buf = 0x00;
12659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	int ret;
12759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	struct i2c_msg msg[] = {
128f9e315a16a5536120bac09a6d4217b8381c73c5cMichael Krufky		{ .addr = priv->i2c_props.addr, .flags = 0,
12959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		  .buf = &buf, .len = 1 },
130f9e315a16a5536120bac09a6d4217b8381c73c5cMichael Krufky		{ .addr = priv->i2c_props.addr, .flags = I2C_M_RD,
13159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		  .buf = regs, .len = 16 }
13259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	};
13359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
13459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda18271_i2c_gate_ctrl(fe, 1);
13559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
13659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* read all registers */
137f9e315a16a5536120bac09a6d4217b8381c73c5cMichael Krufky	ret = i2c_transfer(priv->i2c_props.adap, msg, 2);
13859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
13959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda18271_i2c_gate_ctrl(fe, 0);
14059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
14159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	if (ret != 2)
14259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		tda_err("ERROR: i2c_transfer returned: %d\n", ret);
14359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
14459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	if (tda18271_debug & DBG_REG)
14559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		tda18271_dump_regs(fe, 0);
14659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
14759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	return (ret == 2 ? 0 : ret);
14859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky}
14959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
15059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufkyint tda18271_read_extended(struct dvb_frontend *fe)
15159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky{
15259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	struct tda18271_priv *priv = fe->tuner_priv;
15359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	unsigned char *regs = priv->tda18271_regs;
15459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	unsigned char regdump[TDA18271_NUM_REGS];
15559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	unsigned char buf = 0x00;
15659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	int ret, i;
15759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	struct i2c_msg msg[] = {
158f9e315a16a5536120bac09a6d4217b8381c73c5cMichael Krufky		{ .addr = priv->i2c_props.addr, .flags = 0,
15959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		  .buf = &buf, .len = 1 },
160f9e315a16a5536120bac09a6d4217b8381c73c5cMichael Krufky		{ .addr = priv->i2c_props.addr, .flags = I2C_M_RD,
16159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		  .buf = regdump, .len = TDA18271_NUM_REGS }
16259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	};
16359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
16459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda18271_i2c_gate_ctrl(fe, 1);
16559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
16659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* read all registers */
167f9e315a16a5536120bac09a6d4217b8381c73c5cMichael Krufky	ret = i2c_transfer(priv->i2c_props.adap, msg, 2);
16859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
16959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda18271_i2c_gate_ctrl(fe, 0);
17059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
17159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	if (ret != 2)
17259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		tda_err("ERROR: i2c_transfer returned: %d\n", ret);
17359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
174805d92dfa627acad3d4a78966bc5e4f8183d48b3Adrian Bunk	for (i = 0; i < TDA18271_NUM_REGS; i++) {
17559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		/* don't update write-only registers */
17659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		if ((i != R_EB9)  &&
17759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		    (i != R_EB16) &&
17859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		    (i != R_EB17) &&
17959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		    (i != R_EB19) &&
18059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		    (i != R_EB20))
18159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		regs[i] = regdump[i];
18259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	}
18359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
18459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	if (tda18271_debug & DBG_REG)
18559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		tda18271_dump_regs(fe, 1);
18659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
18759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	return (ret == 2 ? 0 : ret);
18859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky}
18959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
19059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufkyint tda18271_write_regs(struct dvb_frontend *fe, int idx, int len)
19159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky{
19259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	struct tda18271_priv *priv = fe->tuner_priv;
19359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	unsigned char *regs = priv->tda18271_regs;
19459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	unsigned char buf[TDA18271_NUM_REGS + 1];
195f9e315a16a5536120bac09a6d4217b8381c73c5cMichael Krufky	struct i2c_msg msg = { .addr = priv->i2c_props.addr, .flags = 0,
196e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab			       .buf = buf };
197e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab	int i, ret = 1, max;
19859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
19959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	BUG_ON((len == 0) || (idx + len > sizeof(buf)));
20059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
201e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab
202e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab	switch (priv->small_i2c) {
203e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab	case TDA18271_03_BYTE_CHUNK_INIT:
204e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab		max = 3;
205e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab		break;
206e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab	case TDA18271_08_BYTE_CHUNK_INIT:
207e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab		max = 8;
208e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab		break;
209e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab	case TDA18271_16_BYTE_CHUNK_INIT:
210e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab		max = 16;
211e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab		break;
212e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab	case TDA18271_39_BYTE_CHUNK_INIT:
213e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab	default:
214e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab		max = 39;
215e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab	}
21659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
21759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda18271_i2c_gate_ctrl(fe, 1);
218e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab	while (len) {
219e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab		if (max > len)
220e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab			max = len;
221e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab
222e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab		buf[0] = idx;
223e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab		for (i = 1; i <= max; i++)
224e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab			buf[i] = regs[idx - 1 + i];
22559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
226e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab		msg.len = max + 1;
22759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
228e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab		/* write registers */
229e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab		ret = i2c_transfer(priv->i2c_props.adap, &msg, 1);
230e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab		if (ret != 1)
231e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab			break;
232e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab
233e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab		idx += max;
234e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab		len -= max;
235e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab	}
23659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda18271_i2c_gate_ctrl(fe, 0);
23759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
23859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	if (ret != 1)
239650901c0b6917505e81f6593d230ea3cdcf6518aMichael Krufky		tda_err("ERROR: idx = 0x%x, len = %d, "
2407655e594945289b418af39f6669fea4666a7b520Mauro Carvalho Chehab			"i2c_transfer returned: %d\n", idx, max, ret);
24159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
24259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	return (ret == 1 ? 0 : ret);
24359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky}
24459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
24559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky/*---------------------------------------------------------------------*/
24659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
2474efb0ca5d00f2c7a8bf9632556a4b4330cf409c5Michael Krufkyint tda18271_charge_pump_source(struct dvb_frontend *fe,
2484efb0ca5d00f2c7a8bf9632556a4b4330cf409c5Michael Krufky				enum tda18271_pll pll, int force)
2494efb0ca5d00f2c7a8bf9632556a4b4330cf409c5Michael Krufky{
2504efb0ca5d00f2c7a8bf9632556a4b4330cf409c5Michael Krufky	struct tda18271_priv *priv = fe->tuner_priv;
2514efb0ca5d00f2c7a8bf9632556a4b4330cf409c5Michael Krufky	unsigned char *regs = priv->tda18271_regs;
2524efb0ca5d00f2c7a8bf9632556a4b4330cf409c5Michael Krufky
2534efb0ca5d00f2c7a8bf9632556a4b4330cf409c5Michael Krufky	int r_cp = (pll == TDA18271_CAL_PLL) ? R_EB7 : R_EB4;
2544efb0ca5d00f2c7a8bf9632556a4b4330cf409c5Michael Krufky
2554efb0ca5d00f2c7a8bf9632556a4b4330cf409c5Michael Krufky	regs[r_cp] &= ~0x20;
2564efb0ca5d00f2c7a8bf9632556a4b4330cf409c5Michael Krufky	regs[r_cp] |= ((force & 1) << 5);
2574efb0ca5d00f2c7a8bf9632556a4b4330cf409c5Michael Krufky
258d35fccaffd095e79691cd07a49a36867cb275b72Michael Krufky	return tda18271_write_regs(fe, r_cp, 1);
2594efb0ca5d00f2c7a8bf9632556a4b4330cf409c5Michael Krufky}
2604efb0ca5d00f2c7a8bf9632556a4b4330cf409c5Michael Krufky
26159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufkyint tda18271_init_regs(struct dvb_frontend *fe)
26259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky{
26359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	struct tda18271_priv *priv = fe->tuner_priv;
26459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	unsigned char *regs = priv->tda18271_regs;
26559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
26659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda_dbg("initializing registers for device @ %d-%04x\n",
267f9e315a16a5536120bac09a6d4217b8381c73c5cMichael Krufky		i2c_adapter_id(priv->i2c_props.adap),
268f9e315a16a5536120bac09a6d4217b8381c73c5cMichael Krufky		priv->i2c_props.addr);
26959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
27059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* initialize registers */
27159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	switch (priv->id) {
27259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	case TDA18271HDC1:
27359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		regs[R_ID]   = 0x83;
27459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		break;
27559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	case TDA18271HDC2:
27659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		regs[R_ID]   = 0x84;
27759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		break;
27859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	};
27959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
28059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_TM]   = 0x08;
28159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_PL]   = 0x80;
28259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EP1]  = 0xc6;
28359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EP2]  = 0xdf;
28459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EP3]  = 0x16;
28559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EP4]  = 0x60;
28659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EP5]  = 0x80;
28759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CPD]  = 0x80;
28859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CD1]  = 0x00;
28959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CD2]  = 0x00;
29059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CD3]  = 0x00;
29159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_MPD]  = 0x00;
29259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_MD1]  = 0x00;
29359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_MD2]  = 0x00;
29459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_MD3]  = 0x00;
29559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
29659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	switch (priv->id) {
29759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	case TDA18271HDC1:
29859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		regs[R_EB1]  = 0xff;
29959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		break;
30059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	case TDA18271HDC2:
30159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		regs[R_EB1]  = 0xfc;
30259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		break;
30359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	};
30459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
30559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB2]  = 0x01;
30659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB3]  = 0x84;
30759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB4]  = 0x41;
30859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB5]  = 0x01;
30959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB6]  = 0x84;
31059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB7]  = 0x40;
31159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB8]  = 0x07;
31259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB9]  = 0x00;
31359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB10] = 0x00;
31459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB11] = 0x96;
31559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
31659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	switch (priv->id) {
31759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	case TDA18271HDC1:
31859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		regs[R_EB12] = 0x0f;
31959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		break;
32059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	case TDA18271HDC2:
32159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		regs[R_EB12] = 0x33;
32259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		break;
32359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	};
32459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
32559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB13] = 0xc1;
32659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB14] = 0x00;
32759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB15] = 0x8f;
32859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB16] = 0x00;
32959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB17] = 0x00;
33059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
33159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	switch (priv->id) {
33259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	case TDA18271HDC1:
33359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		regs[R_EB18] = 0x00;
33459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		break;
33559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	case TDA18271HDC2:
33659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		regs[R_EB18] = 0x8c;
33759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		break;
33859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	};
33959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
34059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB19] = 0x00;
34159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB20] = 0x20;
34259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
34359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	switch (priv->id) {
34459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	case TDA18271HDC1:
34559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		regs[R_EB21] = 0x33;
34659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		break;
34759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	case TDA18271HDC2:
34859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		regs[R_EB21] = 0xb3;
34959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		break;
35059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	};
35159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
35259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB22] = 0x48;
35359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB23] = 0xb0;
35459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
355e350d44fed8eb86a7192a579e3687fcd76a4645bMauro Carvalho Chehab	tda18271_write_regs(fe, 0x00, TDA18271_NUM_REGS);
35659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
35759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* setup agc1 gain */
35859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB17] = 0x00;
35959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda18271_write_regs(fe, R_EB17, 1);
36059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB17] = 0x03;
36159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda18271_write_regs(fe, R_EB17, 1);
36259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB17] = 0x43;
36359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda18271_write_regs(fe, R_EB17, 1);
36459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB17] = 0x4c;
36559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda18271_write_regs(fe, R_EB17, 1);
36659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
36759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* setup agc2 gain */
36859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	if ((priv->id) == TDA18271HDC1) {
36959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		regs[R_EB20] = 0xa0;
37059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		tda18271_write_regs(fe, R_EB20, 1);
37159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		regs[R_EB20] = 0xa7;
37259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		tda18271_write_regs(fe, R_EB20, 1);
37359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		regs[R_EB20] = 0xe7;
37459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		tda18271_write_regs(fe, R_EB20, 1);
37559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		regs[R_EB20] = 0xec;
37659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		tda18271_write_regs(fe, R_EB20, 1);
37759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	}
37859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
37959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* image rejection calibration */
38059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
38159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* low-band */
38259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EP3] = 0x1f;
38359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EP4] = 0x66;
38459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EP5] = 0x81;
38559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CPD] = 0xcc;
38659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CD1] = 0x6c;
38759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CD2] = 0x00;
38859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CD3] = 0x00;
38959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_MPD] = 0xcd;
39059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_MD1] = 0x77;
39159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_MD2] = 0x08;
39259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_MD3] = 0x00;
39359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
394e83ebb64eff4636a5eab06a6cc493ab51e900ed0Michael Krufky	tda18271_write_regs(fe, R_EP3, 11);
39559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
39659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	if ((priv->id) == TDA18271HDC2) {
39759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		/* main pll cp source on */
3984efb0ca5d00f2c7a8bf9632556a4b4330cf409c5Michael Krufky		tda18271_charge_pump_source(fe, TDA18271_MAIN_PLL, 1);
39959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		msleep(1);
40059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
40159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		/* main pll cp source off */
4024efb0ca5d00f2c7a8bf9632556a4b4330cf409c5Michael Krufky		tda18271_charge_pump_source(fe, TDA18271_MAIN_PLL, 0);
40359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	}
40459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
40559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	msleep(5); /* pll locking */
40659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
40759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* launch detector */
40859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda18271_write_regs(fe, R_EP1, 1);
40959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	msleep(5); /* wanted low measurement */
41059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
41159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EP5] = 0x85;
41259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CPD] = 0xcb;
41359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CD1] = 0x66;
41459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CD2] = 0x70;
41559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
41659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda18271_write_regs(fe, R_EP3, 7);
41759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	msleep(5); /* pll locking */
41859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
41959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* launch optimization algorithm */
42059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda18271_write_regs(fe, R_EP2, 1);
42159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	msleep(30); /* image low optimization completion */
42259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
42359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* mid-band */
42459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EP5] = 0x82;
42559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CPD] = 0xa8;
42659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CD2] = 0x00;
42759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_MPD] = 0xa9;
42859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_MD1] = 0x73;
42959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_MD2] = 0x1a;
43059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
43159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda18271_write_regs(fe, R_EP3, 11);
43259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	msleep(5); /* pll locking */
43359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
434e83ebb64eff4636a5eab06a6cc493ab51e900ed0Michael Krufky	/* launch detector */
43559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda18271_write_regs(fe, R_EP1, 1);
43659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	msleep(5); /* wanted mid measurement */
43759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
43859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EP5] = 0x86;
43959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CPD] = 0xa8;
44059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CD1] = 0x66;
44159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CD2] = 0xa0;
44259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
44359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda18271_write_regs(fe, R_EP3, 7);
44459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	msleep(5); /* pll locking */
44559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
44659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* launch optimization algorithm */
44759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda18271_write_regs(fe, R_EP2, 1);
44859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	msleep(30); /* image mid optimization completion */
44959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
45059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* high-band */
45159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EP5] = 0x83;
45259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CPD] = 0x98;
45359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CD1] = 0x65;
45459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CD2] = 0x00;
45559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_MPD] = 0x99;
45659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_MD1] = 0x71;
45759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_MD2] = 0xcd;
45859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
45959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda18271_write_regs(fe, R_EP3, 11);
46059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	msleep(5); /* pll locking */
46159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
46259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* launch detector */
46359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda18271_write_regs(fe, R_EP1, 1);
46459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	msleep(5); /* wanted high measurement */
46559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
46659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EP5] = 0x87;
46759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CD1] = 0x65;
46859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CD2] = 0x50;
46959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
47059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda18271_write_regs(fe, R_EP3, 7);
47159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	msleep(5); /* pll locking */
47259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
47359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* launch optimization algorithm */
47459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda18271_write_regs(fe, R_EP2, 1);
47559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	msleep(30); /* image high optimization completion */
47659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
47759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* return to normal mode */
47859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EP4] = 0x64;
47959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda18271_write_regs(fe, R_EP4, 1);
48059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
48159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* synchronize */
48259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	tda18271_write_regs(fe, R_EP1, 1);
48359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
48459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	return 0;
48559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky}
48659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
48759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky/*---------------------------------------------------------------------*/
48859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
489518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky/*
490518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky *  Standby modes, EP3 [7:5]
491518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky *
492518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky *  | SM  || SM_LT || SM_XT || mode description
493518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky *  |=====\\=======\\=======\\===================================
494518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky *  |  0  ||   0   ||   0   || normal mode
495518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky *  |-----||-------||-------||-----------------------------------
496518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky *  |     ||       ||       || standby mode w/ slave tuner output
497518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky *  |  1  ||   0   ||   0   || & loop thru & xtal oscillator on
498518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky *  |-----||-------||-------||-----------------------------------
499518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky *  |  1  ||   1   ||   0   || standby mode w/ xtal oscillator on
500518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky *  |-----||-------||-------||-----------------------------------
501518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky *  |  1  ||   1   ||   1   || power off
502518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky *
503518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky */
504518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky
505518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufkyint tda18271_set_standby_mode(struct dvb_frontend *fe,
506518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky			      int sm, int sm_lt, int sm_xt)
507518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky{
508518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky	struct tda18271_priv *priv = fe->tuner_priv;
509518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky	unsigned char *regs = priv->tda18271_regs;
510518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky
5119c41d456e2936ea3aafa07d431c5963799f9659eMichael Krufky	if (tda18271_debug & DBG_ADV)
5129c41d456e2936ea3aafa07d431c5963799f9659eMichael Krufky		tda_dbg("sm = %d, sm_lt = %d, sm_xt = %d\n", sm, sm_lt, sm_xt);
513518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky
514518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky	regs[R_EP3]  &= ~0xe0; /* clear sm, sm_lt, sm_xt */
51551ca3bddf34bb6cdbdddd89f59fe3a0131d40ebaRoel Kluin	regs[R_EP3]  |= (sm    ? (1 << 7) : 0) |
51651ca3bddf34bb6cdbdddd89f59fe3a0131d40ebaRoel Kluin			(sm_lt ? (1 << 6) : 0) |
51751ca3bddf34bb6cdbdddd89f59fe3a0131d40ebaRoel Kluin			(sm_xt ? (1 << 5) : 0);
518518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky
519d35fccaffd095e79691cd07a49a36867cb275b72Michael Krufky	return tda18271_write_regs(fe, R_EP3, 1);
520518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky}
521518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky
522518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky/*---------------------------------------------------------------------*/
523518d87399baee908b0353bc0ef7d41c3c46295ecMichael Krufky
52459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufkyint tda18271_calc_main_pll(struct dvb_frontend *fe, u32 freq)
52559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky{
52659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* sets main post divider & divider bytes, but does not write them */
52759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	struct tda18271_priv *priv = fe->tuner_priv;
52859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	unsigned char *regs = priv->tda18271_regs;
52959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	u8 d, pd;
53059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	u32 div;
53159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
53259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	int ret = tda18271_lookup_pll_map(fe, MAIN_PLL, &freq, &pd, &d);
5334bd5d1071ddbb35ae545c7738e6411e50ce28b17Michael Krufky	if (tda_fail(ret))
53459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		goto fail;
53559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
5363f688e8c62fb69ff65bc9325831b5b3d3f5ef8edMichael Krufky	regs[R_MPD]   = (0x7f & pd);
53759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
53859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	div =  ((d * (freq / 1000)) << 7) / 125;
53959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
54059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_MD1]   = 0x7f & (div >> 16);
54159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_MD2]   = 0xff & (div >> 8);
54259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_MD3]   = 0xff & div;
54359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufkyfail:
54459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	return ret;
54559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky}
54659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
54759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufkyint tda18271_calc_cal_pll(struct dvb_frontend *fe, u32 freq)
54859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky{
54959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* sets cal post divider & divider bytes, but does not write them */
55059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	struct tda18271_priv *priv = fe->tuner_priv;
55159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	unsigned char *regs = priv->tda18271_regs;
55259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	u8 d, pd;
55359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	u32 div;
55459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
55559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	int ret = tda18271_lookup_pll_map(fe, CAL_PLL, &freq, &pd, &d);
5564bd5d1071ddbb35ae545c7738e6411e50ce28b17Michael Krufky	if (tda_fail(ret))
55759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		goto fail;
55859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
55959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CPD]   = pd;
56059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
56159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	div =  ((d * (freq / 1000)) << 7) / 125;
56259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
56359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CD1]   = 0x7f & (div >> 16);
56459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CD2]   = 0xff & (div >> 8);
56559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_CD3]   = 0xff & div;
56659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufkyfail:
56759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	return ret;
56859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky}
56959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
57059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky/*---------------------------------------------------------------------*/
57159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
57259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufkyint tda18271_calc_bp_filter(struct dvb_frontend *fe, u32 *freq)
57359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky{
57459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* sets bp filter bits, but does not write them */
57559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	struct tda18271_priv *priv = fe->tuner_priv;
57659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	unsigned char *regs = priv->tda18271_regs;
57759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	u8 val;
57859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
57959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	int ret = tda18271_lookup_map(fe, BP_FILTER, freq, &val);
5804bd5d1071ddbb35ae545c7738e6411e50ce28b17Michael Krufky	if (tda_fail(ret))
58159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		goto fail;
58259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
58359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EP1]  &= ~0x07; /* clear bp filter bits */
58459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EP1]  |= (0x07 & val);
58559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufkyfail:
58659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	return ret;
58759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky}
58859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
58959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufkyint tda18271_calc_km(struct dvb_frontend *fe, u32 *freq)
59059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky{
59159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* sets K & M bits, but does not write them */
59259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	struct tda18271_priv *priv = fe->tuner_priv;
59359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	unsigned char *regs = priv->tda18271_regs;
59459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	u8 val;
59559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
59659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	int ret = tda18271_lookup_map(fe, RF_CAL_KMCO, freq, &val);
5974bd5d1071ddbb35ae545c7738e6411e50ce28b17Michael Krufky	if (tda_fail(ret))
59859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		goto fail;
59959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
60059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB13] &= ~0x7c; /* clear k & m bits */
60159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB13] |= (0x7c & val);
60259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufkyfail:
60359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	return ret;
60459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky}
60559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
60659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufkyint tda18271_calc_rf_band(struct dvb_frontend *fe, u32 *freq)
60759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky{
60859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* sets rf band bits, but does not write them */
60959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	struct tda18271_priv *priv = fe->tuner_priv;
61059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	unsigned char *regs = priv->tda18271_regs;
61159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	u8 val;
61259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
61359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	int ret = tda18271_lookup_map(fe, RF_BAND, freq, &val);
6144bd5d1071ddbb35ae545c7738e6411e50ce28b17Michael Krufky	if (tda_fail(ret))
61559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		goto fail;
61659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
61759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EP2]  &= ~0xe0; /* clear rf band bits */
61859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EP2]  |= (0xe0 & (val << 5));
61959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufkyfail:
62059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	return ret;
62159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky}
62259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
62359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufkyint tda18271_calc_gain_taper(struct dvb_frontend *fe, u32 *freq)
62459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky{
62559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* sets gain taper bits, but does not write them */
62659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	struct tda18271_priv *priv = fe->tuner_priv;
62759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	unsigned char *regs = priv->tda18271_regs;
62859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	u8 val;
62959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
63059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	int ret = tda18271_lookup_map(fe, GAIN_TAPER, freq, &val);
6314bd5d1071ddbb35ae545c7738e6411e50ce28b17Michael Krufky	if (tda_fail(ret))
63259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		goto fail;
63359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
63459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EP2]  &= ~0x1f; /* clear gain taper bits */
63559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EP2]  |= (0x1f & val);
63659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufkyfail:
63759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	return ret;
63859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky}
63959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
64059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufkyint tda18271_calc_ir_measure(struct dvb_frontend *fe, u32 *freq)
64159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky{
64259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* sets IR Meas bits, but does not write them */
64359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	struct tda18271_priv *priv = fe->tuner_priv;
64459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	unsigned char *regs = priv->tda18271_regs;
64559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	u8 val;
64659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
64759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	int ret = tda18271_lookup_map(fe, IR_MEASURE, freq, &val);
6484bd5d1071ddbb35ae545c7738e6411e50ce28b17Michael Krufky	if (tda_fail(ret))
64959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky		goto fail;
65059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
65159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EP5] &= ~0x07;
65259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EP5] |= (0x07 & val);
65359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufkyfail:
65459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	return ret;
65559067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky}
65659067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
65759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufkyint tda18271_calc_rf_cal(struct dvb_frontend *fe, u32 *freq)
65859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky{
65959067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	/* sets rf cal byte (RFC_Cprog), but does not write it */
66059067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	struct tda18271_priv *priv = fe->tuner_priv;
66159067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	unsigned char *regs = priv->tda18271_regs;
66259067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	u8 val;
66359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
664fc60d6e2727157b53d49c8d55888d0a78dafbc9fMichael Krufky	int ret = tda18271_lookup_map(fe, RF_CAL, freq, &val);
665119a7c7e34b5e5fa65051960ca05000a19dbce85Michael Krufky	/* The TDA18271HD/C1 rf_cal map lookup is expected to go out of range
666119a7c7e34b5e5fa65051960ca05000a19dbce85Michael Krufky	 * for frequencies above 61.1 MHz.  In these cases, the internal RF
667119a7c7e34b5e5fa65051960ca05000a19dbce85Michael Krufky	 * tracking filters calibration mechanism is used.
668119a7c7e34b5e5fa65051960ca05000a19dbce85Michael Krufky	 *
669119a7c7e34b5e5fa65051960ca05000a19dbce85Michael Krufky	 * There is no need to warn the user about this.
670119a7c7e34b5e5fa65051960ca05000a19dbce85Michael Krufky	 */
671119a7c7e34b5e5fa65051960ca05000a19dbce85Michael Krufky	if (ret < 0)
672119a7c7e34b5e5fa65051960ca05000a19dbce85Michael Krufky		goto fail;
67359067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
67459067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky	regs[R_EB14] = val;
675119a7c7e34b5e5fa65051960ca05000a19dbce85Michael Krufkyfail:
676fc60d6e2727157b53d49c8d55888d0a78dafbc9fMichael Krufky	return ret;
67759067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky}
67859067f7ed491ec95e6e9033e35e1ae726cff3ceeMichael Krufky
679be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perchesint _tda_printk(struct tda18271_priv *state, const char *level,
680be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perches		const char *func, const char *fmt, ...)
681be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perches{
682be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perches	struct va_format vaf;
683be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perches	va_list args;
684be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perches	int rtn;
685be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perches
686be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perches	va_start(args, fmt);
687be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perches
688be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perches	vaf.fmt = fmt;
689be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perches	vaf.va = &args;
690be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perches
691be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perches	if (state)
692be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perches		rtn = printk("%s%s: [%d-%04x|%c] %pV",
693be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perches			     level, func, i2c_adapter_id(state->i2c_props.adap),
694be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perches			     state->i2c_props.addr,
695be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perches			     (state->role == TDA18271_MASTER) ? 'M' : 'S',
696be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perches			     &vaf);
697be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perches	else
698be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perches		rtn = printk("%s%s: %pV", level, func, &vaf);
699be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perches
700be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perches	va_end(args);
701be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perches
702be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perches	return rtn;
703be85fefecb20b533a2c3f668a345f03f492aeea3Joe Perches}
704