141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham/* 241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham Fujitsu MB86A16 DVB-S/DSS DC Receiver driver 341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 44cd191fba45ee3cf3035d7e4d3a942979cd9c5e4Manu Abraham Copyright (C) Manu Abraham (abraham.manu@gmail.com) 541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham This program is free software; you can redistribute it and/or modify 741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham it under the terms of the GNU General Public License as published by 841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham the Free Software Foundation; either version 2 of the License, or 941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (at your option) any later version. 1041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 1141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham This program is distributed in the hope that it will be useful, 1241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham but WITHOUT ANY WARRANTY; without even the implied warranty of 1341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham GNU General Public License for more details. 1541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 1641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham You should have received a copy of the GNU General Public License 1741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham along with this program; if not, write to the Free Software 1841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 1941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham*/ 2041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 2141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#include <linux/init.h> 2241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#include <linux/kernel.h> 2341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#include <linux/module.h> 2441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#include <linux/moduleparam.h> 255a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h> 2641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 2741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#include "dvb_frontend.h" 2841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#include "mb86a16.h" 2941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#include "mb86a16_priv.h" 3041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 3141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamunsigned int verbose = 5; 3241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahammodule_param(verbose, int, 0644); 3341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 3441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#define ABS(x) ((x) < 0 ? (-x) : (x)) 3541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 3641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstruct mb86a16_state { 3741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham struct i2c_adapter *i2c_adap; 3841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham const struct mb86a16_config *config; 3941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham struct dvb_frontend frontend; 4041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 41f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham /* tuning parameters */ 4241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int frequency; 4341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int srate; 4441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 45f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham /* Internal stuff */ 4641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int master_clk; 4741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int deci; 4841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int csel; 4941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int rsel; 5041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham}; 5141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 5241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#define MB86A16_ERROR 0 5341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#define MB86A16_NOTICE 1 5441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#define MB86A16_INFO 2 5541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#define MB86A16_DEBUG 3 5641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 5741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#define dprintk(x, y, z, format, arg...) do { \ 5841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (z) { \ 5941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if ((x > MB86A16_ERROR) && (x > y)) \ 6041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham printk(KERN_ERR "%s: " format "\n", __func__, ##arg); \ 6141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else if ((x > MB86A16_NOTICE) && (x > y)) \ 6241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham printk(KERN_NOTICE "%s: " format "\n", __func__, ##arg); \ 6341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else if ((x > MB86A16_INFO) && (x > y)) \ 6441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham printk(KERN_INFO "%s: " format "\n", __func__, ##arg); \ 6541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else if ((x > MB86A16_DEBUG) && (x > y)) \ 6641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham printk(KERN_DEBUG "%s: " format "\n", __func__, ##arg); \ 6741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else { \ 6841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (x > y) \ 6941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham printk(format, ##arg); \ 7041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } \ 7141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} while (0) 7241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 7341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#define TRACE_IN dprintk(verbose, MB86A16_DEBUG, 1, "-->()") 7441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#define TRACE_OUT dprintk(verbose, MB86A16_DEBUG, 1, "()-->") 7541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 7641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int mb86a16_write(struct mb86a16_state *state, u8 reg, u8 val) 7741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 7841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int ret; 7941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham u8 buf[] = { reg, val }; 8041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 8141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham struct i2c_msg msg = { 8241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .addr = state->config->demod_address, 8341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .flags = 0, 8441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .buf = buf, 8541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .len = 2 8641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham }; 8741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 8841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_DEBUG, 1, 8941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham "writing to [0x%02x],Reg[0x%02x],Data[0x%02x]", 9041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->config->demod_address, buf[0], buf[1]); 9141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 9241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham ret = i2c_transfer(state->i2c_adap, &msg, 1); 9341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 9441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return (ret != 1) ? -EREMOTEIO : 0; 9541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 9641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 9741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int mb86a16_read(struct mb86a16_state *state, u8 reg, u8 *val) 9841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 9941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int ret; 10041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham u8 b0[] = { reg }; 10141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham u8 b1[] = { 0 }; 10241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 10341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham struct i2c_msg msg[] = { 10441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham { 10541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .addr = state->config->demod_address, 10641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .flags = 0, 10741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .buf = b0, 10841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .len = 1 109f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham }, { 11041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .addr = state->config->demod_address, 11141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .flags = I2C_M_RD, 11241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .buf = b1, 11341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .len = 1 11441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 11541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham }; 11641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham ret = i2c_transfer(state->i2c_adap, msg, 2); 11741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (ret != 2) { 11841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "read error(reg=0x%02x, ret=0x%i)", 11941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham reg, ret); 12041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 12141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 12241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 12341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *val = b1[0]; 12441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 12541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return ret; 12641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 12741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 12841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int CNTM_set(struct mb86a16_state *state, 12941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char timint1, 13041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char timint2, 13141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char cnext) 13241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 13341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char val; 13441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 13541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham val = (timint1 << 4) | (timint2 << 2) | cnext; 13641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_CNTMR, val) < 0) 13741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 13841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 13941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 14041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 14141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr: 14241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 14341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 14441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 14541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 14641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int smrt_set(struct mb86a16_state *state, int rate) 14741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 14841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int tmp ; 14941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int m ; 15041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char STOFS0, STOFS1; 15141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 15241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham m = 1 << state->deci; 15341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham tmp = (8192 * state->master_clk - 2 * m * rate * 8192 + state->master_clk / 2) / state->master_clk; 15441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 15541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham STOFS0 = tmp & 0x0ff; 15641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham STOFS1 = (tmp & 0xf00) >> 8; 15741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 15841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_SRATE1, (state->deci << 2) | 15941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (state->csel << 1) | 16041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->rsel) < 0) 16141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 16241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_SRATE2, STOFS0) < 0) 16341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 16441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_SRATE3, STOFS1) < 0) 16541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 16641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 16741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 16841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr: 16941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 17041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 17141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 17241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 17341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int srst(struct mb86a16_state *state) 17441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 17541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_RESET, 0x04) < 0) 17641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 17741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 17841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 17941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr: 18041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 18141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 18241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 18341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 18441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 18541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int afcex_data_set(struct mb86a16_state *state, 18641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char AFCEX_L, 18741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char AFCEX_H) 18841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 18941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_AFCEXL, AFCEX_L) < 0) 19041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 19141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_AFCEXH, AFCEX_H) < 0) 19241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 19341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 19441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 19541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr: 19641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 19741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 19841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 19941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 20041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 20141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int afcofs_data_set(struct mb86a16_state *state, 20241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char AFCEX_L, 20341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char AFCEX_H) 20441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 20541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, 0x58, AFCEX_L) < 0) 20641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 20741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, 0x59, AFCEX_H) < 0) 20841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 20941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 21041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 21141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr: 21241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 21341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 21441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 21541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 21641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int stlp_set(struct mb86a16_state *state, 21741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char STRAS, 21841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char STRBS) 21941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 22041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_STRFILTCOEF1, (STRBS << 3) | (STRAS)) < 0) 22141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 22241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 22341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 22441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr: 22541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 22641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 22741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 22841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 22941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int Vi_set(struct mb86a16_state *state, unsigned char ETH, unsigned char VIA) 23041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 23141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_VISET2, 0x04) < 0) 23241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 23341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_VISET3, 0xf5) < 0) 23441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 23541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 23641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 23741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr: 23841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 23941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 24041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 24141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 24241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int initial_set(struct mb86a16_state *state) 24341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 24441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (stlp_set(state, 5, 7)) 24541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 246a890cce595c86013ca1fba644c25c01b86149b23Manu Abraham 247a890cce595c86013ca1fba644c25c01b86149b23Manu Abraham udelay(100); 24841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (afcex_data_set(state, 0, 0)) 24941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 250a890cce595c86013ca1fba644c25c01b86149b23Manu Abraham 251a890cce595c86013ca1fba644c25c01b86149b23Manu Abraham udelay(100); 25241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (afcofs_data_set(state, 0, 0)) 25341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 25441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 255a890cce595c86013ca1fba644c25c01b86149b23Manu Abraham udelay(100); 25641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_CRLFILTCOEF1, 0x16) < 0) 25741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 25841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, 0x2f, 0x21) < 0) 25941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 26041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_VIMAG, 0x38) < 0) 26141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 26241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_FAGCS1, 0x00) < 0) 26341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 26441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_FAGCS2, 0x1c) < 0) 26541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 26641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_FAGCS3, 0x20) < 0) 26741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 26841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_FAGCS4, 0x1e) < 0) 26941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 27041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_FAGCS5, 0x23) < 0) 27141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 27241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, 0x54, 0xff) < 0) 27341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 27441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_TSOUT, 0x00) < 0) 27541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 27641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 27741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 27841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 27941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr: 28041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 28141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 28241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 28341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 28441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int S01T_set(struct mb86a16_state *state, 28541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char s1t, 28641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned s0t) 28741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 28841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, 0x33, (s1t << 3) | s0t) < 0) 28941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 29041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 29141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 29241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr: 29341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 29441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 29541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 29641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 29741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 29841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int EN_set(struct mb86a16_state *state, 29941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int cren, 30041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int afcen) 30141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 30241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char val; 30341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 30441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham val = 0x7a | (cren << 7) | (afcen << 2); 30541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, 0x49, val) < 0) 30641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 30741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 30841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 30941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr: 31041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 31141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 31241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 31341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 31441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int AFCEXEN_set(struct mb86a16_state *state, 31541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int afcexen, 31641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int smrt) 31741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 31841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char AFCA ; 31941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 32041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (smrt > 18875) 32141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham AFCA = 4; 32241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else if (smrt > 9375) 32341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham AFCA = 3; 32441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else if (smrt > 2250) 32541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham AFCA = 2; 32641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else 32741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham AFCA = 1; 32841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 32941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, 0x2a, 0x02 | (afcexen << 5) | (AFCA << 2)) < 0) 33041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 33141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 33241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 33341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 33441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr: 33541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 33641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 33741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 33841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 33941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int DAGC_data_set(struct mb86a16_state *state, 34041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char DAGCA, 34141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char DAGCW) 34241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 34341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, 0x2d, (DAGCA << 3) | DAGCW) < 0) 34441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 34541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 34641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 34741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 34841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr: 34941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 35041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 35141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 35241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 35341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic void smrt_info_get(struct mb86a16_state *state, int rate) 35441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 35541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (rate >= 37501) { 35641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->deci = 0; state->csel = 0; state->rsel = 0; 35741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (rate >= 30001) { 35841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->deci = 0; state->csel = 0; state->rsel = 1; 35941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (rate >= 26251) { 36041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->deci = 0; state->csel = 1; state->rsel = 0; 36141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (rate >= 22501) { 36241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->deci = 0; state->csel = 1; state->rsel = 1; 36341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (rate >= 18751) { 36441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->deci = 1; state->csel = 0; state->rsel = 0; 36541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (rate >= 15001) { 36641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->deci = 1; state->csel = 0; state->rsel = 1; 36741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (rate >= 13126) { 36841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->deci = 1; state->csel = 1; state->rsel = 0; 36941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (rate >= 11251) { 37041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->deci = 1; state->csel = 1; state->rsel = 1; 37141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (rate >= 9376) { 37241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->deci = 2; state->csel = 0; state->rsel = 0; 37341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (rate >= 7501) { 37441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->deci = 2; state->csel = 0; state->rsel = 1; 37541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (rate >= 6563) { 37641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->deci = 2; state->csel = 1; state->rsel = 0; 37741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (rate >= 5626) { 37841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->deci = 2; state->csel = 1; state->rsel = 1; 37941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (rate >= 4688) { 38041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->deci = 3; state->csel = 0; state->rsel = 0; 38141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (rate >= 3751) { 38241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->deci = 3; state->csel = 0; state->rsel = 1; 38341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (rate >= 3282) { 38441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->deci = 3; state->csel = 1; state->rsel = 0; 38541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (rate >= 2814) { 38641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->deci = 3; state->csel = 1; state->rsel = 1; 38741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (rate >= 2344) { 38841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->deci = 4; state->csel = 0; state->rsel = 0; 38941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (rate >= 1876) { 39041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->deci = 4; state->csel = 0; state->rsel = 1; 39141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (rate >= 1641) { 39241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->deci = 4; state->csel = 1; state->rsel = 0; 39341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (rate >= 1407) { 39441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->deci = 4; state->csel = 1; state->rsel = 1; 39541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (rate >= 1172) { 39641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->deci = 5; state->csel = 0; state->rsel = 0; 39741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (rate >= 939) { 39841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->deci = 5; state->csel = 0; state->rsel = 1; 39941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (rate >= 821) { 40041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->deci = 5; state->csel = 1; state->rsel = 0; 40141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else { 40241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->deci = 5; state->csel = 1; state->rsel = 1; 40341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 40441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 40541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (state->csel == 0) 40641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->master_clk = 92000; 40741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else 40841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->master_clk = 61333; 40941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 41041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 41141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 41241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int signal_det(struct mb86a16_state *state, 41341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int smrt, 41441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char *SIG) 41541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 41641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 41741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int ret ; 41841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int smrtd ; 41941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int wait_sym ; 420e15c7ccd31faa0618478ad78e11423891919a87eManu Abraham 421e15c7ccd31faa0618478ad78e11423891919a87eManu Abraham u32 wait_t; 42241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char S[3] ; 42341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int i ; 42441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 42541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (*SIG > 45) { 42641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (CNTM_set(state, 2, 1, 2) < 0) { 42741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "CNTM set Error"); 42841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 42941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 43041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham wait_sym = 40000; 43141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else { 43241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (CNTM_set(state, 3, 1, 2) < 0) { 43341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "CNTM set Error"); 43441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 43541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 43641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham wait_sym = 80000; 43741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 43841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham for (i = 0; i < 3; i++) { 439f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham if (i == 0) 44041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham smrtd = smrt * 98 / 100; 44141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else if (i == 1) 44241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham smrtd = smrt; 44341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else 44441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham smrtd = smrt * 102 / 100; 44541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham smrt_info_get(state, smrtd); 44641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham smrt_set(state, smrtd); 44741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham srst(state); 44841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham wait_t = (wait_sym + 99 * smrtd / 100) / smrtd; 44941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (wait_t == 0) 45041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham wait_t = 1; 45141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham msleep_interruptible(10); 45241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_read(state, 0x37, &(S[i])) != 2) { 45341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 45441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 45541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 45641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 45741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if ((S[1] > S[0] * 112 / 100) && 45841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (S[1] > S[2] * 112 / 100)) { 45941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 46041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham ret = 1; 46141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else { 46241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham ret = 0; 46341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 46441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *SIG = S[1]; 46541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 46641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (CNTM_set(state, 0, 1, 2) < 0) { 46741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "CNTM set Error"); 46841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 46941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 47041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 47141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return ret; 47241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 47341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 47441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int rf_val_set(struct mb86a16_state *state, 47541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int f, 47641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int smrt, 47741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char R) 47841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 47941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char C, F, B; 48041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int M; 48141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char rf_val[5]; 48241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int ack = -1; 48341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 484f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham if (smrt > 37750) 48541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham C = 1; 48641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else if (smrt > 18875) 48741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham C = 2; 488f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham else if (smrt > 5500) 48941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham C = 3; 49041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else 49141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham C = 4; 49241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 49341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (smrt > 30500) 49441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham F = 3; 49541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else if (smrt > 9375) 49641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham F = 1; 49741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else if (smrt > 4625) 49841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham F = 0; 49941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else 50041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham F = 2; 50141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 50241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (f < 1060) 50341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham B = 0; 50441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else if (f < 1175) 50541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham B = 1; 50641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else if (f < 1305) 50741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham B = 2; 50841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else if (f < 1435) 50941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham B = 3; 51041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else if (f < 1570) 51141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham B = 4; 51241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else if (f < 1715) 51341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham B = 5; 51441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else if (f < 1845) 51541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham B = 6; 51641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else if (f < 1980) 51741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham B = 7; 51841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else if (f < 2080) 51941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham B = 8; 52041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else 52141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham B = 9; 52241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 52341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham M = f * (1 << R) / 2; 52441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 52541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham rf_val[0] = 0x01 | (C << 3) | (F << 1); 52641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham rf_val[1] = (R << 5) | ((M & 0x1f000) >> 12); 52741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham rf_val[2] = (M & 0x00ff0) >> 4; 52841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham rf_val[3] = ((M & 0x0000f) << 4) | B; 52941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 530f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham /* Frequency Set */ 53141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, 0x21, rf_val[0]) < 0) 53241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham ack = 0; 53341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, 0x22, rf_val[1]) < 0) 53441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham ack = 0; 53541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, 0x23, rf_val[2]) < 0) 53641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham ack = 0; 53741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, 0x24, rf_val[3]) < 0) 53841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham ack = 0; 53941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, 0x25, 0x01) < 0) 54041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham ack = 0; 54141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (ack == 0) { 54241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "RF Setup - I2C transfer error"); 54341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 54441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 54541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 54641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 54741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 54841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 54941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int afcerr_chk(struct mb86a16_state *state) 55041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 55141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char AFCM_L, AFCM_H ; 55241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int AFCM ; 55341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int afcm, afcerr ; 55441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 55541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_read(state, 0x0e, &AFCM_L) != 2) 55641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 55741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_read(state, 0x0f, &AFCM_H) != 2) 55841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 55941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 56041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham AFCM = (AFCM_H << 8) + AFCM_L; 56141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 56241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (AFCM > 2048) 56341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham afcm = AFCM - 4096; 56441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else 56541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham afcm = AFCM; 56641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham afcerr = afcm * state->master_clk / 8192; 56741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 56841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return afcerr; 56941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 57041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr: 57141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 57241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 57341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 57441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 57541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int dagcm_val_get(struct mb86a16_state *state) 57641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 57741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int DAGCM; 57841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char DAGCM_H, DAGCM_L; 57941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 58041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_read(state, 0x45, &DAGCM_L) != 2) 58141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 58241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_read(state, 0x46, &DAGCM_H) != 2) 58341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 58441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 58541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham DAGCM = (DAGCM_H << 8) + DAGCM_L; 58641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 58741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return DAGCM; 58841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 58941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr: 59041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 59141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 59241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 59341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 59441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int mb86a16_read_status(struct dvb_frontend *fe, fe_status_t *status) 59541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 59677557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham u8 stat, stat2; 59741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham struct mb86a16_state *state = fe->demodulator_priv; 59841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 5991fa1f107852484157c5453cc6c4a60c792f06c35Sigmund Augdal *status = 0; 60077557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham 60177557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if (mb86a16_read(state, MB86A16_SIG1, &stat) != 2) 60277557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham goto err; 60377557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if (mb86a16_read(state, MB86A16_SIG2, &stat2) != 2) 60477557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham goto err; 60577557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if ((stat > 25) && (stat2 > 25)) 60677557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham *status |= FE_HAS_SIGNAL; 60777557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if ((stat > 45) && (stat2 > 45)) 60877557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham *status |= FE_HAS_CARRIER; 60977557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham 61077557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if (mb86a16_read(state, MB86A16_STATUS, &stat) != 2) 61177557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham goto err; 61277557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham 61377557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if (stat & 0x01) 61441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *status |= FE_HAS_SYNC; 61577557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if (stat & 0x01) 61677557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham *status |= FE_HAS_VITERBI; 61777557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham 61877557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if (mb86a16_read(state, MB86A16_FRAMESYNC, &stat) != 2) 61977557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham goto err; 62077557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham 62177557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if ((stat & 0x0f) && (*status & FE_HAS_VITERBI)) 62241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *status |= FE_HAS_LOCK; 62341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 62441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 62577557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham 62677557abef0de3f1f1e8f563db6df8710a9e930feManu Abrahamerr: 62777557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 62877557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham return -EREMOTEIO; 62941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 63041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 63141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int sync_chk(struct mb86a16_state *state, 63241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char *VIRM) 63341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 63441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char val; 63541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int sync; 63641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 63741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_read(state, 0x0d, &val) != 2) 63841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 63941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 64041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_INFO, 1, "Status = %02x,", val); 64141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham sync = val & 0x01; 64241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *VIRM = (val & 0x1c) >> 2; 64341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 64441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return sync; 64541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr: 64641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 64741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 64841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 64941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 65041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 65141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int freqerr_chk(struct mb86a16_state *state, 65241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int fTP, 65341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int smrt, 65441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int unit) 65541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 65641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char CRM, AFCML, AFCMH; 65741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char temp1, temp2, temp3; 65841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int crm, afcm, AFCM; 659f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham int crrerr, afcerr; /* kHz */ 660f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham int frqerr; /* MHz */ 66141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int afcen, afcexen = 0; 66241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int R, M, fOSC, fOSC_OFS; 66341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 66441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_read(state, 0x43, &CRM) != 2) 66541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 66641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 66741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (CRM > 127) 66841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham crm = CRM - 256; 66941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else 67041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham crm = CRM; 67141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 67241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham crrerr = smrt * crm / 256; 67341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_read(state, 0x49, &temp1) != 2) 67441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 67541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 67641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham afcen = (temp1 & 0x04) >> 2; 67741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (afcen == 0) { 67841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_read(state, 0x2a, &temp1) != 2) 67941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 68041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham afcexen = (temp1 & 0x20) >> 5; 68141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 68241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 68341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (afcen == 1) { 68441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_read(state, 0x0e, &AFCML) != 2) 68541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 68641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_read(state, 0x0f, &AFCMH) != 2) 68741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 68841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (afcexen == 1) { 68941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_read(state, 0x2b, &AFCML) != 2) 69041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 69141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_read(state, 0x2c, &AFCMH) != 2) 69241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 69341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 69441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if ((afcen == 1) || (afcexen == 1)) { 69541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham smrt_info_get(state, smrt); 69641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham AFCM = ((AFCMH & 0x01) << 8) + AFCML; 69741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (AFCM > 255) 69841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham afcm = AFCM - 512; 69941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else 70041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham afcm = AFCM; 70141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 70241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham afcerr = afcm * state->master_clk / 8192; 70341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else 70441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham afcerr = 0; 70541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 70641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_read(state, 0x22, &temp1) != 2) 70741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 70841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_read(state, 0x23, &temp2) != 2) 70941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 71041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_read(state, 0x24, &temp3) != 2) 71141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 71241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 71341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham R = (temp1 & 0xe0) >> 5; 71441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham M = ((temp1 & 0x1f) << 12) + (temp2 << 4) + (temp3 >> 4); 71541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (R == 0) 71641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham fOSC = 2 * M; 71741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else 71841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham fOSC = M; 71941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 72041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham fOSC_OFS = fOSC - fTP; 72141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 722f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham if (unit == 0) { /* MHz */ 72341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (crrerr + afcerr + fOSC_OFS * 1000 >= 0) 72441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham frqerr = (crrerr + afcerr + fOSC_OFS * 1000 + 500) / 1000; 72541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else 72641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham frqerr = (crrerr + afcerr + fOSC_OFS * 1000 - 500) / 1000; 727f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham } else { /* kHz */ 72841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham frqerr = crrerr + afcerr + fOSC_OFS * 1000; 72941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 73041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 73141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return frqerr; 73241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr: 73341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 73441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 73541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 73641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 73741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic unsigned char vco_dev_get(struct mb86a16_state *state, int smrt) 73841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 73941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char R; 74041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 74141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (smrt > 9375) 74241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham R = 0; 74341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else 74441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham R = 1; 74541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 74641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return R; 74741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 74841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 74941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic void swp_info_get(struct mb86a16_state *state, 75041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int fOSC_start, 75141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int smrt, 75241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int v, int R, 75341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int swp_ofs, 75441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int *fOSC, 75541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int *afcex_freq, 75641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char *AFCEX_L, 75741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char *AFCEX_H) 75841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 75941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int AFCEX ; 76041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int crnt_swp_freq ; 76141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 76241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham crnt_swp_freq = fOSC_start * 1000 + v * swp_ofs; 76341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 764f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham if (R == 0) 76541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *fOSC = (crnt_swp_freq + 1000) / 2000 * 2; 76641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else 76741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *fOSC = (crnt_swp_freq + 500) / 1000; 76841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 76941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (*fOSC >= crnt_swp_freq) 770f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham *afcex_freq = *fOSC * 1000 - crnt_swp_freq; 77141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else 77241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *afcex_freq = crnt_swp_freq - *fOSC * 1000; 77341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 77441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham AFCEX = *afcex_freq * 8192 / state->master_clk; 77541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *AFCEX_L = AFCEX & 0x00ff; 77641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *AFCEX_H = (AFCEX & 0x0f00) >> 8; 77741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 77841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 77941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 78041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int swp_freq_calcuation(struct mb86a16_state *state, int i, int v, int *V, int vmax, int vmin, 78141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int SIGMIN, int fOSC, int afcex_freq, int swp_ofs, unsigned char *SIG1) 78241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 78341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int swp_freq ; 78441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 78541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if ((i % 2 == 1) && (v <= vmax)) { 786f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham /* positive v (case 1) */ 78741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if ((v - 1 == vmin) && 78841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v) >= 0) && 78941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v - 1) >= 0) && 79041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v - 1) > *(V + 30 + v)) && 79141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v - 1) > SIGMIN)) { 79241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 79341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_freq = fOSC * 1000 + afcex_freq - swp_ofs; 79441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *SIG1 = *(V + 30 + v - 1); 79541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if ((v == vmax) && 79641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v) >= 0) && 79741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v - 1) >= 0) && 79841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v) > *(V + 30 + v - 1)) && 79941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v) > SIGMIN)) { 800f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham /* (case 2) */ 80141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_freq = fOSC * 1000 + afcex_freq; 80241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *SIG1 = *(V + 30 + v); 80341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if ((*(V + 30 + v) > 0) && 80441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v - 1) > 0) && 80541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v - 2) > 0) && 80641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v - 3) > 0) && 80741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v - 1) > *(V + 30 + v)) && 80841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v - 2) > *(V + 30 + v - 3)) && 80941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham ((*(V + 30 + v - 1) > SIGMIN) || 81041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v - 2) > SIGMIN))) { 811f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham /* (case 3) */ 81241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (*(V + 30 + v - 1) >= *(V + 30 + v - 2)) { 81341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_freq = fOSC * 1000 + afcex_freq - swp_ofs; 81441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *SIG1 = *(V + 30 + v - 1); 81541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else { 81641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_freq = fOSC * 1000 + afcex_freq - swp_ofs * 2; 81741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *SIG1 = *(V + 30 + v - 2); 81841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 81941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if ((v == vmax) && 82041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v) >= 0) && 82141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v - 1) >= 0) && 82241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v - 2) >= 0) && 82341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v) > *(V + 30 + v - 2)) && 82441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v - 1) > *(V + 30 + v - 2)) && 82541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham ((*(V + 30 + v) > SIGMIN) || 82641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v - 1) > SIGMIN))) { 827f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham /* (case 4) */ 82841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (*(V + 30 + v) >= *(V + 30 + v - 1)) { 82941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_freq = fOSC * 1000 + afcex_freq; 83041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *SIG1 = *(V + 30 + v); 83141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else { 83241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_freq = fOSC * 1000 + afcex_freq - swp_ofs; 83341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *SIG1 = *(V + 30 + v - 1); 83441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 83541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else { 83641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_freq = -1 ; 83741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 83841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if ((i % 2 == 0) && (v >= vmin)) { 839f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham /* Negative v (case 1) */ 84041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if ((*(V + 30 + v) > 0) && 84141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 1) > 0) && 84241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 2) > 0) && 84341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 1) > *(V + 30 + v)) && 84441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 1) > *(V + 30 + v + 2)) && 84541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 1) > SIGMIN)) { 84641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 84741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_freq = fOSC * 1000 + afcex_freq + swp_ofs; 84841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *SIG1 = *(V + 30 + v + 1); 84941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if ((v + 1 == vmax) && 85041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v) >= 0) && 85141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 1) >= 0) && 85241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 1) > *(V + 30 + v)) && 85341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 1) > SIGMIN)) { 854f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham /* (case 2) */ 85541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_freq = fOSC * 1000 + afcex_freq + swp_ofs; 85641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *SIG1 = *(V + 30 + v); 85741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if ((v == vmin) && 85841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v) > 0) && 85941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 1) > 0) && 86041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 2) > 0) && 86141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v) > *(V + 30 + v + 1)) && 86241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v) > *(V + 30 + v + 2)) && 86341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v) > SIGMIN)) { 864f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham /* (case 3) */ 86541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_freq = fOSC * 1000 + afcex_freq; 86641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *SIG1 = *(V + 30 + v); 86741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if ((*(V + 30 + v) >= 0) && 86841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 1) >= 0) && 86941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 2) >= 0) && 870f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham (*(V + 30 + v + 3) >= 0) && 87141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 1) > *(V + 30 + v)) && 87241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 2) > *(V + 30 + v + 3)) && 87341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham ((*(V + 30 + v + 1) > SIGMIN) || 87441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 2) > SIGMIN))) { 875f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham /* (case 4) */ 87641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (*(V + 30 + v + 1) >= *(V + 30 + v + 2)) { 87741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_freq = fOSC * 1000 + afcex_freq + swp_ofs; 87841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *SIG1 = *(V + 30 + v + 1); 87941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else { 88041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_freq = fOSC * 1000 + afcex_freq + swp_ofs * 2; 88141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *SIG1 = *(V + 30 + v + 2); 88241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 88341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if ((*(V + 30 + v) >= 0) && 88441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 1) >= 0) && 88541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 2) >= 0) && 88641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 3) >= 0) && 88741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v) > *(V + 30 + v + 2)) && 88841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 1) > *(V + 30 + v + 2)) && 88941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v) > *(V + 30 + v + 3)) && 89041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 1) > *(V + 30 + v + 3)) && 89141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham ((*(V + 30 + v) > SIGMIN) || 89241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 1) > SIGMIN))) { 893f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham /* (case 5) */ 89441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (*(V + 30 + v) >= *(V + 30 + v + 1)) { 89541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_freq = fOSC * 1000 + afcex_freq; 89641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *SIG1 = *(V + 30 + v); 89741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else { 89841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_freq = fOSC * 1000 + afcex_freq + swp_ofs; 89941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *SIG1 = *(V + 30 + v + 1); 90041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 90141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if ((v + 2 == vmin) && 90241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v) >= 0) && 90341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 1) >= 0) && 90441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 2) >= 0) && 90541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 1) > *(V + 30 + v)) && 90641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 2) > *(V + 30 + v)) && 90741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham ((*(V + 30 + v + 1) > SIGMIN) || 90841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (*(V + 30 + v + 2) > SIGMIN))) { 909f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham /* (case 6) */ 91041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (*(V + 30 + v + 1) >= *(V + 30 + v + 2)) { 91141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_freq = fOSC * 1000 + afcex_freq + swp_ofs; 91241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *SIG1 = *(V + 30 + v + 1); 91341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else { 91441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_freq = fOSC * 1000 + afcex_freq + swp_ofs * 2; 91541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *SIG1 = *(V + 30 + v + 2); 91641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 91741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if ((vmax == 0) && (vmin == 0) && (*(V + 30 + v) > SIGMIN)) { 91841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_freq = fOSC * 1000; 91941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *SIG1 = *(V + 30 + v); 920f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham } else 921f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham swp_freq = -1; 922f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham } else 923f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham swp_freq = -1; 92441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 92541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return swp_freq; 92641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 92741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 92841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic void swp_info_get2(struct mb86a16_state *state, 92941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int smrt, 93041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int R, 93141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int swp_freq, 93241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int *afcex_freq, 93341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int *fOSC, 93441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char *AFCEX_L, 93541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char *AFCEX_H) 93641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 93741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int AFCEX ; 93841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 93941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (R == 0) 94041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *fOSC = (swp_freq + 1000) / 2000 * 2; 94141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else 94241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *fOSC = (swp_freq + 500) / 1000; 94341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 94441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (*fOSC >= swp_freq) 94541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *afcex_freq = *fOSC * 1000 - swp_freq; 94641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else 94741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *afcex_freq = swp_freq - *fOSC * 1000; 94841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 94941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham AFCEX = *afcex_freq * 8192 / state->master_clk; 95041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *AFCEX_L = AFCEX & 0x00ff; 95141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *AFCEX_H = (AFCEX & 0x0f00) >> 8; 95241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 95341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 95441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic void afcex_info_get(struct mb86a16_state *state, 95541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int afcex_freq, 95641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char *AFCEX_L, 95741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char *AFCEX_H) 95841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 95941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int AFCEX ; 96041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 96141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham AFCEX = afcex_freq * 8192 / state->master_clk; 96241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *AFCEX_L = AFCEX & 0x00ff; 96341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *AFCEX_H = (AFCEX & 0x0f00) >> 8; 96441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 96541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 96641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int SEQ_set(struct mb86a16_state *state, unsigned char loop) 96741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 968f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham /* SLOCK0 = 0 */ 96941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, 0x32, 0x02 | (loop << 2)) < 0) { 97041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 97141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 97241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 97341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 97441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 97541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 97641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 97741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int iq_vt_set(struct mb86a16_state *state, unsigned char IQINV) 97841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 979f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham /* Viterbi Rate, IQ Settings */ 98041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, 0x06, 0xdf | (IQINV << 5)) < 0) { 98141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 98241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 98341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 98441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 98541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 98641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 98741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 98841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int FEC_srst(struct mb86a16_state *state) 98941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 99041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_RESET, 0x02) < 0) { 99141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 99241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 99341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 99441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 99541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 99641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 99741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 99841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int S2T_set(struct mb86a16_state *state, unsigned char S2T) 99941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 100041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, 0x34, 0x70 | S2T) < 0) { 100141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 100241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 100341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 100441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 100541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 100641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 100741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 100841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int S45T_set(struct mb86a16_state *state, unsigned char S4T, unsigned char S5T) 100941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 101041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, 0x35, 0x00 | (S5T << 4) | S4T) < 0) { 101141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 101241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 101341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 101441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 101541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 101641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 101741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 101841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 101941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int mb86a16_set_fe(struct mb86a16_state *state) 102041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 102141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham u8 agcval, cnmval; 102241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 102341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int i, j; 102441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int fOSC = 0; 102541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int fOSC_start = 0; 102641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int wait_t; 102741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int fcp; 102841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int swp_ofs; 102941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int V[60]; 103041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham u8 SIG1MIN; 103141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 103241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char CREN, AFCEN, AFCEXEN; 103341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char SIG1; 103441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char TIMINT1, TIMINT2, TIMEXT; 103541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char S0T, S1T; 103641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char S2T; 1037f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham/* unsigned char S2T, S3T; */ 103841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char S4T, S5T; 103941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char AFCEX_L, AFCEX_H; 104041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char R; 104141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char VIRM; 104241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char ETH, VIA; 104341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham unsigned char junk; 104441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 104541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int loop; 104641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int ftemp; 104741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int v, vmax, vmin; 104841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int vmax_his, vmin_his; 104941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int swp_freq, prev_swp_freq[20]; 105041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int prev_freq_num; 105141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int signal_dupl; 105241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int afcex_freq; 105341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int signal; 105441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int afcerr; 105541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int temp_freq, delta_freq; 105641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int dagcm[4]; 105741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int smrt_d; 1058f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham/* int freq_err; */ 105941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int n; 106041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int ret = -1; 106141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int sync; 106241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 106341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_INFO, 1, "freq=%d Mhz, symbrt=%d Ksps", state->frequency, state->srate); 106441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 1065b05c90de08b582172b8f63dd751ac0a1aee421e9Manu Abraham fcp = 3000; 106641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_ofs = state->srate / 4; 106741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 106841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham for (i = 0; i < 60; i++) 106941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham V[i] = -1; 107041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 107141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham for (i = 0; i < 20; i++) 107241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham prev_swp_freq[i] = 0; 107341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 107441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham SIG1MIN = 25; 107541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 107641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham for (n = 0; ((n < 3) && (ret == -1)); n++) { 107741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham SEQ_set(state, 0); 107841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham iq_vt_set(state, 0); 107941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 108041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham CREN = 0; 108141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham AFCEN = 0; 108241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham AFCEXEN = 1; 108341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham TIMINT1 = 0; 108441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham TIMINT2 = 1; 108541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham TIMEXT = 2; 108641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham S1T = 0; 108741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham S0T = 0; 108841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 108941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (initial_set(state) < 0) { 109041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "initial set failed"); 109141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 109241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 109341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (DAGC_data_set(state, 3, 2) < 0) { 109441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "DAGC data set error"); 109541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 109641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 109741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (EN_set(state, CREN, AFCEN) < 0) { 109841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "EN set error"); 1099f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham return -1; /* (0, 0) */ 110041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 110141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (AFCEXEN_set(state, AFCEXEN, state->srate) < 0) { 110241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "AFCEXEN set error"); 1103f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham return -1; /* (1, smrt) = (1, symbolrate) */ 110441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 110541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (CNTM_set(state, TIMINT1, TIMINT2, TIMEXT) < 0) { 110641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "CNTM set error"); 1107f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham return -1; /* (0, 1, 2) */ 110841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 110941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (S01T_set(state, S1T, S0T) < 0) { 111041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "S01T set error"); 1111f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham return -1; /* (0, 0) */ 111241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 111341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham smrt_info_get(state, state->srate); 111441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (smrt_set(state, state->srate) < 0) { 111541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "smrt info get error"); 111641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 111741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 111841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 111941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham R = vco_dev_get(state, state->srate); 112041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (R == 1) 112141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham fOSC_start = state->frequency; 112241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 112341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else if (R == 0) { 112441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (state->frequency % 2 == 0) { 112541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham fOSC_start = state->frequency; 112641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else { 112741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham fOSC_start = state->frequency + 1; 112841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (fOSC_start > 2150) 112941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham fOSC_start = state->frequency - 1; 113041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 113141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 113241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham loop = 1; 113341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham ftemp = fOSC_start * 1000; 113441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham vmax = 0 ; 113541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham while (loop == 1) { 113641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham ftemp = ftemp + swp_ofs; 113741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham vmax++; 113841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 1139f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham /* Upper bound */ 114041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (ftemp > 2150000) { 114141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham loop = 0; 114241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham vmax--; 1143f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham } else { 1144f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham if ((ftemp == 2150000) || 1145f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham (ftemp - state->frequency * 1000 >= fcp + state->srate / 4)) 1146f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham loop = 0; 114741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 114841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 114941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 115041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham loop = 1; 115141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham ftemp = fOSC_start * 1000; 115241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham vmin = 0 ; 115341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham while (loop == 1) { 115441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham ftemp = ftemp - swp_ofs; 115541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham vmin--; 115641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 1157f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham /* Lower bound */ 115841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (ftemp < 950000) { 115941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham loop = 0; 116041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham vmin++; 1161f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham } else { 1162f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham if ((ftemp == 950000) || 1163f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham (state->frequency * 1000 - ftemp >= fcp + state->srate / 4)) 1164f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham loop = 0; 116541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 116641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 116741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 116841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham wait_t = (8000 + state->srate / 2) / state->srate; 116941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (wait_t == 0) 117041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham wait_t = 1; 117141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 117241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham i = 0; 117341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham j = 0; 117441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham prev_freq_num = 0; 117541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham loop = 1; 117641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham signal = 0; 117741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham vmax_his = 0; 117841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham vmin_his = 0; 117941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham v = 0; 118041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 118141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham while (loop == 1) { 118241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_info_get(state, fOSC_start, state->srate, 118341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham v, R, swp_ofs, &fOSC, 118441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham &afcex_freq, &AFCEX_L, &AFCEX_H); 118541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 1186a890cce595c86013ca1fba644c25c01b86149b23Manu Abraham udelay(100); 118741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (rf_val_set(state, fOSC, state->srate, R) < 0) { 118841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "rf val set error"); 118941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 119041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 1191a890cce595c86013ca1fba644c25c01b86149b23Manu Abraham udelay(100); 119241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) { 119341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "afcex data set error"); 119441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 119541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 119641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (srst(state) < 0) { 119741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "srst error"); 119841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 119941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 120041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham msleep_interruptible(wait_t); 120141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 120241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_read(state, 0x37, &SIG1) != 2) { 120341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 120441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 120541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 120641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham V[30 + v] = SIG1 ; 120741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_freq = swp_freq_calcuation(state, i, v, V, vmax, vmin, 120841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham SIG1MIN, fOSC, afcex_freq, 1209f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham swp_ofs, &SIG1); /* changed */ 121041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 121141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham signal_dupl = 0; 121241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham for (j = 0; j < prev_freq_num; j++) { 121341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if ((ABS(prev_swp_freq[j] - swp_freq)) < (swp_ofs * 3 / 2)) { 121441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham signal_dupl = 1; 121541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_INFO, 1, "Probably Duplicate Signal, j = %d", j); 121641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 121741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 121841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if ((signal_dupl == 0) && (swp_freq > 0) && (ABS(swp_freq - state->frequency * 1000) < fcp + state->srate / 6)) { 121941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_DEBUG, 1, "------ Signal detect ------ [swp_freq=[%07d, srate=%05d]]", swp_freq, state->srate); 122041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham prev_swp_freq[prev_freq_num] = swp_freq; 122141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham prev_freq_num++; 122241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_info_get2(state, state->srate, R, swp_freq, 122341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham &afcex_freq, &fOSC, 122441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham &AFCEX_L, &AFCEX_H); 122541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 122641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (rf_val_set(state, fOSC, state->srate, R) < 0) { 122741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "rf val set error"); 122841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 122941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 123041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) { 123141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "afcex data set error"); 123241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 123341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 123441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham signal = signal_det(state, state->srate, &SIG1); 123541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (signal == 1) { 123641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "***** Signal Found *****"); 123741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham loop = 0; 123841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else { 123941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "!!!!! No signal !!!!!, try again..."); 124041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham smrt_info_get(state, state->srate); 124141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (smrt_set(state, state->srate) < 0) { 124241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "smrt set error"); 124341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 124441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 124541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 124641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 124741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (v > vmax) 124841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham vmax_his = 1 ; 124941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (v < vmin) 125041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham vmin_his = 1 ; 125141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham i++; 125241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 125341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if ((i % 2 == 1) && (vmax_his == 1)) 125441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham i++; 125541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if ((i % 2 == 0) && (vmin_his == 1)) 125641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham i++; 125741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 125841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (i % 2 == 1) 125941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham v = (i + 1) / 2; 126041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else 126141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham v = -i / 2; 126241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 126341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if ((vmax_his == 1) && (vmin_his == 1)) 126441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham loop = 0 ; 126541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 126641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 126741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (signal == 1) { 126841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_INFO, 1, " Start Freq Error Check"); 126941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham S1T = 7 ; 127041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham S0T = 1 ; 127141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham CREN = 0 ; 127241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham AFCEN = 1 ; 127341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham AFCEXEN = 0 ; 127441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 127541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (S01T_set(state, S1T, S0T) < 0) { 127641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "S01T set error"); 127741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 127841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 127941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham smrt_info_get(state, state->srate); 128041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (smrt_set(state, state->srate) < 0) { 128141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "smrt set error"); 128241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 128341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 128441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (EN_set(state, CREN, AFCEN) < 0) { 128541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "EN set error"); 128641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 128741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 128841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (AFCEXEN_set(state, AFCEXEN, state->srate) < 0) { 128941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "AFCEXEN set error"); 129041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 129141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 129241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham afcex_info_get(state, afcex_freq, &AFCEX_L, &AFCEX_H); 129341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (afcofs_data_set(state, AFCEX_L, AFCEX_H) < 0) { 129441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "AFCOFS data set error"); 129541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 129641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 129741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (srst(state) < 0) { 129841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "srst error"); 129941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 130041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 1301f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham /* delay 4~200 */ 130241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham wait_t = 200000 / state->master_clk + 200000 / state->srate; 130341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham msleep(wait_t); 130441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham afcerr = afcerr_chk(state); 130541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (afcerr == -1) 130641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 130741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 130841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_freq = fOSC * 1000 + afcerr ; 130941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham AFCEXEN = 1 ; 131041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (state->srate >= 1500) 131141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham smrt_d = state->srate / 3; 131241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else 131341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham smrt_d = state->srate / 2; 131441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham smrt_info_get(state, smrt_d); 131541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (smrt_set(state, smrt_d) < 0) { 131641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "smrt set error"); 131741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 131841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 131941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (AFCEXEN_set(state, AFCEXEN, smrt_d) < 0) { 132041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "AFCEXEN set error"); 132141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 132241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 132341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham R = vco_dev_get(state, smrt_d); 132441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (DAGC_data_set(state, 2, 0) < 0) { 132541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "DAGC data set error"); 132641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 132741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 132841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham for (i = 0; i < 3; i++) { 132941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham temp_freq = swp_freq + (i - 1) * state->srate / 8; 133041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_info_get2(state, smrt_d, R, temp_freq, &afcex_freq, &fOSC, &AFCEX_L, &AFCEX_H); 133141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (rf_val_set(state, fOSC, smrt_d, R) < 0) { 133241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "rf val set error"); 133341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 133441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 133541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) { 133641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "afcex data set error"); 133741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 133841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 133941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham wait_t = 200000 / state->master_clk + 40000 / smrt_d; 134041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham msleep(wait_t); 134141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dagcm[i] = dagcm_val_get(state); 134241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 134341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if ((dagcm[0] > dagcm[1]) && 134441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (dagcm[0] > dagcm[2]) && 134541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (dagcm[0] - dagcm[1] > 2 * (dagcm[2] - dagcm[1]))) { 134641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 134741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham temp_freq = swp_freq - 2 * state->srate / 8; 134841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_info_get2(state, smrt_d, R, temp_freq, &afcex_freq, &fOSC, &AFCEX_L, &AFCEX_H); 134941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (rf_val_set(state, fOSC, smrt_d, R) < 0) { 135041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "rf val set error"); 135141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 135241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 135341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) { 135441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "afcex data set"); 135541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 135641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 135741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham wait_t = 200000 / state->master_clk + 40000 / smrt_d; 135841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham msleep(wait_t); 135941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dagcm[3] = dagcm_val_get(state); 136041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (dagcm[3] > dagcm[1]) 136141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham delta_freq = (dagcm[2] - dagcm[0] + dagcm[1] - dagcm[3]) * state->srate / 300; 136241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else 136341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham delta_freq = 0; 136441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if ((dagcm[2] > dagcm[1]) && 136541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (dagcm[2] > dagcm[0]) && 136641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham (dagcm[2] - dagcm[1] > 2 * (dagcm[0] - dagcm[1]))) { 136741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 136841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham temp_freq = swp_freq + 2 * state->srate / 8; 136941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_info_get2(state, smrt_d, R, temp_freq, &afcex_freq, &fOSC, &AFCEX_L, &AFCEX_H); 137041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (rf_val_set(state, fOSC, smrt_d, R) < 0) { 137141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "rf val set"); 137241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 137341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 137441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) { 137541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "afcex data set"); 137641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 137741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 137841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham wait_t = 200000 / state->master_clk + 40000 / smrt_d; 137941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham msleep(wait_t); 138041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dagcm[3] = dagcm_val_get(state); 138141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (dagcm[3] > dagcm[1]) 138241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham delta_freq = (dagcm[2] - dagcm[0] + dagcm[3] - dagcm[1]) * state->srate / 300; 138341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else 138441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham delta_freq = 0 ; 138541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 138641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else { 138741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham delta_freq = 0 ; 138841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 138941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_INFO, 1, "SWEEP Frequency = %d", swp_freq); 139041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_freq += delta_freq; 139141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_INFO, 1, "Adjusting .., DELTA Freq = %d, SWEEP Freq=%d", delta_freq, swp_freq); 139241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (ABS(state->frequency * 1000 - swp_freq) > 3800) { 139341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_INFO, 1, "NO -- SIGNAL !"); 139441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else { 139541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 139641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham S1T = 0; 139741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham S0T = 3; 139841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham CREN = 1; 139941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham AFCEN = 0; 140041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham AFCEXEN = 1; 140141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 140241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (S01T_set(state, S1T, S0T) < 0) { 140341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "S01T set error"); 140441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 140541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 140641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (DAGC_data_set(state, 0, 0) < 0) { 140741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "DAGC data set error"); 140841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 140941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 141041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham R = vco_dev_get(state, state->srate); 141141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham smrt_info_get(state, state->srate); 141241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (smrt_set(state, state->srate) < 0) { 141341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "smrt set error"); 141441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 141541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 141641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (EN_set(state, CREN, AFCEN) < 0) { 141741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "EN set error"); 141841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 141941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 142041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (AFCEXEN_set(state, AFCEXEN, state->srate) < 0) { 142141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "AFCEXEN set error"); 142241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 142341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 142441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham swp_info_get2(state, state->srate, R, swp_freq, &afcex_freq, &fOSC, &AFCEX_L, &AFCEX_H); 142541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (rf_val_set(state, fOSC, state->srate, R) < 0) { 142641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "rf val set error"); 142741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 142841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 142941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) { 143041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "afcex data set error"); 143141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 143241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 143341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (srst(state) < 0) { 143441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "srst error"); 143541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -1; 143641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 143741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham wait_t = 7 + (10000 + state->srate / 2) / state->srate; 143841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (wait_t == 0) 143941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham wait_t = 1; 144041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham msleep_interruptible(wait_t); 144141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_read(state, 0x37, &SIG1) != 2) { 144241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 144341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 144441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 144541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 144641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (SIG1 > 110) { 144741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham S2T = 4; S4T = 1; S5T = 6; ETH = 4; VIA = 6; 144841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham wait_t = 7 + (917504 + state->srate / 2) / state->srate; 144941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (SIG1 > 105) { 145041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham S2T = 4; S4T = 2; S5T = 8; ETH = 7; VIA = 2; 145141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham wait_t = 7 + (1048576 + state->srate / 2) / state->srate; 145241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (SIG1 > 85) { 145341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham S2T = 5; S4T = 2; S5T = 8; ETH = 7; VIA = 2; 145441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham wait_t = 7 + (1310720 + state->srate / 2) / state->srate; 145541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else if (SIG1 > 65) { 145641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham S2T = 6; S4T = 2; S5T = 8; ETH = 7; VIA = 2; 145741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham wait_t = 7 + (1572864 + state->srate / 2) / state->srate; 145841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else { 145941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham S2T = 7; S4T = 2; S5T = 8; ETH = 7; VIA = 2; 146041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham wait_t = 7 + (2097152 + state->srate / 2) / state->srate; 146141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 1462f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham wait_t *= 2; /* FOS */ 146341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham S2T_set(state, S2T); 146441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham S45T_set(state, S4T, S5T); 146541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham Vi_set(state, ETH, VIA); 146641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham srst(state); 146741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham msleep_interruptible(wait_t); 146841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham sync = sync_chk(state, &VIRM); 146941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_INFO, 1, "-------- Viterbi=[%d] SYNC=[%d] ---------", VIRM, sync); 147041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (VIRM) { 1471f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham if (VIRM == 4) { 1472f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham /* 5/6 */ 147341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (SIG1 > 110) 1474f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham wait_t = (786432 + state->srate / 2) / state->srate; 147541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else 147641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham wait_t = (1572864 + state->srate / 2) / state->srate; 147741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (state->srate < 5000) 1478f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham /* FIXME ! , should be a long wait ! */ 147941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham msleep_interruptible(wait_t); 148041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham else 148141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham msleep_interruptible(wait_t); 148241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 148341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (sync_chk(state, &junk) == 0) { 148441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham iq_vt_set(state, 1); 148541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham FEC_srst(state); 148641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 148741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 1488f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham /* 1/2, 2/3, 3/4, 7/8 */ 148977557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if (SIG1 > 110) 1490f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham wait_t = (786432 + state->srate / 2) / state->srate; 149177557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham else 149277557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham wait_t = (1572864 + state->srate / 2) / state->srate; 149377557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham msleep_interruptible(wait_t); 149477557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham SEQ_set(state, 1); 149541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else { 1496776c3ebe9678f86b9b0e72d541208bb39f9551c6Manu Abraham dprintk(verbose, MB86A16_INFO, 1, "NO -- SYNC"); 149741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham SEQ_set(state, 1); 14985dd83a35bea908ebb8243d67d8c251eed2bb5cc8Manu Abraham ret = -1; 149941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 150041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 150141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } else { 1502f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham dprintk(verbose, MB86A16_INFO, 1, "NO -- SIGNAL"); 15035dd83a35bea908ebb8243d67d8c251eed2bb5cc8Manu Abraham ret = -1; 150441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 150541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 150641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham sync = sync_chk(state, &junk); 150741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (sync) { 150841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_INFO, 1, "******* SYNC *******"); 150941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham freqerr_chk(state, state->frequency, state->srate, 1); 15105dd83a35bea908ebb8243d67d8c251eed2bb5cc8Manu Abraham ret = 0; 1511071e3060a5f482e5948608d55e28bc7f5dd759cdManu Abraham break; 151241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 151341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 151441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 151541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham mb86a16_read(state, 0x15, &agcval); 151641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham mb86a16_read(state, 0x26, &cnmval); 151741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_INFO, 1, "AGC = %02x CNM = %02x", agcval, cnmval); 151841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 151941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return ret; 152041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 152141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 152241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int mb86a16_send_diseqc_msg(struct dvb_frontend *fe, 152341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham struct dvb_diseqc_master_cmd *cmd) 152441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 152541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham struct mb86a16_state *state = fe->demodulator_priv; 152641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int i; 152741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham u8 regs; 152841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 152941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA) < 0) 153041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 153141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_DCCOUT, 0x00) < 0) 153241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 153341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_TONEOUT2, 0x04) < 0) 153441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 153541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 153641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham regs = 0x18; 153741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 153841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (cmd->msg_len > 5 || cmd->msg_len < 4) 153941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EINVAL; 154041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 154141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham for (i = 0; i < cmd->msg_len; i++) { 154241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, regs, cmd->msg[i]) < 0) 154341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 154441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 154541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham regs++; 154641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 154741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham i += 0x90; 154841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 154941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham msleep_interruptible(10); 155041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 155141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_DCC1, i) < 0) 155241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 155341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_DCCOUT, MB86A16_DCCOUT_DISEN) < 0) 155441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 155541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 155641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 155741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 155841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr: 155941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 156041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 156141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 156241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 156341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int mb86a16_send_diseqc_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t burst) 156441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 156541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham struct mb86a16_state *state = fe->demodulator_priv; 156641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 156741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham switch (burst) { 156841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham case SEC_MINI_A: 156941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA | 157041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham MB86A16_DCC1_TBEN | 157141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham MB86A16_DCC1_TBO) < 0) 157241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 157341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_DCCOUT, MB86A16_DCCOUT_DISEN) < 0) 157441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 157541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham break; 157641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham case SEC_MINI_B: 157741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA | 157841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham MB86A16_DCC1_TBEN) < 0) 157941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 158041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_DCCOUT, MB86A16_DCCOUT_DISEN) < 0) 158141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 158241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham break; 158341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 158441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 158541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 158641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr: 158741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 158841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 158941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 159041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 159141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int mb86a16_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone) 159241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 159341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham struct mb86a16_state *state = fe->demodulator_priv; 159441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 159541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham switch (tone) { 159641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham case SEC_TONE_ON: 159741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_TONEOUT2, 0x00) < 0) 159841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 159941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA | 160041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham MB86A16_DCC1_CTOE) < 0) 160141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 160241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 160341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_DCCOUT, MB86A16_DCCOUT_DISEN) < 0) 160441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 160541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham break; 160641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham case SEC_TONE_OFF: 160741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_TONEOUT2, 0x04) < 0) 160841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 160941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA) < 0) 161041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 161141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_write(state, MB86A16_DCCOUT, 0x00) < 0) 161241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err; 161341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham break; 161441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham default: 161541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EINVAL; 161641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 161741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 161841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 161941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr: 162041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 162141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 162241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 162341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 162441da5320df6decec7efce0d936ccadfa9deb49d1Mauro Carvalho Chehabstatic enum dvbfe_search mb86a16_search(struct dvb_frontend *fe) 162541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 162641da5320df6decec7efce0d936ccadfa9deb49d1Mauro Carvalho Chehab struct dtv_frontend_properties *p = &fe->dtv_property_cache; 162741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham struct mb86a16_state *state = fe->demodulator_priv; 162841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 16295dd83a35bea908ebb8243d67d8c251eed2bb5cc8Manu Abraham state->frequency = p->frequency / 1000; 163041da5320df6decec7efce0d936ccadfa9deb49d1Mauro Carvalho Chehab state->srate = p->symbol_rate / 1000; 163141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 16325dd83a35bea908ebb8243d67d8c251eed2bb5cc8Manu Abraham if (!mb86a16_set_fe(state)) { 163325985edcedea6396277003854657b5f3cb31a628Lucas De Marchi dprintk(verbose, MB86A16_ERROR, 1, "Successfully acquired LOCK"); 16345dd83a35bea908ebb8243d67d8c251eed2bb5cc8Manu Abraham return DVBFE_ALGO_SEARCH_SUCCESS; 16355dd83a35bea908ebb8243d67d8c251eed2bb5cc8Manu Abraham } 163641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 16375dd83a35bea908ebb8243d67d8c251eed2bb5cc8Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "Lock acquisition failed!"); 16385dd83a35bea908ebb8243d67d8c251eed2bb5cc8Manu Abraham return DVBFE_ALGO_SEARCH_FAILED; 163941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 164041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 164141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic void mb86a16_release(struct dvb_frontend *fe) 164241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 164341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham struct mb86a16_state *state = fe->demodulator_priv; 164441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham kfree(state); 164541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 164641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 164741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int mb86a16_init(struct dvb_frontend *fe) 164841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 164941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 165041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 165141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 165241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int mb86a16_sleep(struct dvb_frontend *fe) 165341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 165441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 165541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 165641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 165741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int mb86a16_read_ber(struct dvb_frontend *fe, u32 *ber) 165841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 165977557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham u8 ber_mon, ber_tab, ber_lsb, ber_mid, ber_msb, ber_tim, ber_rst; 166077557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham u32 timer; 166177557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham 166277557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham struct mb86a16_state *state = fe->demodulator_priv; 166377557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham 166477557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham *ber = 0; 166577557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if (mb86a16_read(state, MB86A16_BERMON, &ber_mon) != 2) 166677557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham goto err; 166777557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if (mb86a16_read(state, MB86A16_BERTAB, &ber_tab) != 2) 166877557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham goto err; 166977557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if (mb86a16_read(state, MB86A16_BERLSB, &ber_lsb) != 2) 167077557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham goto err; 167177557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if (mb86a16_read(state, MB86A16_BERMID, &ber_mid) != 2) 167277557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham goto err; 167377557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if (mb86a16_read(state, MB86A16_BERMSB, &ber_msb) != 2) 167477557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham goto err; 167577557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham /* BER monitor invalid when BER_EN = 0 */ 167677557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if (ber_mon & 0x04) { 167777557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham /* coarse, fast calculation */ 167877557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham *ber = ber_tab & 0x1f; 167977557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham dprintk(verbose, MB86A16_DEBUG, 1, "BER coarse=[0x%02x]", *ber); 168077557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if (ber_mon & 0x01) { 168177557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham /* 168277557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham * BER_SEL = 1, The monitored BER is the estimated 168377557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham * value with a Reed-Solomon decoder error amount at 168477557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham * the deinterleaver output. 168577557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham * monitored BER is expressed as a 20 bit output in total 168677557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham */ 168777557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham ber_rst = ber_mon >> 3; 168877557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham *ber = (((ber_msb << 8) | ber_mid) << 8) | ber_lsb; 168977557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if (ber_rst == 0) 169077557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham timer = 12500000; 169177557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if (ber_rst == 1) 169277557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham timer = 25000000; 169377557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if (ber_rst == 2) 169477557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham timer = 50000000; 169577557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if (ber_rst == 3) 169677557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham timer = 100000000; 169777557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham 169877557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham *ber /= timer; 169977557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham dprintk(verbose, MB86A16_DEBUG, 1, "BER fine=[0x%02x]", *ber); 170077557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham } else { 170177557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham /* 170277557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham * BER_SEL = 0, The monitored BER is the estimated 170377557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham * value with a Viterbi decoder error amount at the 170477557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham * QPSK demodulator output. 170577557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham * monitored BER is expressed as a 24 bit output in total 170677557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham */ 170777557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham ber_tim = ber_mon >> 1; 170877557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham *ber = (((ber_msb << 8) | ber_mid) << 8) | ber_lsb; 170977557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if (ber_tim == 0) 171077557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham timer = 16; 171177557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if (ber_tim == 1) 171277557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham timer = 24; 171377557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham 171477557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham *ber /= 2 ^ timer; 171577557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham dprintk(verbose, MB86A16_DEBUG, 1, "BER fine=[0x%02x]", *ber); 171677557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham } 171777557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham } 171841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 171977557abef0de3f1f1e8f563db6df8710a9e930feManu Abrahamerr: 172077557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 172177557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham return -EREMOTEIO; 172241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 172341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 172441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int mb86a16_read_signal_strength(struct dvb_frontend *fe, u16 *strength) 172541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 172677557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham u8 agcm = 0; 172777557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham struct mb86a16_state *state = fe->demodulator_priv; 172877557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham 172941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *strength = 0; 173077557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if (mb86a16_read(state, MB86A16_AGCM, &agcm) != 2) { 173177557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 173277557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham return -EREMOTEIO; 173377557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham } 173477557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham 173577557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham *strength = ((0xff - agcm) * 100) / 256; 173677557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham dprintk(verbose, MB86A16_DEBUG, 1, "Signal strength=[%d %%]", (u8) *strength); 173777557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham *strength = (0xffff - 0xff) + agcm; 173841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 173941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 174041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 174141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 174241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstruct cnr { 174341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham u8 cn_reg; 174441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham u8 cn_val; 174541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham}; 174641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 174741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic const struct cnr cnr_tab[] = { 174841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham { 35, 2 }, 174941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham { 40, 3 }, 175041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham { 50, 4 }, 175141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham { 60, 5 }, 175241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham { 70, 6 }, 175341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham { 80, 7 }, 175441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham { 92, 8 }, 175541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham { 103, 9 }, 175641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham { 115, 10 }, 175741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham { 138, 12 }, 175841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham { 162, 15 }, 175941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham { 180, 18 }, 176041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham { 185, 19 }, 176141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham { 189, 20 }, 176241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham { 195, 22 }, 176341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham { 199, 24 }, 176441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham { 201, 25 }, 176541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham { 202, 26 }, 176641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham { 203, 27 }, 176741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham { 205, 28 }, 176841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham { 208, 30 } 176941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham}; 177041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 177141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int mb86a16_read_snr(struct dvb_frontend *fe, u16 *snr) 177241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 177341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham struct mb86a16_state *state = fe->demodulator_priv; 177441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int i = 0; 177541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham int low_tide = 2, high_tide = 30, q_level; 177641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham u8 cn; 177741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 17781fa1f107852484157c5453cc6c4a60c792f06c35Sigmund Augdal *snr = 0; 177941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mb86a16_read(state, 0x26, &cn) != 2) { 178041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 178141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EREMOTEIO; 178241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 178341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 178441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham for (i = 0; i < ARRAY_SIZE(cnr_tab); i++) { 178541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (cn < cnr_tab[i].cn_reg) { 178641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham *snr = cnr_tab[i].cn_val; 178741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham break; 178841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 178941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 179041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham q_level = (*snr * 100) / (high_tide - low_tide); 179141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dprintk(verbose, MB86A16_ERROR, 1, "SNR (Quality) = [%d dB], Level=%d %%", *snr, q_level); 179277557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham *snr = (0xffff - 0xff) + *snr; 179341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 179441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 179541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 179641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 179741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int mb86a16_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) 179841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 179977557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham u8 dist; 180077557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham struct mb86a16_state *state = fe->demodulator_priv; 180177557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham 180277557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham if (mb86a16_read(state, MB86A16_DISTMON, &dist) != 2) { 180377557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error"); 180477557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham return -EREMOTEIO; 180577557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham } 180677557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham *ucblocks = dist; 180777557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham 180841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 180941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 181041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 18115dd83a35bea908ebb8243d67d8c251eed2bb5cc8Manu Abrahamstatic enum dvbfe_algo mb86a16_frontend_algo(struct dvb_frontend *fe) 18125dd83a35bea908ebb8243d67d8c251eed2bb5cc8Manu Abraham{ 18135dd83a35bea908ebb8243d67d8c251eed2bb5cc8Manu Abraham return DVBFE_ALGO_CUSTOM; 18145dd83a35bea908ebb8243d67d8c251eed2bb5cc8Manu Abraham} 18155dd83a35bea908ebb8243d67d8c251eed2bb5cc8Manu Abraham 181641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic struct dvb_frontend_ops mb86a16_ops = { 18175226bb875b051fef4ea6b4bc718e5e028cb8602bMauro Carvalho Chehab .delsys = { SYS_DVBS }, 181841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .info = { 181941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .name = "Fujitsu MB86A16 DVB-S", 182041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .frequency_min = 950000, 182141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .frequency_max = 2150000, 182277557abef0de3f1f1e8f563db6df8710a9e930feManu Abraham .frequency_stepsize = 3000, 182341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .frequency_tolerance = 0, 182441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .symbol_rate_min = 1000000, 182541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .symbol_rate_max = 45000000, 182641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .symbol_rate_tolerance = 500, 182741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | 182841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | 182941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham FE_CAN_FEC_7_8 | FE_CAN_QPSK | 183041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham FE_CAN_FEC_AUTO 183141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham }, 183241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .release = mb86a16_release, 18335dd83a35bea908ebb8243d67d8c251eed2bb5cc8Manu Abraham 183441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .get_frontend_algo = mb86a16_frontend_algo, 18355dd83a35bea908ebb8243d67d8c251eed2bb5cc8Manu Abraham .search = mb86a16_search, 183641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .init = mb86a16_init, 183741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .sleep = mb86a16_sleep, 183841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .read_status = mb86a16_read_status, 183941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 184041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .read_ber = mb86a16_read_ber, 184141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .read_signal_strength = mb86a16_read_signal_strength, 184241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .read_snr = mb86a16_read_snr, 184341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .read_ucblocks = mb86a16_read_ucblocks, 184441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 184541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .diseqc_send_master_cmd = mb86a16_send_diseqc_msg, 184641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .diseqc_send_burst = mb86a16_send_diseqc_burst, 184741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham .set_tone = mb86a16_set_tone, 184841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham}; 184941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 185041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstruct dvb_frontend *mb86a16_attach(const struct mb86a16_config *config, 185141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham struct i2c_adapter *i2c_adap) 185241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 185341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham u8 dev_id = 0; 185441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham struct mb86a16_state *state = NULL; 185541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 1856f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham state = kmalloc(sizeof(struct mb86a16_state), GFP_KERNEL); 185741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (state == NULL) 185841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto error; 185941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 186041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->config = config; 186141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->i2c_adap = i2c_adap; 186241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 186341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham mb86a16_read(state, 0x7f, &dev_id); 186441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (dev_id != 0xfe) 186541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto error; 186641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 1867f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham memcpy(&state->frontend.ops, &mb86a16_ops, sizeof(struct dvb_frontend_ops)); 186841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->frontend.demodulator_priv = state; 186941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham state->frontend.ops.set_voltage = state->config->set_voltage; 187041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 187141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return &state->frontend; 187241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerror: 187341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham kfree(state); 187441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return NULL; 187541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 187641e840b13e111ba18b138d055ddd250bd5ad5e39Manu AbrahamEXPORT_SYMBOL(mb86a16_attach); 187741e840b13e111ba18b138d055ddd250bd5ad5e39Manu AbrahamMODULE_LICENSE("GPL"); 187841e840b13e111ba18b138d055ddd250bd5ad5e39Manu AbrahamMODULE_AUTHOR("Manu Abraham"); 1879