cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

stb0899_drv.c (45177B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3	STB0899 Multistandard Frontend driver
      4	Copyright (C) Manu Abraham (abraham.manu@gmail.com)
      5
      6	Copyright (C) ST Microelectronics
      7
      8*/
      9
     10#include <linux/init.h>
     11#include <linux/jiffies.h>
     12#include <linux/kernel.h>
     13#include <linux/module.h>
     14#include <linux/slab.h>
     15#include <linux/string.h>
     16
     17#include <linux/dvb/frontend.h>
     18#include <media/dvb_frontend.h>
     19
     20#include "stb0899_drv.h"
     21#include "stb0899_priv.h"
     22#include "stb0899_reg.h"
     23
     24/* Max transfer size done by I2C transfer functions */
     25#define MAX_XFER_SIZE  64
     26
     27static unsigned int verbose = 0;//1;
     28module_param(verbose, int, 0644);
     29
     30/* C/N in dB/10, NIRM/NIRL */
     31static const struct stb0899_tab stb0899_cn_tab[] = {
     32	{ 200,	2600 },
     33	{ 190,	2700 },
     34	{ 180,	2860 },
     35	{ 170,	3020 },
     36	{ 160,	3210 },
     37	{ 150,	3440 },
     38	{ 140,	3710 },
     39	{ 130,	4010 },
     40	{ 120,	4360 },
     41	{ 110,	4740 },
     42	{ 100,	5190 },
     43	{ 90,	5670 },
     44	{ 80,	6200 },
     45	{ 70,	6770 },
     46	{ 60,	7360 },
     47	{ 50,	7970 },
     48	{ 40,	8250 },
     49	{ 30,	9000 },
     50	{ 20,	9450 },
     51	{ 15,	9600 },
     52};
     53
     54/* DVB-S AGCIQ_VALUE vs. signal level in dBm/10.
     55 * As measured, connected to a modulator.
     56 * -8.0 to -50.0 dBm directly connected,
     57 * -52.0 to -74.8 with extra attenuation.
     58 * Cut-off to AGCIQ_VALUE = 0x80 below -74.8dBm.
     59 * Crude linear extrapolation below -84.8dBm and above -8.0dBm.
     60 */
     61static const struct stb0899_tab stb0899_dvbsrf_tab[] = {
     62	{ -750,	-128 },
     63	{ -748,	 -94 },
     64	{ -745,	 -92 },
     65	{ -735,	 -90 },
     66	{ -720,	 -87 },
     67	{ -670,	 -77 },
     68	{ -640,	 -70 },
     69	{ -610,	 -62 },
     70	{ -600,	 -60 },
     71	{ -590,	 -56 },
     72	{ -560,	 -41 },
     73	{ -540,	 -25 },
     74	{ -530,	 -17 },
     75	{ -520,	 -11 },
     76	{ -500,	   1 },
     77	{ -490,	   6 },
     78	{ -480,	  10 },
     79	{ -440,	  22 },
     80	{ -420,	  27 },
     81	{ -400,	  31 },
     82	{ -380,	  34 },
     83	{ -340,	  40 },
     84	{ -320,	  43 },
     85	{ -280,	  48 },
     86	{ -250,	  52 },
     87	{ -230,	  55 },
     88	{ -180,	  61 },
     89	{ -140,	  66 },
     90	{  -90,	  73 },
     91	{  -80,	  74 },
     92	{  500,	 127 }
     93};
     94
     95/* DVB-S2 IF_AGC_GAIN vs. signal level in dBm/10.
     96 * As measured, connected to a modulator.
     97 * -8.0 to -50.1 dBm directly connected,
     98 * -53.0 to -76.6 with extra attenuation.
     99 * Cut-off to IF_AGC_GAIN = 0x3fff below -76.6dBm.
    100 * Crude linear extrapolation below -76.6dBm and above -8.0dBm.
    101 */
    102static const struct stb0899_tab stb0899_dvbs2rf_tab[] = {
    103	{  700,	    0 },
    104	{  -80,	 3217 },
    105	{ -150,	 3893 },
    106	{ -190,	 4217 },
    107	{ -240,	 4621 },
    108	{ -280,	 4945 },
    109	{ -320,	 5273 },
    110	{ -350,	 5545 },
    111	{ -370,	 5741 },
    112	{ -410,	 6147 },
    113	{ -450,	 6671 },
    114	{ -490,	 7413 },
    115	{ -501,	 7665 },
    116	{ -530,	 8767 },
    117	{ -560,	10219 },
    118	{ -580,	10939 },
    119	{ -590,	11518 },
    120	{ -600,	11723 },
    121	{ -650,	12659 },
    122	{ -690,	13219 },
    123	{ -730,	13645 },
    124	{ -750,	13909 },
    125	{ -766,	14153 },
    126	{ -950,	16383 }
    127};
    128
    129/* DVB-S2 Es/N0 quant in dB/100 vs read value * 100*/
    130static struct stb0899_tab stb0899_quant_tab[] = {
    131	{    0,	    0 },
    132	{    0,	  100 },
    133	{  600,	  200 },
    134	{  950,	  299 },
    135	{ 1200,	  398 },
    136	{ 1400,	  501 },
    137	{ 1560,	  603 },
    138	{ 1690,	  700 },
    139	{ 1810,	  804 },
    140	{ 1910,	  902 },
    141	{ 2000,	 1000 },
    142	{ 2080,	 1096 },
    143	{ 2160,	 1202 },
    144	{ 2230,	 1303 },
    145	{ 2350,	 1496 },
    146	{ 2410,	 1603 },
    147	{ 2460,	 1698 },
    148	{ 2510,	 1799 },
    149	{ 2600,	 1995 },
    150	{ 2650,	 2113 },
    151	{ 2690,  2213 },
    152	{ 2720,	 2291 },
    153	{ 2760,	 2399 },
    154	{ 2800,	 2512 },
    155	{ 2860,	 2692 },
    156	{ 2930,	 2917 },
    157	{ 2960,	 3020 },
    158	{ 3010,	 3199 },
    159	{ 3040,	 3311 },
    160	{ 3060,	 3388 },
    161	{ 3120,	 3631 },
    162	{ 3190,	 3936 },
    163	{ 3400,	 5012 },
    164	{ 3610,	 6383 },
    165	{ 3800,	 7943 },
    166	{ 4210,	12735 },
    167	{ 4500,	17783 },
    168	{ 4690,	22131 },
    169	{ 4810,	25410 }
    170};
    171
    172/* DVB-S2 Es/N0 estimate in dB/100 vs read value */
    173static struct stb0899_tab stb0899_est_tab[] = {
    174	{    0,	     0 },
    175	{    0,	     1 },
    176	{  301,	     2 },
    177	{ 1204,	    16 },
    178	{ 1806,	    64 },
    179	{ 2408,	   256 },
    180	{ 2709,	   512 },
    181	{ 3010,	  1023 },
    182	{ 3311,	  2046 },
    183	{ 3612,	  4093 },
    184	{ 3823,	  6653 },
    185	{ 3913,	  8185 },
    186	{ 4010,	 10233 },
    187	{ 4107,	 12794 },
    188	{ 4214,	 16368 },
    189	{ 4266,	 18450 },
    190	{ 4311,	 20464 },
    191	{ 4353,	 22542 },
    192	{ 4391,	 24604 },
    193	{ 4425,	 26607 },
    194	{ 4457,	 28642 },
    195	{ 4487,	 30690 },
    196	{ 4515,	 32734 },
    197	{ 4612,	 40926 },
    198	{ 4692,	 49204 },
    199	{ 4816,	 65464 },
    200	{ 4913,	 81846 },
    201	{ 4993,	 98401 },
    202	{ 5060,	114815 },
    203	{ 5118,	131220 },
    204	{ 5200,	158489 },
    205	{ 5300,	199526 },
    206	{ 5400,	251189 },
    207	{ 5500,	316228 },
    208	{ 5600,	398107 },
    209	{ 5720,	524807 },
    210	{ 5721,	526017 },
    211};
    212
    213static int _stb0899_read_reg(struct stb0899_state *state, unsigned int reg)
    214{
    215	int ret;
    216
    217	u8 b0[] = { reg >> 8, reg & 0xff };
    218	u8 buf;
    219
    220	struct i2c_msg msg[] = {
    221		{
    222			.addr	= state->config->demod_address,
    223			.flags	= 0,
    224			.buf	= b0,
    225			.len	= 2
    226		},{
    227			.addr	= state->config->demod_address,
    228			.flags	= I2C_M_RD,
    229			.buf	= &buf,
    230			.len	= 1
    231		}
    232	};
    233
    234	ret = i2c_transfer(state->i2c, msg, 2);
    235	if (ret != 2) {
    236		if (ret != -ERESTARTSYS)
    237			dprintk(state->verbose, FE_ERROR, 1,
    238				"Read error, Reg=[0x%02x], Status=%d",
    239				reg, ret);
    240
    241		return ret < 0 ? ret : -EREMOTEIO;
    242	}
    243	if (unlikely(*state->verbose >= FE_DEBUGREG))
    244		dprintk(state->verbose, FE_ERROR, 1, "Reg=[0x%02x], data=%02x",
    245			reg, buf);
    246
    247	return (unsigned int)buf;
    248}
    249
    250int stb0899_read_reg(struct stb0899_state *state, unsigned int reg)
    251{
    252	int result;
    253
    254	result = _stb0899_read_reg(state, reg);
    255	/*
    256	 * Bug ID 9:
    257	 * access to 0xf2xx/0xf6xx
    258	 * must be followed by read from 0xf2ff/0xf6ff.
    259	 */
    260	if ((reg != 0xf2ff) && (reg != 0xf6ff) &&
    261	    (((reg & 0xff00) == 0xf200) || ((reg & 0xff00) == 0xf600)))
    262		_stb0899_read_reg(state, (reg | 0x00ff));
    263
    264	return result;
    265}
    266
    267u32 _stb0899_read_s2reg(struct stb0899_state *state,
    268			u32 stb0899_i2cdev,
    269			u32 stb0899_base_addr,
    270			u16 stb0899_reg_offset)
    271{
    272	int status;
    273	u32 data;
    274	u8 buf[7] = { 0 };
    275	u16 tmpaddr;
    276
    277	u8 buf_0[] = {
    278		GETBYTE(stb0899_i2cdev, BYTE1),		/* 0xf3	S2 Base Address (MSB)	*/
    279		GETBYTE(stb0899_i2cdev, BYTE0),		/* 0xfc	S2 Base Address (LSB)	*/
    280		GETBYTE(stb0899_base_addr, BYTE0),	/* 0x00	Base Address (LSB)	*/
    281		GETBYTE(stb0899_base_addr, BYTE1),	/* 0x04	Base Address (LSB)	*/
    282		GETBYTE(stb0899_base_addr, BYTE2),	/* 0x00	Base Address (MSB)	*/
    283		GETBYTE(stb0899_base_addr, BYTE3),	/* 0x00	Base Address (MSB)	*/
    284	};
    285	u8 buf_1[] = {
    286		0x00,	/* 0xf3	Reg Offset	*/
    287		0x00,	/* 0x44	Reg Offset	*/
    288	};
    289
    290	struct i2c_msg msg_0 = {
    291		.addr	= state->config->demod_address,
    292		.flags	= 0,
    293		.buf	= buf_0,
    294		.len	= 6
    295	};
    296
    297	struct i2c_msg msg_1 = {
    298		.addr	= state->config->demod_address,
    299		.flags	= 0,
    300		.buf	= buf_1,
    301		.len	= 2
    302	};
    303
    304	struct i2c_msg msg_r = {
    305		.addr	= state->config->demod_address,
    306		.flags	= I2C_M_RD,
    307		.buf	= buf,
    308		.len	= 4
    309	};
    310
    311	tmpaddr = stb0899_reg_offset & 0xff00;
    312	if (!(stb0899_reg_offset & 0x8))
    313		tmpaddr = stb0899_reg_offset | 0x20;
    314
    315	buf_1[0] = GETBYTE(tmpaddr, BYTE1);
    316	buf_1[1] = GETBYTE(tmpaddr, BYTE0);
    317
    318	status = i2c_transfer(state->i2c, &msg_0, 1);
    319	if (status < 1) {
    320		if (status != -ERESTARTSYS)
    321			printk(KERN_ERR "%s ERR(1), Device=[0x%04x], Base address=[0x%08x], Offset=[0x%04x], Status=%d\n",
    322			       __func__, stb0899_i2cdev, stb0899_base_addr, stb0899_reg_offset, status);
    323
    324		goto err;
    325	}
    326
    327	/* Dummy	*/
    328	status = i2c_transfer(state->i2c, &msg_1, 1);
    329	if (status < 1)
    330		goto err;
    331
    332	status = i2c_transfer(state->i2c, &msg_r, 1);
    333	if (status < 1)
    334		goto err;
    335
    336	buf_1[0] = GETBYTE(stb0899_reg_offset, BYTE1);
    337	buf_1[1] = GETBYTE(stb0899_reg_offset, BYTE0);
    338
    339	/* Actual	*/
    340	status = i2c_transfer(state->i2c, &msg_1, 1);
    341	if (status < 1) {
    342		if (status != -ERESTARTSYS)
    343			printk(KERN_ERR "%s ERR(2), Device=[0x%04x], Base address=[0x%08x], Offset=[0x%04x], Status=%d\n",
    344			       __func__, stb0899_i2cdev, stb0899_base_addr, stb0899_reg_offset, status);
    345		goto err;
    346	}
    347
    348	status = i2c_transfer(state->i2c, &msg_r, 1);
    349	if (status < 1) {
    350		if (status != -ERESTARTSYS)
    351			printk(KERN_ERR "%s ERR(3), Device=[0x%04x], Base address=[0x%08x], Offset=[0x%04x], Status=%d\n",
    352			       __func__, stb0899_i2cdev, stb0899_base_addr, stb0899_reg_offset, status);
    353		return status < 0 ? status : -EREMOTEIO;
    354	}
    355
    356	data = MAKEWORD32(buf[3], buf[2], buf[1], buf[0]);
    357	if (unlikely(*state->verbose >= FE_DEBUGREG))
    358		printk(KERN_DEBUG "%s Device=[0x%04x], Base address=[0x%08x], Offset=[0x%04x], Data=[0x%08x]\n",
    359		       __func__, stb0899_i2cdev, stb0899_base_addr, stb0899_reg_offset, data);
    360
    361	return data;
    362
    363err:
    364	return status < 0 ? status : -EREMOTEIO;
    365}
    366
    367int stb0899_write_s2reg(struct stb0899_state *state,
    368			u32 stb0899_i2cdev,
    369			u32 stb0899_base_addr,
    370			u16 stb0899_reg_offset,
    371			u32 stb0899_data)
    372{
    373	int status;
    374
    375	/* Base Address Setup	*/
    376	u8 buf_0[] = {
    377		GETBYTE(stb0899_i2cdev, BYTE1),		/* 0xf3	S2 Base Address (MSB)	*/
    378		GETBYTE(stb0899_i2cdev, BYTE0),		/* 0xfc	S2 Base Address (LSB)	*/
    379		GETBYTE(stb0899_base_addr, BYTE0),	/* 0x00	Base Address (LSB)	*/
    380		GETBYTE(stb0899_base_addr, BYTE1),	/* 0x04	Base Address (LSB)	*/
    381		GETBYTE(stb0899_base_addr, BYTE2),	/* 0x00	Base Address (MSB)	*/
    382		GETBYTE(stb0899_base_addr, BYTE3),	/* 0x00	Base Address (MSB)	*/
    383	};
    384	u8 buf_1[] = {
    385		0x00,	/* 0xf3	Reg Offset	*/
    386		0x00,	/* 0x44	Reg Offset	*/
    387		0x00,	/* data			*/
    388		0x00,	/* data			*/
    389		0x00,	/* data			*/
    390		0x00,	/* data			*/
    391	};
    392
    393	struct i2c_msg msg_0 = {
    394		.addr	= state->config->demod_address,
    395		.flags	= 0,
    396		.buf	= buf_0,
    397		.len	= 6
    398	};
    399
    400	struct i2c_msg msg_1 = {
    401		.addr	= state->config->demod_address,
    402		.flags	= 0,
    403		.buf	= buf_1,
    404		.len	= 6
    405	};
    406
    407	buf_1[0] = GETBYTE(stb0899_reg_offset, BYTE1);
    408	buf_1[1] = GETBYTE(stb0899_reg_offset, BYTE0);
    409	buf_1[2] = GETBYTE(stb0899_data, BYTE0);
    410	buf_1[3] = GETBYTE(stb0899_data, BYTE1);
    411	buf_1[4] = GETBYTE(stb0899_data, BYTE2);
    412	buf_1[5] = GETBYTE(stb0899_data, BYTE3);
    413
    414	if (unlikely(*state->verbose >= FE_DEBUGREG))
    415		printk(KERN_DEBUG "%s Device=[0x%04x], Base Address=[0x%08x], Offset=[0x%04x], Data=[0x%08x]\n",
    416		       __func__, stb0899_i2cdev, stb0899_base_addr, stb0899_reg_offset, stb0899_data);
    417
    418	status = i2c_transfer(state->i2c, &msg_0, 1);
    419	if (unlikely(status < 1)) {
    420		if (status != -ERESTARTSYS)
    421			printk(KERN_ERR "%s ERR (1), Device=[0x%04x], Base Address=[0x%08x], Offset=[0x%04x], Data=[0x%08x], status=%d\n",
    422			       __func__, stb0899_i2cdev, stb0899_base_addr, stb0899_reg_offset, stb0899_data, status);
    423		goto err;
    424	}
    425	status = i2c_transfer(state->i2c, &msg_1, 1);
    426	if (unlikely(status < 1)) {
    427		if (status != -ERESTARTSYS)
    428			printk(KERN_ERR "%s ERR (2), Device=[0x%04x], Base Address=[0x%08x], Offset=[0x%04x], Data=[0x%08x], status=%d\n",
    429			       __func__, stb0899_i2cdev, stb0899_base_addr, stb0899_reg_offset, stb0899_data, status);
    430
    431		return status < 0 ? status : -EREMOTEIO;
    432	}
    433
    434	return 0;
    435
    436err:
    437	return status < 0 ? status : -EREMOTEIO;
    438}
    439
    440int stb0899_read_regs(struct stb0899_state *state, unsigned int reg, u8 *buf, u32 count)
    441{
    442	int status;
    443
    444	u8 b0[] = { reg >> 8, reg & 0xff };
    445
    446	struct i2c_msg msg[] = {
    447		{
    448			.addr	= state->config->demod_address,
    449			.flags	= 0,
    450			.buf	= b0,
    451			.len	= 2
    452		},{
    453			.addr	= state->config->demod_address,
    454			.flags	= I2C_M_RD,
    455			.buf	= buf,
    456			.len	= count
    457		}
    458	};
    459
    460	status = i2c_transfer(state->i2c, msg, 2);
    461	if (status != 2) {
    462		if (status != -ERESTARTSYS)
    463			printk(KERN_ERR "%s Read error, Reg=[0x%04x], Count=%u, Status=%d\n",
    464			       __func__, reg, count, status);
    465		goto err;
    466	}
    467	/*
    468	 * Bug ID 9:
    469	 * access to 0xf2xx/0xf6xx
    470	 * must be followed by read from 0xf2ff/0xf6ff.
    471	 */
    472	if ((reg != 0xf2ff) && (reg != 0xf6ff) &&
    473	    (((reg & 0xff00) == 0xf200) || ((reg & 0xff00) == 0xf600)))
    474		_stb0899_read_reg(state, (reg | 0x00ff));
    475
    476	dprintk(state->verbose, FE_DEBUGREG, 1,
    477		"%s [0x%04x]: %*ph", __func__, reg, count, buf);
    478
    479	return 0;
    480err:
    481	return status < 0 ? status : -EREMOTEIO;
    482}
    483
    484int stb0899_write_regs(struct stb0899_state *state, unsigned int reg, u8 *data, u32 count)
    485{
    486	int ret;
    487	u8 buf[MAX_XFER_SIZE];
    488	struct i2c_msg i2c_msg = {
    489		.addr	= state->config->demod_address,
    490		.flags	= 0,
    491		.buf	= buf,
    492		.len	= 2 + count
    493	};
    494
    495	if (2 + count > sizeof(buf)) {
    496		printk(KERN_WARNING
    497		       "%s: i2c wr reg=%04x: len=%d is too big!\n",
    498		       KBUILD_MODNAME, reg, count);
    499		return -EINVAL;
    500	}
    501
    502	buf[0] = reg >> 8;
    503	buf[1] = reg & 0xff;
    504	memcpy(&buf[2], data, count);
    505
    506	dprintk(state->verbose, FE_DEBUGREG, 1,
    507		"%s [0x%04x]: %*ph", __func__, reg, count, data);
    508	ret = i2c_transfer(state->i2c, &i2c_msg, 1);
    509
    510	/*
    511	 * Bug ID 9:
    512	 * access to 0xf2xx/0xf6xx
    513	 * must be followed by read from 0xf2ff/0xf6ff.
    514	 */
    515	if ((((reg & 0xff00) == 0xf200) || ((reg & 0xff00) == 0xf600)))
    516		stb0899_read_reg(state, (reg | 0x00ff));
    517
    518	if (ret != 1) {
    519		if (ret != -ERESTARTSYS)
    520			dprintk(state->verbose, FE_ERROR, 1, "Reg=[0x%04x], Data=[0x%02x ...], Count=%u, Status=%d",
    521				reg, data[0], count, ret);
    522		return ret < 0 ? ret : -EREMOTEIO;
    523	}
    524
    525	return 0;
    526}
    527
    528int stb0899_write_reg(struct stb0899_state *state, unsigned int reg, u8 data)
    529{
    530	u8 tmp = data;
    531	return stb0899_write_regs(state, reg, &tmp, 1);
    532}
    533
    534/*
    535 * stb0899_get_mclk
    536 * Get STB0899 master clock frequency
    537 * ExtClk: external clock frequency (Hz)
    538 */
    539static u32 stb0899_get_mclk(struct stb0899_state *state)
    540{
    541	u32 mclk = 0, div = 0;
    542
    543	div = stb0899_read_reg(state, STB0899_NCOARSE);
    544	mclk = (div + 1) * state->config->xtal_freq / 6;
    545	dprintk(state->verbose, FE_DEBUG, 1, "div=%d, mclk=%d", div, mclk);
    546
    547	return mclk;
    548}
    549
    550/*
    551 * stb0899_set_mclk
    552 * Set STB0899 master Clock frequency
    553 * Mclk: demodulator master clock
    554 * ExtClk: external clock frequency (Hz)
    555 */
    556static void stb0899_set_mclk(struct stb0899_state *state, u32 Mclk)
    557{
    558	struct stb0899_internal *internal = &state->internal;
    559	u8 mdiv = 0;
    560
    561	dprintk(state->verbose, FE_DEBUG, 1, "state->config=%p", state->config);
    562	mdiv = ((6 * Mclk) / state->config->xtal_freq) - 1;
    563	dprintk(state->verbose, FE_DEBUG, 1, "mdiv=%d", mdiv);
    564
    565	stb0899_write_reg(state, STB0899_NCOARSE, mdiv);
    566	internal->master_clk = stb0899_get_mclk(state);
    567
    568	dprintk(state->verbose, FE_DEBUG, 1, "MasterCLOCK=%d", internal->master_clk);
    569}
    570
    571static int stb0899_postproc(struct stb0899_state *state, u8 ctl, int enable)
    572{
    573	struct stb0899_config *config		= state->config;
    574	const struct stb0899_postproc *postproc	= config->postproc;
    575
    576	/* post process event */
    577	if (postproc) {
    578		if (enable) {
    579			if (postproc[ctl].level == STB0899_GPIOPULLUP)
    580				stb0899_write_reg(state, postproc[ctl].gpio, 0x02);
    581			else
    582				stb0899_write_reg(state, postproc[ctl].gpio, 0x82);
    583		} else {
    584			if (postproc[ctl].level == STB0899_GPIOPULLUP)
    585				stb0899_write_reg(state, postproc[ctl].gpio, 0x82);
    586			else
    587				stb0899_write_reg(state, postproc[ctl].gpio, 0x02);
    588		}
    589	}
    590	return 0;
    591}
    592
    593static void stb0899_detach(struct dvb_frontend *fe)
    594{
    595	struct stb0899_state *state = fe->demodulator_priv;
    596
    597	/* post process event */
    598	stb0899_postproc(state, STB0899_POSTPROC_GPIO_POWER, 0);
    599}
    600
    601static void stb0899_release(struct dvb_frontend *fe)
    602{
    603	struct stb0899_state *state = fe->demodulator_priv;
    604
    605	dprintk(state->verbose, FE_DEBUG, 1, "Release Frontend");
    606	kfree(state);
    607}
    608
    609/*
    610 * stb0899_get_alpha
    611 * return: rolloff
    612 */
    613static int stb0899_get_alpha(struct stb0899_state *state)
    614{
    615	u8 mode_coeff;
    616
    617	mode_coeff = stb0899_read_reg(state, STB0899_DEMOD);
    618
    619	if (STB0899_GETFIELD(MODECOEFF, mode_coeff) == 1)
    620		return 20;
    621	else
    622		return 35;
    623}
    624
    625/*
    626 * stb0899_init_calc
    627 */
    628static void stb0899_init_calc(struct stb0899_state *state)
    629{
    630	struct stb0899_internal *internal = &state->internal;
    631	int master_clk;
    632	u8 agc[2];
    633	u32 reg;
    634
    635	/* Read registers (in burst mode)	*/
    636	stb0899_read_regs(state, STB0899_AGC1REF, agc, 2); /* AGC1R and AGC2O	*/
    637
    638	/* Initial calculations	*/
    639	master_clk			= stb0899_get_mclk(state);
    640	internal->t_agc1		= 0;
    641	internal->t_agc2		= 0;
    642	internal->master_clk		= master_clk;
    643	internal->mclk			= master_clk / 65536L;
    644	internal->rolloff		= stb0899_get_alpha(state);
    645
    646	/* DVBS2 Initial calculations	*/
    647	/* Set AGC value to the middle	*/
    648	internal->agc_gain		= 8154;
    649	reg = STB0899_READ_S2REG(STB0899_S2DEMOD, IF_AGC_CNTRL);
    650	STB0899_SETFIELD_VAL(IF_GAIN_INIT, reg, internal->agc_gain);
    651	stb0899_write_s2reg(state, STB0899_S2DEMOD, STB0899_BASE_IF_AGC_CNTRL, STB0899_OFF0_IF_AGC_CNTRL, reg);
    652
    653	reg = STB0899_READ_S2REG(STB0899_S2DEMOD, RRC_ALPHA);
    654	internal->rrc_alpha		= STB0899_GETFIELD(RRC_ALPHA, reg);
    655
    656	internal->center_freq		= 0;
    657	internal->av_frame_coarse	= 10;
    658	internal->av_frame_fine		= 20;
    659	internal->step_size		= 2;
    660/*
    661	if ((pParams->SpectralInv == FE_IQ_NORMAL) || (pParams->SpectralInv == FE_IQ_AUTO))
    662		pParams->IQLocked = 0;
    663	else
    664		pParams->IQLocked = 1;
    665*/
    666}
    667
    668static int stb0899_wait_diseqc_fifo_empty(struct stb0899_state *state, int timeout)
    669{
    670	u8 reg = 0;
    671	unsigned long start = jiffies;
    672
    673	while (1) {
    674		reg = stb0899_read_reg(state, STB0899_DISSTATUS);
    675		if (!STB0899_GETFIELD(FIFOFULL, reg))
    676			break;
    677		if (time_after(jiffies, start + timeout)) {
    678			dprintk(state->verbose, FE_ERROR, 1, "timed out !!");
    679			return -ETIMEDOUT;
    680		}
    681	}
    682
    683	return 0;
    684}
    685
    686static int stb0899_send_diseqc_msg(struct dvb_frontend *fe, struct dvb_diseqc_master_cmd *cmd)
    687{
    688	struct stb0899_state *state = fe->demodulator_priv;
    689	u8 reg, i;
    690
    691	if (cmd->msg_len > sizeof(cmd->msg))
    692		return -EINVAL;
    693
    694	/* enable FIFO precharge	*/
    695	reg = stb0899_read_reg(state, STB0899_DISCNTRL1);
    696	STB0899_SETFIELD_VAL(DISPRECHARGE, reg, 1);
    697	stb0899_write_reg(state, STB0899_DISCNTRL1, reg);
    698	for (i = 0; i < cmd->msg_len; i++) {
    699		/* wait for FIFO empty	*/
    700		if (stb0899_wait_diseqc_fifo_empty(state, 100) < 0)
    701			return -ETIMEDOUT;
    702
    703		stb0899_write_reg(state, STB0899_DISFIFO, cmd->msg[i]);
    704	}
    705	reg = stb0899_read_reg(state, STB0899_DISCNTRL1);
    706	STB0899_SETFIELD_VAL(DISPRECHARGE, reg, 0);
    707	stb0899_write_reg(state, STB0899_DISCNTRL1, reg);
    708	msleep(100);
    709	return 0;
    710}
    711
    712static int stb0899_wait_diseqc_rxidle(struct stb0899_state *state, int timeout)
    713{
    714	u8 reg = 0;
    715	unsigned long start = jiffies;
    716
    717	while (!STB0899_GETFIELD(RXEND, reg)) {
    718		reg = stb0899_read_reg(state, STB0899_DISRX_ST0);
    719		if (time_after(jiffies, start + timeout)) {
    720			dprintk(state->verbose, FE_ERROR, 1, "timed out!!");
    721			return -ETIMEDOUT;
    722		}
    723		msleep(10);
    724	}
    725
    726	return 0;
    727}
    728
    729static int stb0899_recv_slave_reply(struct dvb_frontend *fe, struct dvb_diseqc_slave_reply *reply)
    730{
    731	struct stb0899_state *state = fe->demodulator_priv;
    732	u8 reg, length = 0, i;
    733	int result;
    734
    735	if (stb0899_wait_diseqc_rxidle(state, 100) < 0)
    736		return -ETIMEDOUT;
    737
    738	reg = stb0899_read_reg(state, STB0899_DISRX_ST0);
    739	if (STB0899_GETFIELD(RXEND, reg)) {
    740
    741		reg = stb0899_read_reg(state, STB0899_DISRX_ST1);
    742		length = STB0899_GETFIELD(FIFOBYTENBR, reg);
    743
    744		if (length > sizeof (reply->msg)) {
    745			result = -EOVERFLOW;
    746			goto exit;
    747		}
    748		reply->msg_len = length;
    749
    750		/* extract data */
    751		for (i = 0; i < length; i++)
    752			reply->msg[i] = stb0899_read_reg(state, STB0899_DISFIFO);
    753	}
    754
    755	return 0;
    756exit:
    757
    758	return result;
    759}
    760
    761static int stb0899_wait_diseqc_txidle(struct stb0899_state *state, int timeout)
    762{
    763	u8 reg = 0;
    764	unsigned long start = jiffies;
    765
    766	while (!STB0899_GETFIELD(TXIDLE, reg)) {
    767		reg = stb0899_read_reg(state, STB0899_DISSTATUS);
    768		if (time_after(jiffies, start + timeout)) {
    769			dprintk(state->verbose, FE_ERROR, 1, "timed out!!");
    770			return -ETIMEDOUT;
    771		}
    772		msleep(10);
    773	}
    774	return 0;
    775}
    776
    777static int stb0899_send_diseqc_burst(struct dvb_frontend *fe,
    778				     enum fe_sec_mini_cmd burst)
    779{
    780	struct stb0899_state *state = fe->demodulator_priv;
    781	u8 reg, old_state;
    782
    783	/* wait for diseqc idle	*/
    784	if (stb0899_wait_diseqc_txidle(state, 100) < 0)
    785		return -ETIMEDOUT;
    786
    787	reg = stb0899_read_reg(state, STB0899_DISCNTRL1);
    788	old_state = reg;
    789	/* set to burst mode	*/
    790	STB0899_SETFIELD_VAL(DISEQCMODE, reg, 0x03);
    791	STB0899_SETFIELD_VAL(DISPRECHARGE, reg, 0x01);
    792	stb0899_write_reg(state, STB0899_DISCNTRL1, reg);
    793	switch (burst) {
    794	case SEC_MINI_A:
    795		/* unmodulated	*/
    796		stb0899_write_reg(state, STB0899_DISFIFO, 0x00);
    797		break;
    798	case SEC_MINI_B:
    799		/* modulated	*/
    800		stb0899_write_reg(state, STB0899_DISFIFO, 0xff);
    801		break;
    802	}
    803	reg = stb0899_read_reg(state, STB0899_DISCNTRL1);
    804	STB0899_SETFIELD_VAL(DISPRECHARGE, reg, 0x00);
    805	stb0899_write_reg(state, STB0899_DISCNTRL1, reg);
    806	/* wait for diseqc idle	*/
    807	if (stb0899_wait_diseqc_txidle(state, 100) < 0)
    808		return -ETIMEDOUT;
    809
    810	/* restore state	*/
    811	stb0899_write_reg(state, STB0899_DISCNTRL1, old_state);
    812
    813	return 0;
    814}
    815
    816static int stb0899_diseqc_init(struct stb0899_state *state)
    817{
    818/*
    819	struct dvb_diseqc_slave_reply rx_data;
    820*/
    821	u8 f22_tx, reg;
    822
    823	u32 mclk, tx_freq = 22000;/* count = 0, i; */
    824	reg = stb0899_read_reg(state, STB0899_DISCNTRL2);
    825	STB0899_SETFIELD_VAL(ONECHIP_TRX, reg, 0);
    826	stb0899_write_reg(state, STB0899_DISCNTRL2, reg);
    827
    828	/* disable Tx spy	*/
    829	reg = stb0899_read_reg(state, STB0899_DISCNTRL1);
    830	STB0899_SETFIELD_VAL(DISEQCRESET, reg, 1);
    831	stb0899_write_reg(state, STB0899_DISCNTRL1, reg);
    832
    833	reg = stb0899_read_reg(state, STB0899_DISCNTRL1);
    834	STB0899_SETFIELD_VAL(DISEQCRESET, reg, 0);
    835	stb0899_write_reg(state, STB0899_DISCNTRL1, reg);
    836
    837	mclk = stb0899_get_mclk(state);
    838	f22_tx = mclk / (tx_freq * 32);
    839	stb0899_write_reg(state, STB0899_DISF22, f22_tx); /* DiSEqC Tx freq	*/
    840	state->rx_freq = 20000;
    841
    842	return 0;
    843}
    844
    845static int stb0899_sleep(struct dvb_frontend *fe)
    846{
    847	struct stb0899_state *state = fe->demodulator_priv;
    848/*
    849	u8 reg;
    850*/
    851	dprintk(state->verbose, FE_DEBUG, 1, "Going to Sleep .. (Really tired .. :-))");
    852	/* post process event */
    853	stb0899_postproc(state, STB0899_POSTPROC_GPIO_POWER, 0);
    854
    855	return 0;
    856}
    857
    858static int stb0899_wakeup(struct dvb_frontend *fe)
    859{
    860	int rc;
    861	struct stb0899_state *state = fe->demodulator_priv;
    862
    863	if ((rc = stb0899_write_reg(state, STB0899_SYNTCTRL, STB0899_SELOSCI)))
    864		return rc;
    865	/* Activate all clocks; DVB-S2 registers are inaccessible otherwise. */
    866	if ((rc = stb0899_write_reg(state, STB0899_STOPCLK1, 0x00)))
    867		return rc;
    868	if ((rc = stb0899_write_reg(state, STB0899_STOPCLK2, 0x00)))
    869		return rc;
    870
    871	/* post process event */
    872	stb0899_postproc(state, STB0899_POSTPROC_GPIO_POWER, 1);
    873
    874	return 0;
    875}
    876
    877static int stb0899_init(struct dvb_frontend *fe)
    878{
    879	int i;
    880	struct stb0899_state *state = fe->demodulator_priv;
    881	struct stb0899_config *config = state->config;
    882
    883	dprintk(state->verbose, FE_DEBUG, 1, "Initializing STB0899 ... ");
    884
    885	/* init device		*/
    886	dprintk(state->verbose, FE_DEBUG, 1, "init device");
    887	for (i = 0; config->init_dev[i].address != 0xffff; i++)
    888		stb0899_write_reg(state, config->init_dev[i].address, config->init_dev[i].data);
    889
    890	dprintk(state->verbose, FE_DEBUG, 1, "init S2 demod");
    891	/* init S2 demod	*/
    892	for (i = 0; config->init_s2_demod[i].offset != 0xffff; i++)
    893		stb0899_write_s2reg(state, STB0899_S2DEMOD,
    894				    config->init_s2_demod[i].base_address,
    895				    config->init_s2_demod[i].offset,
    896				    config->init_s2_demod[i].data);
    897
    898	dprintk(state->verbose, FE_DEBUG, 1, "init S1 demod");
    899	/* init S1 demod	*/
    900	for (i = 0; config->init_s1_demod[i].address != 0xffff; i++)
    901		stb0899_write_reg(state, config->init_s1_demod[i].address, config->init_s1_demod[i].data);
    902
    903	dprintk(state->verbose, FE_DEBUG, 1, "init S2 FEC");
    904	/* init S2 fec		*/
    905	for (i = 0; config->init_s2_fec[i].offset != 0xffff; i++)
    906		stb0899_write_s2reg(state, STB0899_S2FEC,
    907				    config->init_s2_fec[i].base_address,
    908				    config->init_s2_fec[i].offset,
    909				    config->init_s2_fec[i].data);
    910
    911	dprintk(state->verbose, FE_DEBUG, 1, "init TST");
    912	/* init test		*/
    913	for (i = 0; config->init_tst[i].address != 0xffff; i++)
    914		stb0899_write_reg(state, config->init_tst[i].address, config->init_tst[i].data);
    915
    916	stb0899_init_calc(state);
    917	stb0899_diseqc_init(state);
    918
    919	return 0;
    920}
    921
    922static int stb0899_table_lookup(const struct stb0899_tab *tab, int max, int val)
    923{
    924	int res = 0;
    925	int min = 0, med;
    926
    927	if (val < tab[min].read)
    928		res = tab[min].real;
    929	else if (val >= tab[max].read)
    930		res = tab[max].real;
    931	else {
    932		while ((max - min) > 1) {
    933			med = (max + min) / 2;
    934			if (val >= tab[min].read && val < tab[med].read)
    935				max = med;
    936			else
    937				min = med;
    938		}
    939		res = ((val - tab[min].read) *
    940		       (tab[max].real - tab[min].real) /
    941		       (tab[max].read - tab[min].read)) +
    942			tab[min].real;
    943	}
    944
    945	return res;
    946}
    947
    948static int stb0899_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
    949{
    950	struct stb0899_state *state		= fe->demodulator_priv;
    951	struct stb0899_internal *internal	= &state->internal;
    952
    953	int val;
    954	u32 reg;
    955	*strength = 0;
    956	switch (state->delsys) {
    957	case SYS_DVBS:
    958	case SYS_DSS:
    959		if (internal->lock) {
    960			reg  = stb0899_read_reg(state, STB0899_VSTATUS);
    961			if (STB0899_GETFIELD(VSTATUS_LOCKEDVIT, reg)) {
    962
    963				reg = stb0899_read_reg(state, STB0899_AGCIQIN);
    964				val = (s32)(s8)STB0899_GETFIELD(AGCIQVALUE, reg);
    965
    966				*strength = stb0899_table_lookup(stb0899_dvbsrf_tab, ARRAY_SIZE(stb0899_dvbsrf_tab) - 1, val);
    967				*strength += 750;
    968				dprintk(state->verbose, FE_DEBUG, 1, "AGCIQVALUE = 0x%02x, C = %d * 0.1 dBm",
    969					val & 0xff, *strength);
    970			}
    971		}
    972		break;
    973	case SYS_DVBS2:
    974		if (internal->lock) {
    975			reg = STB0899_READ_S2REG(STB0899_S2DEMOD, IF_AGC_GAIN);
    976			val = STB0899_GETFIELD(IF_AGC_GAIN, reg);
    977
    978			*strength = stb0899_table_lookup(stb0899_dvbs2rf_tab, ARRAY_SIZE(stb0899_dvbs2rf_tab) - 1, val);
    979			*strength += 950;
    980			dprintk(state->verbose, FE_DEBUG, 1, "IF_AGC_GAIN = 0x%04x, C = %d * 0.1 dBm",
    981				val & 0x3fff, *strength);
    982		}
    983		break;
    984	default:
    985		dprintk(state->verbose, FE_DEBUG, 1, "Unsupported delivery system");
    986		return -EINVAL;
    987	}
    988
    989	return 0;
    990}
    991
    992static int stb0899_read_snr(struct dvb_frontend *fe, u16 *snr)
    993{
    994	struct stb0899_state *state		= fe->demodulator_priv;
    995	struct stb0899_internal *internal	= &state->internal;
    996
    997	unsigned int val, quant, quantn = -1, est, estn = -1;
    998	u8 buf[2];
    999	u32 reg;
   1000
   1001	*snr = 0;
   1002	reg  = stb0899_read_reg(state, STB0899_VSTATUS);
   1003	switch (state->delsys) {
   1004	case SYS_DVBS:
   1005	case SYS_DSS:
   1006		if (internal->lock) {
   1007			if (STB0899_GETFIELD(VSTATUS_LOCKEDVIT, reg)) {
   1008
   1009				stb0899_read_regs(state, STB0899_NIRM, buf, 2);
   1010				val = MAKEWORD16(buf[0], buf[1]);
   1011
   1012				*snr = stb0899_table_lookup(stb0899_cn_tab, ARRAY_SIZE(stb0899_cn_tab) - 1, val);
   1013				dprintk(state->verbose, FE_DEBUG, 1, "NIR = 0x%02x%02x = %u, C/N = %d * 0.1 dBm\n",
   1014					buf[0], buf[1], val, *snr);
   1015			}
   1016		}
   1017		break;
   1018	case SYS_DVBS2:
   1019		if (internal->lock) {
   1020			reg = STB0899_READ_S2REG(STB0899_S2DEMOD, UWP_CNTRL1);
   1021			quant = STB0899_GETFIELD(UWP_ESN0_QUANT, reg);
   1022			reg = STB0899_READ_S2REG(STB0899_S2DEMOD, UWP_STAT2);
   1023			est = STB0899_GETFIELD(ESN0_EST, reg);
   1024			if (est == 1)
   1025				val = 301; /* C/N = 30.1 dB */
   1026			else if (est == 2)
   1027				val = 270; /* C/N = 27.0 dB */
   1028			else {
   1029				/* quantn = 100 * log(quant^2) */
   1030				quantn = stb0899_table_lookup(stb0899_quant_tab, ARRAY_SIZE(stb0899_quant_tab) - 1, quant * 100);
   1031				/* estn = 100 * log(est) */
   1032				estn = stb0899_table_lookup(stb0899_est_tab, ARRAY_SIZE(stb0899_est_tab) - 1, est);
   1033				/* snr(dBm/10) = -10*(log(est)-log(quant^2)) => snr(dBm/10) = (100*log(quant^2)-100*log(est))/10 */
   1034				val = (quantn - estn) / 10;
   1035			}
   1036			*snr = val;
   1037			dprintk(state->verbose, FE_DEBUG, 1, "Es/N0 quant = %d (%d) estimate = %u (%d), C/N = %d * 0.1 dBm",
   1038				quant, quantn, est, estn, val);
   1039		}
   1040		break;
   1041	default:
   1042		dprintk(state->verbose, FE_DEBUG, 1, "Unsupported delivery system");
   1043		return -EINVAL;
   1044	}
   1045
   1046	return 0;
   1047}
   1048
   1049static int stb0899_read_status(struct dvb_frontend *fe, enum fe_status *status)
   1050{
   1051	struct stb0899_state *state		= fe->demodulator_priv;
   1052	struct stb0899_internal *internal	= &state->internal;
   1053	u8 reg;
   1054	*status = 0;
   1055
   1056	switch (state->delsys) {
   1057	case SYS_DVBS:
   1058	case SYS_DSS:
   1059		dprintk(state->verbose, FE_DEBUG, 1, "Delivery system DVB-S/DSS");
   1060		if (internal->lock) {
   1061			reg  = stb0899_read_reg(state, STB0899_VSTATUS);
   1062			if (STB0899_GETFIELD(VSTATUS_LOCKEDVIT, reg)) {
   1063				dprintk(state->verbose, FE_DEBUG, 1, "--------> FE_HAS_CARRIER | FE_HAS_LOCK");
   1064				*status |= FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_LOCK;
   1065
   1066				reg = stb0899_read_reg(state, STB0899_PLPARM);
   1067				if (STB0899_GETFIELD(VITCURPUN, reg)) {
   1068					dprintk(state->verbose, FE_DEBUG, 1, "--------> FE_HAS_VITERBI | FE_HAS_SYNC");
   1069					*status |= FE_HAS_VITERBI | FE_HAS_SYNC;
   1070					/* post process event */
   1071					stb0899_postproc(state, STB0899_POSTPROC_GPIO_LOCK, 1);
   1072				}
   1073			}
   1074		}
   1075		break;
   1076	case SYS_DVBS2:
   1077		dprintk(state->verbose, FE_DEBUG, 1, "Delivery system DVB-S2");
   1078		if (internal->lock) {
   1079			reg = STB0899_READ_S2REG(STB0899_S2DEMOD, DMD_STAT2);
   1080			if (STB0899_GETFIELD(UWP_LOCK, reg) && STB0899_GETFIELD(CSM_LOCK, reg)) {
   1081				*status |= FE_HAS_CARRIER;
   1082				dprintk(state->verbose, FE_DEBUG, 1,
   1083					"UWP & CSM Lock ! ---> DVB-S2 FE_HAS_CARRIER");
   1084
   1085				reg = stb0899_read_reg(state, STB0899_CFGPDELSTATUS1);
   1086				if (STB0899_GETFIELD(CFGPDELSTATUS_LOCK, reg)) {
   1087					*status |= FE_HAS_LOCK;
   1088					dprintk(state->verbose, FE_DEBUG, 1,
   1089						"Packet Delineator Locked ! -----> DVB-S2 FE_HAS_LOCK");
   1090
   1091				}
   1092				if (STB0899_GETFIELD(CONTINUOUS_STREAM, reg)) {
   1093					*status |= FE_HAS_VITERBI;
   1094					dprintk(state->verbose, FE_DEBUG, 1,
   1095						"Packet Delineator found VITERBI ! -----> DVB-S2 FE_HAS_VITERBI");
   1096				}
   1097				if (STB0899_GETFIELD(ACCEPTED_STREAM, reg)) {
   1098					*status |= FE_HAS_SYNC;
   1099					dprintk(state->verbose, FE_DEBUG, 1,
   1100						"Packet Delineator found SYNC ! -----> DVB-S2 FE_HAS_SYNC");
   1101					/* post process event */
   1102					stb0899_postproc(state, STB0899_POSTPROC_GPIO_LOCK, 1);
   1103				}
   1104			}
   1105		}
   1106		break;
   1107	default:
   1108		dprintk(state->verbose, FE_DEBUG, 1, "Unsupported delivery system");
   1109		return -EINVAL;
   1110	}
   1111	return 0;
   1112}
   1113
   1114/*
   1115 * stb0899_get_error
   1116 * viterbi error for DVB-S/DSS
   1117 * packet error for DVB-S2
   1118 * Bit Error Rate or Packet Error Rate * 10 ^ 7
   1119 */
   1120static int stb0899_read_ber(struct dvb_frontend *fe, u32 *ber)
   1121{
   1122	struct stb0899_state *state		= fe->demodulator_priv;
   1123	struct stb0899_internal *internal	= &state->internal;
   1124
   1125	u8  lsb, msb;
   1126
   1127	*ber = 0;
   1128
   1129	switch (state->delsys) {
   1130	case SYS_DVBS:
   1131	case SYS_DSS:
   1132		if (internal->lock) {
   1133			lsb = stb0899_read_reg(state, STB0899_ECNT1L);
   1134			msb = stb0899_read_reg(state, STB0899_ECNT1M);
   1135			*ber = MAKEWORD16(msb, lsb);
   1136			/* Viterbi Check	*/
   1137			if (STB0899_GETFIELD(VSTATUS_PRFVIT, internal->v_status)) {
   1138				/* Error Rate		*/
   1139				*ber *= 9766;
   1140				/* ber = ber * 10 ^ 7	*/
   1141				*ber /= (-1 + (1 << (2 * STB0899_GETFIELD(NOE, internal->err_ctrl))));
   1142				*ber /= 8;
   1143			}
   1144		}
   1145		break;
   1146	case SYS_DVBS2:
   1147		if (internal->lock) {
   1148			lsb = stb0899_read_reg(state, STB0899_ECNT1L);
   1149			msb = stb0899_read_reg(state, STB0899_ECNT1M);
   1150			*ber = MAKEWORD16(msb, lsb);
   1151			/* ber = ber * 10 ^ 7	*/
   1152			*ber *= 10000000;
   1153			*ber /= (-1 + (1 << (4 + 2 * STB0899_GETFIELD(NOE, internal->err_ctrl))));
   1154		}
   1155		break;
   1156	default:
   1157		dprintk(state->verbose, FE_DEBUG, 1, "Unsupported delivery system");
   1158		return -EINVAL;
   1159	}
   1160
   1161	return 0;
   1162}
   1163
   1164static int stb0899_set_voltage(struct dvb_frontend *fe,
   1165			       enum fe_sec_voltage voltage)
   1166{
   1167	struct stb0899_state *state = fe->demodulator_priv;
   1168
   1169	switch (voltage) {
   1170	case SEC_VOLTAGE_13:
   1171		stb0899_write_reg(state, STB0899_GPIO00CFG, 0x82);
   1172		stb0899_write_reg(state, STB0899_GPIO01CFG, 0x02);
   1173		stb0899_write_reg(state, STB0899_GPIO02CFG, 0x00);
   1174		break;
   1175	case SEC_VOLTAGE_18:
   1176		stb0899_write_reg(state, STB0899_GPIO00CFG, 0x02);
   1177		stb0899_write_reg(state, STB0899_GPIO01CFG, 0x02);
   1178		stb0899_write_reg(state, STB0899_GPIO02CFG, 0x82);
   1179		break;
   1180	case SEC_VOLTAGE_OFF:
   1181		stb0899_write_reg(state, STB0899_GPIO00CFG, 0x82);
   1182		stb0899_write_reg(state, STB0899_GPIO01CFG, 0x82);
   1183		stb0899_write_reg(state, STB0899_GPIO02CFG, 0x82);
   1184		break;
   1185	default:
   1186		return -EINVAL;
   1187	}
   1188
   1189	return 0;
   1190}
   1191
   1192static int stb0899_set_tone(struct dvb_frontend *fe, enum fe_sec_tone_mode tone)
   1193{
   1194	struct stb0899_state *state = fe->demodulator_priv;
   1195	struct stb0899_internal *internal = &state->internal;
   1196
   1197	u8 div, reg;
   1198
   1199	/* wait for diseqc idle	*/
   1200	if (stb0899_wait_diseqc_txidle(state, 100) < 0)
   1201		return -ETIMEDOUT;
   1202
   1203	switch (tone) {
   1204	case SEC_TONE_ON:
   1205		div = (internal->master_clk / 100) / 5632;
   1206		div = (div + 5) / 10;
   1207		stb0899_write_reg(state, STB0899_DISEQCOCFG, 0x66);
   1208		reg = stb0899_read_reg(state, STB0899_ACRPRESC);
   1209		STB0899_SETFIELD_VAL(ACRPRESC, reg, 0x03);
   1210		stb0899_write_reg(state, STB0899_ACRPRESC, reg);
   1211		stb0899_write_reg(state, STB0899_ACRDIV1, div);
   1212		break;
   1213	case SEC_TONE_OFF:
   1214		stb0899_write_reg(state, STB0899_DISEQCOCFG, 0x20);
   1215		break;
   1216	default:
   1217		return -EINVAL;
   1218	}
   1219	return 0;
   1220}
   1221
   1222int stb0899_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
   1223{
   1224	int i2c_stat;
   1225	struct stb0899_state *state = fe->demodulator_priv;
   1226
   1227	i2c_stat = stb0899_read_reg(state, STB0899_I2CRPT);
   1228	if (i2c_stat < 0)
   1229		goto err;
   1230
   1231	if (enable) {
   1232		dprintk(state->verbose, FE_DEBUG, 1, "Enabling I2C Repeater ...");
   1233		i2c_stat |=  STB0899_I2CTON;
   1234		if (stb0899_write_reg(state, STB0899_I2CRPT, i2c_stat) < 0)
   1235			goto err;
   1236	} else {
   1237		dprintk(state->verbose, FE_DEBUG, 1, "Disabling I2C Repeater ...");
   1238		i2c_stat &= ~STB0899_I2CTON;
   1239		if (stb0899_write_reg(state, STB0899_I2CRPT, i2c_stat) < 0)
   1240			goto err;
   1241	}
   1242	return 0;
   1243err:
   1244	dprintk(state->verbose, FE_ERROR, 1, "I2C Repeater control failed");
   1245	return -EREMOTEIO;
   1246}
   1247
   1248
   1249static inline void CONVERT32(u32 x, char *str)
   1250{
   1251	*str++	= (x >> 24) & 0xff;
   1252	*str++	= (x >> 16) & 0xff;
   1253	*str++	= (x >>  8) & 0xff;
   1254	*str++	= (x >>  0) & 0xff;
   1255	*str	= '\0';
   1256}
   1257
   1258static int stb0899_get_dev_id(struct stb0899_state *state)
   1259{
   1260	u8 chip_id, release;
   1261	u16 id;
   1262	u32 demod_ver = 0, fec_ver = 0;
   1263	char demod_str[5] = { 0 };
   1264	char fec_str[5] = { 0 };
   1265
   1266	id = stb0899_read_reg(state, STB0899_DEV_ID);
   1267	dprintk(state->verbose, FE_DEBUG, 1, "ID reg=[0x%02x]", id);
   1268	chip_id = STB0899_GETFIELD(CHIP_ID, id);
   1269	release = STB0899_GETFIELD(CHIP_REL, id);
   1270
   1271	dprintk(state->verbose, FE_ERROR, 1, "Device ID=[%d], Release=[%d]",
   1272		chip_id, release);
   1273
   1274	CONVERT32(STB0899_READ_S2REG(STB0899_S2DEMOD, DMD_CORE_ID), (char *)&demod_str);
   1275
   1276	demod_ver = STB0899_READ_S2REG(STB0899_S2DEMOD, DMD_VERSION_ID);
   1277	dprintk(state->verbose, FE_ERROR, 1, "Demodulator Core ID=[%s], Version=[%d]", (char *) &demod_str, demod_ver);
   1278	CONVERT32(STB0899_READ_S2REG(STB0899_S2FEC, FEC_CORE_ID_REG), (char *)&fec_str);
   1279	fec_ver = STB0899_READ_S2REG(STB0899_S2FEC, FEC_VER_ID_REG);
   1280	if (! (chip_id > 0)) {
   1281		dprintk(state->verbose, FE_ERROR, 1, "couldn't find a STB 0899");
   1282
   1283		return -ENODEV;
   1284	}
   1285	dprintk(state->verbose, FE_ERROR, 1, "FEC Core ID=[%s], Version=[%d]", (char*) &fec_str, fec_ver);
   1286
   1287	return 0;
   1288}
   1289
   1290static void stb0899_set_delivery(struct stb0899_state *state)
   1291{
   1292	u8 reg;
   1293	u8 stop_clk[2];
   1294
   1295	stop_clk[0] = stb0899_read_reg(state, STB0899_STOPCLK1);
   1296	stop_clk[1] = stb0899_read_reg(state, STB0899_STOPCLK2);
   1297
   1298	switch (state->delsys) {
   1299	case SYS_DVBS:
   1300		dprintk(state->verbose, FE_DEBUG, 1, "Delivery System -- DVB-S");
   1301		/* FECM/Viterbi ON	*/
   1302		reg = stb0899_read_reg(state, STB0899_FECM);
   1303		STB0899_SETFIELD_VAL(FECM_RSVD0, reg, 0);
   1304		STB0899_SETFIELD_VAL(FECM_VITERBI_ON, reg, 1);
   1305		stb0899_write_reg(state, STB0899_FECM, reg);
   1306
   1307		stb0899_write_reg(state, STB0899_RSULC, 0xb1);
   1308		stb0899_write_reg(state, STB0899_TSULC, 0x40);
   1309		stb0899_write_reg(state, STB0899_RSLLC, 0x42);
   1310		stb0899_write_reg(state, STB0899_TSLPL, 0x12);
   1311
   1312		reg = stb0899_read_reg(state, STB0899_TSTRES);
   1313		STB0899_SETFIELD_VAL(FRESLDPC, reg, 1);
   1314		stb0899_write_reg(state, STB0899_TSTRES, reg);
   1315
   1316		STB0899_SETFIELD_VAL(STOP_CHK8PSK, stop_clk[0], 1);
   1317		STB0899_SETFIELD_VAL(STOP_CKFEC108, stop_clk[0], 1);
   1318		STB0899_SETFIELD_VAL(STOP_CKFEC216, stop_clk[0], 1);
   1319
   1320		STB0899_SETFIELD_VAL(STOP_CKPKDLIN108, stop_clk[1], 1);
   1321		STB0899_SETFIELD_VAL(STOP_CKPKDLIN216, stop_clk[1], 1);
   1322
   1323		STB0899_SETFIELD_VAL(STOP_CKINTBUF216, stop_clk[0], 1);
   1324		STB0899_SETFIELD_VAL(STOP_CKCORE216, stop_clk[0], 0);
   1325
   1326		STB0899_SETFIELD_VAL(STOP_CKS2DMD108, stop_clk[1], 1);
   1327		break;
   1328	case SYS_DVBS2:
   1329		/* FECM/Viterbi OFF	*/
   1330		reg = stb0899_read_reg(state, STB0899_FECM);
   1331		STB0899_SETFIELD_VAL(FECM_RSVD0, reg, 0);
   1332		STB0899_SETFIELD_VAL(FECM_VITERBI_ON, reg, 0);
   1333		stb0899_write_reg(state, STB0899_FECM, reg);
   1334
   1335		stb0899_write_reg(state, STB0899_RSULC, 0xb1);
   1336		stb0899_write_reg(state, STB0899_TSULC, 0x42);
   1337		stb0899_write_reg(state, STB0899_RSLLC, 0x40);
   1338		stb0899_write_reg(state, STB0899_TSLPL, 0x02);
   1339
   1340		reg = stb0899_read_reg(state, STB0899_TSTRES);
   1341		STB0899_SETFIELD_VAL(FRESLDPC, reg, 0);
   1342		stb0899_write_reg(state, STB0899_TSTRES, reg);
   1343
   1344		STB0899_SETFIELD_VAL(STOP_CHK8PSK, stop_clk[0], 1);
   1345		STB0899_SETFIELD_VAL(STOP_CKFEC108, stop_clk[0], 0);
   1346		STB0899_SETFIELD_VAL(STOP_CKFEC216, stop_clk[0], 0);
   1347
   1348		STB0899_SETFIELD_VAL(STOP_CKPKDLIN108, stop_clk[1], 0);
   1349		STB0899_SETFIELD_VAL(STOP_CKPKDLIN216, stop_clk[1], 0);
   1350
   1351		STB0899_SETFIELD_VAL(STOP_CKINTBUF216, stop_clk[0], 0);
   1352		STB0899_SETFIELD_VAL(STOP_CKCORE216, stop_clk[0], 0);
   1353
   1354		STB0899_SETFIELD_VAL(STOP_CKS2DMD108, stop_clk[1], 0);
   1355		break;
   1356	case SYS_DSS:
   1357		/* FECM/Viterbi ON	*/
   1358		reg = stb0899_read_reg(state, STB0899_FECM);
   1359		STB0899_SETFIELD_VAL(FECM_RSVD0, reg, 1);
   1360		STB0899_SETFIELD_VAL(FECM_VITERBI_ON, reg, 1);
   1361		stb0899_write_reg(state, STB0899_FECM, reg);
   1362
   1363		stb0899_write_reg(state, STB0899_RSULC, 0xa1);
   1364		stb0899_write_reg(state, STB0899_TSULC, 0x61);
   1365		stb0899_write_reg(state, STB0899_RSLLC, 0x42);
   1366
   1367		reg = stb0899_read_reg(state, STB0899_TSTRES);
   1368		STB0899_SETFIELD_VAL(FRESLDPC, reg, 1);
   1369		stb0899_write_reg(state, STB0899_TSTRES, reg);
   1370
   1371		STB0899_SETFIELD_VAL(STOP_CHK8PSK, stop_clk[0], 1);
   1372		STB0899_SETFIELD_VAL(STOP_CKFEC108, stop_clk[0], 1);
   1373		STB0899_SETFIELD_VAL(STOP_CKFEC216, stop_clk[0], 1);
   1374
   1375		STB0899_SETFIELD_VAL(STOP_CKPKDLIN108, stop_clk[1], 1);
   1376		STB0899_SETFIELD_VAL(STOP_CKPKDLIN216, stop_clk[1], 1);
   1377
   1378		STB0899_SETFIELD_VAL(STOP_CKCORE216, stop_clk[0], 0);
   1379
   1380		STB0899_SETFIELD_VAL(STOP_CKS2DMD108, stop_clk[1], 1);
   1381		break;
   1382	default:
   1383		dprintk(state->verbose, FE_ERROR, 1, "Unsupported delivery system");
   1384		break;
   1385	}
   1386	STB0899_SETFIELD_VAL(STOP_CKADCI108, stop_clk[0], 0);
   1387	stb0899_write_regs(state, STB0899_STOPCLK1, stop_clk, 2);
   1388}
   1389
   1390/*
   1391 * stb0899_set_iterations
   1392 * set the LDPC iteration scale function
   1393 */
   1394static void stb0899_set_iterations(struct stb0899_state *state)
   1395{
   1396	struct stb0899_internal *internal = &state->internal;
   1397	struct stb0899_config *config = state->config;
   1398
   1399	s32 iter_scale;
   1400	u32 reg;
   1401
   1402	iter_scale = 17 * (internal->master_clk / 1000);
   1403	iter_scale += 410000;
   1404	iter_scale /= (internal->srate / 1000000);
   1405	iter_scale /= 1000;
   1406
   1407	if (iter_scale > config->ldpc_max_iter)
   1408		iter_scale = config->ldpc_max_iter;
   1409
   1410	reg = STB0899_READ_S2REG(STB0899_S2FEC, MAX_ITER);
   1411	STB0899_SETFIELD_VAL(MAX_ITERATIONS, reg, iter_scale);
   1412	stb0899_write_s2reg(state, STB0899_S2FEC, STB0899_BASE_MAX_ITER, STB0899_OFF0_MAX_ITER, reg);
   1413}
   1414
   1415static enum dvbfe_search stb0899_search(struct dvb_frontend *fe)
   1416{
   1417	struct stb0899_state *state = fe->demodulator_priv;
   1418	struct stb0899_params *i_params = &state->params;
   1419	struct stb0899_internal *internal = &state->internal;
   1420	struct stb0899_config *config = state->config;
   1421	struct dtv_frontend_properties *props = &fe->dtv_property_cache;
   1422
   1423	u32 SearchRange, gain;
   1424
   1425	i_params->freq	= props->frequency;
   1426	i_params->srate = props->symbol_rate;
   1427	state->delsys = props->delivery_system;
   1428	dprintk(state->verbose, FE_DEBUG, 1, "delivery system=%d", state->delsys);
   1429
   1430	SearchRange = 10000000;
   1431	dprintk(state->verbose, FE_DEBUG, 1, "Frequency=%d, Srate=%d", i_params->freq, i_params->srate);
   1432	/* checking Search Range is meaningless for a fixed 3 Mhz			*/
   1433	if (INRANGE(i_params->srate, 1000000, 45000000)) {
   1434		dprintk(state->verbose, FE_DEBUG, 1, "Parameters IN RANGE");
   1435		stb0899_set_delivery(state);
   1436
   1437		if (state->config->tuner_set_rfsiggain) {
   1438			if (internal->srate > 15000000)
   1439				gain =  8; /* 15Mb < srate < 45Mb, gain = 8dB	*/
   1440			else if (internal->srate > 5000000)
   1441				gain = 12; /*  5Mb < srate < 15Mb, gain = 12dB	*/
   1442			else
   1443				gain = 14; /*  1Mb < srate <  5Mb, gain = 14db	*/
   1444			state->config->tuner_set_rfsiggain(fe, gain);
   1445		}
   1446
   1447		if (i_params->srate <= 5000000)
   1448			stb0899_set_mclk(state, config->lo_clk);
   1449		else
   1450			stb0899_set_mclk(state, config->hi_clk);
   1451
   1452		switch (state->delsys) {
   1453		case SYS_DVBS:
   1454		case SYS_DSS:
   1455			dprintk(state->verbose, FE_DEBUG, 1, "DVB-S delivery system");
   1456			internal->freq	= i_params->freq;
   1457			internal->srate	= i_params->srate;
   1458			/*
   1459			 * search = user search range +
   1460			 *	    500Khz +
   1461			 *	    2 * Tuner_step_size +
   1462			 *	    10% of the symbol rate
   1463			 */
   1464			internal->srch_range	= SearchRange + 1500000 + (i_params->srate / 5);
   1465			internal->derot_percent	= 30;
   1466
   1467			/* What to do for tuners having no bandwidth setup ?	*/
   1468			/* enable tuner I/O */
   1469			stb0899_i2c_gate_ctrl(&state->frontend, 1);
   1470
   1471			if (state->config->tuner_set_bandwidth)
   1472				state->config->tuner_set_bandwidth(fe, (13 * (stb0899_carr_width(state) + SearchRange)) / 10);
   1473			if (state->config->tuner_get_bandwidth)
   1474				state->config->tuner_get_bandwidth(fe, &internal->tuner_bw);
   1475
   1476			/* disable tuner I/O */
   1477			stb0899_i2c_gate_ctrl(&state->frontend, 0);
   1478
   1479			/* Set DVB-S1 AGC		*/
   1480			stb0899_write_reg(state, STB0899_AGCRFCFG, 0x11);
   1481
   1482			/* Run the search algorithm	*/
   1483			dprintk(state->verbose, FE_DEBUG, 1, "running DVB-S search algo ..");
   1484			if (stb0899_dvbs_algo(state)	== RANGEOK) {
   1485				internal->lock		= 1;
   1486				dprintk(state->verbose, FE_DEBUG, 1,
   1487					"-------------------------------------> DVB-S LOCK !");
   1488
   1489//				stb0899_write_reg(state, STB0899_ERRCTRL1, 0x3d); /* Viterbi Errors	*/
   1490//				internal->v_status = stb0899_read_reg(state, STB0899_VSTATUS);
   1491//				internal->err_ctrl = stb0899_read_reg(state, STB0899_ERRCTRL1);
   1492//				dprintk(state->verbose, FE_DEBUG, 1, "VSTATUS=0x%02x", internal->v_status);
   1493//				dprintk(state->verbose, FE_DEBUG, 1, "ERR_CTRL=0x%02x", internal->err_ctrl);
   1494
   1495				return DVBFE_ALGO_SEARCH_SUCCESS;
   1496			} else {
   1497				internal->lock		= 0;
   1498
   1499				return DVBFE_ALGO_SEARCH_FAILED;
   1500			}
   1501			break;
   1502		case SYS_DVBS2:
   1503			internal->freq			= i_params->freq;
   1504			internal->srate			= i_params->srate;
   1505			internal->srch_range		= SearchRange;
   1506
   1507			/* enable tuner I/O */
   1508			stb0899_i2c_gate_ctrl(&state->frontend, 1);
   1509
   1510			if (state->config->tuner_set_bandwidth)
   1511				state->config->tuner_set_bandwidth(fe, (stb0899_carr_width(state) + SearchRange));
   1512			if (state->config->tuner_get_bandwidth)
   1513				state->config->tuner_get_bandwidth(fe, &internal->tuner_bw);
   1514
   1515			/* disable tuner I/O */
   1516			stb0899_i2c_gate_ctrl(&state->frontend, 0);
   1517
   1518//			pParams->SpectralInv		= pSearch->IQ_Inversion;
   1519
   1520			/* Set DVB-S2 AGC		*/
   1521			stb0899_write_reg(state, STB0899_AGCRFCFG, 0x1c);
   1522
   1523			/* Set IterScale =f(MCLK,SYMB)	*/
   1524			stb0899_set_iterations(state);
   1525
   1526			/* Run the search algorithm	*/
   1527			dprintk(state->verbose, FE_DEBUG, 1, "running DVB-S2 search algo ..");
   1528			if (stb0899_dvbs2_algo(state)	== DVBS2_FEC_LOCK) {
   1529				internal->lock		= 1;
   1530				dprintk(state->verbose, FE_DEBUG, 1,
   1531					"-------------------------------------> DVB-S2 LOCK !");
   1532
   1533//				stb0899_write_reg(state, STB0899_ERRCTRL1, 0xb6); /* Packet Errors	*/
   1534//				internal->v_status = stb0899_read_reg(state, STB0899_VSTATUS);
   1535//				internal->err_ctrl = stb0899_read_reg(state, STB0899_ERRCTRL1);
   1536
   1537				return DVBFE_ALGO_SEARCH_SUCCESS;
   1538			} else {
   1539				internal->lock		= 0;
   1540
   1541				return DVBFE_ALGO_SEARCH_FAILED;
   1542			}
   1543			break;
   1544		default:
   1545			dprintk(state->verbose, FE_ERROR, 1, "Unsupported delivery system");
   1546			return DVBFE_ALGO_SEARCH_INVALID;
   1547		}
   1548	}
   1549
   1550	return DVBFE_ALGO_SEARCH_ERROR;
   1551}
   1552
   1553static int stb0899_get_frontend(struct dvb_frontend *fe,
   1554				struct dtv_frontend_properties *p)
   1555{
   1556	struct stb0899_state *state		= fe->demodulator_priv;
   1557	struct stb0899_internal *internal	= &state->internal;
   1558
   1559	dprintk(state->verbose, FE_DEBUG, 1, "Get params");
   1560	p->symbol_rate = internal->srate;
   1561	p->frequency = internal->freq;
   1562
   1563	return 0;
   1564}
   1565
   1566static enum dvbfe_algo stb0899_frontend_algo(struct dvb_frontend *fe)
   1567{
   1568	return DVBFE_ALGO_CUSTOM;
   1569}
   1570
   1571static const struct dvb_frontend_ops stb0899_ops = {
   1572	.delsys = { SYS_DVBS, SYS_DVBS2, SYS_DSS },
   1573	.info = {
   1574		.name			= "STB0899 Multistandard",
   1575		.frequency_min_hz	=  950 * MHz,
   1576		.frequency_max_hz	= 2150 * MHz,
   1577		.symbol_rate_min	=  5000000,
   1578		.symbol_rate_max	= 45000000,
   1579
   1580		.caps			= FE_CAN_INVERSION_AUTO	|
   1581					  FE_CAN_FEC_AUTO	|
   1582					  FE_CAN_2G_MODULATION	|
   1583					  FE_CAN_QPSK
   1584	},
   1585
   1586	.detach				= stb0899_detach,
   1587	.release			= stb0899_release,
   1588	.init				= stb0899_init,
   1589	.sleep				= stb0899_sleep,
   1590//	.wakeup				= stb0899_wakeup,
   1591
   1592	.i2c_gate_ctrl			= stb0899_i2c_gate_ctrl,
   1593
   1594	.get_frontend_algo		= stb0899_frontend_algo,
   1595	.search				= stb0899_search,
   1596	.get_frontend                   = stb0899_get_frontend,
   1597
   1598
   1599	.read_status			= stb0899_read_status,
   1600	.read_snr			= stb0899_read_snr,
   1601	.read_signal_strength		= stb0899_read_signal_strength,
   1602	.read_ber			= stb0899_read_ber,
   1603
   1604	.set_voltage			= stb0899_set_voltage,
   1605	.set_tone			= stb0899_set_tone,
   1606
   1607	.diseqc_send_master_cmd		= stb0899_send_diseqc_msg,
   1608	.diseqc_recv_slave_reply	= stb0899_recv_slave_reply,
   1609	.diseqc_send_burst		= stb0899_send_diseqc_burst,
   1610};
   1611
   1612struct dvb_frontend *stb0899_attach(struct stb0899_config *config, struct i2c_adapter *i2c)
   1613{
   1614	struct stb0899_state *state = NULL;
   1615
   1616	state = kzalloc(sizeof (struct stb0899_state), GFP_KERNEL);
   1617	if (state == NULL)
   1618		goto error;
   1619
   1620	state->verbose				= &verbose;
   1621	state->config				= config;
   1622	state->i2c				= i2c;
   1623	state->frontend.ops			= stb0899_ops;
   1624	state->frontend.demodulator_priv	= state;
   1625	/* use configured inversion as default -- we'll later autodetect inversion */
   1626	state->internal.inversion		= config->inversion;
   1627
   1628	stb0899_wakeup(&state->frontend);
   1629	if (stb0899_get_dev_id(state) == -ENODEV) {
   1630		printk("%s: Exiting .. !\n", __func__);
   1631		goto error;
   1632	}
   1633
   1634	printk("%s: Attaching STB0899 \n", __func__);
   1635	return &state->frontend;
   1636
   1637error:
   1638	kfree(state);
   1639	return NULL;
   1640}
   1641EXPORT_SYMBOL(stb0899_attach);
   1642MODULE_PARM_DESC(verbose, "Set Verbosity level");
   1643MODULE_AUTHOR("Manu Abraham");
   1644MODULE_DESCRIPTION("STB0899 Multi-Std frontend");
   1645MODULE_LICENSE("GPL");