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