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